115 refactoring dynamic page

This commit is contained in:
survellow
2023-12-26 20:28:57 +01:00
parent 0b695e6a78
commit dcb6a90fb6
6 changed files with 62 additions and 56 deletions

View File

@@ -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"

View File

@@ -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",

View File

@@ -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",

View File

@@ -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()"

View File

@@ -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="

View File

@@ -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>