Der Aufgabenkatalog zieht dorthin, wo verteilt wird

Filipe: "das soll auch bitte nicht in der kategorie aufgaben sondern
eure aufgaben sein bitte. setzt das perfekt da rein und pass es
uebeertrieben krass rein."

Und das ist richtig: "Aufgaben" zeigt, WAS liegt. Verteilt wird seit
dem 22.09. auf "Eure Aufgaben" -- dort wird die Person gewaehlt, dort
steht das Formular, dort ihre Aufgaben. Der Katalog ist nichts anderes
als ein zweiter Weg zu derselben Handlung: 101 fertige Aufgaben statt
einer selbst getippten.

WAS DER ERSTE ANLAUF ZERSTOERT HAETTE. Der Block enthaelt ZWEI
Kataloge, und sie gehen an zwei verschiedene Personenkreise -- das
entscheidet der Server. Team Dogi bekommt die 101 Aufgaben in 14
Kategorien, die Agentur den Creator-Katalog (vier Bereiche, vier
Stufen). Ihn einfach herauszuschneiden und drueben hinzulegen haette
dem zweiten Katalog die Heimat genommen. Gemerkt hat das keine
Ueberlegung, sondern die Frage, wer die Zeile "ich.rolle === 'creator'"
eigentlich bedient -- pruef-aufgaben-vorlagen misst sie seit Tagen.

Deshalb eine gemeinsame Datei (vorlagenbrett.js) statt zweier
Abschriften: Die gemeinsamen Teile -- Abruf, Klappkopf, Uebernehmen --
gibt es weiter genau einmal, und jede Seite sagt beim Einrichten, ob
sie den Team- oder den Creator-Zweig zeigt. Fehlt ihr dabei eine
Angabe, sagt die Datei das in der Konsole, statt stumm nichts zu
zeichnen.

WAS DER UMZUG NEBENBEI LOESCHT: Drueben brauchte der Katalog eine
EIGENE Personenwahl, weil es dort keine gab -- eine dritte Knopfreihe
unter zwei anderen, und die Moeglichkeit, oben den einen und unten den
anderen zu waehlen. Hier ist die Person laengst gewaehlt, mitsamt ihren
Zahlen. Eine Auswahl statt zwei.

DREI DINGE, DIE ERST DADURCH AUFFIELEN:

"schon uebernommen" galt im Team-Katalog fuer JEDEN. Sobald irgendwer
eine Vorlage hatte, stand es an der Karte -- auch fuer alle anderen.
Auf einer Seite ohne Personenwahl fiel das kaum auf; hier waere es
offen falsch: Man waehlt Frida, und der Katalog behauptet, sie habe die
Aufgabe schon, weil Rieke sie hat. Der Creator-Zweig machte es von
Anfang an richtig. Und wer verteilt, bekommt ohne gewaehlte Person gar
keine Markierung mehr: "irgendwer hat sie" liest man als "brauche ich
nicht mehr zu vergeben" und ueberspringt, was dem Menschen vor einem
fehlt.

Der Katalog blieb fuer einen Modi GANZ weg. window.__ich kommt ueber
das Netz und ist beim ersten Zeichnen noch nicht da; ein stummes
"return" liess den Block dauerhaft verschwinden, weil niemand ein
zweites Mal zeichnet. Gefunden hat das kein Codelesen, sondern ein
Bildschirmfoto -- die Seite sah vollstaendig aus, nur ohne den Block.
Gewartet wird jetzt mit der Wartestelle des Hauses.

Und er markierte bei einem Modi nichts mehr: Die Aufgabenliste wurde
nur beim Personenwechsel geholt, und ein Modi waehlt nie jemanden.
Damit war die Sperre gegen das zweite Uebernehmen derselben Vorlage
weg. Jetzt gibt es einen Abrufweg fuer beide.

Der Knopf nennt den Namen ("An Rieke"), der Satz darueber auch. Statt
einer Wegbeschreibung zur Personenwahl steht ein Knopf, der hinfuehrt
-- "waehle oben" waere falsch, die Kacheln stehen weiter unten. Und
"auf dem Brett darunter" stimmt hier nicht mehr: Der Kopftext sagt
jetzt, WAS entsteht, nicht WO es landet.

Gemessen: pruef-modi-katalog 129 (vorher 125), pruef-modi-kategorien
29 (vorher 25 mit 3 Fehlern), pruef-aufgaben-vorlagen, pruef-struktur
und pruef-css-klassen alles in Ordnung. Dazu eine Abnahme ueber beide
Seiten und drei Rollen: 32 Messungen, 0 Befunde -- darunter die
Gegenprobe, dass Marinas uebernommene Aufgabe bei Frida NICHT als
uebernommen gilt.

Die 403-Zeilen in pruef-modi-kategorien waren ebenfalls eine Altlast:
Seit dem 22.09. legt im Team Dogi nur die Leitung an ("sie sich nicht
selber aufgaben geben"), die Pruefung tat es weiter als Modi. Sie misst
das jetzt -- samt der Gegenprobe, die es vorher nicht gab.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-23 17:14:01 +02:00
co-authored by Claude Opus 5
parent 290d7c8d88
commit 84e4048ab4
44 changed files with 2112 additions and 1543 deletions
+110 -76
View File
@@ -490,8 +490,11 @@ console.log("\n=== 6. Das Brett im echten Browser ===\n");
await seite.fill("#code", "CODE-MODI-0001");
await seite.click("button[type=submit]");
await seite.waitForURL("**/start.html", { timeout: 15000 });
await seite.goto(BASIS + "/workspace/aufgaben.html", { waitUntil: "networkidle" });
await seite.waitForTimeout(1200);
/* DER KATALOG STEHT SEIT DEM 23.09.2026 AUF "EURE AUFGABEN".
Filipe: "das soll auch bitte nicht in der kategorie aufgaben
sondern eure aufgaben sein bitte." */
await seite.goto(BASIS + "/workspace/entwicklung.html", { waitUntil: "networkidle" });
await seite.waitForTimeout(1600);
/* Aufklappen, falls es zugeklappt startet. */
const zu = await seite.evaluate(() =>
@@ -703,8 +706,9 @@ console.log("");
await seite.fill("#code", "CODE-DOGI-0001");
await seite.click("button[type=submit]");
await seite.waitForURL("**/start.html", { timeout: 15000 });
await seite.goto(BASIS + "/workspace/aufgaben.html", { waitUntil: "networkidle" });
await seite.waitForTimeout(1400);
/* Siehe oben: der Katalog ist umgezogen. */
await seite.goto(BASIS + "/workspace/entwicklung.html", { waitUntil: "networkidle" });
await seite.waitForTimeout(1800);
const zu = await seite.evaluate(() =>
document.getElementById("vorlagenbrett")?.dataset.auf !== "ja");
if (zu) {
@@ -712,85 +716,111 @@ console.log("");
await seite.waitForTimeout(800);
}
const wahl = await seite.evaluate(() => {
const reihen = [...document.querySelectorAll(".stufenleiter")];
const letzte = document.querySelector('[aria-label="Person wählen"]');
const zahl = /^[0-9]+$/;
/* ==== AN WEN? DIE FRAGE IST JETZT SCHON BEANTWORTET ============
Bis zum 23.09.2026 brachte der Katalog eine EIGENE Personenreihe
mit -- eine dritte Knopfreihe unter zwei anderen. Sie war noetig,
weil "Aufgaben" keine Personenwahl hat.
Auf "Eure Aufgaben" gibt es sie: die Kacheln unter "Wen gehst du
durch?". Zwei Auswahlen fuer dieselbe Frage waeren die
Gelegenheit, oben den einen und unten den anderen zu waehlen --
und dann stuenden zwei Antworten auf einem Bildschirm.
GEPRUEFT WIRD DESHALB DIE VERBINDUNG: Was die Seite oben sagt,
muss der Katalog unten meinen. */
const ohne = await seite.evaluate(() => ({
knopf: document.querySelector(".vorlagenbrett__karte .knopf")?.textContent.trim(),
satz: [...document.querySelectorAll("#vorlagenbrett .stufenleiter__hilfe")]
.map((z) => z.textContent.trim()).join(" | "),
hin: !!document.querySelector("#vorlagenbrett .knopf-still"),
reihen: document.querySelectorAll("#vorlagenbrett .stufenleiter").length,
}));
ok(ohne.reihen === 2,
"zwei Auswahlreihen statt drei -- die Person steht oben (" + ohne.reihen + ")");
ok(ohne.knopf === "Übernehmen",
'solange niemand gewaehlt ist, heisst der Knopf schlicht "Übernehmen" ('
+ ohne.knopf + ")");
ok(/niemand gewählt/.test(ohne.satz), "und ein Satz sagt genau das");
/* KEINE WEGBESCHREIBUNG, SONDERN EIN WEG. "Waehle oben jemanden"
waere falsch -- die Kacheln stehen weiter UNTEN. Der Knopf
weiss, wo sie sind, auch nach dem naechsten Umbau. */
ok(ohne.hin, "mit einem Knopf, der zur Personenwahl fuehrt");
/* JETZT WIRKLICH WAEHLEN -- ueber die Kachel, so wie ein Mensch. */
await seite.evaluate(() => {
[...document.querySelectorAll("#personen .e-person")]
.find((k) => (k.dataset.name || k.textContent).includes("Marina"))?.click();
});
await seite.waitForTimeout(2400);
const nachWahl = await seite.evaluate(() => {
const karten = [...document.querySelectorAll(".vorlagenbrett__karte")];
const frisch = karten.find((k) => k.dataset.schon !== "ja");
const schon = karten.find((k) => k.dataset.schon === "ja");
return {
reihen: reihen.length,
namen: [...(letzte?.querySelectorAll(".stufenleiter__name") || [])]
.map((z) => z.textContent.trim()),
zahlenOk: [...(letzte?.querySelectorAll(".stufenleiter__zahl") || [])]
.every((z) => zahl.test(z.textContent.trim())),
zahlen: [...(letzte?.querySelectorAll(".stufenleiter__zahl") || [])]
.map((z) => z.textContent.trim()),
/* Der Satz steht seit dem 16.09.2026 in `stufenleiter__hilfe`
-- derselbe Baustein wie beim anderen Brett. Vorher war es
`vorlagenbrett__stand`, und das ist die Zeile fuer Zahlen. */
satz: [...document.querySelectorAll(".stufenleiter__hilfe")]
.map((z) => z.textContent.trim())
.find((t) => t.includes("Formular oben") || t.includes("gehen an")) || "",
satz: [...document.querySelectorAll("#vorlagenbrett .stufenleiter__hilfe")]
.map((z) => z.textContent.trim()).find((t) => t.includes("geht an")) || "",
/* ZWEI VERSCHIEDENE KARTEN, ZWEI VERSCHIEDENE KNOEPFE -- und
die erste im Feld ist nicht zwangslaeufig eine frische.
Die erste Fassung nahm schlicht "die erste Karte" und
meldete einen Fehler, weil dort "Nochmal" stand: genau das
richtige Wort fuer eine, die schon liegt. */
frisch: frisch?.querySelector(".knopf")?.textContent.trim() || null,
schon: schon?.querySelector(".knopf")?.textContent.trim() || null,
liste: document.getElementById("e-aufgaben-titel")?.textContent || "",
};
});
/* ZWEI FEINE REIHEN: die Stufen und die Personen. Eine einzelne
Zahl haette nicht gesagt, welche der beiden fehlt. */
/* DREI REIHEN: Kategorie, Stufe, Person. Die ersten beiden sehen
jetzt aus wie drueben beim anderen Brett. */
ok(wahl.reihen === 3, "drei Auswahlreihen (Kategorie, Stufe, Person): " + wahl.reihen);
ok(wahl.namen.includes("Marina"),
"der Modi steht zur Auswahl (" + wahl.namen.join(", ") + ")");
ok(!wahl.namen.includes("Tili") && !wahl.namen.includes("Schulle"),
"ein Creator und eine Managerin nicht — sie arbeiten im anderen Haus");
ok(wahl.zahlenOk && wahl.zahlen.length === wahl.namen.length,
"neben jedem Namen steht, wie viel offen ist (" + wahl.zahlen.join(", ") + ")");
ok(wahl.satz.includes("Formular oben"),
"und solange niemand gewählt ist, sagt die Seite es");
ok(nachWahl.satz.includes("Marina"), "nach dem Klick steht es da: " + nachWahl.satz);
/* DER KNOPF NENNT DEN NAMEN. "Uebernehmen" allein laesst offen,
wer sie bekommt -- und die Antwort steht weit oben. */
ok(nachWahl.frisch === "An Marina",
'eine frische Karte traegt ihren Namen ("' + nachWahl.frisch + '")');
/* Und eine, die sie schon hat, sagt das statt des Namens -- sonst
saehen beide gleich aus und man holte sie zweimal. */
ok(nachWahl.schon === null || nachWahl.schon === "Nochmal",
'eine schon uebernommene sagt "Nochmal" ('
+ (nachWahl.schon === null ? "keine im Feld" : nachWahl.schon) + ")");
ok(/Marina/.test(nachWahl.liste),
'die Aufgabenliste darunter gehoert ihr ("' + nachWahl.liste + '")');
/* JETZT WIRKLICH DRUECKEN -- und nachsehen, ob die Aufgabe bei
DIESEM Menschen landet. Ein Knopf, den niemand betaetigt hat,
ist kein geprueter Knopf. */
await seite.evaluate(() => {
const reihen = [...document.querySelectorAll(".stufenleiter")];
const letzte = document.querySelector('[aria-label="Person wählen"]');
[...letzte.querySelectorAll(".stufenleiter__knopf")]
.find((k) => k.textContent.includes("Marina"))?.click();
});
await seite.waitForTimeout(600);
const nachWahl = await seite.evaluate(() =>
[...document.querySelectorAll(".stufenleiter__hilfe")]
.map((z) => z.textContent.trim()).find((t) => t.includes("gehen an")) || "");
ok(nachWahl.includes("Marina"), "nach dem Klick steht es da: " + nachWahl);
/* GEZAEHLT WIRD IN IHRER LISTE, NICHT AUF DEM BRETT.
/* GEZAEHLT WERDEN AUFGABEN, NICHT KARTEN.
Seit dem 23.09.2026 fasst das Brett gleiche Aufgaben zu EINER
Karte zusammen ("0 von 8"). Eine neue Aufgabe erhoeht die
Kartenzahl also nur dann, wenn es noch keine gleichnamige gibt --
sonst wandert sie in eine bestehende Karte hinein. Genau das
war die Absicht des Umbaus; eine Pruefung, die trotzdem Karten
zaehlt, misst ab da die alte Anordnung und nicht die Sache.
Jede Karte weist ihre Aufgaben aus: data-id (eine) oder
data-ids (mehrere). */
const zaehleAufgaben = () => [...document.querySelectorAll(".karte")]
.reduce((n, k) => n + (k.dataset.ids || k.dataset.id || "")
.split(",").filter(Boolean).length, 0);
const vorher = await seite.evaluate(zaehleAufgaben);
Auf "Aufgaben" stand unter dem Katalog das Brett, und die
Pruefung zaehlte dort die Karten. Hier steht darunter die
Aufgabenliste der gewaehlten Person -- und die ist die bessere
Antwort auf die Frage, die der Abschnitt stellt: Landet die
Aufgabe bei DIESEM Menschen? Auf dem Brett musste man das aus
dem Namen auf der Karte herauslesen; hier ist es die Liste
selbst, die ihren Namen traegt. */
const zaehleListe = () =>
document.querySelectorAll("#e-aufgaben-liste .e-aufgabe").length;
const vorher = await seite.evaluate(zaehleListe);
const welche = await seite.evaluate(() =>
document.querySelector(".vorlagenbrett__karte .vorlagenbrett__titel")
?.textContent.trim() || "");
await seite.evaluate(() => {
[...document.querySelectorAll(".vorlagenbrett__karte")][0]
?.querySelector("button")?.click();
});
await seite.waitForTimeout(1800);
const danach = await seite.evaluate(() => ({
aufgaben: [...document.querySelectorAll(".karte")]
.reduce((n, k) => n + (k.dataset.ids || k.dataset.id || "")
.split(",").filter(Boolean).length, 0),
karten: document.querySelectorAll(".karte").length,
fuerMarina: [...document.querySelectorAll(".karte")]
.filter((k) => k.textContent.includes("Marina")).length,
}));
ok(danach.aufgaben === vorher + 1,
"die Aufgabe liegt auf dem Brett (" + vorher + " -> " + danach.aufgaben
+ " Aufgaben in " + danach.karten + " Karten)");
ok(danach.fuerMarina > 0, "und zwar bei Marina (" + danach.fuerMarina + ")");
await seite.waitForTimeout(2600);
const danach = await seite.evaluate((titel) => ({
liste: document.querySelectorAll("#e-aufgaben-liste .e-aufgabe").length,
steht: [...document.querySelectorAll("#e-aufgaben-liste .e-aufgabe")]
.some((a) => a.textContent.includes(titel)),
ueberschrift: document.getElementById("e-aufgaben-titel")?.textContent || "",
markiert: [...document.querySelectorAll(".vorlagenbrett__karte")]
.filter((k) => k.dataset.schon === "ja").length,
}), welche);
ok(danach.liste === vorher + 1,
"die Aufgabe liegt in ihrer Liste (" + vorher + " -> " + danach.liste + ")");
ok(danach.steht, 'und zwar genau die uebernommene ("' + welche + '")');
ok(/Marina/.test(danach.ueberschrift),
"die Liste ist ihre (" + danach.ueberschrift.trim() + ")");
/* UND DER KATALOG WEISS ES. Ohne diese Zeile koennte man dieselbe
Vorlage gleich noch einmal holen, ohne Hinweis -- genau das war
der Grund fuer die Markierung. */
ok(danach.markiert >= 1,
"der Katalog markiert sie als uebernommen (" + danach.markiert + ")");
/* ==== DIE BEWERBUNG AM BILDSCHIRM ENTSCHEIDEN (23.09.2026) ======
@@ -838,7 +868,11 @@ console.log("");
ok(bw?.auffaellig === true, "und die Karte faellt auf");
/* ---- Jetzt wirklich druecken, samt Notiz ---------------------- */
const vorherK = await seite.evaluate(() => document.querySelectorAll(".karte").length);
/* Auch hier: die Liste der gewaehlten Person, nicht das Brett.
Marina ist oben gewaehlt, und ihre Bewerbung wird gleich
angenommen -- die Aufgabe muss also bei ihr auftauchen. */
const vorherK = await seite.evaluate(() =>
document.querySelectorAll("#e-aufgaben-liste .e-aufgabe").length);
await seite.evaluate(() => {
[...document.querySelectorAll(".vorlagenbrett__bewerbung button")]
.find((b) => b.textContent.trim() === "Annehmen")?.click();
@@ -860,7 +894,7 @@ console.log("");
await seite.waitForTimeout(2200);
const nachher = await seite.evaluate(() => ({
karten: document.querySelectorAll(".karte").length,
karten: document.querySelectorAll("#e-aufgaben-liste .e-aufgabe").length,
nochBeworben: document.querySelectorAll(".vorlagenbrett__bewerbung").length,
}));
ok(nachher.karten === vorherK + 1,
+100 -17
View File
@@ -142,12 +142,36 @@ console.log("\n=== 2. Der Modi setzt eine Kategorie ===\n");
const jsonKopf = { "Content-Type": "application/json" };
let aufgabeId = null;
{
const a = await hole(modiAn.keks, "/workspace/api/aufgaben", {
/* IM TEAM DOGI LEGT DIE LEITUNG AN (nachgezogen 23.09.2026).
Hier stand `modiAn` -- und bis zum 22.09.2026 war das richtig.
An dem Tag bekam der Server die Regel "ein Modi gibt sich keine
Aufgaben" (Filipe: "sie sich nicht selber aufgaben geben"), und
diese Pruefung wurde nicht nachgezogen. Seither meldete sie
"angelegt (403)" -- ein Fehler, der keiner war, und der bei jedem
Lauf mitlief, bis ihn niemand mehr las.
Die Kategorie wird dabei MITGESCHICKT: Genau darum geht es in
diesem Abschnitt, und ob sie den Weg ueber das Anlegen durch
jemand anderen ueberlebt, war vorher nie geprueft. */
const a = await hole(dogiAn.keks, "/workspace/api/aufgaben", {
method: "POST", headers: jsonKopf,
body: JSON.stringify({ titel: "Clip vom Freitags-Live schneiden", kategorie: "clipping" }),
body: JSON.stringify({ titel: "Clip vom Freitags-Live schneiden",
kategorie: "clipping", verantwortlich_id: idModi }),
});
aufgabeId = a.daten?.id ?? null;
ok(a.status === 201 && Number.isInteger(aufgabeId), `angelegt (${a.status})`);
ok(a.status === 201 && Number.isInteger(aufgabeId),
`die Leitung legt sie fuer ihn an (${a.status})`);
/* UND DIE GEGENPROBE, die es vorher gar nicht gab: Er selbst kann
es nicht. Ohne sie bewiese die Zeile darueber nur, dass das
Anlegen ueberhaupt geht -- nicht, dass die Schranke steht. */
const b = await hole(modiAn.keks, "/workspace/api/aufgaben", {
method: "POST", headers: jsonKopf,
body: JSON.stringify({ titel: "Etwas fuer mich selbst", kategorie: "clipping" }),
});
ok(b.status === 403 && b.daten?.fehler === "nur_leitung_legt_an",
`er selbst darf es nicht (${b.status} ${b.daten?.fehler || ""})`);
}
if (aufgabeId) {
const a = await hole(modiAn.keks, "/workspace/api/aufgaben");
@@ -178,12 +202,19 @@ if (aufgabeId) {
/* ---------- 3. Ein Tippfehler ist ein Fehler ------------------------- */
console.log("\n=== 3. Was bei einem falschen Wert passiert ===\n");
{
const a = await hole(modiAn.keks, "/workspace/api/aufgaben", {
/* AUCH HIER DIE LEITUNG (nachgezogen 23.09.2026, gleicher Grund).
Ein Modi kaeme gar nicht bis zur Feldpruefung -- die Schranke
steht davor, und die Antwort waere 403 statt 400. Gemessen wuerde
dann nicht mehr, was dieser Abschnitt wissen will: dass ein
falscher Kategoriewert BENANNT wird statt still zu verschwinden. */
const a = await hole(dogiAn.keks, "/workspace/api/aufgaben", {
method: "POST", headers: jsonKopf,
body: JSON.stringify({ titel: "Irgendwas", kategorie: "gibtesnicht" }),
body: JSON.stringify({ titel: "Irgendwas", kategorie: "gibtesnicht",
verantwortlich_id: idModi }),
});
ok(a.status === 400 && /Kategorie/i.test(a.daten?.fehler || ""),
`dem Modi wird es gesagt (${a.status} ${a.daten?.fehler || ""})`);
`der falsche Wert wird benannt (${a.status} ${a.daten?.fehler || ""})`);
}
/* ---------- 4. Und wenn ein Manager sie schickt? --------------------- */
@@ -249,21 +280,52 @@ console.log("\n=== 5. Das Feld im echten Formular ===\n");
ok(z.sichtbar, "der Modi sieht das Feld");
ok(z.auswahl.length >= 7,
`mit ${z.auswahl.length} Eintraegen (${z.auswahl.slice(1, 4).join(", ")} …)`);
/* DAS VORLAGENBRETT (berichtigt 10.09.2026).
/* DAS VORLAGENBRETT (berichtigt 10.09., umgezogen 23.09.2026).
Hier stand "und kein Creator-Vorlagenbrett" -- richtig, solange
es fuer einen Modi ueberhaupt keinen Katalog gab. Seit der
Katalog aus Teil 2 da ist, steht das Brett wieder da, nur mit
SEINEM Inhalt. Geprueft wird deshalb ab jetzt beides: dass es
da ist, und dass der fremde nicht durchschlaegt. Was der
Katalog selbst enthaelt, prueft pruef-modi-katalog. */
Am 10.09. stand hier "und kein Creator-Vorlagenbrett" --
richtig, solange es fuer einen Modi ueberhaupt keinen Katalog
gab. Seit dem Katalog aus Teil 2 stand das Brett wieder da,
nur mit SEINEM Inhalt.
Seit dem 23.09.2026 steht es nicht mehr HIER.
Filipe: "das soll auch bitte nicht in der kategorie aufgaben
sondern eure aufgaben sein bitte."
GEPRUEFT WIRD DER UMZUG IN BEIDE RICHTUNGEN. Nur "hier ist er
weg" waere die halbe Auskunft: Weg ist er auch dann, wenn ihn
ein Fehler ueberall verschwinden laesst. Erst mit der zweiten
Haelfte -- "und drueben ist er da" -- sagt die Pruefung etwas
ueber den Umzug statt ueber einen Ausfall. */
const vorlagen = await seite.evaluate(() => {
const v = document.getElementById("vorlagenbrett");
return { da: !!v && !v.hidden, text: document.body.innerText };
return {
leer: !v || v.hidden,
datei: !!window.Vorlagenbrett,
text: document.body.innerText,
};
});
ok(vorlagen.da, "das Vorlagenbrett steht da -- mit seinem eigenen Katalog");
ok(vorlagen.datei, "die Katalogdatei ist auch hier geladen");
ok(vorlagen.leer, "aber der Katalog steht nicht mehr auf dieser Seite");
ok(!/vier Bereichen und vier Stufen/.test(vorlagen.text),
"und kein Wort vom Creator-Katalog");
/* DIE ANDERE HAELFTE: drueben steht er. */
{
const s2 = await kontext.newPage();
await s2.goto(BASIS + "/workspace/entwicklung.html", { waitUntil: "networkidle" });
await s2.waitForTimeout(1600);
const drueben = await s2.evaluate(() => {
const v = document.getElementById("vorlagenbrett");
return {
da: !!v && !v.hidden,
kopf: document.querySelector(".vorlagenbrett__unter")?.textContent || "",
};
});
ok(drueben.da, "dafuer steht er auf „Eure Aufgaben“");
ok(/Kategorien/.test(drueben.kopf),
`mit seinem eigenen Kopf ("${drueben.kopf.slice(0, 55)}…")`);
await s2.close();
}
ok(konsole.length === 0,
konsole.length ? `Fehler in der Konsole: ${konsole[0]}` : "keine Fehler in der Konsole");
await seite.screenshot({ path: "pruef-modi-kategorie.png", fullPage: false });
@@ -342,9 +404,30 @@ console.log("\n=== 5. Das Feld im echten Formular ===\n");
/* GEGENPROBE ZUM BROWSERTEIL: Findet die Suche die Namen ueberhaupt,
wenn sie dastehen? Ohne diesen Schritt bewiese der Haken oben
nichts -- er waere auch gruen, wenn innerText leer waere. */
nichts -- er waere auch gruen, wenn innerText leer waere.
GESUCHT WIRD SEIT DEM 23.09.2026 AUF "EURE AUFGABEN".
Bis dahin stand hier "aufgaben.html" -- und die Namen standen
dort, weil das Vorlagenbrett sie als Knopfreihe zeigte. Mit dem
Umzug des Katalogs sind sie mitgewandert. Die Gegenprobe hing
also an etwas, das mit ihrer eigentlichen Frage nichts zu tun
hatte; sie wurde rot, ohne dass die Verborgenheit beim Manager
auch nur beruehrt worden waere.
Das ist die Sorte Abhaengigkeit, die man erst bemerkt, wenn sie
bricht: Die Zeile oben prueft eine Seite, die Gegenprobe dazu
eine andere -- und dass beide dieselbe waren, war Zufall. */
{
const { kontext, seite } = await formular("creator", "CODE-MODI-0001");
const kontext = await browser.newContext();
const seite = await kontext.newPage();
await seite.goto(BASIS + "/workspace/", { waitUntil: "domcontentloaded" });
await seite.click('.rolle[data-rolle="creator"]');
await seite.fill("#code", "CODE-MODI-0001");
await seite.click("button[type=submit]");
await seite.waitForURL("**/start.html", { timeout: 15000 });
await seite.goto(BASIS + "/workspace/entwicklung.html", { waitUntil: "networkidle" });
await seite.waitForTimeout(1600);
const text = await seite.evaluate(() => document.body.innerText);
ok(kategorien.length > 0 && kategorien.some((k) => text.includes(k.name)),
"beim Modi findet dieselbe Suche die Namen sehr wohl");