|
@@ -6,22 +6,26 @@ import {
|
|
|
dayMap,
|
|
dayMap,
|
|
|
englishClassRe,
|
|
englishClassRe,
|
|
|
firstPhaseClassRe,
|
|
firstPhaseClassRe,
|
|
|
|
|
+ parsePDFVersion,
|
|
|
toTime,
|
|
toTime,
|
|
|
} from "../helpers";
|
|
} from "../helpers";
|
|
|
import {
|
|
import {
|
|
|
- TaughtClass,
|
|
|
|
|
ClassSelectorColumn,
|
|
ClassSelectorColumn,
|
|
|
Ordering,
|
|
Ordering,
|
|
|
FilterRule,
|
|
FilterRule,
|
|
|
ModuleLanguages,
|
|
ModuleLanguages,
|
|
|
ClassesVersion,
|
|
ClassesVersion,
|
|
|
- SemesterConfiguration,
|
|
|
|
|
} from "../types";
|
|
} from "../types";
|
|
|
import { useClassVersionStore } from "./ClassVersion";
|
|
import { useClassVersionStore } from "./ClassVersion";
|
|
|
import { useModulesStore } from "./modules";
|
|
import { useModulesStore } from "./modules";
|
|
|
import { usePlanningStore } from "./planning";
|
|
import { usePlanningStore } from "./planning";
|
|
|
import { useStateStore } from "./state";
|
|
import { useStateStore } from "./state";
|
|
|
import { useStudenthubStore } from "./studenthub";
|
|
import { useStudenthubStore } from "./studenthub";
|
|
|
|
|
+import { getBlockmodules } from "../api/modules/semesters/blockmodules";
|
|
|
|
|
+import { TaughtClass } from "../api/types/semesters/versions/class";
|
|
|
|
|
+import { getClasses } from "../api/modules/semesters/versions/classes";
|
|
|
|
|
+import { getConfig } from "../api/modules/semesters/config";
|
|
|
|
|
+import { SemesterConfiguration } from "../api/types/semesters/config";
|
|
|
|
|
|
|
|
// eslint-disable-next-line
|
|
// eslint-disable-next-line
|
|
|
type SortingFunction = (o1: any, o2: any) => number;
|
|
type SortingFunction = (o1: any, o2: any) => number;
|
|
@@ -106,7 +110,7 @@ export const useClassesStore = defineStore("classes", {
|
|
|
|
|
|
|
|
if (column == ClassSelectorColumn.Time) {
|
|
if (column == ClassSelectorColumn.Time) {
|
|
|
transformedRules[column].forEach((rule) =>
|
|
transformedRules[column].forEach((rule) =>
|
|
|
- foundClasses.push(...filterTimeColumn(classes, rule)),
|
|
|
|
|
|
|
+ foundClasses.push(...filterTimeColumn(classes, rule))
|
|
|
);
|
|
);
|
|
|
classes = [...new Set(foundClasses)];
|
|
classes = [...new Set(foundClasses)];
|
|
|
return;
|
|
return;
|
|
@@ -122,7 +126,7 @@ export const useClassesStore = defineStore("classes", {
|
|
|
}
|
|
}
|
|
|
didFilter = true;
|
|
didFilter = true;
|
|
|
foundClasses.push(
|
|
foundClasses.push(
|
|
|
- ...classes.filter((c) => c.degree_prg == rule.filterData.degree),
|
|
|
|
|
|
|
+ ...classes.filter((c) => c.degree_prg == rule.filterData.degree)
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -142,8 +146,8 @@ export const useClassesStore = defineStore("classes", {
|
|
|
(c) =>
|
|
(c) =>
|
|
|
c.name.toLowerCase().includes(term) ||
|
|
c.name.toLowerCase().includes(term) ||
|
|
|
(checkName &&
|
|
(checkName &&
|
|
|
- c.module?.name.toLocaleLowerCase().includes(term)),
|
|
|
|
|
- ),
|
|
|
|
|
|
|
+ c.module?.name.toLocaleLowerCase().includes(term))
|
|
|
|
|
+ )
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
break;
|
|
break;
|
|
@@ -167,7 +171,7 @@ export const useClassesStore = defineStore("classes", {
|
|
|
if (term.length == 0) return;
|
|
if (term.length == 0) return;
|
|
|
didFilter = true;
|
|
didFilter = true;
|
|
|
foundClasses.push(
|
|
foundClasses.push(
|
|
|
- ...classes.filter((c) => c.class.toLowerCase().includes(term)),
|
|
|
|
|
|
|
+ ...classes.filter((c) => c.class.toLowerCase().includes(term))
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
break;
|
|
break;
|
|
@@ -179,8 +183,8 @@ export const useClassesStore = defineStore("classes", {
|
|
|
didFilter = true;
|
|
didFilter = true;
|
|
|
foundClasses.push(
|
|
foundClasses.push(
|
|
|
...classes.filter((c) =>
|
|
...classes.filter((c) =>
|
|
|
- c.teachers.join().toLowerCase().includes(term),
|
|
|
|
|
- ),
|
|
|
|
|
|
|
+ c.teachers.join().toLowerCase().includes(term)
|
|
|
|
|
+ )
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
break;
|
|
break;
|
|
@@ -192,8 +196,8 @@ export const useClassesStore = defineStore("classes", {
|
|
|
didFilter = true;
|
|
didFilter = true;
|
|
|
foundClasses.push(
|
|
foundClasses.push(
|
|
|
...classes.filter(
|
|
...classes.filter(
|
|
|
- (c) => c.teaching_type == rule.filterData.teachingType,
|
|
|
|
|
- ),
|
|
|
|
|
|
|
+ (c) => c.teaching_type == rule.filterData.teachingType
|
|
|
|
|
+ )
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
break;
|
|
break;
|
|
@@ -213,7 +217,7 @@ export const useClassesStore = defineStore("classes", {
|
|
|
return cd.degreePrograms;
|
|
return cd.degreePrograms;
|
|
|
},
|
|
},
|
|
|
currentData(): ClassesVersion | null {
|
|
currentData(): ClassesVersion | null {
|
|
|
- const version = this.cvStore.semVer;
|
|
|
|
|
|
|
+ const version = this.cvStore.semVerString;
|
|
|
if (version == null) return null;
|
|
if (version == null) return null;
|
|
|
if (!(version in this.data)) {
|
|
if (!(version in this.data)) {
|
|
|
console.error(`The version ${version} has not yet been loaded!`);
|
|
console.error(`The version ${version} has not yet been loaded!`);
|
|
@@ -225,9 +229,9 @@ export const useClassesStore = defineStore("classes", {
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
actions: {
|
|
actions: {
|
|
|
- fetchData(version: string | null = null): Promise<null> {
|
|
|
|
|
|
|
+ fetchData(version: string | null = null): Promise<null> | undefined {
|
|
|
if (version == null) {
|
|
if (version == null) {
|
|
|
- version = this.cvStore.semVer;
|
|
|
|
|
|
|
+ version = this.cvStore.semVerString;
|
|
|
|
|
|
|
|
if (version == null) {
|
|
if (version == null) {
|
|
|
// console.error("The current semester/version was unexpectedly null!");
|
|
// console.error("The current semester/version was unexpectedly null!");
|
|
@@ -239,9 +243,9 @@ export const useClassesStore = defineStore("classes", {
|
|
|
if (version in this.data)
|
|
if (version in this.data)
|
|
|
return this.data[version].ready ?? new Promise((res, rej) => rej);
|
|
return this.data[version].ready ?? new Promise((res, rej) => rej);
|
|
|
|
|
|
|
|
- const semVer = version;
|
|
|
|
|
- this.data[semVer] = {
|
|
|
|
|
- version: semVer,
|
|
|
|
|
|
|
+ const semVerStr = version;
|
|
|
|
|
+ this.data[semVerStr] = {
|
|
|
|
|
+ version: semVerStr,
|
|
|
ready: null,
|
|
ready: null,
|
|
|
loaded: false,
|
|
loaded: false,
|
|
|
teachers: [],
|
|
teachers: [],
|
|
@@ -254,13 +258,18 @@ export const useClassesStore = defineStore("classes", {
|
|
|
config: { blockclass_file: "block.pdf" },
|
|
config: { blockclass_file: "block.pdf" },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- const semVerFolder = this.cvStore.semVerFolderFromSemVer(semVer);
|
|
|
|
|
- const semesterFolder = this.cvStore.semesterFolderFromSemVer(semVer);
|
|
|
|
|
|
|
+ const semVer = parsePDFVersion(semVerStr);
|
|
|
|
|
+ if (semVer === undefined) {
|
|
|
|
|
+ console.error(
|
|
|
|
|
+ `Failed to find the semester in the given string: ${version}`
|
|
|
|
|
+ );
|
|
|
|
|
+ return undefined;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- this.data[semVer].ready = new Promise((resolve, reject) => {
|
|
|
|
|
- const fe = fetch(`${semVerFolder}/classes.json`);
|
|
|
|
|
- const bc = fetch(`${semesterFolder}/blockclasses.json`);
|
|
|
|
|
- const sc = fetch(`${semesterFolder}/config.json`);
|
|
|
|
|
|
|
+ this.data[semVerStr].ready = new Promise((resolve, reject) => {
|
|
|
|
|
+ const fe = getClasses(semVer);
|
|
|
|
|
+ const bc = getBlockmodules(semVer);
|
|
|
|
|
+ const sc = getConfig(semVer);
|
|
|
const modulesStore = useModulesStore();
|
|
const modulesStore = useModulesStore();
|
|
|
|
|
|
|
|
const addModuleGetters = (cls: TaughtClass) => {
|
|
const addModuleGetters = (cls: TaughtClass) => {
|
|
@@ -290,15 +299,14 @@ export const useClassesStore = defineStore("classes", {
|
|
|
*/
|
|
*/
|
|
|
const bmReady = new Promise((resolveBM) => {
|
|
const bmReady = new Promise((resolveBM) => {
|
|
|
Promise.all([bc, modulesStore.ready])
|
|
Promise.all([bc, modulesStore.ready])
|
|
|
- .then((response) => response[0].json())
|
|
|
|
|
- .then((data: TaughtClass[]) => {
|
|
|
|
|
|
|
+ .then(([data]: [TaughtClass[], unknown]) => {
|
|
|
data.forEach(addModuleGetters);
|
|
data.forEach(addModuleGetters);
|
|
|
- this.data[semVer].blockClasses = data;
|
|
|
|
|
|
|
+ this.data[semVerStr].blockClasses = data;
|
|
|
resolveBM(null);
|
|
resolveBM(null);
|
|
|
})
|
|
})
|
|
|
.catch((error) => {
|
|
.catch((error) => {
|
|
|
console.error(error);
|
|
console.error(error);
|
|
|
- this.data[semVer].blockClasses = [];
|
|
|
|
|
|
|
+ this.data[semVerStr].blockClasses = [];
|
|
|
resolveBM(null); // We will resolve and not reject, as it's okay to not have a blockmodules.json on the server
|
|
resolveBM(null); // We will resolve and not reject, as it's okay to not have a blockmodules.json on the server
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
@@ -308,15 +316,14 @@ export const useClassesStore = defineStore("classes", {
|
|
|
*/
|
|
*/
|
|
|
const scReady = new Promise((resolveSC) => {
|
|
const scReady = new Promise((resolveSC) => {
|
|
|
Promise.all([sc, modulesStore.ready])
|
|
Promise.all([sc, modulesStore.ready])
|
|
|
- .then((response) => response[0].json())
|
|
|
|
|
- .then((data: SemesterConfiguration) => {
|
|
|
|
|
- this.data[semVer].config = data;
|
|
|
|
|
|
|
+ .then(([data]: [SemesterConfiguration, unknown]) => {
|
|
|
|
|
+ this.data[semVerStr].config = data;
|
|
|
resolveSC(null);
|
|
resolveSC(null);
|
|
|
})
|
|
})
|
|
|
.catch((error) => {
|
|
.catch((error) => {
|
|
|
console.error(error);
|
|
console.error(error);
|
|
|
- this.data[semVer].config = { blockclass_file: "block.pdf" };
|
|
|
|
|
- resolveSC(null); // We will resolve and not reject, as it's okay to not have a blockmodules.json on the server
|
|
|
|
|
|
|
+ this.data[semVerStr].config = { blockclass_file: "block.pdf" };
|
|
|
|
|
+ resolveSC(null); // We will resolve and not reject, as it's okay to not have a config.json on the server
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -324,13 +331,12 @@ export const useClassesStore = defineStore("classes", {
|
|
|
* Process the standard classes
|
|
* Process the standard classes
|
|
|
*/
|
|
*/
|
|
|
Promise.all([fe, bmReady, scReady, modulesStore.ready])
|
|
Promise.all([fe, bmReady, scReady, modulesStore.ready])
|
|
|
- .then((response) => (response[0] as Response).json())
|
|
|
|
|
- .then((data: TaughtClass[]) => {
|
|
|
|
|
|
|
+ .then(([data]: [TaughtClass[], unknown, unknown, unknown]) => {
|
|
|
data.forEach(addModuleGetters);
|
|
data.forEach(addModuleGetters);
|
|
|
- this.data[semVer].taughtClasses = data;
|
|
|
|
|
- this.updateUniqueDegreePrograms(semVer);
|
|
|
|
|
|
|
+ this.data[semVerStr].taughtClasses = data;
|
|
|
|
|
+ this.updateUniqueDegreePrograms(semVerStr);
|
|
|
|
|
|
|
|
- this.data[semVer].loaded = true;
|
|
|
|
|
|
|
+ this.data[semVerStr].loaded = true;
|
|
|
|
|
|
|
|
const planningStore = usePlanningStore();
|
|
const planningStore = usePlanningStore();
|
|
|
planningStore.loadFromStorage();
|
|
planningStore.loadFromStorage();
|
|
@@ -338,7 +344,8 @@ export const useClassesStore = defineStore("classes", {
|
|
|
})
|
|
})
|
|
|
.catch((error) => {
|
|
.catch((error) => {
|
|
|
console.error(error);
|
|
console.error(error);
|
|
|
- this.data[semVer].taughtClasses = [];
|
|
|
|
|
|
|
+ // TODO
|
|
|
|
|
+ this.data[semVerStr].taughtClasses = [];
|
|
|
reject(null);
|
|
reject(null);
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
@@ -354,7 +361,7 @@ export const useClassesStore = defineStore("classes", {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
this.data[version].degreePrograms.sort((a, b) =>
|
|
this.data[version].degreePrograms.sort((a, b) =>
|
|
|
- a.toLowerCase().localeCompare(b.toLowerCase()),
|
|
|
|
|
|
|
+ a.toLowerCase().localeCompare(b.toLowerCase())
|
|
|
);
|
|
);
|
|
|
},
|
|
},
|
|
|
getById(module_id: string): TaughtClass | null {
|
|
getById(module_id: string): TaughtClass | null {
|
|
@@ -464,7 +471,7 @@ export const useClassesStore = defineStore("classes", {
|
|
|
|
|
|
|
|
function filterTimeColumn(
|
|
function filterTimeColumn(
|
|
|
modules: TaughtClass[],
|
|
modules: TaughtClass[],
|
|
|
- filterset: FilterRule,
|
|
|
|
|
|
|
+ filterset: FilterRule
|
|
|
): TaughtClass[] {
|
|
): TaughtClass[] {
|
|
|
const timeData = filterset.filterData as Record<string, number>;
|
|
const timeData = filterset.filterData as Record<string, number>;
|
|
|
const start = timeData.startTime;
|
|
const start = timeData.startTime;
|
|
@@ -482,7 +489,7 @@ function filterTimeColumn(
|
|
|
modules = modules.filter(
|
|
modules = modules.filter(
|
|
|
(m) =>
|
|
(m) =>
|
|
|
((m.weekday ?? 0) == startingDay && m.from >= startingTime) ||
|
|
((m.weekday ?? 0) == startingDay && m.from >= startingTime) ||
|
|
|
- (m.weekday ?? 0) > startingDay,
|
|
|
|
|
|
|
+ (m.weekday ?? 0) > startingDay
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -495,7 +502,7 @@ function filterTimeColumn(
|
|
|
modules = modules.filter(
|
|
modules = modules.filter(
|
|
|
(m) =>
|
|
(m) =>
|
|
|
(m.weekday ?? 0) == startingDay &&
|
|
(m.weekday ?? 0) == startingDay &&
|
|
|
- (endingTime == 0 || m.to <= endingTime),
|
|
|
|
|
|
|
+ (endingTime == 0 || m.to <= endingTime)
|
|
|
);
|
|
);
|
|
|
} else {
|
|
} else {
|
|
|
aEnd *= -1;
|
|
aEnd *= -1;
|
|
@@ -508,7 +515,7 @@ function filterTimeColumn(
|
|
|
(m) =>
|
|
(m) =>
|
|
|
(m.weekday ?? 0) < endingDay ||
|
|
(m.weekday ?? 0) < endingDay ||
|
|
|
((m.weekday ?? 0) == endingDay &&
|
|
((m.weekday ?? 0) == endingDay &&
|
|
|
- (endingTime == 0 || m.to <= endingTime)),
|
|
|
|
|
|
|
+ (endingTime == 0 || m.to <= endingTime))
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|