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:
+110
-76
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user