show the broken line on timetable parsing error

Certains utilisateurs font remonter régulièrement que le générateur ne marche pas. C'est normal, on n'a pas forcément prévu tous les cas et on n'est pas à l'abri des changements de format de l'UTBM.

Ce qui est très embêtant, dans ces cas-là, c'est qu'on donne très peu d'informations sur ce qui n'a pas marché, et que les utilisateurs peuvent difficilement faire remonter plus que ça.

En décrivant la ligne qui n'a pas pu être parsée, ça devrait déjà rendre la gestion de ce genre de problème un peu plus facile, tout en étant plus transparent pour l'utilisateur
This commit is contained in:
imperosol
2026-09-08 23:49:04 +02:00
parent 564baf3b56
commit ecaef644b3
4 changed files with 37 additions and 19 deletions
@@ -59,7 +59,7 @@ function parseSlots(s: string): TimetableSlot[] {
.map((row: string) => {
const parsed = TIMETABLE_ROW_RE.exec(row);
if (!parsed?.groups) {
throw new Error(`Couldn't parse row ${row}`);
throw new Error(`Couldn't parse row ${row}`, { cause: { row: row } });
}
const [startHour, startMin] = parsed.groups.startHour
.split(":")
@@ -78,7 +78,7 @@ function parseSlots(s: string): TimetableSlot[] {
document.addEventListener("alpine:init", () => {
Alpine.data("timetableGenerator", () => ({
content: DEFAULT_TIMETABLE,
error: "",
error: null as { incorrectRow?: string },
displayedWeekdays: [] as WeekDay[],
courses: [] as TimetableSlot[],
startSlot: 0,
@@ -106,10 +106,9 @@ document.addEventListener("alpine:init", () => {
generate() {
try {
this.courses = parseSlots(this.content);
} catch {
this.error = gettext(
"Wrong timetable format. Make sure you copied if from your student folder.",
);
this.error = null;
} catch (err) {
this.error = { incorrectRow: err?.cause?.row };
return;
}