Add support for multiple remote timetables

- Add timetable "title" column to db
- Make API return array of timetables
- Add settings page for selecting a timetable
- Add InfoCard if no timetable is selected
This commit is contained in:
2023-06-18 14:30:36 +02:00
parent dac0d09167
commit 48364d4c59
10 changed files with 176 additions and 30 deletions

View File

@ -10,6 +10,7 @@ export const loadingFailed = ref(false);
/* Preferences */
export const classFilter = ref(localStorage.getItem("classFilter") || "none");
export const timetableId = ref(localStorage.getItem("timetableId") || "none");
export const timetableGroups = ref(
JSON.parse(localStorage.getItem("timetableGroups") || "[]")
);
@ -20,6 +21,9 @@ watch(classFilter, (newValue) => {
localStorage.setItem("classFilter", newValue);
fetchData(getNextAndPrevDay(selectedDate.value), false);
});
watch(timetableId, (newValue) => {
localStorage.setItem("timetableId", newValue);
});
watch(
timetableGroups,
(newValue) => {
@ -47,7 +51,14 @@ export const changeDay = ref(0);
export const changeDate = ref(new Date());
/* Data store */
export const timetable = ref({ trusted: true });
export const timetable = computed(() => {
const selectedTimetable = timetables.value.find(
(e) => e.id == timetableId.value
);
return selectedTimetable || { trusted: true, source: "", data: [] };
});
export const timetables = ref([]);
export const times = ref([]);
export const substitutions = ref({});
export const history = ref({});
export const classList = ref([]);
@ -92,7 +103,7 @@ export async function fetchData(days, partial) {
if (!partial) {
await fetchClassList();
loadingProgress.value = step++ / steps;
await fetchTimetable();
await fetchTimetables();
loadingProgress.value = step++ / steps;
}
for (const day of days) {
@ -117,15 +128,18 @@ export async function fetchClassList() {
classList.value = classListData;
}
export async function fetchTimetable() {
export async function fetchTimetables() {
const timetableResponse = await fetch(
`${baseUrl}/timetable?class=${classFilter.value}`
);
const timetableData = await timetableResponse.json();
if (timetableData.error) {
console.warn("API Error: " + timetableData.error);
timetable.value = { trusted: true, source: "", data: [] };
} else timetable.value = timetableData;
timetables.value = [];
} else {
timetables.value = timetableData.timetables;
times.value = timetableData.times;
}
}
export async function fetchSubstitutions(day) {