mirror of
https://gitlab.dit.htwk-leipzig.de/htwk-software/htwkalender-pwa.git
synced 2025-08-05 19:29:16 +02:00
115 refactoring dynamic page
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
import { computed, ComputedRef, PropType } from "vue";
|
import { computed, ComputedRef, PropType } from "vue";
|
||||||
import { Module } from "../model/module.ts";
|
import { Module } from "../model/module.ts";
|
||||||
import moduleStore from "../store/moduleStore";
|
import moduleStore from "../store/moduleStore";
|
||||||
import router from "../router";
|
|
||||||
|
|
||||||
const store = moduleStore();
|
const store = moduleStore();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -40,21 +39,10 @@ function toggleModule(module: Module) {
|
|||||||
store.addModule(module);
|
store.addModule(module);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextStep() {
|
|
||||||
router.push("/additional-modules");
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex flex-column w-full">
|
<div class="flex flex-column w-full">
|
||||||
<Button
|
|
||||||
:disabled="store.isEmpty()"
|
|
||||||
class="col-12 md:col-4 mb-3 align-self-end"
|
|
||||||
@click="nextStep()"
|
|
||||||
icon="pi pi-arrow-right"
|
|
||||||
:label="$t('moduleSelection.nextStep')"
|
|
||||||
/>
|
|
||||||
<DataView
|
<DataView
|
||||||
:value="modules"
|
:value="modules"
|
||||||
data-key="uuid"
|
data-key="uuid"
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
"winterSemester": "Wintersemester",
|
"winterSemester": "Wintersemester",
|
||||||
"summerSemester": "Sommersemester",
|
"summerSemester": "Sommersemester",
|
||||||
"subTitle": "Bitte wähle eine Gruppe und das Semester aus.",
|
"subTitle": "Bitte wähle eine Gruppe und das Semester aus.",
|
||||||
|
"nextStep": "Weiter",
|
||||||
"courseDropDown": "Gruppe",
|
"courseDropDown": "Gruppe",
|
||||||
"noCoursesAvailable": "Keine Gruppen verfügbar",
|
"noCoursesAvailable": "Keine Gruppen verfügbar",
|
||||||
"semesterDropDown": "Semester"
|
"semesterDropDown": "Semester"
|
||||||
@@ -26,7 +27,6 @@
|
|||||||
"occupied": "belegt"
|
"occupied": "belegt"
|
||||||
},
|
},
|
||||||
"moduleSelection": {
|
"moduleSelection": {
|
||||||
"nextStep": "Weiter",
|
|
||||||
"selectAll": "Alle anwählen",
|
"selectAll": "Alle anwählen",
|
||||||
"deselectAll": "Alle abwählen",
|
"deselectAll": "Alle abwählen",
|
||||||
"selected": "angewählt",
|
"selected": "angewählt",
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
"winterSemester": "winter semester",
|
"winterSemester": "winter semester",
|
||||||
"summerSemester": "summer semester",
|
"summerSemester": "summer semester",
|
||||||
"subTitle": "please select a course and semester",
|
"subTitle": "please select a course and semester",
|
||||||
|
"nextStep": "next step",
|
||||||
"courseDropDown": "please select a course",
|
"courseDropDown": "please select a course",
|
||||||
"noCoursesAvailable": "no courses listed",
|
"noCoursesAvailable": "no courses listed",
|
||||||
"semesterDropDown": "please select a semester"
|
"semesterDropDown": "please select a semester"
|
||||||
@@ -26,7 +27,6 @@
|
|||||||
"occupied": "occupied"
|
"occupied": "occupied"
|
||||||
},
|
},
|
||||||
"moduleSelection": {
|
"moduleSelection": {
|
||||||
"nextStep": "next step",
|
|
||||||
"selectAll": "select all",
|
"selectAll": "select all",
|
||||||
"deselectAll": "deselect all",
|
"deselectAll": "deselect all",
|
||||||
"selected": "selected",
|
"selected": "selected",
|
||||||
|
@@ -8,6 +8,10 @@ import DynamicPage from "./DynamicPage.vue";
|
|||||||
import ModuleSelection from "../components/ModuleSelection.vue";
|
import ModuleSelection from "../components/ModuleSelection.vue";
|
||||||
import { Module } from "../model/module.ts";
|
import { Module } from "../model/module.ts";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
|
import moduleStore from "../store/moduleStore";
|
||||||
|
import router from "../router";
|
||||||
|
|
||||||
|
const store = moduleStore();
|
||||||
const { t } = useI18n({ useScope: "global" });
|
const { t } = useI18n({ useScope: "global" });
|
||||||
|
|
||||||
const courses = async () => {
|
const courses = async () => {
|
||||||
@@ -58,12 +62,18 @@ async function getModules() {
|
|||||||
:headline="$t('courseSelection.headline')"
|
:headline="$t('courseSelection.headline')"
|
||||||
:subTitle="$t('courseSelection.subTitle')"
|
:subTitle="$t('courseSelection.subTitle')"
|
||||||
icon="pi pi-calendar"
|
icon="pi pi-calendar"
|
||||||
|
:button="{
|
||||||
|
label: $t('courseSelection.nextStep'),
|
||||||
|
icon: 'pi pi-arrow-right',
|
||||||
|
disabled: store.isEmpty(),
|
||||||
|
onClick: () => router.push('/additional-modules')
|
||||||
|
}"
|
||||||
>
|
>
|
||||||
<template #selection>
|
<template #selection="{ flexSpecs }">
|
||||||
<Dropdown
|
<Dropdown
|
||||||
v-model="selectedCourse"
|
v-model="selectedCourse"
|
||||||
:options="countries"
|
:options="countries"
|
||||||
class="flex-1 m-0"
|
:class="flexSpecs"
|
||||||
filter
|
filter
|
||||||
option-label="name"
|
option-label="name"
|
||||||
:placeholder="$t('courseSelection.courseDropDown')"
|
:placeholder="$t('courseSelection.courseDropDown')"
|
||||||
@@ -74,7 +84,7 @@ async function getModules() {
|
|||||||
<Dropdown
|
<Dropdown
|
||||||
v-model="selectedSemester"
|
v-model="selectedSemester"
|
||||||
:options="semesters"
|
:options="semesters"
|
||||||
class="flex-1 m-0"
|
:class="flexSpecs"
|
||||||
option-label="name"
|
option-label="name"
|
||||||
:placeholder="$t('courseSelection.semesterDropDown')"
|
:placeholder="$t('courseSelection.semesterDropDown')"
|
||||||
@change="getModules()"
|
@change="getModules()"
|
||||||
|
@@ -2,10 +2,16 @@
|
|||||||
import { computed, useSlots } from 'vue';
|
import { computed, useSlots } from 'vue';
|
||||||
|
|
||||||
defineProps<{
|
defineProps<{
|
||||||
hideContent: Boolean,
|
hideContent: boolean,
|
||||||
headline: String,
|
headline: string,
|
||||||
subTitle?: String,
|
subTitle?: string,
|
||||||
icon?: String,
|
icon?: string,
|
||||||
|
button?: {
|
||||||
|
label: string,
|
||||||
|
icon: string,
|
||||||
|
disabled: boolean,
|
||||||
|
onClick: () => void
|
||||||
|
}
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
const slots = useSlots()
|
const slots = useSlots()
|
||||||
@@ -43,9 +49,21 @@ const hasContent = computed(() => {
|
|||||||
>
|
>
|
||||||
<slot
|
<slot
|
||||||
name="selection"
|
name="selection"
|
||||||
class="flex-1 m-0"
|
flexSpecs="flex-1 m-0"
|
||||||
></slot>
|
></slot>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="button"
|
||||||
|
class="flex flex-wrap m-0 mb-3 gap-2 w-full lg:w-8 align-items-center justify-content-end"
|
||||||
|
>
|
||||||
|
<Button
|
||||||
|
:disabled="button.disabled"
|
||||||
|
class="col-12 md:col-4"
|
||||||
|
@click="button.onClick()"
|
||||||
|
:icon="button.icon"
|
||||||
|
:label="button.label"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="hasContent"
|
v-if="hasContent"
|
||||||
:class="
|
:class="
|
||||||
|
@@ -7,6 +7,7 @@ import router from "../router";
|
|||||||
import tokenStore from "../store/tokenStore";
|
import tokenStore from "../store/tokenStore";
|
||||||
import { useToast } from "primevue/usetoast";
|
import { useToast } from "primevue/usetoast";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
|
import DynamicPage from "./DynamicPage.vue";
|
||||||
const { t } = useI18n({ useScope: "global" });
|
const { t } = useI18n({ useScope: "global" });
|
||||||
|
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
@@ -14,10 +15,14 @@ const toast = useToast();
|
|||||||
const token: Ref<string> = ref("");
|
const token: Ref<string> = ref("");
|
||||||
const modules: Ref<Map<string, Module>> = ref(moduleStore().modules);
|
const modules: Ref<Map<string, Module>> = ref(moduleStore().modules);
|
||||||
|
|
||||||
function extractToken(token: string): string {
|
const tokenRegex = /^[a-z0-9]{15}$/;
|
||||||
const tokenRegex = /^[a-z0-9]{15}$/;
|
const tokenUriRegex = /[?&]token=([a-z0-9]{15})(?:&|$)/;
|
||||||
const tokenUriRegex = /[?&]token=([a-z0-9]{15})(?:&|$)/;
|
|
||||||
|
|
||||||
|
const isToken = (token: string): boolean => {
|
||||||
|
return tokenRegex.test(token) || tokenUriRegex.test(token);
|
||||||
|
};
|
||||||
|
|
||||||
|
function extractToken(token: string): string {
|
||||||
if (tokenRegex.test(token)) {
|
if (tokenRegex.test(token)) {
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
@@ -66,43 +71,28 @@ function loadCalendar(): void {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex flex-column align-items-center transition-all transition-duration-500 transition-ease-in-out md:mt-8 mb-7">
|
<DynamicPage
|
||||||
<div class="flex align-items-center justify-content-center gap-2 mx-2">
|
hideContent
|
||||||
<h3 class="text-4xl">
|
:headline="$t('editCalendarView.headline')"
|
||||||
{{ $t("editCalendarView.headline") }}
|
:subTitle="$t('editCalendarView.subTitle')"
|
||||||
</h3>
|
icon="pi pi-pencil"
|
||||||
<i
|
:button="{
|
||||||
class="pi pi-pencil"
|
label: $t('editCalendarView.loadCalendar'),
|
||||||
style="font-size: 2rem"
|
icon: 'pi pi-arrow-down',
|
||||||
></i>
|
disabled: !isToken(token),
|
||||||
</div>
|
onClick: loadCalendar
|
||||||
<div
|
}"
|
||||||
class="flex justify-content-center"
|
>
|
||||||
>
|
<template #selection="{ flexSpecs }">
|
||||||
<p class="text-2xl m-2">{{ $t("editCalendarView.subTitle") }}</p>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
class="flex align-items-center justify-content-center m-4 w-full lg:w-8"
|
|
||||||
>
|
|
||||||
<InputText
|
<InputText
|
||||||
v-model="token"
|
v-model="token"
|
||||||
type="text"
|
type="text"
|
||||||
class="w-full"
|
:class="flexSpecs"
|
||||||
autofocus
|
autofocus
|
||||||
@keyup.enter="loadCalendar"
|
@keyup.enter="loadCalendar"
|
||||||
/>
|
/>
|
||||||
</div>
|
</template>
|
||||||
<div
|
</DynamicPage>
|
||||||
class="flex align-items-center justify-content-end m-2 w-full lg:w-8"
|
|
||||||
>
|
|
||||||
<Button
|
|
||||||
:label="$t('editCalendarView.loadCalendar')"
|
|
||||||
icon="pi pi-arrow-down"
|
|
||||||
class="col-12 md:col-4 mb-3 align-self-end"
|
|
||||||
@click="loadCalendar"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
|
Reference in New Issue
Block a user