diff --git a/tools/community-blick.mjs b/tools/community-blick.mjs index d31c1475..e3c075fd 100644 --- a/tools/community-blick.mjs +++ b/tools/community-blick.mjs @@ -201,6 +201,53 @@ await ctx.addCookies(kGast.split("; ").filter(Boolean).map((z) => { return { name, value: rest.join("="), domain: "127.0.0.1", path: "/" }; })); +console.log(""); +/* ---- ZUERST DIE STARTSEITE --------------------------------------- + Sie ist das Erste, was ein Mitglied sieht -- und der einzige Weg zu + den sieben Brettern. Bisher habe ich sie nie mit Gast-Augen + angesehen; gemessen wurden immer nur die Bretter selbst. */ +{ + await seite.goto(`${BASIS}/workspace/start.html`, { waitUntil: "networkidle" }); + await seite.waitForTimeout(1600); + const z = await seite.evaluate(() => { + const kacheln = [...document.querySelectorAll(".kachel")]; + return { + anzahl: kacheln.length, + namen: kacheln.map((k) => (k.querySelector(".kachel__name, h2, h3")?.textContent || "").trim()), + ohneUnterzeile: kacheln.filter((k) => + !(k.querySelector(".kachel__unter, .kachel p")?.textContent || "").trim()).length, + hoehen: [...new Set(kacheln.map((k) => Math.round(k.getBoundingClientRect().height)))].length, + ueberschrift: document.querySelector("h1")?.textContent?.trim() || "", + seitenhoehe: document.body.scrollHeight, + aufgabenBlock: !document.getElementById("zahlen-block")?.hidden, + arbeitswoerter: [...document.body.innerText.matchAll(/Vorarbeiten|goenn dir was|gönn dir was|Betreut|Review|Abgebrochen/g)].map((m) => m[0]), + }; + }); + console.log(""); + console.log("=== Die Startseite mit Gast-Augen ==="); + console.log(` Ueberschrift: „${z.ueberschrift}"`); + console.log(` ${z.anzahl} Kacheln, ${z.hoehen} verschiedene Hoehen, ${z.ohneUnterzeile} ohne Unterzeile`); + console.log(` ${z.namen.join(" · ")}`); + console.log(` Seitenhoehe ${z.seitenhoehe} px · Aufgabenblock: ${z.aufgabenBlock ? "DA" : "weg"}`); + console.log(` Arbeitswoerter auf der Seite: ${z.arbeitswoerter.join(", ") || "(keine)"}`); + + /* FUEHREN DIE ZAHLEN IRGENDWOHIN? Sieben Links auf aufgaben.html -- + und die Rechtetabelle nennt dort „ALLE", was die Rolle „gast" + ausdruecklich NICHT einschliesst. Also nachsehen statt annehmen. */ + const zahlenlinks = await seite.evaluate(() => + [...document.querySelectorAll("#zahlen a")].map((a2) => a2.getAttribute("href"))); + console.log(` Zahlen-Links: ${zahlenlinks.length}`); + if (zahlenlinks.length) { + const ziel = new URL(zahlenlinks[0], `${BASIS}/workspace/`).href; + const antwort = await seite.goto(ziel, { waitUntil: "domcontentloaded" }); + console.log(` Klick auf die erste Zahl -> ${antwort.status()} ${seite.url().split("/").pop()}`); + await seite.goto(`${BASIS}/workspace/start.html`, { waitUntil: "networkidle" }); + } + await seite.screenshot({ + path: `C:/Users/qciga/AppData/Local/Temp/comm-start${BREITE < 700 ? "-handy" : ""}.png`, + fullPage: true }); +} + console.log(""); console.log("=== Was ein Mitglied sieht ==="); for (const b of BRETTER) { @@ -252,6 +299,34 @@ console.log(fehlerAufSeite.length ? `ACHTUNG: ${fehlerAufSeite.length} Konsolenfehler: ${fehlerAufSeite.slice(0, 3).join(" | ")}` : "Keine Konsolenfehler."); +/* ---- GEGENPROBE: SIEHT DAS TEAM SEINEN ARBEITSPLATZ NOCH? -------- + + „Deine Aufgaben" verschwindet seit dem 18.09.2026 fuer alle, die + keine Aufgaben-Kachel haben. Die Gefahr dabei ist immer dieselbe: + dass es auch dort verschwindet, wo es hingehoert. Ohne diese + Messung saehe eine abgeschaffte Funktion genauso aus wie eine, die + richtig entscheidet. */ +{ + const ctx2 = await browser.newContext({ viewport: { width: BREITE, height: 1100 } }); + const seite2 = await ctx2.newPage(); + await seite2.goto(BASIS + "/workspace/", { waitUntil: "networkidle" }); + await seite2.click('.rolle[data-rolle="admin"]'); + await seite2.fill("#code", "CODE-DOGI-0001"); + await seite2.click("button[type=submit]", { noWaitAfter: true }); + await seite2.waitForURL("**/start.html", { timeout: 25000 }); + await seite2.waitForTimeout(1600); + const z = await seite2.evaluate(() => ({ + block: !document.getElementById("zahlen-block")?.hidden, + links: document.querySelectorAll("#zahlen a").length, + satz: document.body.innerText.includes("Vorarbeiten"), + })); + console.log(""); + console.log("=== Gegenprobe: DogFather auf derselben Seite ==="); + console.log(` Aufgabenblock: ${z.block ? "DA" : "FEHLT"} · Zahlen-Links: ${z.links}` + + ` · „Vorarbeiten": ${z.satz ? "ja" : "nein"}`); + await ctx2.close(); +} + await browser.close(); kind.kill(); try { rmSync(ordner, { recursive: true, force: true }); } catch { /* Rest */ } diff --git a/workspace/app.webmanifest b/workspace/app.webmanifest index 53c03c82..6c66103f 100644 --- a/workspace/app.webmanifest +++ b/workspace/app.webmanifest @@ -22,25 +22,25 @@ }, "icons": [ { - "src": "/assets/img/app-symbole/workspace-192.png?v=202609182022", + "src": "/assets/img/app-symbole/workspace-192.png?v=202609182128", "sizes": "192x192", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-512.png?v=202609182022", + "src": "/assets/img/app-symbole/workspace-512.png?v=202609182128", "sizes": "512x512", "type": "image/png", "purpose": "any" }, { - "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609182022", + "src": "/assets/img/app-symbole/workspace-192-maskable.png?v=202609182128", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609182022", + "src": "/assets/img/app-symbole/workspace-512-maskable.png?v=202609182128", "sizes": "512x512", "type": "image/png", "purpose": "maskable" diff --git a/workspace/assets/js/start.js b/workspace/assets/js/start.js index 21150106..f921413a 100644 --- a/workspace/assets/js/start.js +++ b/workspace/assets/js/start.js @@ -26,6 +26,23 @@ (() => { 'use strict'; + /** Hat diese Person ueberhaupt einen Arbeitsplatz hier? + + GEFRAGT WIRD NICHT NACH DER ROLLE. Rollennamen der Community + gehoeren nicht in eine Datei, die jeder herunterladen kann -- + darueber wacht pruef-modi-wortleck, und ROLLENTEXT unten laesst + sie aus demselben Grund aus. + + Gefragt wird nach etwas, das der Server ohnehin schon beantwortet + hat: Hat sie die Aufgaben-Kachel? Er schickt nur, was jemand + sehen darf. Keine zweite Wahrheit, kein Rollenname -- und es + bleibt richtig, wenn sich die Rechte aendern. */ + function hatArbeitsplatz() { + const liste = ich && ich.bereiche; + if (!Array.isArray(liste)) return true; /* im Zweifel wie bisher */ + return liste.some((b) => String(b.ziel || '').split('?')[0] === 'aufgaben.html'); + } + const ROLLENTEXT = { spicy: 'Spicy Media · Überblick über alle, ohne Automationen', admin: 'DogFather · Gesamtübersicht und Freigaben', @@ -879,7 +896,15 @@ satz = `${gesamt} ${gesamt === 1 ? 'Punkt steht' : 'Punkte stehen'} an, nichts davon brennt.`; stufe = 'offen'; } else { - satz = 'Nichts liegt an – guter Tag zum Vorarbeiten.'; + /* „VORARBEITEN" IST ARBEITSSPRACHE (18.09.2026). + + Fuer jemanden mit Aufgabenliste ist der Satz richtig. Ein + Mitglied der Community arbeitet hier aber nicht vor -- es + schaut vorbei. Derselbe Satz fuer beide waere fuer die eine + Haelfte eine Aufforderung, die es nicht einloesen kann. */ + satz = hatArbeitsplatz() + ? 'Nichts liegt an – guter Tag zum Vorarbeiten.' + : 'Gerade ist nichts los. Guter Moment, um zu stöbern.'; stufe = 'ruhig'; } el2.textContent = satz; @@ -1486,8 +1511,31 @@ darunter statt an ihrer Stelle. Damit bleibt die Aussage "es ist gerade nichts zu tun" erhalten, ohne dass die Seite ihre Form ändert -- gedämpft ist auch eine Antwort, nur eben eine leise. */ + /* ---- WER KEINE AUFGABEN HAT, BEKOMMT KEINE ZAHLEN (18.09.2026) + + Ein Mitglied der Community sah hier „Deine Aufgaben" mit sieben + Zaehlern: Ueberfaellig, Heute faellig, Offen, In Arbeit, Review, + Erledigt, Abgebrochen -- alle null. Darunter „Nichts offen. + Alles abgearbeitet – goenn dir was." + + Das ist die Sprache eines Arbeitsplatzes, und ein Zuschauer hat + hier keinen. Schlimmer: Jede der sieben Zahlen ist ein LINK auf + aufgaben.html. Gemessen mit Gast-Augen -- ein Klick landet + wieder auf start.html. Sieben tote Knoepfe, und der Code + daneben sagt selbst: „Ein toter Knopf ist keine Antwort." + + WORAN ERKANNT: nicht an der Rolle. Rollennamen der Community + gehoeren nicht in eine Datei, die jeder herunterladen kann + (darueber wacht pruef-modi-wortleck, und ROLLENTEXT oben laesst + sie aus demselben Grund aus). Entschieden wird deshalb an der + Frage, die ohnehin schon beantwortet ist: Hat diese Person die + Aufgaben-Kachel? Der Server schickt nur, was jemand sehen darf. + Keine zweite Wahrheit, kein Rollenname, und es bleibt richtig, + wenn sich die Rechte aendern. */ const summe = ZAHLEN.reduce((n, z) => n + (daten[z.schluessel] ?? 0), 0); const block = $('zahlen-block'); + if (!hatArbeitsplatz()) { block.hidden = true; return; } + block.hidden = false; if (!summe) block.dataset.leer = 'ja'; else block.removeAttribute('data-leer'); $('zahlen-leer').hidden = !!summe; diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 06fc27c1..7b4ec5b4 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -12,19 +12,19 @@ Ton wie die Kopfleiste darunter (#06090f), damit Leiste und Seite eine Flaeche sind statt zweier. --> - - - - - - + + + + + + - +
@@ -291,10 +291,10 @@ - - - - - + + + + +