diff --git a/src/App.vue b/src/App.vue index 4e99256..919a8eb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -41,7 +41,7 @@ const isDataView = computed(() => route.meta.dataView || false); :error="loadingFailed" />
-
+
route.meta.dataView || false); @changeDate="(date) => (changeDate = date)" v-show="isDataView" /> -
- -
-
+
+
+ +
+
+
@@ -90,15 +92,20 @@ body { } main { - width: 100%; - max-width: 900px; + height: 100%; overflow: hidden; display: grid; - grid-template-rows: auto 1fr; + grid-template-rows: 1fr; } diff --git a/src/components/lesson-group-list.vue b/src/components/lesson-group-list.vue new file mode 100644 index 0000000..9db783f --- /dev/null +++ b/src/components/lesson-group-list.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/settings/editor-navbar.vue b/src/components/settings/editor-navbar.vue new file mode 100644 index 0000000..3821939 --- /dev/null +++ b/src/components/settings/editor-navbar.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/timetable-list.vue b/src/components/timetable-list.vue index b2db22c..478f55e 100644 --- a/src/components/timetable-list.vue +++ b/src/components/timetable-list.vue @@ -42,7 +42,7 @@ const linkedTimetable = computed(() => {
diff --git a/src/router/index.js b/src/router/index.js index 883e7c9..5bcfb66 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -9,6 +9,7 @@ import LoginView from "@/views/LoginView.vue"; import TokenView from "@/views/TokenView.vue"; import FilteringSettings from "@/views/settings/FilteringSettings.vue"; import TimetableSettings from "@/views/settings/TimetableSettings.vue"; +import TimetableEditor from "@/views/settings/TimetableEditor.vue"; import TimetableGroupSettings from "@/views/settings/TimetableGroupSettings.vue"; import AppearanceSettings from "@/views/settings/AppearanceSettings.vue"; import AboutPage from "@/views/settings/AboutPage.vue"; @@ -76,6 +77,14 @@ const router = createRouter({ }, ], }, + { + path: "/settings/timetable/edit/:id?", + name: "title.editTimetable", + component: TimetableEditor, + meta: { + hideNav: true, + }, + }, { path: "/login", name: "title.login", diff --git a/src/store.js b/src/store.js index 8216e6d..34c2255 100644 --- a/src/store.js +++ b/src/store.js @@ -34,9 +34,13 @@ watch( }, { deep: true } ); -watch(localTimetables, (newValue) => { - localStorage.setItem("timetables", JSON.stringify(newValue)); -}); +watch( + localTimetables, + (newValue) => { + localStorage.setItem("timetables", JSON.stringify(newValue)); + }, + { deep: true } +); watch(theme, (newValue) => { localStorage.setItem("theme", newValue); }); @@ -186,7 +190,7 @@ export const parsedTimetable = computed(() => { let usedLesson = { ...lesson }; // Check if lesson has multiple options // (timetable groups) - if (Array.isArray(lesson)) { + if (Array.isArray(lesson) && lesson.length > 1) { let matchingLesson = lesson.find((e) => timetableGroups.value.includes(e.group) ); @@ -200,6 +204,8 @@ export const parsedTimetable = computed(() => { }; } usedLesson = { ...matchingLesson }; + } else if (Array.isArray(lesson)) { + usedLesson = { ...lesson[0] }; } // Duplicate the lesson if its length is > 1 for it // to show up multiple times in the timetable view @@ -220,7 +226,7 @@ export const possibleTimetableGroups = computed(() => { for (const lesson of day) { if (Array.isArray(lesson)) { for (const group of lesson) { - if (!foundTimetableGroups.includes(group.group)) { + if (group.group && !foundTimetableGroups.includes(group.group)) { foundTimetableGroups.push(group.group); } } diff --git a/src/strings.js b/src/strings.js index 2badfc3..91c2eeb 100644 --- a/src/strings.js +++ b/src/strings.js @@ -6,6 +6,7 @@ export const strings = { history: "History", login: "Login", token: "Token", + editTimetable: "Edit Timetable", settings: { main: "Settings", filtering: "Filtering", @@ -28,6 +29,7 @@ export const strings = { text: { filtering: "Select a class here so the correct timetable is used and only relevant substitutions are shown.", + createTimetable: "Create a new Timetable", timetableGroups: "A timetable group defines, which lesson should be displayed, and which substitution should be shown if there are multiple possibilities for a single lesson within one class.", language: "Change the language of all texts in the application.", @@ -110,6 +112,9 @@ export const strings = { token: { header: "Generate API-Token", }, + editor: { + newLesson: "Create new Lesson", + }, }, de: { title: { @@ -117,6 +122,7 @@ export const strings = { substitutions: "Vertretungsplan", history: "Verlauf", login: "Anmelden", + editTimetable: "Stundenplan Editieren", settings: { main: "Einstellungen", filtering: "Filter", @@ -139,6 +145,7 @@ export const strings = { text: { filtering: "Wähle hier deine Klasse aus, damit du deinen Stundenplan angezeigt bekommst und du nur relevante Vertretungen siehst.", + createTimetable: "Neuen Stundenplan erstellen", timetableGroups: "Stundenplan-Gruppen legen fest, welche Stundenplan-Daten du angezeigt bekommst, wenn es mehrere Möglichkeiten für eine Stunde gibt.", language: "Ändere die Sprache aller Texte dieser Anwendung.", @@ -220,5 +227,8 @@ export const strings = { "An den Vertretungen für diesen Tag wurde noch nichts geändert", }, }, + editor: { + newLesson: "Neue Stunde hinzufügen", + }, }, }; diff --git a/src/views/settings/TimetableEditor.vue b/src/views/settings/TimetableEditor.vue new file mode 100644 index 0000000..44452e4 --- /dev/null +++ b/src/views/settings/TimetableEditor.vue @@ -0,0 +1,221 @@ + + + + + + + diff --git a/src/views/settings/TimetableSettings.vue b/src/views/settings/TimetableSettings.vue index d04b6d7..5bca1c3 100644 --- a/src/views/settings/TimetableSettings.vue +++ b/src/views/settings/TimetableSettings.vue @@ -1,6 +1,7 @@