103 lines
2.9 KiB
JavaScript
103 lines
2.9 KiB
JavaScript
import { computed } from "@vue/reactivity";
|
|
import { ref, watch } from "vue";
|
|
|
|
export const substitutionFilter = ref(
|
|
localStorage.getItem("substitutionFilter") || "all"
|
|
);
|
|
export const timetableClass = ref(
|
|
localStorage.getItem("timetableClass") || "none"
|
|
);
|
|
|
|
watch(substitutionFilter, (newValue) => {
|
|
if (newValue == "other") {
|
|
newValue = prompt("Please enter a class to filter (e.g. 9C)");
|
|
}
|
|
localStorage.setItem("substitutionFilter", newValue);
|
|
fetchData();
|
|
});
|
|
watch(timetableClass, (newValue) => {
|
|
localStorage.setItem("timetableClass", newValue);
|
|
fetchData();
|
|
});
|
|
|
|
export const timetable = ref([]);
|
|
export const substitutions = ref([]);
|
|
export const history = ref([]);
|
|
export const classList = ref([]);
|
|
|
|
export const historyOfDate = computed(() => {
|
|
const dates = {};
|
|
for (const entry of history.value) {
|
|
const date = entry.date;
|
|
if (!dates[date]) dates[date] = [];
|
|
dates[entry.date].push(entry);
|
|
}
|
|
return dates;
|
|
});
|
|
|
|
export const substitutionsForDate = computed(() => {
|
|
const dates = {};
|
|
for (const substitution of substitutions.value) {
|
|
const date = substitution.date;
|
|
if (!dates[date]) dates[date] = [];
|
|
dates[substitution.date].push(substitution);
|
|
}
|
|
return sortObject(dates);
|
|
});
|
|
|
|
export const parsedTimetable = computed(() => {
|
|
return timetable.value.map((day) => {
|
|
const newDay = [];
|
|
for (const lesson of day) {
|
|
const lessonLength = lesson.length || 1;
|
|
delete lesson.length;
|
|
for (var i = 0; i < lessonLength; i++) newDay.push(lesson);
|
|
}
|
|
return newDay;
|
|
});
|
|
});
|
|
|
|
export async function fetchData() {
|
|
const baseUrl = "http://localhost:3000/api";
|
|
const timetableResponse = await fetch(
|
|
`${baseUrl}/timetable?class=${timetableClass.value}`
|
|
);
|
|
const timetableData = await timetableResponse.json();
|
|
if (timetableData.error) {
|
|
console.warn("API Error: " + timetableData.error);
|
|
timetable.value = [];
|
|
} else timetable.value = timetableData;
|
|
|
|
const substitutionResponse = await fetch(
|
|
substitutionFilter.value == "all"
|
|
? `${baseUrl}/substitutions`
|
|
: `${baseUrl}/substitutions?class=${substitutionFilter.value}`
|
|
);
|
|
const substitutionData = await substitutionResponse.json();
|
|
substitutions.value = substitutionData;
|
|
|
|
const historyResponse = await fetch(
|
|
substitutionFilter.value == "all"
|
|
? `${baseUrl}/history`
|
|
: `${baseUrl}/history?class=${substitutionFilter.value}`
|
|
);
|
|
const historyData = await historyResponse.json();
|
|
if (historyData.error) console.warn("API Error: " + historyData.error);
|
|
else history.value = historyData;
|
|
|
|
const classListResponse = await fetch(`${baseUrl}/classes`);
|
|
const classListData = await classListResponse.json();
|
|
classList.value = classListData;
|
|
}
|
|
|
|
fetchData();
|
|
|
|
function sortObject(obj) {
|
|
return Object.keys(obj)
|
|
.sort()
|
|
.reduce(function (result, key) {
|
|
result[key] = obj[key];
|
|
return result;
|
|
}, {});
|
|
}
|