diff --git a/pruef-ampel.png b/pruef-ampel.png index 1b72d289..1b45d24d 100644 Binary files a/pruef-ampel.png and b/pruef-ampel.png differ diff --git a/pruef-buehne.png b/pruef-buehne.png index b5f73a80..0d1d4e5d 100644 Binary files a/pruef-buehne.png and b/pruef-buehne.png differ diff --git a/pruef-handy.png b/pruef-handy.png index 3ad8acd2..451b13d3 100644 Binary files a/pruef-handy.png and b/pruef-handy.png differ diff --git a/pruef-lesbarkeit-wissen.png b/pruef-lesbarkeit-wissen.png index 0ea4de26..90077bbe 100644 Binary files a/pruef-lesbarkeit-wissen.png and b/pruef-lesbarkeit-wissen.png differ diff --git a/pruef-merkzeichen.png b/pruef-merkzeichen.png index bf623aa5..172548f4 100644 Binary files a/pruef-merkzeichen.png and b/pruef-merkzeichen.png differ diff --git a/pruef-personen.png b/pruef-personen.png index 041e21c4..a0ec129d 100644 Binary files a/pruef-personen.png and b/pruef-personen.png differ diff --git a/pruef-protokoll-auf.png b/pruef-protokoll-auf.png index 8bc0c4ad..dbb453fb 100644 Binary files a/pruef-protokoll-auf.png and b/pruef-protokoll-auf.png differ diff --git a/pruef-protokoll-zu.png b/pruef-protokoll-zu.png index 23bc0007..643c8af1 100644 Binary files a/pruef-protokoll-zu.png and b/pruef-protokoll-zu.png differ diff --git a/pruef-schulung.png b/pruef-schulung.png index 65050eca..6cf87062 100644 Binary files a/pruef-schulung.png and b/pruef-schulung.png differ diff --git a/pruef-scout-zuteilung.png b/pruef-scout-zuteilung.png index edf2633b..56cfc88a 100644 Binary files a/pruef-scout-zuteilung.png and b/pruef-scout-zuteilung.png differ diff --git a/pruef-start-computer.png b/pruef-start-computer.png index 929cc7a1..0e468ca8 100644 Binary files a/pruef-start-computer.png and b/pruef-start-computer.png differ diff --git a/pruef-start-creator.png b/pruef-start-creator.png index a5597054..7f24cb48 100644 Binary files a/pruef-start-creator.png and b/pruef-start-creator.png differ diff --git a/pruef-start-handy.png b/pruef-start-handy.png index 2fb688df..5e733b24 100644 Binary files a/pruef-start-handy.png and b/pruef-start-handy.png differ diff --git a/pruef-team.png b/pruef-team.png index 922e490f..2b4556d6 100644 Binary files a/pruef-team.png and b/pruef-team.png differ diff --git a/pruef-uebersicht-computer.png b/pruef-uebersicht-computer.png index 70a6bb03..f8a3608d 100644 Binary files a/pruef-uebersicht-computer.png and b/pruef-uebersicht-computer.png differ diff --git a/pruef-uebersicht-creator.png b/pruef-uebersicht-creator.png index bd64f501..12cc459b 100644 Binary files a/pruef-uebersicht-creator.png and b/pruef-uebersicht-creator.png differ diff --git a/pruef-uebersicht-handy.png b/pruef-uebersicht-handy.png index fd5655c6..ac5a9d12 100644 Binary files a/pruef-uebersicht-handy.png and b/pruef-uebersicht-handy.png differ diff --git a/pruef-zustand.png b/pruef-zustand.png index 90bb5f69..0bec3e15 100644 Binary files a/pruef-zustand.png and b/pruef-zustand.png differ diff --git a/server/pruef-sicht.mjs b/server/pruef-sicht.mjs index 08655491..5d7d3eda 100644 --- a/server/pruef-sicht.mjs +++ b/server/pruef-sicht.mjs @@ -346,6 +346,80 @@ ok(parseFloat(nachher.rahmen) >= 1, `ein Rahmen um die Seite erinnert daran (${nachher.rahmen}) – ` + "der gefaehrlichste Fall ist, dass man es vergisst"); +/* ================================================================ + DIE SEITE SELBST MUSS SICH AENDERN, nicht nur die Listen. + + Der Fehler, den diese Pruefung uebersehen hat (gemeldet 02.09.2026): + "ich hab oben die Ansicht von Tili ausgewaehlt und seh immer noch die + Seite genau wie meine." + + Sie hat bisher nur geprueft, dass WENIGER AUFGABEN erscheinen -- und + das stimmte ja. Kacheln, Rollenzeile und Begruessung kamen aber + weiterhin von DogFather, weil /api/ich immer den Angemeldeten + lieferte. Der Umschalter war halb gebaut, und die Pruefung hat genau + die Haelfte geprueft, die fertig war. + + Deshalb jetzt: Sieht man den Arbeitsplatz eines CREATORS, duerfen die + Kacheln der Leitung nicht mehr dastehen -- und es muss dranstehen, + WESSEN Arbeitsplatz das ist. */ +console.log("\n=== Die Seite zeigt den fremden Arbeitsplatz, nicht den eigenen"); +await bDogi.seite.goto(BASIS + "/workspace/start.html", { waitUntil: "networkidle" }); +await bDogi.seite.waitForTimeout(1400); +/* ZUERST AUF DIE EIGENE SICHT ZURUECK. Der Abschnitt davor hat auf einen + Scout umgeschaltet, und die Auswahl ueberlebt den Seitenwechsel -- das + ist ja gerade gewollt. Ohne dieses Zuruecksetzen mass der erste Anlauf + "seine eigenen Kacheln" waehrend noch die fremde Sicht lief und + meldete einen Fehler, den es nicht gab. + + Eine Pruefung, die ihren eigenen Ausgangszustand nicht herstellt, + misst den Nachhall der vorigen. */ +await bDogi.seite.selectOption("#sicht-feld", ""); +await bDogi.seite.waitForTimeout(1600); +const eigene = await bDogi.seite.evaluate(() => ({ + kacheln: [...document.querySelectorAll(".kachel__name")].map((e) => e.textContent), + rolle: document.getElementById("rollentext")?.textContent, +})); +ok(eigene.kacheln.includes("Personen & Zugänge"), + `als er selbst sieht er die Leitungs-Kacheln (${eigene.kacheln.length} Kacheln)`); + +await bDogi.seite.selectOption("#sicht-feld", String(idTili)); +await bDogi.seite.waitForTimeout(1800); +const fremd = await bDogi.seite.evaluate(() => ({ + kacheln: [...document.querySelectorAll(".kachel__name")].map((e) => e.textContent), + rolle: document.getElementById("rollentext")?.textContent, + gruppen: [...document.querySelectorAll(".gruppe__name")].map((e) => e.textContent), +})); +ok(!fremd.kacheln.includes("Personen & Zugänge"), + `in der Sicht eines Creators fehlen die Leitungs-Kacheln ` + + `(${eigene.kacheln.length} -> ${fremd.kacheln.length})`); +ok(!fremd.kacheln.includes("Automationen"), " auch die Automationen"); +ok(fremd.kacheln.length < eigene.kacheln.length, + " die Seite zeigt wirklich weniger, nicht dasselbe"); +ok(/Tili/.test(fremd.rolle || ""), + `und es steht dran, wessen Arbeitsplatz das ist ("${fremd.rolle}")`); +ok(/Creator/.test(fremd.rolle || ""), + " samt seiner Rolle"); +/* Die Gruppe heisst fuer einen Creator "Wissen" statt "Team & System" -- + ein weiterer Beleg, dass die SEITE der Sicht folgt und nicht nur die + Daten dahinter. */ +ok(fremd.gruppen.includes("Wissen"), + `die Gruppentitel folgen ebenfalls (${fremd.gruppen.join(", ")})`); + +await bDogi.seite.click(".sicht__weg"); +await bDogi.seite.waitForTimeout(1600); +const zurueckSeite = await bDogi.seite.evaluate(() => ({ + kacheln: [...document.querySelectorAll(".kachel__name")].map((e) => e.textContent), + rolle: document.getElementById("rollentext")?.textContent, +})); +ok(zurueckSeite.kacheln.includes("Personen & Zugänge") + && !/Tili/.test(zurueckSeite.rolle || ""), + `zurueck bei sich sieht er wieder alles ("${zurueckSeite.rolle}")`); + +await bDogi.seite.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" }); +await bDogi.seite.waitForTimeout(1200); +await bDogi.seite.selectOption("#sicht-feld", String(idPat)); +await bDogi.seite.waitForTimeout(1800); + /* Und er BLEIBT beim Seitenwechsel -- sonst muesste man ihn auf jeder Seite neu setzen, und genau das war der Wunsch ("ueberall"). */ await bDogi.seite.goto(BASIS + "/workspace/kalender.html", { waitUntil: "networkidle" }); diff --git a/server/workspace.js b/server/workspace.js index c0c6816b..529d64eb 100644 --- a/server/workspace.js +++ b/server/workspace.js @@ -876,9 +876,40 @@ workspaceRouter.get("/workspace/api/ich", (req, res) => { if (z?.bild) bild = `/workspace/api/steckbrief/bild/${z.bild}`; } catch { /* ohne Bild ist die Anmeldung trotzdem gültig */ } + /* WESSEN ARBEITSPLATZ WIRD GERADE ANGESEHEN (02.09.2026). + + Ohne diese Angabe war der Umschalter nur halb gebaut: Die LISTEN + folgten der gewaehlten Sicht, die Seite drumherum nicht. DogFather + waehlte einen Creator -- und sah weiterhin seine eigene Begruessung, + seine Rolle und seine Kacheln. Gemeldet mit den Worten "ich seh + immer noch die Seite genau wie meine", und das stimmte. + + `sicht` steht NEBEN den eigenen Angaben, nicht an ihrer Stelle. Die + Oberflaeche braucht beides: WER BIN ICH (fuer die Kopfleiste, fuer + "das bin ich" in Listen, fuer alles, was schreibt) und WESSEN + ARBEITSPLATZ SEHE ICH (fuer das, was gezeigt wird). Die beiden zu + vermischen waere der sichere Weg dazu, dass irgendwann etwas unter + fremdem Namen gespeichert wird. + + Null, solange die eigene Sicht laeuft -- dann gibt es nichts zu + unterscheiden. + + sichtPerson() wird hier direkt gerufen und nicht ueber req.sicht: + Die Middleware haengt erst NACH diesem Router (siehe index.js). */ + const angesehen = sichtPerson(req); + const sicht = angesehen && angesehen.id !== person.id + ? { + id: angesehen.id, + name: angesehen.name, + rolle: angesehen.rolle, + rolle_name: ROLLEN_NAME[angesehen.rolle] ?? angesehen.rolle, + } + : null; + res.json({ id: person.id, name: person.name, rolle: person.rolle, rolle_name: ROLLEN_NAME[person.rolle] ?? person.rolle, + sicht, bild, }); }); diff --git a/workspace/assets/js/kopf.js b/workspace/assets/js/kopf.js index 5df35336..8bebf74c 100644 --- a/workspace/assets/js/kopf.js +++ b/workspace/assets/js/kopf.js @@ -744,7 +744,20 @@ /* ---------- fetch einmal umleiten ------------------------------------- */ - let aktiv = 0; /* 0 = eigene Sicht */ + /* SOFORT gesetzt, nicht erst beim Bauen der Kopfleiste. + + Genau das war der Fehler hinter "ich hab die Ansicht von Tili + ausgewaehlt und seh immer noch die Seite genau wie meine": `aktiv` + wurde erst in sichtAufbauen() gefuellt, und das laeuft ueber + werZeigen() -- also NACHDEM die Seite ihre erste Abfrage schon + abgeschickt hat. Die allererste Anfrage (/api/ich, aus der Kacheln, + Rolle und Begruessung entstehen) ging damit immer ohne die gewaehlte + Sicht hinaus. + + Ein Fehler der REIHENFOLGE, nicht der Logik -- und deshalb einer, + den man im Quelltext nicht sieht: Beide Zeilen sind fuer sich + richtig. */ + let aktiv = lesen(); const echtesFetch = window.fetch.bind(window); window.fetch = function (eingabe, optionen) { @@ -792,7 +805,7 @@ if (!kopf || baut || document.getElementById('sicht-wahl')) return; baut = true; - aktiv = lesen(); + aktiv = lesen(); /* nochmals lesen -- ein anderer Reiter kann sie geaendert haben */ let personen = []; try { diff --git a/workspace/assets/js/start.js b/workspace/assets/js/start.js index ea8e5e70..f317fe94 100644 --- a/workspace/assets/js/start.js +++ b/workspace/assets/js/start.js @@ -95,6 +95,18 @@ }; let ich = null; + /* WESSEN ARBEITSPLATZ WIRD GEZEIGT (02.09.2026). + + `ich` ist, WER ANGEMELDET ist -- das bleibt so und gilt fuer alles, + was schreibt oder Rechte hat. `zeigt` ist, WESSEN Arbeitsplatz auf + dem Bildschirm steht. Im Normalfall dasselbe. + + Vorher gab es nur `ich`, und die Folge war ein halb gebauter + Umschalter: Die Listen kamen bereits von der gewaehlten Person, + Kacheln, Rolle und Begruessung aber weiterhin von DogFather. Er sah + einen Creator-Arbeitsplatz in seiner eigenen Verkleidung -- gemeldet + mit "ich seh immer noch die Seite genau wie meine". */ + let zeigt = null; let hinweise = []; /* ---------- Aufbau ------------------------------------------------------- */ @@ -119,13 +131,17 @@ let laufNr = 0; for (const gruppe of GRUPPEN) { - const meine = gruppe.bereiche.filter((b) => b.rollen.includes(ich.rolle)); + /* Nach der ANGESEHENEN Rolle -- sonst stuenden bei der Sicht auf + einen Creator weiterhin "Personen & Zugaenge" und "Automationen" + da, die er gar nicht hat. Genau daran war zu sehen, dass die + Sicht nicht greift. */ + const meine = gruppe.bereiche.filter((b) => b.rollen.includes(zeigt.rolle)); if (!meine.length) continue; const abschnitt = el('section', 'gruppe'); const kopf = el('div', 'gruppe__kopf'); /* Manche Gruppen heißen für einen Creator anders -- siehe GRUPPEN. */ - const istCreator = ich.rolle === 'creator'; + const istCreator = zeigt.rolle === 'creator'; kopf.append(el('h2', 'gruppe__name', (istCreator && gruppe.nameCreator) || gruppe.name)); kopf.append(el('span', 'gruppe__unter', @@ -306,7 +322,7 @@ das jetzt mit einem echten Bild nach. */ const p = $('plakette'); p.textContent = ''; - p.dataset.rolle = ich.rolle; + p.dataset.rolle = ich.rolle; /* die Plakette bleibt DEINE */ if (ich.bild) { const b = el('img', 'willkommen__foto'); b.src = ich.bild; @@ -323,7 +339,13 @@ p.textContent = (ich.name || '?').trim().charAt(0).toUpperCase(); } - $('rollentext').textContent = ROLLENTEXT[ich.rolle] || ich.rolle; + /* Die Zeile unter dem Gruss sagt, WESSEN Arbeitsplatz man sieht. + Bei der eigenen Sicht wie bisher die eigene Rolle; bei fremder + Sicht der Name davor -- sonst liest man "Creator, dein eigener + Bereich" und haelt es fuer die eigene Lage. */ + $('rollentext').textContent = ich.sicht + ? `Arbeitsplatz von ${ich.sicht.name} · ${ROLLENTEXT[zeigt.rolle] || zeigt.rolle}` + : (ROLLENTEXT[ich.rolle] || ich.rolle); } /* Ein Satz zur Lage -- gerechnet aus denselben Hinweisen, die darunter @@ -363,6 +385,10 @@ return; } + /* Die Sicht steht in der Antwort von /api/ich. Ohne sie ist `zeigt` + schlicht die eigene Person -- der Normalfall. */ + zeigt = ich.sicht || ich; + window.werZeigen?.(ich); grussZeigen(); diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 6785cf30..58538a0c 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -7,9 +7,9 @@ - - - + + + @@ -152,9 +152,9 @@ - - - - + + + + diff --git a/workspace/automation.html b/workspace/automation.html index cc5ead47..599cb646 100644 --- a/workspace/automation.html +++ b/workspace/automation.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -132,9 +132,9 @@ - - - - + + + + diff --git a/workspace/bereich.html b/workspace/bereich.html index c6d0a131..a70707ae 100644 --- a/workspace/bereich.html +++ b/workspace/bereich.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -115,13 +115,13 @@ - - - - - - - - + + + + + + + + diff --git a/workspace/calls.html b/workspace/calls.html index 1d01778a..2d87ab5a 100644 --- a/workspace/calls.html +++ b/workspace/calls.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -54,10 +54,10 @@ - - - - - + + + + + diff --git a/workspace/content.html b/workspace/content.html index b2366230..fdde1d42 100644 --- a/workspace/content.html +++ b/workspace/content.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -164,11 +164,11 @@ - - - - - - + + + + + + diff --git a/workspace/dateien.html b/workspace/dateien.html index 468d25bb..47237f47 100644 --- a/workspace/dateien.html +++ b/workspace/dateien.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -93,9 +93,9 @@ - - - - + + + + diff --git a/workspace/index.html b/workspace/index.html index dbc9f067..ce419843 100644 --- a/workspace/index.html +++ b/workspace/index.html @@ -25,7 +25,7 @@ type="image/webp" media="(max-width: 899px)" /> - + @@ -143,6 +143,6 @@

- + diff --git a/workspace/kalender.html b/workspace/kalender.html index 1f492099..4bf1dde9 100644 --- a/workspace/kalender.html +++ b/workspace/kalender.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -147,9 +147,9 @@ - - - - + + + + diff --git a/workspace/personen.html b/workspace/personen.html index 792df503..530f926c 100644 --- a/workspace/personen.html +++ b/workspace/personen.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -121,9 +121,9 @@ - - - - + + + + diff --git a/workspace/profil.html b/workspace/profil.html index ab8a4759..d3357305 100644 --- a/workspace/profil.html +++ b/workspace/profil.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -193,10 +193,10 @@ - - - - - + + + + + diff --git a/workspace/report.html b/workspace/report.html index 65537404..faaefb6b 100644 --- a/workspace/report.html +++ b/workspace/report.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -91,10 +91,10 @@ - - - - - + + + + + diff --git a/workspace/scouting.html b/workspace/scouting.html index 5724a1cd..f6e04d7f 100644 --- a/workspace/scouting.html +++ b/workspace/scouting.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -124,9 +124,9 @@ - - - - + + + + diff --git a/workspace/start.html b/workspace/start.html index 7977df87..2f6f9baf 100644 --- a/workspace/start.html +++ b/workspace/start.html @@ -7,8 +7,8 @@ - - + + @@ -99,9 +99,9 @@

- - - - + + + + diff --git a/workspace/startcheck.html b/workspace/startcheck.html index 44dc9775..f689832c 100644 --- a/workspace/startcheck.html +++ b/workspace/startcheck.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -70,10 +70,10 @@ - - - - - + + + + + diff --git a/workspace/steckbrief.html b/workspace/steckbrief.html index beb08375..a150d985 100644 --- a/workspace/steckbrief.html +++ b/workspace/steckbrief.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -111,9 +111,9 @@ - - - - + + + + diff --git a/workspace/uebersicht.html b/workspace/uebersicht.html index 2da774ca..10567cae 100644 --- a/workspace/uebersicht.html +++ b/workspace/uebersicht.html @@ -7,9 +7,9 @@ - - - + + + @@ -57,9 +57,9 @@ - + - - + + diff --git a/workspace/wissen.html b/workspace/wissen.html index 2a74a59a..cf0d9d6f 100644 --- a/workspace/wissen.html +++ b/workspace/wissen.html @@ -7,10 +7,10 @@ - - - - + + + + @@ -175,9 +175,9 @@ - - - - + + + +