Kapitel 11 auf der Crew-Adresse: die Community gehoert nicht in die Pflegeliste

ZWEITER BEFUND DES ABENDS, und wieder einer, den es im Agenturhaus
gar nicht geben konnte.

Bauplan Kapitel 11, woertlich: "Stand der Ersten Schritte: nur fuer
Team-Rollen, 'fertig / offen' mit Datum. Fuer die Community wird
nichts je Person angezeigt."

Gemessen: Auf der Crew-Adresse nahm die Liste schlicht alle Fassungen
des Hauses -- und seit die Community seit heute frueh eine eigene
Fassung hat, stand jedes Mitglied mit Namen, Fortschritt und Datum
darin. Im Agenturhaus konnte das nie auffallen, dort ist jede Fassung
eine Teamrolle.

Das ist kein Schoenheitsfehler: Ein Mitglied hat sich zum Mitlesen
angemeldet, nicht zu einer Fortschrittsakte. Jetzt siebt
`standRollen()` ueber AUSSEN_ROLLEN -- abgeleitet und nicht als zweite
Liste, damit die naechste Rolle von aussen automatisch heraus ist.
Gegenprobe gefahren: Sieb ausgebaut -> die Zeile wird rot und nennt
"1 von 4".

DAZU GEPRUEFT, was Kapitel 11 sonst verlangt (pruef-anleitung
173 -> 181): DogFather bekommt auf der Crew-Adresse die Pflege statt
einer Fassung, mit den VIER Fassungen dieses Hauses (nicht denen der
Agentur); ein Modi kommt an die Liste gar nicht heran (403); und die
"Vorschau in der Sicht dieser Rolle" liefert ihm die 29 Karten des
Modi, mit `darf_pflegen: true` und `darf_abhaken: false` -- er soll
pflegen koennen, aber nicht in fremdem Namen abhaken. Nachgestellt
wird dabei genau die Anfrage, die kopf.js stellt (`sicht=<Nummer>`
an jede lesende Anfrage), nicht eine nachgebaute.

AUSSERDEM: ZWEI DINGE HIESSEN `an-stufe`
Der Kasten einer EINORDNUNG ("Das brauchst du sofort") und der Kasten
"Deine Stufe" mit Neu, Dabei, Stamm trugen dieselbe Klasse. Der
Bauplan warnt in Kapitel 14 ausdruecklich davor, die beiden zu
verwechseln -- im Quelltext taten sie es.

Aufgefallen beim Messen des Filters "Muss": Er musste seine Suche von
Hand auf `#stufen` eingrenzen, sonst haette er die Karte "Deine Stufe"
mit weggeblendet. Eine Regel wie `.an-stufe { display: none }` haette
denselben Schaden angerichtet, und man haette sie nicht kommen sehen.
Die Mitglieder-Stufe heisst jetzt `an-rang`; in der Oberflaeche aendert
sich kein Wort.

IM BROWSER NACHGEMESSEN (390 px, echte Anmeldung)
  Filter "Muss"  -> Community 5 Karten, rechte Hand 8. Genau die
                    Zahlen der Abnahme-Checkliste, und nach dem
                    Umbenennen blendet er nur noch den einen
                    Abschnitt aus statt zwei.
  "Deine Stufe"  -> Community ja ("Du bist gerade: Neu"), rechte Hand
                    nein. Steht und faellt mit dem neuen Namen.
  Keine Browsermeldungen, kein Querscrollen.

pruef-css-klassen und pruef-anleitung (181) gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-06 17:49:18 +02:00
co-authored by Claude Opus 5
parent a7b5775268
commit 88a8d302b9
51 changed files with 842 additions and 707 deletions
+30 -2
View File
@@ -615,8 +615,36 @@ anleitungRouter.put("/workspace/api/anleitung/rolle/:rolle", nurPflege, (req, re
* Unterscheidung wie bei der Team-Lage. Hier steht, wer seine
* Einweisung noch offen hat, damit jemand nachfragen kann. Nicht,
* was er gelesen hat oder wie lange er gebraucht hat. */
/** Welche Rollen stehen im „Stand der Ersten Schritte"?
*
* NUR TEAMROLLEN -- Bauplan Kapitel 11, woertlich: „Stand der Ersten
* Schritte: nur fuer Team-Rollen, ‚fertig / offen' mit Datum. Fuer die
* Community wird nichts je Person angezeigt."
*
* GEMESSEN AM 06.10.2026, UND ES STIMMTE NICHT: Auf der Crew-Adresse
* nahm die Liste schlicht alle Fassungen des Hauses -- und seit die
* Community eine eigene Fassung hat, stand jedes Mitglied mit Namen
* und Fortschritt darin. Das ist kein Schoenheitsfehler: Ein Mitglied
* hat sich zum Mitlesen angemeldet, nicht zu einer Fortschrittsakte.
* Im Agenturhaus fiel es nicht auf, weil dort jede Fassung eine
* Teamrolle ist.
*
* ABGELEITET AUS AUSSEN_ROLLEN und nicht aus einer zweiten Liste:
* Kommt eines Tages eine weitere Rolle von aussen dazu, ist sie damit
* automatisch heraus. Eine Liste hier waere die, die man beim
* Anlegen der neuen Rolle nicht anfasst. */
function standRollen(haus) {
return fassungenFuer(haus).filter((r) => !AUSSEN_ROLLEN.has(r));
}
anleitungRouter.get("/workspace/api/anleitung/stand", nurPflege, (req, res) => {
try {
const rollen = standRollen(hausVon(req.person));
/* Keine Teamrolle in diesem Haus? Dann eine leere Liste und kein
SQL mit leerem IN () -- das waere ein Syntaxfehler und damit ein
500 an einer Stelle, an der „es gibt niemanden" die richtige
Antwort ist. */
if (!rollen.length) return res.json({ leute: [] });
const leute = db().prepare(
`SELECT p.id, p.name, p.rolle,
(SELECT COUNT(*) FROM anl_zeile z
@@ -625,8 +653,8 @@ anleitungRouter.get("/workspace/api/anleitung/stand", nurPflege, (req, res) => {
WHERE s.person_id = p.id AND z2.art = 'schritt') AS erledigt,
(SELECT MAX(s2.erledigt_am) FROM anl_stand s2 WHERE s2.person_id = p.id) AS zuletzt
FROM personen p
WHERE p.aktiv = 1 AND p.rolle IN (${fassungenFuer(hausVon(req.person)).map(() => "?").join(",")})
ORDER BY p.rolle, p.name`).all(hausVon(req.person), ...fassungenFuer(hausVon(req.person)));
WHERE p.aktiv = 1 AND p.rolle IN (${rollen.map(() => "?").join(",")})
ORDER BY p.rolle, p.name`).all(hausVon(req.person), ...rollen);
res.json({
leute: leute.map((p) => ({
name: p.name, rolle: p.rolle,