B1: Das Anschlagbrett haelt 24 Stunden -- und sieht aus wie ein Anschlagbrett

"die sachen sollen in der seite vom anschlagbrett immer automatisch
nach 24h von da verschwinden. weil alles hat seine kategorie und was
nicht ist auch nicht um ewig auf der seite zu bleiben fertig."

SEINE BEGRUENDUNG IST DIE REGEL. Ein Anschlagbrett sagt, was GERADE
gilt. Was laenger gilt, hat seinen eigenen Bereich -- Regeln stehen bei
den Regeln, Termine bei "Was ansteht". Eine Ansage vom letzten
Dienstag, die noch haengt, ist keine Ansage mehr, sondern Papier an der
Wand.

DIE DREI ENTSCHEIDUNGEN, DIE ICH TREFFEN MUSSTE -- und woran ich sie
festgemacht habe:

1. AB WANN LAUFEN DIE 24 STUNDEN? Ab `erstellt`, nicht ab `datum`.
   `datum` ist ein vom Team gesetztes Feld und kann in der Zukunft
   liegen (es traegt die Termine). Eine Ansage, die morgen gilt, soll
   morgen verschwinden und nicht uebermorgen.

2. VERSCHWINDET SIE GANZ? Nein. Er sagt "von DA verschwinden" -- von
   der Seite. Geloescht wird nichts: Wer eine Ansage geschrieben hat,
   soll sie wiederfinden. Sie kommt als `abgehaengt` mit und steht
   zugeklappt unter einer leisen Zeile "Abgehaengt (3)". Auf dem Brett
   selbst steht sie damit nicht mehr.

3. WER ENTSCHEIDET? Der Server. Die Stunden im Browser nachzurechnen
   waere eine zweite Fassung derselben Regel, und eine davon waere
   irgendwann aelter. Die Frist geht als Zahl mit der Antwort.

DAS AUSSEHEN ("viel besser gestaltet, übersichtlicher, moderner,
hochwertiger, professioneller"): Was haengt, sieht jetzt aus wie etwas,
das haengt -- kraeftiger Rand links in der Farbe seiner ART (Ansage
babyblau, Neue Regel gold, Hinweis lila, Danke gruen), ein Schein von
links, mehr Luft. Die Art stand bisher nur im Text; jetzt sieht man
sie. Abgehaengtes ist grau statt durchsichtig -- durchsichtig hiesse,
das Buehnenbild scheint durch, also Text auf einem Foto.

pruef-anschlagbrett.mjs (NEU, 12/0) misst beide Seiten der Grenze
(23 h haengt, 25 h nicht), rechnet relativ zur jetzigen Uhrzeit statt
mit einem festen Datum, und hat den Eintrag, an dem sich alles
entscheidet: alt aufgehaengt, Datum von heute. Wer nach `datum`
filtert, laesst ihn haengen. Dazu zwei Gegenproben: auf jedem anderen
Brett gibt es das Merkmal gar nicht, und wo die Grenze WIRKLICH liegt,
wird aus den Eintraegen nachgerechnet statt aus der Zahl im Modul.

NEBENBEFUND, den erst dieser Commit ausgeloest hat
---------------------------------------------------
pruef-bereiche-lesend stuerzte ab: "listen EACCES 127.0.0.1:5040".

Die Portnummern werden aus der Stelle im Alphabet abgeleitet -- heute
sind fuenf neue Pruefdateien dazugekommen, und dadurch ist diese
Pruefung auf die 5040 gerutscht. Die haelt auf diesem Rechner ein
Windows-Dienst (svchost, PID 7136).

`portMussFreiSein` kannte nur ZWEI Antworten: EADDRINUSE oder frei.
EACCES galt als frei -- die Pruefung lief weiter, bis der echte Server
auf demselben Port startete und mit einem unbehandelten Fehler
abstuerzte. Ein Stapelauszug aus node:net, der wie ein Fehler im Code
aussieht.

Jetzt drei Antworten. Und ein belegter Port wird anders behandelt als
ein gesperrter: Belegt geht vorbei (der andere Lauf hoert auf),
gesperrt nie. Abzubrechen hiesse, die Pruefung waere auf diesem Rechner
dauerhaft nicht ausfuehrbar -- die Sorte Warnung, die immer kommt und
deshalb weggeklickt wird. Ausgewichen wird um einen festen Betrag
(+4000), damit die Nummer abgeleitet und eindeutig bleibt.

Mitgelaufen und gruen: pruef-bereiche-lesend, pruef-css-klassen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-22 23:47:52 +02:00
co-authored by Claude Opus 5
parent 7c23913347
commit 189d0b3363
44 changed files with 1097 additions and 591 deletions
+76
View File
@@ -466,6 +466,18 @@
const k = el('article', 'eintrag-karte');
k.dataset.dringlich = e.dringlichkeit;
k.dataset.status = e.status;
/* DIE ART GEHOERT AN DIE KARTE (22.09.2026).
Am Anschlagbrett traegt sie die Farbe: Ansage, Neue Regel,
Hinweis, Danke an euch. Sie stand bisher nur im Text der Karte
-- eine Auskunft, die man lesen muss, statt einer, die man
sieht.
Das Merkmal steht an JEDER Karte und nicht nur am
Anschlagbrett: Es ist eine Tatsache ueber den Eintrag, keine
Anzeige. Wer sie auf einem anderen Brett braucht, findet sie
vor -- und muss nicht erst diese Zeile aendern. */
if (e.art) k.dataset.art = e.art;
/* DER GANZE KASTEN IST DER WEG ZUM VIDEO (19.09.2026).
@@ -2242,6 +2254,63 @@
ziel.append(kasten);
window.abschnittKlappbar?.(kopf, kasten, `ansteht:${r}`, r === 'vorbei');
}
} else if (bereich === 'anschlag') {
/* =================================================================
DAS ANSCHLAGBRETT: WAS GERADE HAENGT, UND WAS ABGEHAENGT IST
=================================================================
Filipe: „die sachen sollen in der seite vom anschlagbrett
immer automatisch nach 24h von da verschwinden. weil alles
hat seine kategorie und was nicht ist auch nicht um ewig auf
der seite zu bleiben fertig."
WER ENTSCHEIDET, IST DER SERVER. `e.abgehaengt` kommt mit der
Antwort; hier wird nur einsortiert. Die Stunden im Browser
nachzurechnen waere eine zweite Fassung derselben Regel --
und eine davon waere irgendwann aelter als die andere.
ABGEHAENGT HEISST ZUGEKLAPPT, NICHT GELOESCHT. Er sagt „von
DA verschwinden": von der Seite. Wer eine Ansage geschrieben
hat, soll sie wiederfinden; sie rueckwirkend verschwinden zu
lassen waere etwas anderes als sie abzuhaengen. Die Zeile
darunter ist leise und zu -- auf dem Brett selbst steht sie
damit nicht mehr.
================================================================= */
const haengt = sichtbar.filter((e) => !e.abgehaengt);
const ab = sichtbar.filter((e) => e.abgehaengt);
for (const e of haengt) {
const k = karte(e);
karten.set(e.id, k);
ziel.append(k);
}
/* NICHTS HAENGT MEHR, ABER ES GAB ETWAS: Dann steht der
Leersatz des Bretts nicht da (die Liste ist ja nicht leer),
und man saehe eine Seite, auf der nichts ist und nichts
erklaert wird. */
if (!haengt.length && ab.length) {
ziel.append(el('p', 'leer-hinweis',
'Gerade hängt nichts. Was hier stand, ist abgehängt – es gilt nicht mehr.'));
}
if (ab.length) {
const kopf = el('h2', 'anschlag-alt__kopf');
kopf.append(el('span', 'anschlag-alt__wort', 'Abgehängt'));
kopf.append(el('span', 'anschlag-alt__zahl', String(ab.length)));
const kasten = el('div', 'anschlag-alt');
for (const e of ab) {
const k = karte(e);
k.dataset.abgehaengt = 'ja';
karten.set(e.id, k);
kasten.append(k);
}
ziel.append(kopf);
ziel.append(kasten);
/* ZU, SOLANGE NIEMAND SIE AUFMACHT -- derselbe Klappmechanismus
wie bei „Was ansteht". Ein eigener waere ein zweiter, der
sich anders verhaelt. */
window.abschnittKlappbar?.(kopf, kasten, 'anschlag:alt', true);
}
} else {
for (const e of sichtbar) {
const k = karte(e);
@@ -2486,6 +2555,13 @@
(async () => {
bereich = new URLSearchParams(location.search).get('b') || '';
/* WELCHES BRETT DAS IST, STEHT AM KOERPER (22.09.2026).
Die Stilvorlage braucht es, um dem Anschlagbrett eine eigene
Sprache zu geben. Sie darueber zu setzen statt ueber eine
zusaetzliche Klasse an jeder Karte heisst: EINE Stelle, und sie
stimmt auch fuer alles, was morgen dazukommt. */
if (/^[a-z]+$/.test(bereich)) document.body.dataset.bereich = bereich;
/* Wird eine Bewertung gesetzt, baut sich die Liste neu auf. Der
Zuhoerer haengt am Dokument und wird genau einmal gesetzt --