Gelesene Antworten rutschen zur Seite -- statt sich zu stapeln
VanVan im Support, Meldung #15: „Die Modis können die Antworten auf die Bewerbungen im Bereich eure Aufgaben noch nicht einklappen. Das wird mit der Zeit unübersichtlich." WARUM ES NICHT EINFACH EIN SCHALTER GEWORDEN IST Am 30.09. habe ich diesen Kasten absichtlich NICHT einklappbar gebaut, und die Begruendung steht woertlich im Quelltext: „Eine Antwort, die man erst aufklappen muss, ist wieder keine." Sie ist richtig -- fuer eine Antwort, die man noch nicht gelesen hat. Danach ist sie falsch herum, und genau das meldet VanVan. Ein Schalter, der alles wegklappt, haette die naechste Absage mitversteckt: die Zeile, derentwegen der Kasten ueberhaupt entstanden ist. Deshalb nicht „einklappbar", sondern GELESEN: · Was noch niemand quittiert hat, steht offen da -- wie bisher. · „Verstanden" schiebt eine Zeile hinter „N ältere Antworten", zugeklappt, jederzeit wieder aufzumachen. Nichts wird geloescht; eine Absage samt Begruendung wegzuwerfen, weil jemand sie einmal gelesen hat, waere das Gegenteil des Umbaus vom 30.09. · Ab zwei offenen Antworten gibt es „Alle N verstanden" -- wer nach dem Urlaub sieben vorfindet, soll nicht siebenmal tippen, und sieben Anfragen waeren sieben Gelegenheiten, dass eine verloren geht. AM MENSCHEN, NICHT AM GERAET `gesehen_am` steht in `vorlagen_bewerbungen`, nicht im Browserspeicher. „Habe ich das gelesen?" ist eine Frage ueber die Person: Sonst waere dieselbe Antwort auf dem Handy wieder neu, nachdem man sie am Rechner gelesen hat -- und das waere genau die Unuebersichtlichkeit, die gemeldet wurde, nur eine Tuer weiter. Das AUFKLAPPEN der aelteren bleibt dagegen im Augenblick: kein Zustand, den man mitschleppt. Nach dem Neuladen ist wieder zu. GEGEN FREMDE ZEILEN GESCHUETZT: Nur die eigenen, nur die beantworteten, 404 statt 403 -- wie ueberall im Haus. Ein zweites „Verstanden" zaehlt nicht noch einmal, sonst wanderte die Zeile bei jedem Klick ans Ende und man saehe nicht mehr, wann man sie wirklich gelesen hat. WAS ICH FALSCH ERWARTET HATTE: Meine erste Pruefung verlangte, dass nach einem „Verstanden" OBEN NICHTS mehr steht. Sie wurde rot -- Frida hatte zwei Antworten, und der Knopf gilt je Zeile. Die Pruefung hatte recht; dass er nur seine eigene Zeile nimmt, ist das gewollte Verhalten und steht jetzt als Aussage dort. NEBENBEI: Ein 11,2-px-Pfeil (gemeldet von pruef-css-klassen). Unter 11,5 px faengt im Haus die Grenze an, ab der man zusammenkneift -- dass es „nur ein Zeichen" ist, aendert daran nichts. GEPRUEFT pruef-bewerbung-aufgaben 164 -> 178 ok Im echten Browser, am Handy (390 px): die ungelesene Antwort steht offen mit „Verstanden", danach ist genau diese eine Zeile weg (2 -> 1), sie liegt hinter „1 ältere Antwort", zugeklappt wird sie gar nicht erst gebaut, aufgeklappt steht sie samt Begruendung wieder da, „Alle verstanden" raeumt den Rest, nach dem Neuladen gilt beides weiter als gelesen und ist wieder zu. Am Server: fremde Antwort 404, erfundene Nummer 404, zweites „Verstanden" zaehlt 0. pruef-struktur 102 ok, 414 Routen (eine neue) · pruef-css-klassen · pruef-zeichen 7 · pruef-modi-katalog 150 · pruef-vorlagen 24 · pruef-aufgaben-vorlagen 60 NUR DAS AGENTURHAUS. „Eure Aufgaben" liegt unter `/workspace`; am Crew-Haus aendert sich keine Zeile. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -848,8 +848,127 @@ melde("=== 6. Am echten Bildschirm ===");
|
||||
await kasten2.screenshot({ path: "server/pruef-bewerbung-antwort.png" });
|
||||
console.log(" -- Bild: server/pruef-bewerbung-antwort.png");
|
||||
}
|
||||
|
||||
/* ==== „VERSTANDEN" RAEUMT AUF (03.10.2026) ==============
|
||||
|
||||
VanVan im Support, Meldung #15: „Die Modis können die
|
||||
Antworten auf die Bewerbungen im Bereich eure Aufgaben noch
|
||||
nicht einklappen. Das wird mit der Zeit unübersichtlich."
|
||||
|
||||
GEMESSEN WIRD DER GANZE WEG, nicht nur die Route: Knopf
|
||||
druecken, Zeile rutscht in die zugeklappte Gruppe, Gruppe
|
||||
laesst sich oeffnen, Text ist noch da -- und nach dem
|
||||
Neuladen ist sie immer noch gelesen. Der letzte Punkt ist
|
||||
der eigentliche: Haette ich es im Browserspeicher gemerkt,
|
||||
waere dieselbe Antwort auf dem naechsten Geraet wieder neu. */
|
||||
const stand = () => m5.s.evaluate(() => {
|
||||
const neuB = document.querySelector('.vorlagenbrett__antwort:not([data-alt])');
|
||||
const altB = document.querySelector('.vorlagenbrett__antwort[data-alt="ja"]');
|
||||
return {
|
||||
neuZeilen: neuB ? neuB.querySelectorAll(".vorlagenbrett__antwort-zeile").length : 0,
|
||||
altKopf: altB
|
||||
? (altB.querySelector(".vorlagenbrett__antwort-kopf")?.innerText || "").trim()
|
||||
: null,
|
||||
altZeilen: altB ? altB.querySelectorAll(".vorlagenbrett__antwort-zeile").length : 0,
|
||||
knopf: !!document.querySelector(".vorlagenbrett__antwort-weg"),
|
||||
};
|
||||
});
|
||||
|
||||
const vorher = await stand();
|
||||
ok(vorher.neuZeilen >= 1 && vorher.knopf === true,
|
||||
`die ungelesene Antwort steht offen da, mit „Verstanden" (${vorher.neuZeilen})`);
|
||||
ok(vorher.altKopf === null,
|
||||
`und es gibt noch keine aeltere Gruppe (${vorher.altKopf})`);
|
||||
|
||||
await m5.s.click(".vorlagenbrett__antwort-weg");
|
||||
await m5.s.waitForTimeout(1200);
|
||||
const danach = await stand();
|
||||
/* EINE WENIGER, NICHT KEINE. Mein erster Anlauf erwartete hier
|
||||
null -- Frida hat aber ZWEI Antworten (eine Zusage von
|
||||
weiter oben und diese Absage), und „Verstanden" gilt je
|
||||
Zeile. Die Pruefung hatte recht, die Erwartung war falsch;
|
||||
dass der Knopf nur seine eigene Zeile nimmt, ist genau das
|
||||
gewollte Verhalten und steht jetzt hier als Aussage. */
|
||||
ok(danach.neuZeilen === vorher.neuZeilen - 1,
|
||||
`nach „Verstanden" ist genau diese eine Zeile weg `
|
||||
+ `(${vorher.neuZeilen} → ${danach.neuZeilen})`);
|
||||
/* SIE IST NICHT WEG, SIE IST NUR ZU. Eine Absage samt
|
||||
Begruendung zu loeschen, weil jemand sie einmal gelesen
|
||||
hat, waere das Gegenteil von dem, was am 30.09. gebaut
|
||||
wurde. */
|
||||
ok(/1 ältere Antwort/.test(danach.altKopf || ""),
|
||||
`sondern hinter einer zugeklappten Zeile („${danach.altKopf}")`);
|
||||
ok(danach.altZeilen === 0,
|
||||
` und zugeklappt wird sie gar nicht erst gebaut (${danach.altZeilen})`);
|
||||
|
||||
await m5.s.click(".vorlagenbrett__antwort-kopf");
|
||||
await m5.s.waitForTimeout(800);
|
||||
const auf = await m5.s.evaluate(() => {
|
||||
const altB = document.querySelector('.vorlagenbrett__antwort[data-alt="ja"]');
|
||||
return {
|
||||
zeilen: altB ? altB.querySelectorAll(".vorlagenbrett__antwort-zeile").length : 0,
|
||||
text: altB ? (altB.innerText || "").replace(/\s+/g, " ").trim() : "",
|
||||
};
|
||||
});
|
||||
ok(auf.zeilen === 1, `aufgeklappt steht sie wieder da (${auf.zeilen})`);
|
||||
ok(/schon drei offene/.test(auf.text),
|
||||
"mitsamt der Begruendung — nachlesen geht weiter");
|
||||
|
||||
/* ---- UND DER KNOPF FUER ALLE AUF EINMAL ----------------
|
||||
Wer nach dem Urlaub sieben Antworten vorfindet, soll nicht
|
||||
siebenmal tippen. Er steht erst ab zwei da -- bei einer
|
||||
waere er dasselbe wie der daneben, nur laenger. */
|
||||
await m5.s.click(".vorlagenbrett__antwort-kopf"); /* wieder zu */
|
||||
await m5.s.waitForTimeout(500);
|
||||
const vorAlle = await m5.s.evaluate(() =>
|
||||
!!document.querySelector(".vorlagenbrett__antwort-alle"));
|
||||
if (vorAlle) {
|
||||
await m5.s.click(".vorlagenbrett__antwort-alle");
|
||||
await m5.s.waitForTimeout(1200);
|
||||
} else {
|
||||
/* Nur noch eine offen -- dann nimmt sie ihr eigener Knopf. */
|
||||
await m5.s.click(".vorlagenbrett__antwort-weg");
|
||||
await m5.s.waitForTimeout(1200);
|
||||
}
|
||||
const leer = await stand();
|
||||
ok(leer.neuZeilen === 0,
|
||||
`danach steht oben gar nichts mehr (${leer.neuZeilen})`);
|
||||
ok(/2 ältere Antworten/.test(leer.altKopf || ""),
|
||||
`und beide stehen in der zugeklappten Gruppe („${leer.altKopf}")`);
|
||||
|
||||
/* UND DER SERVER HAT ES SICH GEMERKT. */
|
||||
await m5.s.reload({ waitUntil: "networkidle" });
|
||||
await m5.s.waitForTimeout(1800);
|
||||
const nachLaden = await stand();
|
||||
ok(nachLaden.neuZeilen === 0 && /2 ältere Antworten/.test(nachLaden.altKopf || ""),
|
||||
`nach dem Neuladen gelten sie weiter als gelesen („${nachLaden.altKopf}")`);
|
||||
/* UND SIE IST WIEDER ZU. Das Aufklappen ist eine Frage des
|
||||
Augenblicks, kein Zustand, den man mitschleppt. */
|
||||
ok(nachLaden.altZeilen === 0,
|
||||
`und wieder zugeklappt (${nachLaden.altZeilen} Zeilen)`);
|
||||
} finally { await m5.ctx.close(); }
|
||||
|
||||
/* GEGENPROBE AM SERVER: Eine fremde Antwort laesst sich nicht
|
||||
als gelesen melden -- und eine, auf die noch niemand
|
||||
geantwortet hat, auch nicht. Ohne diese beiden waere
|
||||
„gesehen" ein Knopf, mit dem man in fremden Zeilen schreibt. */
|
||||
{
|
||||
const fremd = await roh("/workspace/api/vorlagen/bewerbung/gesehen", {
|
||||
methode: "POST", keks: hand.keks, body: { id: bw2?.id } });
|
||||
ok(fremd.code === 404,
|
||||
`eine fremde Antwort kann niemand als gelesen melden (${fremd.code})`);
|
||||
|
||||
const erfunden = await roh("/workspace/api/vorlagen/bewerbung/gesehen", {
|
||||
methode: "POST", keks: modi.keks, body: { id: 999999 } });
|
||||
ok(erfunden.code === 404, `eine erfundene Nummer auch nicht (${erfunden.code})`);
|
||||
|
||||
/* UND ZWEIMAL „VERSTANDEN" AENDERT NICHTS MEHR. */
|
||||
const nochmal = await roh("/workspace/api/vorlagen/bewerbung/gesehen", {
|
||||
methode: "POST", keks: modi.keks, body: { id: bw2?.id } });
|
||||
ok(nochmal.code === 200 && nochmal.json?.wieviele === 0,
|
||||
`ein zweites „Verstanden" zaehlt nicht noch einmal (${nochmal.json?.wieviele})`);
|
||||
}
|
||||
|
||||
const h2 = await seiteAls("hand", "CODE-HAND-0001", 1280);
|
||||
try {
|
||||
await h2.s.goto(`${SEITE}/workspace/entwicklung.html`, { waitUntil: "networkidle" });
|
||||
|
||||
Reference in New Issue
Block a user