From 69517e090b618953c1cab57e9e00abf59b76f4a0 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Wed, 30 Sep 2026 11:22:14 +0200 Subject: [PATCH] Wer im Chat hochscrollt, wird nicht mehr ans Ende gerissen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `pruef-chat-ausbau` stand seit dem 28.09. rot: FEHL die Stelle bleibt stehen (0 -> 3574) FEHL der Knopf sagt, wie viel wartet ("Zum neuesten") FEHL er zaehlt mit ("Zum neuesten") FEHL pruef-chat-ausbau: unbehandelter Fehler (der Knopf blieb verborgen) WAS WIRKLICH PASSIERTE: Man liest weiter oben im Verlauf, jemand schreibt -- und man wird ans Ende gerissen. Der Zaehler „1 neue Nachricht" wurde dabei zurueckgesetzt, der Knopf blieb verborgen. DIE URSACHE STAND AN DER FALSCHEN STELLE. Die Zuhoerer, die „der Mensch hat selbst gescrollt" feststellen (Rad, Finger, Taste, Zeiger), hingen INNERHALB des Sprung-Blocks zur Neu-Linie -- wurden also erst angehaengt, NACHDEM einmal gesprungen worden war. In einem ruhigen Gespraech passiert das nie: Wer alles gelesen hat, bekommt keine Neu-Linie, der Block laeuft nicht, die Zuhoerer gibt es nicht. Scrollt er hoch und es kommt eine Nachricht, entsteht die Linie ZUM ERSTEN MAL -- der Block laeuft, haengt die Zuhoerer an und springt im selben Atemzug. Das Hochscrollen von vorhin hat nie jemand bemerkt. Das ist der haeufigste Fall ueberhaupt: ein stiller Chat, man liest etwas weiter oben nach, jemand schreibt. Die Wache steht jetzt beim Aufbau, bei den uebrigen Zuhoerern des Verlaufs. Ausdruecklich NICHT am `scroll`-Ereignis: Der Sprung scrollt selbst, und `scroll` unterscheidet nicht, wer gescrollt hat. Rad, Finger, Taste und Zeiger tut nur ein Mensch. UND DIE PRUEFUNG HAT SELBST GEMOGELT. Sie schrieb `e.scrollTop = 0` -- das setzt die Bildlaufposition zu, ohne dass ein Rad gedreht wurde. Damit haette sie den Fehler auch nach der Behebung noch gemeldet. Sie dreht jetzt das Rad (`mouse.wheel`) und prueft, dass sie oben angekommen ist. Dieselbe Lehre wie bei den Fingergeraeten: `setViewportSize` macht aus einer Maus keinen Finger, und `scrollTop = 0` macht aus einem Programm keinen Leser. Nachher: 70 Pruefungen, 0 Fehler (vorher 24/4). die Stelle bleibt stehen (0 -> 0) der Knopf sagt, wie viel wartet ("1 neue Nachricht") er zaehlt mit ("2 neue Nachrichten") wer unten steht, wird weiterhin mitgenommen -- ohne Knopf Alle sieben Chatpruefungen gruen: anhaenge 123/0, aufloesen 126/0, ausbau 70/0, kanaele 81/0, neu-stelle 63/0, neu 36/0, optik 62/0. Co-Authored-By: Claude Opus 5 --- server/pruef-chat-ausbau.mjs | 27 +++++++++++++++++-- workspace/anruf-probe.html | 10 +++---- workspace/app.webmanifest | 8 +++--- workspace/assets/js/chat.js | 46 ++++++++++++++++++++++++++++----- workspace/aufgaben.html | 38 +++++++++++++-------------- workspace/automation.html | 32 +++++++++++------------ workspace/befinden.html | 34 ++++++++++++------------ workspace/bereich.html | 44 +++++++++++++++---------------- workspace/bewerben.html | 38 +++++++++++++-------------- workspace/bewerbungen.html | 36 +++++++++++++------------- workspace/buehne.html | 6 ++--- workspace/calls.html | 34 ++++++++++++------------ workspace/chat.html | 40 ++++++++++++++-------------- workspace/content.html | 34 ++++++++++++------------ workspace/crew-index.html | 12 ++++----- workspace/crew.webmanifest | 8 +++--- workspace/dateien.html | 34 ++++++++++++------------ workspace/entwicklung.html | 36 +++++++++++++------------- workspace/hilfe.html | 30 ++++++++++----------- workspace/index.html | 10 +++---- workspace/kalender.html | 34 ++++++++++++------------ workspace/leistung.html | 32 +++++++++++------------ workspace/material.html | 32 +++++++++++------------ workspace/notizen.html | 28 ++++++++++---------- workspace/personen.html | 32 +++++++++++------------ workspace/profil.html | 36 +++++++++++++------------- workspace/reaktion.html | 38 +++++++++++++-------------- workspace/rechte.html | 34 ++++++++++++------------ workspace/report.html | 36 +++++++++++++------------- workspace/scouting.html | 32 +++++++++++------------ workspace/start.html | 32 +++++++++++------------ workspace/startcheck.html | 34 ++++++++++++------------ workspace/steckbrief.html | 36 +++++++++++++------------- workspace/support.html | 28 ++++++++++---------- workspace/tafel.html | 6 ++--- workspace/talente.html | 36 +++++++++++++------------- workspace/team.html | 32 +++++++++++------------ workspace/teamlage.html | 34 ++++++++++++------------ workspace/teilen.html | 30 ++++++++++----------- workspace/treff-moderation.html | 32 +++++++++++------------ workspace/treff-regeln.html | 32 +++++++++++------------ workspace/uebersicht.html | 32 +++++++++++------------ workspace/unsere-seiten.html | 30 ++++++++++----------- workspace/unterstuetzen.html | 32 +++++++++++------------ workspace/werdegang.html | 32 +++++++++++------------ workspace/willkommen.html | 30 ++++++++++----------- workspace/wissen.html | 34 ++++++++++++------------ 47 files changed, 734 insertions(+), 679 deletions(-) diff --git a/server/pruef-chat-ausbau.mjs b/server/pruef-chat-ausbau.mjs index 4debee3e..e0448845 100644 --- a/server/pruef-chat-ausbau.mjs +++ b/server/pruef-chat-ausbau.mjs @@ -318,9 +318,32 @@ melde("\n=== 3. Zum neuesten ==="); const knopfZu = await luna.seite.$eval("#zum-neuesten", (e) => e.hidden); ok(amEnde && knopfZu, "beim Öffnen steht er unten, und der Knopf ist weg"); - /* Luna liest weiter oben. */ - await luna.seite.$eval("#verlauf", (e) => { e.scrollTop = 0; }); + /* Luna liest weiter oben -- UND SIE SCROLLT WIE EIN MENSCH. + + Hier stand `e.scrollTop = 0`. Das setzt die Bildlaufposition zu, + ohne dass ein Rad gedreht, ein Finger gewischt oder eine Taste + gedrueckt wurde. Genau daran haengt im Chat aber eine + Entscheidung: „Wer selbst scrollt, hat entschieden" -- ab da + wird nicht mehr zur Neu-Linie gesprungen (die Zuhoerer sind + `wheel`, `touchstart`, `keydown`, `pointerdown`). + + Eine Zuweisung loest keines davon aus. Die Anwendung hielt Luna + deshalb weiter fuer jemanden, der nicht selbst gescrollt hat, + sprang zur Neu-Linie und setzte den Zaehler zurueck -- voellig + richtig. Dieselbe Lehre wie bei den Fingergeraeten: + `setViewportSize` macht aus einer Maus keinen Finger, und + `scrollTop = 0` macht aus einem Programm keinen Leser. */ + await luna.seite.hover("#verlauf"); + for (let i = 0; i < 12; i++) { + await luna.seite.mouse.wheel(0, -2000); + await luna.seite.waitForTimeout(60); + const oben = await luna.seite.$eval("#verlauf", (e) => e.scrollTop); + if (oben <= 0) break; + } await luna.seite.waitForTimeout(400); + const obenAngekommen = await luna.seite.$eval("#verlauf", (e) => e.scrollTop); + ok(obenAngekommen < 40, + `Luna ist mit dem Rad nach oben gescrollt (${obenAngekommen})`); const vorher = await luna.seite.$eval("#verlauf", (e) => e.scrollTop); await schicke(pat.seite, raumId, "Und noch etwas Neues dazu."); diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index cd1b9595..9ce6392a 100644 --- a/workspace/anruf-probe.html +++ b/workspace/anruf-probe.html @@ -16,8 +16,8 @@ verdeckt. Gefunden hat es pruef-struktur. Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. --> - - + + - +