From 0a2363374cec8e484b0caf9c6bedf4bba15c8e77 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Sun, 20 Sep 2026 12:44:31 +0200 Subject: [PATCH] Eine Nachricht, die nicht ankommt, sieht man jetzt -- und schickt sie neu DER KOMMENTAR STAND DA, DIE SACHE NICHT. Im Chat stand woertlich: "NICHT STILL VERSCHWINDEN LASSEN. Wer etwas schreibt und es sieht, glaubt, es sei angekommen." Gemessen: `markiereAlsGescheitert` setzte `n.gescheitert = true` -- und gelesen hat das Merkmal NIEMAND, weder das Skript noch das CSS. Eine gescheiterte Nachricht sah exakt aus wie eine zugestellte. Im CSS stand an der Stelle eine leere Regel mit dem Kommentar "Platzhalter, damit :has unterstuetzt bleibt". Ein Kommentar, der eine Absicht beschreibt, erfuellt sie nicht. Jetzt: sichtbare Kante an der Blase, blasse Darstellung solange sie unterwegs ist, und ein Knopf "Nochmal senden" daneben. Der Satz in der Meldezeile bat vorher ums Kopieren -- fuenf Handgriffe fuer etwas, das die Seite in einem tun kann; den Text hat sie ja noch. KEIN ZWEITER SENDEWEG: Der Knopf legt den Text zurueck ins Feld, stellt das Antwortziel wieder her und ruft `abschicken`. Ein eigener Weg waere morgen anders als dieser, und der Unterschied fiele erst auf, wenn er zaehlt. "ZUM NEUESTEN" STAND AUF EINER RECHNUNG VON GESTERN: `bottom: 96px` -- die Hoehe der Schreibleiste an dem Tag, an dem der Knopf gebaut wurde. Das Textfeld waechst aber bis 160. Wer lange tippt und gleichzeitig oben liest, hatte den Knopf HINTER der Leiste. Und darueber koennen noch das Nachtruhe-Band und der Hochlade-Balken stehen. Jetzt misst die Seite den ganzen Unterbau selbst -- ueber einen Beobachter statt einer Liste von Ausloesern, denn das Band erscheint um Mitternacht von selbst. Kommt morgen ein viertes Bauteil dazu, rechnet es von allein mit. NEUE PRUEFUNG FUER EINEN WEG, DEN NIE ETWAS GEPRUEFT HAT: pruef-chat-optik faengt die Sendeanfrage jetzt einmal ab und geht den ganzen Fehlerweg durch -- 10 Aussagen, darunter: der Unterschied ist auch zu SEHEN, nicht nur im Merkmal (Rand 1px) die Nachricht steht danach GENAU EINMAL da, nicht doppelt und sie ist beim Gegenueber angekommen Der letzte ist der eigentliche: Alles davor koennte gut aussehen und trotzdem nichts zugestellt haben. pruef-treffchat war seit gestern rot -- 8 Fehler ueber "undefined". Sie suchte die Kachel mit `ziel === "chat.html"`, seit dem 19.09. heisst es `chat.html?raum=treff` (sie fuehrt direkt in den Raum). Kein Befund ueber das Haus, sondern einer ueber sich selbst. Sie sucht jetzt nach der SEITE und prueft statt des Wortlauts das, worauf es ankommt: Man erkennt den Chat, und der Name kommt genau einmal vor. 110/0 statt 108 mit 8 Fehlern. pruef-chat, -anhaenge, -kanaele, -optik, -ausbau gruen, pruef-start-ansicht 151/0, pruef-tippziele 11/0, pruef-nachfrage 33/0, pruef-leerzustand 13/0, pruef-meldungen 8/0, pruef-css-klassen gruen. --- server/pruef-chat-optik.mjs | 99 ++++++++++++++++++++++++++ server/pruef-treffchat.mjs | 17 ++++- workspace/anruf-probe.html | 10 +-- workspace/app.webmanifest | 8 +-- workspace/assets/css/chat.css | 63 ++++++++++++++++- workspace/assets/js/chat.js | 120 +++++++++++++++++++++++++++++++- workspace/aufgaben.html | 30 ++++---- workspace/automation.html | 30 ++++---- workspace/befinden.html | 28 ++++---- workspace/bereich.html | 40 +++++------ workspace/bewerben.html | 34 ++++----- workspace/bewerbungen.html | 32 ++++----- workspace/calls.html | 32 ++++----- workspace/chat.html | 34 ++++----- workspace/content.html | 34 ++++----- workspace/crew-index.html | 12 ++-- workspace/crew.webmanifest | 8 +-- workspace/dateien.html | 32 ++++----- workspace/entwicklung.html | 28 ++++---- workspace/hilfe.html | 26 +++---- workspace/index.html | 10 +-- workspace/kalender.html | 32 ++++----- workspace/leistung.html | 30 ++++---- workspace/personen.html | 30 ++++---- workspace/profil.html | 34 ++++----- workspace/rechte.html | 28 ++++---- workspace/report.html | 32 ++++----- workspace/scouting.html | 30 ++++---- workspace/start.html | 28 ++++---- workspace/startcheck.html | 32 ++++----- workspace/steckbrief.html | 34 ++++----- workspace/talente.html | 30 ++++---- workspace/team.html | 30 ++++---- workspace/teamlage.html | 28 ++++---- workspace/teilen.html | 26 +++---- workspace/treff-moderation.html | 28 ++++---- workspace/treff-regeln.html | 30 ++++---- workspace/uebersicht.html | 30 ++++---- workspace/unsere-seiten.html | 26 +++---- workspace/werdegang.html | 30 ++++---- workspace/wissen.html | 32 ++++----- 41 files changed, 807 insertions(+), 520 deletions(-) diff --git a/server/pruef-chat-optik.mjs b/server/pruef-chat-optik.mjs index d8cd036e..9a615581 100644 --- a/server/pruef-chat-optik.mjs +++ b/server/pruef-chat-optik.mjs @@ -394,6 +394,105 @@ melde("\n=== Der Fuss bleibt in der Blase ==="); await luna.seite.waitForTimeout(300); } +/* ===================================================================== + EINE NACHRICHT, DIE NICHT ANKOMMT (20.09.2026) + + Der wichtigste Satz im Code daneben lautete: „NICHT STILL + VERSCHWINDEN LASSEN. Wer etwas schreibt und es sieht, glaubt, es + sei angekommen." Gemessen am 20.09.2026 wurde er nicht eingehalten: + `markiereAlsGescheitert` setzte `n.gescheitert = true` -- und + gelesen hat das Merkmal NIEMAND, weder das Skript noch das CSS. + Eine gescheiterte Nachricht sah exakt aus wie eine zugestellte. + + Ein Kommentar, der eine Absicht beschreibt, erfüllt sie nicht. + + Und der Satz in der Meldezeile bat den Nutzer, die Arbeit der Seite + zu machen: „kopiere sie und versuch es erneut" -- markieren, + kopieren, Feld leeren, einfügen, senden. Fünf Handgriffe für etwas, + das die Seite in einem tun kann; den Text hat sie ja noch. + + Geprüft wird deshalb der GANZE Weg, und zwar an einem echten + Fehlschlag: Die Anfrage wird unterwegs abgefangen, die Nachricht + muss sichtbar scheitern, und der Knopf daneben muss sie wirklich + zustellen. + ===================================================================== */ +{ + melde("\n— Eine Nachricht, die nicht ankommt —"); + + /* Den Sendeweg EINMAL scheitern lassen. Nicht den Server abschalten: + Dann wäre auch der Ereignisstrom weg, und die Prüfung misst einen + anderen Fehler als den gemeinten. */ + let abgefangen = 0; + await luna.seite.route("**/api/chat/raeume/*/nachrichten", (weg) => { + if (abgefangen === 0) { abgefangen++; return weg.abort("failed"); } + return weg.continue(); + }); + + const TEXT = "Diese Nachricht scheitert beim ersten Versuch."; + await luna.seite.fill("#text", TEXT); + await luna.seite.press("#text", "Enter"); + await luna.seite.waitForTimeout(900); + + ok(abgefangen === 1, `die Anfrage wurde wirklich abgefangen (${abgefangen}x)`); + + const gescheitert = await luna.seite.evaluate((t) => { + const alle = [...document.querySelectorAll(".chat-nachricht")]; + const z = alle.find((e) => e.textContent.includes(t)); + if (!z) return null; + return { + markiert: z.dataset.gescheitert === "ja", + knopf: !!z.querySelector(".chat-nachricht__nochmal"), + /* Sieht man den Unterschied WIRKLICH -- oder steht er nur im + Merkmal? Gemessen an echten Bildpunkten. */ + rand: getComputedStyle(z.querySelector(".chat-nachricht__blase")).borderTopWidth, + }; + }, TEXT); + + ok(gescheitert !== null, "die Nachricht steht noch im Verlauf"); + ok(gescheitert?.markiert === true, "und ist sichtbar als gescheitert markiert"); + ok(gescheitert?.rand !== "0px", + `der Unterschied ist auch zu SEHEN, nicht nur im Merkmal (Rand ${gescheitert?.rand})`); + ok(gescheitert?.knopf === true, "und daneben steht „Nochmal senden“"); + + /* Der Satz in der Meldezeile verlangt nichts mehr vom Nutzer. */ + const satz = await luna.seite.evaluate(() => + document.getElementById("fehler")?.textContent || ""); + ok(!/kopiere/i.test(satz), + `und die Meldung bittet nicht mehr ums Kopieren („${satz.slice(0, 70)}“)`); + + /* ---- Und jetzt der Knopf ---------------------------------------- */ + const vorher = await luna.seite.evaluate(() => + document.querySelectorAll(".chat-nachricht").length); + await luna.seite.click(".chat-nachricht__nochmal"); + await luna.seite.waitForTimeout(1200); + + const danach = await luna.seite.evaluate((t) => { + const alle = [...document.querySelectorAll(".chat-nachricht")]; + const treffer = alle.filter((e) => e.textContent.includes(t)); + return { + anzahl: alle.length, + mitText: treffer.length, + nochGescheitert: treffer.some((e) => e.dataset.gescheitert === "ja"), + }; + }, TEXT); + + ok(danach.mitText === 1, + `die Nachricht steht danach GENAU EINMAL da (${danach.mitText}x) ` + + `— nicht doppelt, wie es bei einem zweiten Sendeweg passieren würde`); + ok(danach.nochGescheitert === false, "und gilt nicht mehr als gescheitert"); + ok(danach.anzahl === vorher, `die Zahl der Nachrichten blieb gleich (${vorher} → ${danach.anzahl})`); + + /* Und sie ist WIRKLICH beim Gegenüber angekommen -- nicht nur im + eigenen Bild. Das ist der Unterschied zwischen „sieht gut aus" + und „funktioniert". */ + await pat.seite.waitForTimeout(800); + const beimAnderen = await pat.seite.evaluate((t) => + document.body.textContent.includes(t), TEXT); + ok(beimAnderen === true, "und sie ist beim Gegenüber angekommen"); + + await luna.seite.unroute("**/api/chat/raeume/*/nachrichten"); +} + await luna.ctx.close(); await pat.ctx.close(); await browser.close(); diff --git a/server/pruef-treffchat.mjs b/server/pruef-treffchat.mjs index f269dc70..652f1075 100644 --- a/server/pruef-treffchat.mjs +++ b/server/pruef-treffchat.mjs @@ -464,9 +464,22 @@ melde("=== 6. Die Kachel ==="); { const ich = json(await ruf("/workspace/api/ich", CREW, "GET", { cookie: kGast })); const alle = [...(ich.bereiche || []), ...(ich.bereiche_zusatz || [])]; - const k = alle.find((x) => x.ziel === "chat.html"); + /* NACH DER SEITE SUCHEN, NICHT NACH DER GANZEN ADRESSE (20.09.2026). + Hier stand `x.ziel === "chat.html"`. Seit dem 19.09. traegt die + Kachel `chat.html?raum=treff` -- sie fuehrt direkt in den Raum, + statt in einer Liste zu landen. Die Pruefung fand sie danach gar + nicht mehr und meldete acht Fehler ueber „undefined": kein Befund + ueber das Haus, sondern einer ueber sich selbst. */ + const k = alle.find((x) => String(x.ziel).split("?")[0] === "chat.html"); ok(!!k, "die Community hat eine Chat-Kachel"); - ok(k?.name === "Chat", `sie heißt „${k?.name}“`); + /* NICHT MEHR AUF DEN WORTLAUT „Chat" FESTGENAGELT. Ein Modi hat + ZWEI Kacheln, die in den Chat fuehren -- die des Teams und die + des Treffs. Hiessen beide „Chat", waere das die Falle, die am + 19.09. behoben wurde. Geprueft wird deshalb, worauf es ankommt: + Man erkennt den Chat, und der Name ist eindeutig. */ + ok(/chat/i.test(k?.name || ""), `sie ist als Chat erkennbar: „${k?.name}“`); + ok(alle.filter((x) => x.name === k?.name).length === 1, + `und ihr Name kommt genau einmal vor („${k?.name}“)`); ok(/nacht/i.test(k?.unter || ""), `und sagt schon auf der Startseite, dass er nachts schläft: „${k?.unter}“`); diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 4c81e8b9..6ad585a5 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`. --> - - + + - +