diff --git a/server/pruef-bewerbung-aufgaben.mjs b/server/pruef-bewerbung-aufgaben.mjs
index 50b009ad..fd7fc487 100644
--- a/server/pruef-bewerbung-aufgaben.mjs
+++ b/server/pruef-bewerbung-aufgaben.mjs
@@ -620,8 +620,26 @@ melde("=== 6. Am echten Bildschirm ===");
});
ok(vorher.istLink === false,
"der Knopf fuehrt nicht mehr auf eine andere Seite (kein Link mehr)");
- ok(vorher.aus === true,
- "und ist aus, solange niemand gewaehlt ist — er haette nichts zu verteilen");
+ /* HIER STAND `vorher.aus === true` (bis 22.09.2026 abends).
+ ---------------------------------------------------------------
+ Die Pruefung hat damit MEINEN Entwurf bestaetigt, nicht die
+ Sache: Der Knopf war abgeschaltet, solange niemand gewaehlt
+ war, und daneben stand „Waehl links jemanden aus".
+
+ Gemessen steht die Auswahl aber gar nicht links, sondern
+ 206 px WEITER UNTEN, bei derselben linken Kante (130 px). Wer
+ der Anweisung folgte, sah eine leere Flaeche neben einem
+ toten Knopf.
+
+ Filipe: „weil gerade hängt das und weiß nicht wieso."
+
+ Das ist die unangenehmste Sorte gruener Haken: Er lief, er war
+ gruen, und er hat den Fehler festgeschrieben. Jetzt wird das
+ Gegenteil verlangt -- der Knopf ist IMMER benutzbar, und die
+ Auswahl steht im Formular. */
+ ok(vorher.aus === false,
+ "und er ist benutzbar, auch ohne vorherige Auswahl — die Frage"
+ + " nach der Person wird im Formular selbst gefragt");
ok(vorher.aufgabenBlock === false,
"ohne Person steht auch keine Aufgabenliste da");
@@ -667,8 +685,164 @@ melde("=== 6. Am echten Bildschirm ===");
/* GEGENPROBE: Die Aufgabe ist wirklich da, nicht nur im Bild. */
const ausDerListe = await finde(chef.keks, titel);
ok(!!ausDerListe, "sie steht auch wirklich in der Aufgabenliste des Servers");
+
+ /* =================================================================
+ 6b. VERTEILEN OHNE VORHERIGE AUSWAHL -- und als Bewerbung
+
+ Filipe am 22.09.2026 abends: „dogfather, die rechte hand und
+ die linke hand sollen immer noch aufgaben werden teilen
+ können plus die option dass die modis sich für aufgaben
+ bewerben können. weil gerade hängt das und weiß nicht wieso."
+
+ Der Weg, der vorher tot war: Seite aufmachen, auf „Aufgabe
+ anlegen" druecken -- ohne unten jemanden angeklickt zu haben.
+ Frueher passierte dabei NICHTS.
+
+ Und im selben Formular muss die Bewerbung zu finden sein.
+ Vorher steckte sie hinter „Noch jemanden dazunehmen" und
+ erschien erst, wenn man dort jemanden ankreuzte -- eine
+ Moeglichkeit, die man nicht findet, gibt es nicht.
+ ================================================================= */
+ await e.s.goto(`${SEITE}/workspace/entwicklung.html`, { waitUntil: "networkidle" });
+ await e.s.waitForTimeout(1800);
+ await e.s.click("#verteilen-knopf");
+ await e.s.waitForTimeout(600);
+
+ const direkt = await e.s.evaluate(() => ({
+ offen: !document.getElementById("e-neu")?.hidden,
+ zurWahl: document.querySelectorAll("#e-fuer-leute input[type=checkbox]").length,
+ artSichtbar: document.getElementById("e-art")
+ ? !document.getElementById("e-art").hidden : null,
+ /* Die alte, zugeklappte zweite Liste darf es nicht mehr geben --
+ sonst stehen wieder zwei Bedienungen fuer dieselbe Frage da. */
+ alteZweiteListe: !!document.getElementById("e-mehr-auf"),
+ }));
+ ok(direkt.offen === true,
+ "das Formular geht auch ohne vorherige Auswahl auf — genau der Weg, der haengen blieb");
+ ok(direkt.zurWahl >= 2,
+ `und die Frage nach der Person steht darin, mit ${direkt.zurWahl} Personen zur Wahl`);
+ ok(direkt.alteZweiteListe === false,
+ "die zweite, zugeklappte Personenliste gibt es nicht mehr");
+ ok(direkt.artSichtbar === false,
+ "bei niemandem oder einer Person wird nicht nach der Verteilart gefragt");
+
+ /* Zwei anhaken -> jetzt MUSS die Frage kommen, und die
+ Bewerbung muss eine der Antworten sein. */
+ const angehakt = await e.s.evaluate(() => {
+ const k = [...document.querySelectorAll("#e-fuer-leute input[type=checkbox]")];
+ k[0].click(); k[1].click();
+ return k.length;
+ });
+ await e.s.waitForTimeout(500);
+ const zuZweit = await e.s.evaluate(() => ({
+ artSichtbar: !document.getElementById("e-art").hidden,
+ antworten: [...document.querySelectorAll('#e-art input[name="e-verteilart"]')]
+ .map((x) => x.value),
+ knopf: document.getElementById("verteilen-knopf")?.textContent.trim(),
+ }));
+ ok(angehakt >= 2 && zuZweit.artSichtbar === true,
+ "bei zwei Personen wird gefragt, wie es laufen soll");
+ ok(zuZweit.antworten.includes("pool"),
+ `und der Pool-Weg steht als Antwort da (${zuZweit.antworten.join(", ")})`);
+ ok(/2 Personen/.test(zuZweit.knopf || ""),
+ `der Knopf zaehlt mit („${zuZweit.knopf}")`);
+
+ const poolTitel = "Pool von der Entwicklungsseite";
+ await e.s.check('#e-art input[value="pool"]');
+ await e.s.fill("#e-titel", poolTitel);
+ await e.s.click("#e-neu-speichern");
+ await e.s.waitForTimeout(1800);
+ const poolFertig = await e.s.evaluate(() => ({
+ zu: document.getElementById("e-neu")?.hidden,
+ meldung: document.getElementById("fehler")?.textContent.trim(),
+ gut: document.getElementById("fehler")?.dataset.gut,
+ }));
+ ok(poolFertig.zu === true && poolFertig.gut === "ja",
+ `angelegt und als gute Nachricht gemeldet (${poolFertig.gut})`);
+ /* DIE MELDUNG DARF NICHT „steht jetzt bei ihm" SAGEN. Bei einem
+ Pool sitzt noch niemand daran -- das ist der ganze Punkt. */
+ ok(/bewirbt|bereit/i.test(poolFertig.meldung || "")
+ && !/bei ihm/.test(poolFertig.meldung || ""),
+ `und die Meldung sagt, dass eine Bewerbung kommt („${poolFertig.meldung}")`);
+
+ const poolAufgabe = await finde(chef.keks, poolTitel);
+ ok(!!poolAufgabe, "die Pool-Aufgabe steht in der Liste des Servers");
+ ok(poolAufgabe?.verteilart === "pool",
+ `und sie ist wirklich ein Pool (${poolAufgabe?.verteilart})`);
+ ok((poolAufgabe?.zuteilung || []).length === 2,
+ `mit zwei Leuten darin (${(poolAufgabe?.zuteilung || []).length})`);
} finally { await e.ctx.close(); }
+ /* ===================================================================
+ 6c. ALLE DREI, DIE VERTEILEN DUERFEN -- am Bildschirm
+
+ Filipe: „dogfather, die rechte hand und die linke hand sollen
+ immer noch aufgaben werden teilen können."
+
+ Der Server sagt das seit dem 22.09. ueber `darfAufgabenVerteilen`,
+ und Abschnitt 1 misst das dort auch. Hier geht es um die andere
+ Haelfte: ob es auf der SEITE ankommt. Genau diese Luecke war der
+ Fehler -- die Regel stimmte, der Knopf war trotzdem tot.
+
+ DIE DREI STEHEN IN EINER LISTE, und die Zahl der geprueften
+ Rollen steht in der Bedingung: Eine leere Schleife darf nicht
+ „in Ordnung" heissen.
+ =================================================================== */
+ const verteiler = [
+ ["admin", "CODE-DOGI-0001", "DogFather"],
+ ["hand", "CODE-HAND-0001", "die rechte Hand"],
+ ["linke", "CODE-LINK-0001", "die linke Hand"],
+ ];
+ let konnten = 0;
+ for (const [rolle, code, wer] of verteiler) {
+ const v = await seiteAls(rolle, code, 1180);
+ try {
+ await v.s.goto(`${SEITE}/workspace/entwicklung.html`, { waitUntil: "networkidle" });
+ await v.s.waitForTimeout(1700);
+ const stand = await v.s.evaluate(() => ({
+ band: document.getElementById("verteilen-band")
+ ? !document.getElementById("verteilen-band").hidden : null,
+ aus: document.getElementById("verteilen-knopf")?.disabled,
+ darf: window.__ich?.darf_verteilen,
+ }));
+ if (stand.band === true && stand.aus === false && stand.darf === true) {
+ /* Nicht nur hinsehen -- einmal aufmachen. Ein Knopf, der
+ nicht abgeschaltet ist, muss noch lange nichts tun. */
+ await v.s.click("#verteilen-knopf");
+ await v.s.waitForTimeout(500);
+ const auf = await v.s.evaluate(() => ({
+ offen: !document.getElementById("e-neu")?.hidden,
+ leute: document.querySelectorAll("#e-fuer-leute input[type=checkbox]").length,
+ }));
+ if (auf.offen && auf.leute > 0) konnten++;
+ }
+ ok(stand.band === true && stand.aus === false,
+ `${wer} sieht das Verteilband und kann es bedienen`
+ + ` (sichtbar=${stand.band}, aus=${stand.aus})`);
+ } finally { await v.ctx.close(); }
+ }
+ ok(konnten === verteiler.length,
+ `und alle ${verteiler.length} bekommen das Formular mit der Personenliste auf (${konnten})`);
+
+ /* GEGENPROBE: Ein Modi darf es NICHT. Ohne diese Zeile waere nicht
+ bewiesen, dass die drei oben etwas Besonderes koennen -- eine
+ Pruefung, die bei jedem gruen wird, misst keine Grenze. */
+ {
+ const m = await seiteAls("modi", "CODE-MODI-0001", 1180);
+ try {
+ await m.s.goto(`${SEITE}/workspace/entwicklung.html`, { waitUntil: "networkidle" });
+ await m.s.waitForTimeout(1700);
+ const stand = await m.s.evaluate(() => ({
+ band: document.getElementById("verteilen-band")
+ ? !document.getElementById("verteilen-band").hidden : null,
+ darf: window.__ich?.darf_verteilen,
+ }));
+ ok(stand.band === false && stand.darf === false,
+ `Gegenprobe: ein Modi sieht das Verteilband nicht`
+ + ` (sichtbar=${stand.band}, darf=${stand.darf})`);
+ } finally { await m.ctx.close(); }
+ }
+
ok(meckern.length === 0, meckern.length
? `der Browser meldet: ${meckern.slice(0, 3).join(" | ")}`
: "kein Absturz und keine Fehlermeldung im Browser");
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 44e5798c..c0b2823e 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,15 +16,15 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+