diff --git a/server/pruef-modi-katalog.mjs b/server/pruef-modi-katalog.mjs index 5425679d..c7a7c69d 100644 --- a/server/pruef-modi-katalog.mjs +++ b/server/pruef-modi-katalog.mjs @@ -945,6 +945,105 @@ console.log(""); ok(danach.markiert >= 1, "der Katalog markiert sie als uebernommen (" + danach.markiert + ")"); + /* ==== ANPASSEN AM KATALOG -- DORT, WO VANVAN ARBEITET ========= + ============================================================== + + VanVan im Support, Meldung #6: „Es waere gut, wenn man auch + dort die Moeglichkeit haette die Frist anzupassen, sie als + dauerhafte Aufgabe einstellen zu koennen oder eventuell noch + eine Anmerkung hinzufuegen." + + WARUM DIESE ZEILEN HIER STEHEN UND NICHT NUR IN + pruef-aufgaben-vorlagen: Dort wird der CREATOR-Zweig gemessen + -- das Vorlagenbrett auf „Aufgaben", angemeldet als Creator. + VanVan benutzt den KATALOG auf „Eure Aufgaben". Das sind zwei + verschiedene Karten in derselben Datei, und der Knopf haengt + an beiden einzeln. + + Nach dem Einbau war nur der eine Zweig im Browser geprueft. + Beide liefern denselben Haken NICHT: Ein Creator darf + „dauerhaft" nicht setzen, die Leitung schon -- und genau + dieser Unterschied ist hier die Gegenprobe zu dort. + + Dass man sich bei diesen beiden Brettern vertun kann, ist in + diesem Haus schon vorgekommen: In pruef-bewerbung-aufgaben + steht es als Messfehler notiert, „der wie ein Befund + aussieht". */ + const anpassbar = await seite.evaluate(() => ({ + karten: document.querySelectorAll(".vorlagenbrett__karte").length, + knoepfe: document.querySelectorAll(".vorlagenbrett__anpassen").length, + })); + ok(anpassbar.karten > 0 && anpassbar.knoepfe === anpassbar.karten, + `jede Katalogkarte hat einen „Anpassen …"-Knopf ` + + `(${anpassbar.knoepfe} von ${anpassbar.karten})`); + + await seite.click(".vorlagenbrett__karte .vorlagenbrett__anpassen"); + await seite.waitForSelector("dialog.nachfrage[open]", { timeout: 8000 }); + const felder = await seite.evaluate(() => { + const dlg = document.querySelector("dialog.nachfrage"); + const sicht = (teil) => { + const z = dlg.querySelector(`[data-teil="${teil}"]`); + return !!z && !z.hidden; + }; + return { + datum: sicht("datumzeile"), + haken: sicht("hakenzeile"), + grund: sicht("grundzeile"), + wert: dlg.querySelector("#nachfrage-datum")?.value || "", + min: dlg.querySelector("#nachfrage-datum")?.min || "", + }; + }); + ok(felder.datum && felder.grund, + `das Fenster hat Frist und Anmerkung (${felder.datum}, ${felder.grund})`); + /* DIE GEGENPROBE ZU pruef-aufgaben-vorlagen: Dort bekommt ein + Creator den Haken NICHT. Hier, bei der Leitung, MUSS er da + sein -- sonst waere „dauerhaft" eine Einstellung, die es nur + im Quelltext gibt. */ + ok(felder.haken === true, + `und die Leitung bekommt den „dauerhaft"-Haken (${felder.haken})`); + ok(/^\d{4}-\d{2}-\d{2}$/.test(felder.wert) && felder.wert >= felder.min, + `die Frist der Vorlage steht als Vorgabe drin (${felder.wert}, ` + + `fruehestens ${felder.min})`); + + /* DER HAKEN SPERRT DAS DATUM -- eine dauerhafte Aufgabe hat + keine Frist. Ein Datum, das dasteht und nicht gilt, ist + schlimmer als keins. */ + await seite.check("dialog.nachfrage #nachfrage-haken"); + await seite.waitForTimeout(200); + ok((await seite.evaluate(() => + document.querySelector("dialog.nachfrage #nachfrage-datum").disabled)) === true, + "mit Haken wird die Frist gesperrt"); + + const vorDauer = await seite.evaluate(zaehleListe); + await seite.fill("dialog.nachfrage #nachfrage-grund", + "Laeuft dauerhaft mit, bitte woechentlich kurz durchgehen."); + await seite.click('dialog.nachfrage [data-teil="ja"]'); + await seite.waitForTimeout(2600); + ok(await seite.evaluate(zaehleListe) === vorDauer + 1, + `die angepasste Aufgabe liegt in ihrer Liste ` + + `(${vorDauer} -> ${await seite.evaluate(zaehleListe)})`); + + /* UND JETZT DIE TATSACHEN, nicht die Anzeige. Was auf dem Brett + steht, ist eine Darstellung; was in der Aufgabe steht, gilt. */ + { + const { DatabaseSync: DB5 } = await import("node:sqlite"); + const d5 = new DB5(process.env.WORKSPACE_DB); + const neueste = d5.prepare(`SELECT a.id, a.dauerhaft, a.frist, + (SELECT COUNT(*) FROM aufgaben_notizen n WHERE n.aufgabe_id = a.id) AS notizen, + (SELECT text FROM aufgaben_notizen n WHERE n.aufgabe_id = a.id LIMIT 1) AS wort + FROM aufgaben a ORDER BY a.id DESC LIMIT 1`).get(); + d5.close(); + ok(neueste?.dauerhaft === 1, + `sie ist wirklich dauerhaft (${neueste?.dauerhaft})`); + /* KEINE FRIST -- sonst waere sie ab morgen fuer immer + ueberfaellig, und eine Warnung, die immer kommt, ist keine + mehr. Dieselbe Regel wie im Aenderungsweg. */ + ok(!neueste?.frist, + `und hat keine Frist (${neueste?.frist ?? "keine"})`); + ok(neueste?.notizen === 1 && /woechentlich/.test(neueste?.wort || ""), + `die Anmerkung steht als Notiz dabei („${neueste?.wort}")`); + } + /* ==== DIE BEWERBUNG AM BILDSCHIRM ENTSCHEIDEN (23.09.2026) ====== Filipe: „nur dogfather und die rechte hand sollen annehmen oder