diff --git a/frontend/src/components/AdditionalModuleTable.vue b/frontend/src/components/AdditionalModuleTable.vue new file mode 100644 index 0000000..7c0bf0f --- /dev/null +++ b/frontend/src/components/AdditionalModuleTable.vue @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ + t('additionalModules.footerModulesSelected', { count: store?.countModules() ?? 0 }) + }} + + + + + + + diff --git a/frontend/src/components/ModuleSelection.vue b/frontend/src/components/ModuleSelection.vue index 44bc02d..28c01e8 100644 --- a/frontend/src/components/ModuleSelection.vue +++ b/frontend/src/components/ModuleSelection.vue @@ -2,7 +2,6 @@ import { computed, ComputedRef, PropType } from "vue"; import { Module } from "../model/module.ts"; import moduleStore from "../store/moduleStore"; -import router from "../router"; const store = moduleStore(); const props = defineProps({ @@ -40,21 +39,10 @@ function toggleModule(module: Module) { store.addModule(module); } } - -function nextStep() { - router.push("/additional-modules"); -} - - + -import { defineAsyncComponent, ref, Ref } from "vue"; -import { Module } from "../../model/module.ts"; -import { fetchAllModules } from "../../api/fetchCourse.ts"; -import moduleStore from "../../store/moduleStore"; -import { MultiSelectAllChangeEvent } from "primevue/multiselect"; -import router from "../../router"; -import { fetchModule } from "../../api/fetchModule.ts"; -import { useDialog } from "primevue/usedialog"; -import { useI18n } from "vue-i18n"; - -const dialog = useDialog(); -const { t } = useI18n({ useScope: "global" }); - -const fetchedModules = async () => { - return await fetchAllModules(); -}; - -const modules: Ref = ref([]); - -const selectedModules: Ref = ref([] as Module[]); - -fetchedModules().then( - (data) => - (modules.value = data.map((module: Module) => { - return module; - })), -); - -async function nextStep() { - selectedModules.value.forEach((module: Module) => { - moduleStore().addModule(module); - }); - - await router.push("/edit-calendar"); -} - -const ModuleInformation = defineAsyncComponent( - () => import("../ModuleInformation.vue"), -); - -async function showInfo(module: Module) { - await fetchModule(module).then((data: Module) => { - dialog.open(ModuleInformation, { - props: { - style: { - width: "50vw", - }, - breakpoints: { - "960px": "75vw", - "640px": "90vw", - }, - modal: true, - }, - data: { - module: data, - }, - }); - }); -} - -const display = (module: Module) => module.name + " (" + module.course + ")"; - -const selectAll = ref(false); - -const onSelectAllChange = (event: MultiSelectAllChangeEvent) => { - selectedModules.value = event.checked - ? modules.value.map((module) => module) - : []; - selectAll.value = event.checked; -}; - -function selectChange() { - selectAll.value = selectedModules.value.length === modules.value.length; -} - - - - - - - {{ $t("additionalModules.subTitle") }} - - - - - - - - - {{ display(slotProps.option) }} - - - - - - - - - - - {{ t('additionalModules.footerModulesSelected', { count: selectedModules.length ?? 0 }) }} - - - - - - {{ - $t("additionalModules.nextStep") - }} - - - - - diff --git a/frontend/src/i18n/translations/de.json b/frontend/src/i18n/translations/de.json index a0b7b56..98a02c5 100644 --- a/frontend/src/i18n/translations/de.json +++ b/frontend/src/i18n/translations/de.json @@ -13,6 +13,7 @@ "winterSemester": "Wintersemester", "summerSemester": "Sommersemester", "subTitle": "Bitte wähle eine Gruppe und das Semester aus.", + "nextStep": "Weiter", "courseDropDown": "Gruppe", "noCoursesAvailable": "Keine Gruppen verfügbar", "semesterDropDown": "Semester" @@ -26,7 +27,6 @@ "occupied": "belegt" }, "moduleSelection": { - "nextStep": "Weiter", "selectAll": "Alle anwählen", "deselectAll": "Alle abwählen", "selected": "angewählt", diff --git a/frontend/src/i18n/translations/en.json b/frontend/src/i18n/translations/en.json index e594cbc..bce62ff 100644 --- a/frontend/src/i18n/translations/en.json +++ b/frontend/src/i18n/translations/en.json @@ -13,6 +13,7 @@ "winterSemester": "winter semester", "summerSemester": "summer semester", "subTitle": "please select a course and semester", + "nextStep": "next step", "courseDropDown": "please select a course", "noCoursesAvailable": "no courses listed", "semesterDropDown": "please select a semester" @@ -26,7 +27,6 @@ "occupied": "occupied" }, "moduleSelection": { - "nextStep": "next step", "selectAll": "select all", "deselectAll": "deselect all", "selected": "selected", diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 3f1ff6f..ec53f46 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -8,8 +8,8 @@ const PrivacyPolicy = () => import("../view/PrivacyPolicy.vue"); const RenameModules = () => import("../components/RenameModules.vue"); const RoomFinder = () => import("../view/RoomFinder.vue"); const EditCalendarView = () => import("../view/EditCalendarView.vue"); -const EditAdditionalModules = () => import("../components/editCalendar/EditAdditionalModules.vue"); -const EditModules = () => import("../components/editCalendar/EditModules.vue"); +const EditAdditionalModules = () => import("../view/editCalendar/EditAdditionalModules.vue"); +const EditModules = () => import("../view/editCalendar/EditModules.vue"); const CourseSelection = () => import("../view/CourseSelection.vue"); import i18n from "../i18n"; diff --git a/frontend/src/view/AdditionalModules.vue b/frontend/src/view/AdditionalModules.vue index 79284b3..581dc6d 100644 --- a/frontend/src/view/AdditionalModules.vue +++ b/frontend/src/view/AdditionalModules.vue @@ -1,89 +1,16 @@ @@ -93,100 +20,7 @@ function unselectModule(event: DataTableRowUnselectEvent) { {{ $t("additionalModules.subTitle") }} - - - - - - - - - - - - - - - - - - - - - - - - - - {{ - t('additionalModules.footerModulesSelected', { count: store?.countModules() ?? 0 }) - }} - - - - + - - diff --git a/frontend/src/view/CourseSelection.vue b/frontend/src/view/CourseSelection.vue index 293afb4..6fcf7c0 100644 --- a/frontend/src/view/CourseSelection.vue +++ b/frontend/src/view/CourseSelection.vue @@ -4,9 +4,14 @@ import { fetchCourse, fetchModulesByCourseAndSemester, } from "../api/fetchCourse"; +import DynamicPage from "./DynamicPage.vue"; import ModuleSelection from "../components/ModuleSelection.vue"; import { Module } from "../model/module.ts"; import { useI18n } from "vue-i18n"; +import moduleStore from "../store/moduleStore"; +import router from "../router"; + +const store = moduleStore(); const { t } = useI18n({ useScope: "global" }); const courses = async () => { @@ -52,31 +57,23 @@ async function getModules() { - - - - {{ $t("courseSelection.headline") }} - - - - - {{ $t("courseSelection.subTitle") }} - - + - - - + + + + + diff --git a/frontend/src/view/DynamicPage.vue b/frontend/src/view/DynamicPage.vue new file mode 100644 index 0000000..3bacd16 --- /dev/null +++ b/frontend/src/view/DynamicPage.vue @@ -0,0 +1,81 @@ + + + + + + + {{ headline }} + + + + + {{ subTitle }} + + + + + + + + + + + + diff --git a/frontend/src/view/EditCalendarView.vue b/frontend/src/view/EditCalendarView.vue index 8ef3fe8..68d8462 100644 --- a/frontend/src/view/EditCalendarView.vue +++ b/frontend/src/view/EditCalendarView.vue @@ -7,6 +7,7 @@ import router from "../router"; import tokenStore from "../store/tokenStore"; import { useToast } from "primevue/usetoast"; import { useI18n } from "vue-i18n"; +import DynamicPage from "./DynamicPage.vue"; const { t } = useI18n({ useScope: "global" }); const toast = useToast(); @@ -14,10 +15,14 @@ const toast = useToast(); const token: Ref = ref(""); const modules: Ref> = ref(moduleStore().modules); -function extractToken(token: string): string { - const tokenRegex = /^[a-z0-9]{15}$/; - const tokenUriRegex = /[?&]token=([a-z0-9]{15})(?:&|$)/; +const tokenRegex = /^[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)) { return token; } @@ -66,43 +71,28 @@ function loadCalendar(): void { - - - - {{ $t("editCalendarView.headline") }} - - - - - {{ $t("editCalendarView.subTitle") }} - - + + - - - - - + + diff --git a/frontend/src/view/RoomFinder.vue b/frontend/src/view/RoomFinder.vue index d6b4b45..5cfe131 100644 --- a/frontend/src/view/RoomFinder.vue +++ b/frontend/src/view/RoomFinder.vue @@ -1,6 +1,7 @@ - - - - {{ $t("roomFinderPage.headline") }} - - - - - {{ $t("roomFinderPage.detail") }} - - + - - + + - - + + diff --git a/frontend/src/view/editCalendar/EditAdditionalModules.vue b/frontend/src/view/editCalendar/EditAdditionalModules.vue new file mode 100644 index 0000000..0323e05 --- /dev/null +++ b/frontend/src/view/editCalendar/EditAdditionalModules.vue @@ -0,0 +1,34 @@ + + + + + + + {{ $t("additionalModules.subTitle") }} + + + + + + + + diff --git a/frontend/src/components/editCalendar/EditModules.vue b/frontend/src/view/editCalendar/EditModules.vue similarity index 98% rename from frontend/src/components/editCalendar/EditModules.vue rename to frontend/src/view/editCalendar/EditModules.vue index 6a26b42..8d8c9af 100644 --- a/frontend/src/components/editCalendar/EditModules.vue +++ b/frontend/src/view/editCalendar/EditModules.vue @@ -6,7 +6,7 @@ import { fetchAllModules } from "../../api/fetchCourse.ts"; import {deleteIndividualFeed, saveIndividualFeed} from "../../api/createFeed.ts"; import tokenStore from "../../store/tokenStore"; import router from "../../router"; -import ModuleTemplateDialog from "../ModuleTemplateDialog.vue"; +import ModuleTemplateDialog from "../../components/ModuleTemplateDialog.vue"; import { onlyWhitespace } from "../../helpers/strings.ts"; import { useI18n } from "vue-i18n"; import { useToast } from "primevue/usetoast";
- {{ display(slotProps.option) }} -
{{ $t("editCalendarView.subTitle") }}