Merge pull request #1484 from ae-utbm/edt-msg

show the broken line on timetable parsing error
This commit is contained in:
thomas girod
2026-09-09 07:19:13 +02:00
committed by GitHub
4 changed files with 37 additions and 19 deletions
+12 -1
View File
@@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-04 11:24+0200\n" "POT-Creation-Date: 2026-09-08 23:36+0200\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n" "Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@@ -5852,6 +5852,17 @@ msgstr "les groupes pouvant créer des cotisations"
msgid "Timetable generator" msgid "Timetable generator"
msgstr "Générateur d'emploi du temps" msgstr "Générateur d'emploi du temps"
#: timetable/templates/timetable/generator.jinja
msgid ""
"Wrong timetable format. Make sure you copied if from your student folder."
msgstr ""
"Mauvais format d'emploi du temps. Assurez-vous que vous l'avez copié depuis "
"votre dossier étudiant."
#: timetable/templates/timetable/generator.jinja
msgid "Incorrect row"
msgstr "Ligne incorrecte"
#: timetable/templates/timetable/generator.jinja #: timetable/templates/timetable/generator.jinja
msgid "Generate" msgid "Generate"
msgstr "Générer" msgstr "Générer"
+3 -9
View File
@@ -7,7 +7,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-17 10:03+0200\n" "POT-Creation-Date: 2026-09-08 23:36+0200\n"
"PO-Revision-Date: 2024-09-17 11:54+0200\n" "PO-Revision-Date: 2024-09-17 11:54+0200\n"
"Last-Translator: Sli <antoine@bartuccio.fr>\n" "Last-Translator: Sli <antoine@bartuccio.fr>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@@ -22,8 +22,8 @@ msgid ""
"You're going to remove your own role from the presidency. You may lock " "You're going to remove your own role from the presidency. You may lock "
"yourself out of this page. Do you want to continue ? " "yourself out of this page. Do you want to continue ? "
msgstr "" msgstr ""
"Vous vous apprêtez à retirer votre propre rôle de la présidence. Vous risquez " "Vous vous apprêtez à retirer votre propre rôle de la présidence. Vous "
"de perdre l'accès à cette page. Voulez-vous continuer ?" "risquez de perdre l'accès à cette page. Voulez-vous continuer ?"
#: com/static/bundled/com/components/ics-calendar-index.ts #: com/static/bundled/com/components/ics-calendar-index.ts
msgid "More info" msgid "More info"
@@ -279,9 +279,3 @@ msgstr "Il n'a pas été possible de modérer l'image"
msgid "Couldn't delete picture" msgid "Couldn't delete picture"
msgstr "Il n'a pas été possible de supprimer l'image" msgstr "Il n'a pas été possible de supprimer l'image"
#: timetable/static/bundled/timetable/generator-index.ts
msgid ""
"Wrong timetable format. Make sure you copied if from your student folder."
msgstr ""
"Mauvais format d'emploi du temps. Assurez-vous que vous l'avez copié depuis "
"votre dossier étudiant."
@@ -59,7 +59,7 @@ function parseSlots(s: string): TimetableSlot[] {
.map((row: string) => { .map((row: string) => {
const parsed = TIMETABLE_ROW_RE.exec(row); const parsed = TIMETABLE_ROW_RE.exec(row);
if (!parsed?.groups) { 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 const [startHour, startMin] = parsed.groups.startHour
.split(":") .split(":")
@@ -78,7 +78,7 @@ function parseSlots(s: string): TimetableSlot[] {
document.addEventListener("alpine:init", () => { document.addEventListener("alpine:init", () => {
Alpine.data("timetableGenerator", () => ({ Alpine.data("timetableGenerator", () => ({
content: DEFAULT_TIMETABLE, content: DEFAULT_TIMETABLE,
error: "", error: null as { incorrectRow?: string },
displayedWeekdays: [] as WeekDay[], displayedWeekdays: [] as WeekDay[],
courses: [] as TimetableSlot[], courses: [] as TimetableSlot[],
startSlot: 0, startSlot: 0,
@@ -106,10 +106,9 @@ document.addEventListener("alpine:init", () => {
generate() { generate() {
try { try {
this.courses = parseSlots(this.content); this.courses = parseSlots(this.content);
} catch { this.error = null;
this.error = gettext( } catch (err) {
"Wrong timetable format. Make sure you copied if from your student folder.", this.error = { incorrectRow: err?.cause?.row };
);
return; return;
} }
+17 -3
View File
@@ -16,9 +16,23 @@
<div x-data="timetableGenerator"> <div x-data="timetableGenerator">
<form @submit.prevent="generate()"> <form @submit.prevent="generate()">
<h1>Générateur d'emploi du temps</h1> <h1>Générateur d'emploi du temps</h1>
<div class="alert alert-red" x-show="!!error" x-cloak> <template x-if="error !== null" x-cloak>
<span class="alert-main" x-text="error"></span> <div class="alert alert-red">
</div> <div class="alert-main">
<p>
{% trans trimmed %}
Wrong timetable format. Make sure you copied if from your student folder.
{% endtrans %}
</p>
<template x-if="!!error.incorrectRow">
<p>
{% trans %}Incorrect row{% endtrans %} :
<code x-text="error.incorrectRow"></code>
</p>
</template>
</div>
</div>
</template>
<div class="form-group"> <div class="form-group">
<label for="timetable-input">Colle ton emploi du temps (sans l'entête)</label> <label for="timetable-input">Colle ton emploi du temps (sans l'entête)</label>
<textarea id="timetable-input" cols="30" rows="15" x-model="content"></textarea> <textarea id="timetable-input" cols="30" rows="15" x-model="content"></textarea>