Alles fertig: Konsole montiert, Tageskachel als Instrument, zwei Seiten repariert
DIE KONSOLE -- DREI STUFEN DRAUF
1. VIER NIETEN in den vier Fasen. Das Einzige, was eine Flaeche
endgueltig zu einem GEGENSTAND macht, ist die Frage, wie sie
befestigt ist. Ein Gehaeuse haengt nicht in der Luft.
2. EINE GEFRAESTE NUT trennt Text von Instrumenten -- dunkel auf der
Lichtseite, hell auf der Schattenseite. Genau umgekehrt zu einer
aufgemalten Linie, und deshalb sieht sie nach Material aus.
3. DIE UHR SITZT IN EINER MULDE statt auf der Platte.
Drei Fehler dabei, alle im Bildschirmfoto gesehen: Die Nieten waren
QUADRATE (eine Hintergrundebene laesst sich nicht runden -- jetzt aus
Radialverlaeufen, die selbst rund sind). Die Mulde lag UEBER der Uhr
und hat die polierte Luenette zu mattem Grau gedaempft (`::after` wird
nach allen Kindern gezeichnet). Und das Raster musste von der
Nieten-Ebene herunter: Eine Ebene hat nur EINE Deckkraft.
DIE TAGESKACHEL "WAS IST DRAN"
Die drei Zeilen sind jetzt MODULE -- Fase, Kantenlicht in der Farbe
ihres Bereichs, Eckwinkel. Sie sind damit kleine Ausgaben derselben
Bauteile, zu denen sie fuehren, was sie ja auch sind. Die ZAHL wurde
zum gefassten Schild wie das Zeichen auf den Kacheln, und zwischen den
Haelften laeuft dieselbe gefraeste Nut wie auf der Konsole.
Ein Rueckschritt dabei, von der Pruefung sofort gemeldet: Ich hatte
die Ziffer weiss gemacht, weil das auf Metall gut aussieht -- damit
war ihre Aussage weg. Die Zahl traegt die Farbe ihres Bereichs und bei
etwas Ueberfaelligem die Warnfarbe; das ist die schnellste Auskunft der
ganzen Kachel. Die Farbe gehoert in die Ziffer, nicht ins Schild.
SPICY MEDIA SIEHT DIE ZAHLEN JETZT NIRGENDS
Vorher nur Kachel und Seite -- die Creator-Zahlen standen weiterhin im
Dashboard, weil das sie ueber eine eigene Schnittstelle holt. Die ist
jetzt zu (404 am Server, nicht in der Oberflaeche). Das Dashboard
bleibt fuer sie stehen: Es faengt den Fehlschlag ausdruecklich ab.
Mit Pruefung und Gegenprobe.
UND ZWEI SEITEN, DIE BEIM ANSEHEN AUFFIELEN
Das ist der Ertrag der Durchsicht jener zwoelf Seiten, die bisher nur
GEPRUEFT und nie ANGESEHEN worden waren:
* chat.html und uebersicht.html luden kopf.js OHNE wahl.js. Der
Umschalter "Meine Sicht" fiel dort auf das nackte Systemfeld
zurueck: 92 x 19 px, grauer Kasten, Systemschrift -- auf allen
anderen Seiten ist es ein selbst gebautes Bedienelement, hinter dem
dasselbe Feld unsichtbar bei 2 x 2 px liegt. Kaputt war nichts. Es
sah nur aus wie aus einem anderen Programm, und genau das findet
keine Pruefung, die auf Fehlermeldungen achtet.
Neue Pruefung: Wer kopf.js laedt, muss wahl.js laden -- und vorher.
* Der Chat-Rahmen gehoerte als einzige grosse Flaeche noch nicht zum
Modulsystem. Jetzt schon.
18 Pruefungen gelaufen, alle gruen. Rechner und Handy angesehen,
dazu Kalender, Chat, Automationen, Uebersicht, Start-Check,
Steckbrief, Bereiche, Profil, Content, Scouting und Report.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -426,6 +426,57 @@ console.log("\n=== Gegenprobe ===");
|
||||
"aus classList.add(bedingung ? 'a' : 'b') werden beide Klassen gelesen, aber nicht die Variable");
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
WER kopf.js LAEDT, MUSS AUCH wahl.js LADEN
|
||||
|
||||
Gefunden am 07.09.2026 beim Durchsehen der Seiten, die bis dahin nur
|
||||
GEPRUEFT und nie ANGESEHEN worden waren -- chat.html und
|
||||
uebersicht.html luden kopf.js ohne wahl.js.
|
||||
|
||||
Der Umschalter "Meine Sicht" ist auf allen anderen Seiten ein selbst
|
||||
gebautes Bedienelement (`.wahl2`), hinter dem ein unsichtbares
|
||||
Systemfeld fuer Vorleseprogramme liegt. Ohne wahl.js faellt kopf.js
|
||||
auf dieses Systemfeld zurueck: 92 x 19 Pixel, grauer Kasten, weisse
|
||||
Schrift, Systemschriftgroesse -- gemessen, nicht geschaetzt. Auf den
|
||||
anderen Seiten misst dasselbe Feld 2 x 2 Pixel bei Deckkraft null,
|
||||
weil es dort nur noch der Zugaenglichkeit dient.
|
||||
|
||||
KAPUTT WAR NICHTS. Der Umschalter funktionierte auf beiden Seiten --
|
||||
er sah nur aus wie aus einem anderen Programm. Genau diese Sorte
|
||||
Fehler findet keine Pruefung, die auf Fehlermeldungen achtet, und
|
||||
auch keine, die Klassennamen zaehlt: Die Klasse `.sicht__feld` ist
|
||||
NIRGENDS gestaltet und gilt deshalb zu Recht als Struktur-Anker.
|
||||
|
||||
Deshalb hier eine Pruefung auf die ABHAENGIGKEIT statt auf die Optik:
|
||||
Wer das eine laedt, muss das andere laden -- und zwar vorher. */
|
||||
console.log("\n=== Wer kopf.js laedt, laedt auch wahl.js");
|
||||
{
|
||||
const seitenMitKopf = [];
|
||||
for (const seite of readdirSync(WS).filter((f) => f.endsWith(".html"))) {
|
||||
const html = readFileSync(join(WS, seite), "utf8");
|
||||
const skripte = [...html.matchAll(/<script[^>]+src="assets\/js\/([a-z0-9-]+)\.js/g)]
|
||||
.map((m) => m[1]);
|
||||
if (!skripte.includes("kopf")) continue;
|
||||
seitenMitKopf.push({ seite, skripte });
|
||||
}
|
||||
ok(seitenMitKopf.length >= 10,
|
||||
`${seitenMitKopf.length} Seiten laden kopf.js`);
|
||||
|
||||
const ohneWahl = seitenMitKopf.filter((s) => !s.skripte.includes("wahl")).map((s) => s.seite);
|
||||
ok(ohneWahl.length === 0, ohneWahl.length
|
||||
? `ohne wahl.js: ${ohneWahl.join(", ")}`
|
||||
: "alle davon laden auch wahl.js");
|
||||
|
||||
/* UND ZWAR VORHER. kopf.js fragt beim Aufbau nach dem fertigen
|
||||
Bedienelement; kommt wahl.js danach, ist es zu spaet. */
|
||||
const zuSpaet = seitenMitKopf
|
||||
.filter((s) => s.skripte.indexOf("wahl") > s.skripte.indexOf("kopf"))
|
||||
.map((s) => s.seite);
|
||||
ok(zuSpaet.length === 0, zuSpaet.length
|
||||
? `wahl.js steht zu spaet auf: ${zuSpaet.join(", ")}`
|
||||
: "und immer VOR kopf.js");
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
KEIN SKRIPT BAUT SICH SEINE EIGENE ROLLENLISTE
|
||||
|
||||
|
||||
@@ -420,6 +420,29 @@ const ruf = async (art, weg, keks, koerper) => {
|
||||
`DogFather sieht weiterhin beide (${dTitel.length})`);
|
||||
}
|
||||
{
|
||||
/* DIE ZAHLEN SIEHT SIE NIRGENDS (07.09.2026).
|
||||
|
||||
Zuerst waren nur Kachel und Seite geschlossen -- die Creator-Zahlen
|
||||
standen damit weiterhin im Dashboard, weil das sie ueber eine
|
||||
eigene Schnittstelle holt. Filipe hat entschieden, dass auch das
|
||||
weg soll.
|
||||
|
||||
Geprueft wird die SCHNITTSTELLE und nicht die Oberflaeche: Eine
|
||||
ausgeblendete Zeile ist keine Sperre. Und mit Gegenprobe, sonst
|
||||
bewiese die Zeile nur, dass es den Weg gar nicht gibt. */
|
||||
const beiIhr = await ruf("GET", "/workspace/api/leistung", keksSpicy);
|
||||
ok(beiIhr.status === 404, `die Zahlen antworten ihr mit 404 (${beiIhr.status})`);
|
||||
const beiIhm = await ruf("GET", "/workspace/api/leistung", keksDogi);
|
||||
ok(beiIhm.status === 200, `DogFather bekommt sie weiterhin (${beiIhm.status})`);
|
||||
|
||||
/* UND DAS DASHBOARD BLEIBT FUER SIE STEHEN. Das ist der eigentliche
|
||||
Prueffall: Die Uebersicht holt die Zahlen in einer zusaetzlichen
|
||||
Abfrage. Faengt sie deren Fehlschlag nicht ab, saehe Spicy Media
|
||||
statt der Karten eine leere Seite -- eine Sperre, die die halbe
|
||||
Anwendung mitnimmt, waere schlimmer als keine. */
|
||||
const dash = await ruf("GET", "/workspace/api/uebersicht", keksSpicy);
|
||||
ok(dash.status === 200, `ihre Uebersicht kommt trotzdem (${dash.status})`);
|
||||
|
||||
/* Und DogFather bleibt der Einzige mit dem letzten Wort. */
|
||||
const { status } = await ruf("GET", "/workspace/api/verwaltung/personen", keksDogi);
|
||||
ok(status === 200, `DogFather kommt weiterhin in die Verwaltung (HTTP ${status})`);
|
||||
|
||||
@@ -163,6 +163,19 @@ melde("\n=== Eine Kachel, mittig geteilt ===");
|
||||
lichtDa: v.content !== "none" && v.position === "absolute",
|
||||
};
|
||||
});
|
||||
/* Ein Bild davon, wie sie wirklich aussieht. Prueflaeufe messen
|
||||
Zahlen; ob eine Flaeche gut aussieht, sieht man nur. Die Aufnahme
|
||||
kostet nichts und ist bei jeder Gestaltungsaenderung das Erste,
|
||||
wonach ich sonst von Hand suchen muesste. */
|
||||
try {
|
||||
const kasten = await seite.locator("#dran-block").boundingBox();
|
||||
if (kasten) {
|
||||
await seite.screenshot({ path: "pruef-tagesblick.png",
|
||||
clip: { x: kasten.x - 12, y: kasten.y - 12,
|
||||
width: kasten.width + 24, height: kasten.height + 24 } });
|
||||
}
|
||||
} catch { /* ein fehlendes Bild ist kein Befund */ }
|
||||
|
||||
ok(rahmen.anzeige === "grid"
|
||||
&& /polygon/.test(rahmen.silhouette)
|
||||
&& parseFloat(rahmen.radius) === 0
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
import express from "express";
|
||||
import {
|
||||
db, protokolliere, echteIp, sitzungLesen, istLeitung,
|
||||
db, protokolliere, echteIp, sitzungLesen, istLeitung, istSpicy,
|
||||
sichtbareCreatorIds, ROLLEN_SORTIERUNG,
|
||||
} from "./workspace.js";
|
||||
|
||||
@@ -73,6 +73,33 @@ function gleicheHerkunft(req, res, next) {
|
||||
|
||||
leistungRouter.use("/workspace/api/leistung", angemeldet);
|
||||
|
||||
/* SPICY MEDIA SIEHT DIE ZAHLEN NIRGENDS (07.09.2026).
|
||||
|
||||
Filipe: "bei der spicy rolle, die zahlen diese kategorie nicht
|
||||
sehen." Zuerst habe ich woertlich nur die KATEGORIE geschlossen --
|
||||
Kachel und Seite. Auf Nachfrage, was noch offen sei, habe ich selbst
|
||||
darauf hingewiesen, dass die Creator-Zahlen damit weiterhin im
|
||||
Dashboard stehen (Diamanten, LIVE-Tage, Verweildauer je Karte);
|
||||
Filipe hat entschieden, dass auch das weg soll.
|
||||
|
||||
DIE SPERRE SITZT AM SERVER UND NICHT IN DER OBERFLAECHE. Eine
|
||||
ausgeblendete Zeile ist keine Sperre: Wer die Adresse kennt, ruft
|
||||
die Schnittstelle direkt auf. Hier kommt sie gar nicht mehr an
|
||||
Daten.
|
||||
|
||||
404 statt 403, wie ueberall in diesem Haus: Wer nicht hierher
|
||||
gehoert, muss nicht erfahren, dass es diesen Bereich gibt.
|
||||
|
||||
DAS DASHBOARD BRICHT DADURCH NICHT. Es holt die Zahlen in EINER
|
||||
zusaetzlichen Abfrage und faengt ihren Fehlschlag ausdruecklich ab
|
||||
("die Karten stehen auch ohne", uebersicht.js) -- bei ihr fehlen
|
||||
also die drei Zeilen, alles andere bleibt. Genau deshalb ist diese
|
||||
eine Zeile hier der ganze Eingriff. */
|
||||
leistungRouter.use("/workspace/api/leistung", (req, res, next) => {
|
||||
if (istSpicy(req.person)) return res.status(404).json({ fehler: "nicht_gefunden" });
|
||||
next();
|
||||
});
|
||||
|
||||
/* ---------- Wer darf was ------------------------------------------------ */
|
||||
|
||||
/** Wessen Zahlen darf ich SEHEN? Dieselbe Regel wie überall sonst --
|
||||
|
||||
Reference in New Issue
Block a user