Die rechte Hand meldet wie das Team, die Leiste wird ein Universum, sein Kalender bleibt ganz
Drei Wuensche aus zwei Bildschirmfotos und einem Satz. === 1. SIE DARF SAGEN, WAS PASST UND WAS NICHT === Filipe: "die rechte hand soll bei diesen aufgaben auch wie die modis sagen koennen ob es passt oder nicht ... die rechte hand ist da um mir zu helfen aber auch wie die modis um mir zu sagen was passt und nicht wo die denken bedarf oder nicht. perfektionier das alles." SIE KONNTE ES NICHT, UND ZWAR AN DREI STELLEN GLEICHZEITIG -- die zweite und dritte kamen erst zum Vorschein, nachdem die erste behoben war. Genau deshalb steht "perfektionier das alles" ueber diesem Commit und nicht "eine Zeile geaendert": ERSTENS: Die Frage "an wessen Liste arbeitest du?" kannte nur Creator und Modis (dann die eigene). Sie fiel durch beide Zweige und konnte ueberall antworten, nirgends urteilen. ZWEITENS: Nach der Reparatur durfte sie -- und bekam den KATALOG DER CREATOR. Ihre Meldung trug einen Schluessel, den der Eingang gar nicht kennt, und wurde dort stillschweigend uebersprungen. Die Pruefung meldete "sie darf urteilen (200)" und eine Zeile spaeter "ihre Meldung steht NICHT in DogFathers Eingang". Beides stimmte. DRITTENS: Der Eingang sammelt aus der Liste der Teammitglieder, und die hiess `rolle = 'modi'`. Sie war die Empfaengerin dieser Seite und kam auf ihr selbst nicht vor. Wer nicht in der Liste steht, kann melden, so viel er will -- es erreicht niemanden. Jetzt steht sie in derselben Liste (aber `id <> ich`: eine Karte ueber sich selbst ist kein Ueberblick, sondern ein Spiegel), bekommt denselben Beobachtungskatalog wie die Modis und meldet in denselben Eingang. Alle Rollenvergleiche kommen dabei aus der vorhandenen Menge TEAM_DOGI_ROLLEN statt als zwei Vergleiche danebengeschrieben -- sonst steht dort beim naechsten Mal einer zu wenig. === 2. DIE LEISTE === Filipe: "der hintergrund dieser leiste soll extrem speziell aussehen wie ein universum und soll von lila auf babyblau wechseln, von links nach rechts ... der husky links soll auch babyblau strahlen und nicht rot und der rechts lila. dan brauch ich auch noch einen teilen button." DIE RICHTUNG IST DIE EIGENTLICHE AENDERUNG: Der Schein lief von UNTEN nach oben (die Glut der Agenturseite, nur in Lila). Jetzt von LINKS nach rechts, mit zwei Nebeln und sieben Sternen -- als Verlaufslagen und nicht als Elemente: Sieben Punkte waeren sieben Knoten im Baum auf jeder der zwanzig Seiten, nur fuer Zierde. DIE ZEICHEN TAUSCHEN DIE SEITEN. Links stand ein warmes Rot, fest hingeschrieben in start.css; rechts strahlte der zweite Husky babyblau. Jetzt umgekehrt -- so hat jede Seite der Leiste beide Farben, statt dass jede nur eine hat. Beim rechten wird die FUELLUNG mitgetauscht, nicht nur der Schein: Ein lila Schein um ein blaues Zeichen waere ein Rand, keine Farbe. "UEBERTRIEBEN GEIL" HAT EINE GRENZE, und sie ist gemessen, nicht geschaetzt. Erster Anlauf: .30 -- der Verlauf war zu ahnen, nicht zu sehen, Kontrast 5,26:1. Zweiter: .40 -- sichtbar, aber 4,79:1 in der Mitte, bei einer Grenze von 4,5 zu knapp. Jetzt kraeftige Enden und eine zurueckhaltende Mitte: 5,92 / 5,26 / 7,06:1 an drei Stellen des Verlaufs, gemessen an echten Bildpunkten. Die Farbe liest das Auge an den Enden; in der Mitte gewinnt die Lesbarkeit. DER TEILEN-KNOPF fehlte, weil `DARF_TEILEN` Leitung und Scouts kennt -- die rechte Hand ist keins von beidem. Gefragt wird jetzt nicht nach der Rolle, sondern nach `ich.marke`: Die setzt der Server genau dann, wenn jemand zu Team Dogi gehoert. Der Rollenname bleibt damit aus einer Datei heraus, die jeder herunterlaedt -- und die Frage lautet ohnehin "gehoert diese Person hierher?". === 3. SEIN KALENDER BLEIBT GANZ === Filipe: "mein kalender (dogfather) auf dieser seite hier soll komplett verbunden sein mit dem kalender in der workspace seite ABER NUR IN DER DOGFATHER ROLLE BEI DOGFATHER: NICHT BEI VANVAN." Bei Aufgaben, Bereichen und Dateien ist die Haustrennung eine Hilfe -- man will das andere Haus dort gerade nicht sehen. Beim Kalender waere sie eine Falle: Wer auf der Team-Seite einen Termin eintraegt und die Haelfte seines Tages nicht sieht, legt ihn auf eine Zeit, in der er schon woanders sitzt. Ein Kalender, der nur die halbe Wahrheit zeigt, ist schlimmer als keiner. Geprueft wird die ROLLE und nicht der Name -- ein Name waere die Stelle, an der es beim naechsten Menschen bricht. === WAS DIE PRUEFUNGEN GEZEIGT HABEN === Eine Erwartung war seit Stunden stumm rot: pruef-modi-checkliste verlangte GENAU EINE Zusatzkachel, und seit dem Ideen-Board sind es drei. Ich hatte sie nach der Aenderung nicht noch einmal laufen lassen. Sie zaehlt jetzt nicht mehr auf eine feste Zahl, sondern prueft die AUSSAGE: Wer welche bekommen soll, bekommt welche -- und jede gehoert in die Gruppe "Team Dogi". Eine Pruefung, die bei jeder neuen Kachel rot wird, erzieht dazu, ihr Rotwerden zu ignorieren. Zwei weitere Erwartungen haben sich gedreht und sind im Quelltext begruendet: Der Kalender auf crew. zeigt DogFather jetzt alles (die Pruefung unterscheidet dafuer ER-ja/SIE-nein statt einer einzelnen Antwort -- das ist mehr, nicht weniger), und "aus dem Eingang verschwunden" fragt jetzt nach Schluessel UND Person: Seit die rechte Hand denselben Katalog benutzt, koennen zwei Menschen denselben Punkt melden, und die Pruefung meldete einen Fehler, den es nicht gab. Und eine war wertlos: "die rechte Hand sieht den Agenturtermin nicht" lief gegen einen leeren Kalender -- sie sah ueberhaupt nichts. Sie hat jetzt zwei eigene Termine, einen aus jedem Haus; erst damit sagt die Messung etwas. pruef-modi-checkliste 59 -> 70 · pruef-team-stufen 24 -> 26 · pruef-team-ampel 32 · pruef-haus-trennung 61 -> 62 · pruef-rollen 278 · pruef-css-klassen gruen · pruef-modi-wortleck 5. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -133,6 +133,16 @@ d.prepare(`INSERT INTO termine (titel, beginn, dauer_min, creator_id, erstellt,
|
||||
VALUES ('Call mit Luna','2026-09-12T18:00:00.000Z',60,?,?,?)`).run(idCrea, jetzt, idDogi);
|
||||
d.prepare(`INSERT INTO termine (titel, beginn, dauer_min, teilnehmer_id, erstellt, erstellt_von)
|
||||
VALUES ('Teamrunde','2026-09-12T20:00:00.000Z',30,?,?,?)`).run(idModi, jetzt, idDogi);
|
||||
/* ZWEI TERMINE FUER DIE RECHTE HAND, und beide braucht die Pruefung:
|
||||
|
||||
Ohne einen eigenen Termin saehe sie GAR NICHTS -- jeder sieht nur,
|
||||
woran er beteiligt ist -- und "sie sieht den Agenturtermin nicht"
|
||||
waere ein gruener Haken ueber einer Null. Erst mit einem sichtbaren
|
||||
daneben sagt die Messung etwas: Das eine kommt an, das andere nicht. */
|
||||
d.prepare(`INSERT INTO termine (titel, beginn, dauer_min, creator_id, erstellt, erstellt_von)
|
||||
VALUES ('Lunas Abnahme','2026-09-13T17:00:00.000Z',45,?,?,?)`).run(idCrea, jetzt, idHand);
|
||||
d.prepare(`INSERT INTO termine (titel, beginn, dauer_min, teilnehmer_id, erstellt, erstellt_von)
|
||||
VALUES ('Schichtuebergabe','2026-09-13T19:00:00.000Z',20,?,?,?)`).run(idModi, jetzt, idHand);
|
||||
|
||||
async function anmelden(rolle, code, wand) {
|
||||
const a = await hole("/workspace/api/anmelden", { host: wand, methode: "POST",
|
||||
@@ -233,12 +243,37 @@ console.log("");
|
||||
console.log("=== Kalender ===");
|
||||
{
|
||||
const weg = "/workspace/api/termine?von=2026-09-01&bis=2026-09-30";
|
||||
/* DER KALENDER IST DIE EINE AUSNAHME (11.09.2026).
|
||||
|
||||
Filipe: "mein kalender (dogfather) auf dieser seite hier soll
|
||||
komplett verbunden sein mit dem kalender in der workspace seite
|
||||
ABER NUR IN DER DOGFATHER ROLLE BEI DOGFATHER: NICHT BEI VANVAN."
|
||||
|
||||
Bei Aufgaben, Bereichen und Dateien ist die Trennung eine Hilfe --
|
||||
man will das andere Haus dort gerade nicht sehen. Beim Kalender
|
||||
waere sie eine Falle: Wer auf der Team-Seite einen Termin eintraegt
|
||||
und die Haelfte seines Tages nicht sieht, legt ihn auf eine Zeit,
|
||||
in der er schon woanders sitzt.
|
||||
|
||||
Diese Erwartung hat sich damit gedreht -- vorher verlangte sie das
|
||||
Gegenteil. Sie ist dadurch nicht schwaecher: Sie prueft jetzt eine
|
||||
UNTERSCHEIDUNG (er ja, sie nein) statt einer einzelnen Antwort, und
|
||||
das ist mehr, nicht weniger. */
|
||||
const a = await beide(weg, dogi.keks);
|
||||
const t = (x) => (x?.termine || []).map((z) => z.titel);
|
||||
ok(t(a.crew).includes("Teamrunde"), `auf crew. steht die Teamrunde (${t(a.crew).join(" | ") || "leer"})`);
|
||||
ok(!t(a.crew).includes("Call mit Luna"), "der Call mit der Creatorin nicht");
|
||||
ok(t(a.crew).includes("Teamrunde") && t(a.crew).includes("Call mit Luna"),
|
||||
`DogFather sieht auf crew. seinen GANZEN Kalender (${t(a.crew).join(" | ") || "leer"})`);
|
||||
ok(t(a.ws).includes("Call mit Luna") && t(a.ws).includes("Teamrunde"),
|
||||
`auf workspace. stehen beide (${t(a.ws).length})`);
|
||||
`und auf workspace. denselben (${t(a.ws).length})`);
|
||||
|
||||
/* UND DIE RECHTE HAND NICHT -- sonst hiesse "verbunden" schlicht
|
||||
"die Trennung ist weg". */
|
||||
const h = (await hole(weg, { host: CREW, keks: hand.keks })).daten;
|
||||
const th = (h?.termine || []).map((z) => z.titel);
|
||||
ok(th.includes("Schichtuebergabe"),
|
||||
`die rechte Hand sieht ihren Team-Termin (${th.join(" | ") || "leer"})`);
|
||||
ok(!th.includes("Lunas Abnahme"),
|
||||
"und ihren eigenen Agenturtermin dort NICHT -- die Trennung gilt fuer sie weiter");
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
|
||||
@@ -70,6 +70,10 @@ const idVan = anlegen("VanVan", "admin", "CODE-VAN-0001");
|
||||
const idSpicy = anlegen("Cigdem", "spicy", "CODE-SPIC-0001");
|
||||
const idCreat = anlegen("Tili", "creator", "CODE-ANNA-0001");
|
||||
const idModi = anlegen("Marina", "modi", "CODE-MODI-0001");
|
||||
/* DIE RECHTE HAND (11.09.2026). Bis heute gab es sie in dieser Pruefung
|
||||
nicht -- und deshalb war nie gemessen, ob sie ueberhaupt etwas melden
|
||||
kann. Sie konnte es nicht. */
|
||||
const idHand = anlegen("Rieke", "hand", "CODE-HAND-0001");
|
||||
d.close();
|
||||
void idSpicy;
|
||||
|
||||
@@ -92,6 +96,7 @@ const jsonKopf = { "Content-Type": "application/json" };
|
||||
const modiAn = await anmelden("creator", "CODE-MODI-0001");
|
||||
const dogiAn = await anmelden("admin", "CODE-DOGI-0001");
|
||||
const vanAn = await anmelden("admin", "CODE-VAN-0001");
|
||||
const handAn = await anmelden("hand", "CODE-HAND-0001");
|
||||
const spicyAn = await anmelden("spicy", "CODE-SPIC-0001");
|
||||
const creatAn = await anmelden("creator", "CODE-ANNA-0001");
|
||||
|
||||
@@ -138,11 +143,73 @@ for (const [name, an] of [["DogFather", dogiAn], ["VanVan", vanAn]]) {
|
||||
body: JSON.stringify({ stufe: "gut", creator_id: idModi }),
|
||||
});
|
||||
/* Der Name in der Meldung wird MITGEPRUEFT, nicht nur die Nummer.
|
||||
Am 10.09.2026 wurde die Kachel von "Team-Lage" in "Eingang"
|
||||
umbenannt, weil es zwei gleichnamige gab -- ein Hinweistext, der
|
||||
danach auf die alte fuehrt, schickt jeden auf die falsche Seite. */
|
||||
ok(b.status === 403 && /Eingang/.test(b.daten?.fehler || ""),
|
||||
`${name.padEnd(10)} und wird auf den Eingang verwiesen (${b.status})`);
|
||||
|
||||
Die Kachel hiess "Team-Lage", dann "Eingang", seit dem 11.09.2026
|
||||
"Dein Team" -- und JEDES Mal stand der alte Name noch in dieser
|
||||
Meldung. Ein Hinweistext, der auf eine Seite zeigt, die es unter
|
||||
diesem Namen nicht gibt, schickt jeden auf die falsche Suche.
|
||||
|
||||
Dass es dreimal passiert ist, sagt etwas ueber die Bauart: Der Name
|
||||
steht im Meldetext und nicht an der Kachel. Diese Pruefung ist der
|
||||
Ersatz dafuer -- sie faellt beim naechsten Umbenennen wieder um,
|
||||
und genau das soll sie. */
|
||||
ok(b.status === 403 && /Dein Team/.test(b.daten?.fehler || ""),
|
||||
`${name.padEnd(10)} und wird auf "Dein Team" verwiesen (${b.status})`);
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE RECHTE HAND MELDET GENAUSO (11.09.2026)
|
||||
|
||||
Filipe: "die rechte hand soll bei diesen aufgaben auch wie die modis
|
||||
sagen koennen ob es passt oder nicht ... die rechte hand ist da um
|
||||
mir zu helfen aber auch wie die modis um mir zu sagen was passt und
|
||||
nicht wo die denken bedarf oder nicht."
|
||||
|
||||
SIE KONNTE ES NICHT, und das lag an zwei Stellen gleichzeitig: Die
|
||||
Frage "an wessen Liste arbeitest du?" kannte nur Creator und Modis
|
||||
(dann die eigene) -- fuer alle anderen war es die Liste eines
|
||||
ANDEREN, und an einer fremden darf man nicht bewerten. Sie fiel also
|
||||
durch beide Zweige und konnte ueberall antworten, nirgends urteilen.
|
||||
|
||||
UND IHRE MELDUNG MUSS ANKOMMEN. Der Eingang sammelt aus der Liste
|
||||
der Teammitglieder; stand sie nicht darin, konnte sie melden, so
|
||||
viel sie wollte -- es erreichte niemanden. Beides wird hier gemessen,
|
||||
in dieser Reihenfolge: erst darf sie, dann kommt es an.
|
||||
===================================================================== */
|
||||
console.log("");
|
||||
console.log("=== 2b. Die rechte Hand drückt „Verbessern“ ===");
|
||||
console.log("");
|
||||
{
|
||||
const eigene = await hole(handAn.keks, "/workspace/api/checkliste/live");
|
||||
const punkt = (eigene.daten?.gruppen || []).flatMap((g) => g.punkte || [])[0]?.schluessel;
|
||||
ok(!!punkt, `sie bekommt ihre eigene Liste (${punkt || "leer"})`);
|
||||
|
||||
const a = await hole(handAn.keks, `/workspace/api/checkliste/live/${punkt}`, {
|
||||
method: "PUT", headers: jsonKopf,
|
||||
body: JSON.stringify({ stufe: "verbessern", begruendung: "Der Ablauf hakt beim Übergeben" }),
|
||||
});
|
||||
ok(a.status === 200, `und darf urteilen (${a.status})`);
|
||||
|
||||
const b = await hole(dogiAn.keks, "/workspace/api/teamlage");
|
||||
const drin = (b.daten?.eingang || []).find((e) => e.begruendung === "Der Ablauf hakt beim Übergeben");
|
||||
ok(!!drin, "ihre Meldung steht in DogFathers Eingang");
|
||||
ok(drin?.von === "Rieke", `mit ihrem Namen dabei ("${drin?.von || ""}")`);
|
||||
|
||||
/* SIE STEHT AUCH ALS MENSCH IM TEAM -- sonst waere die Meldung oben
|
||||
eine Zeile ohne Absender, und ihre Ampel und ihre offenen Punkte
|
||||
gaebe es nirgends. */
|
||||
const leute = (b.daten?.modis || b.daten?.leute || []).map((p) => p.name);
|
||||
ok(leute.includes("Rieke"), `und sie selbst im Team (${leute.join(", ") || "leer"})`);
|
||||
|
||||
/* GEGENPROBE: „Passt so" landet auch bei ihr nicht im Eingang --
|
||||
sonst waere er nach einer Sendung voll mit Lob. */
|
||||
const p2 = (eigene.daten?.gruppen || []).flatMap((g) => g.punkte || [])[1]?.schluessel;
|
||||
await hole(handAn.keks, `/workspace/api/checkliste/live/${p2}`, {
|
||||
method: "PUT", headers: jsonKopf, body: JSON.stringify({ stufe: "gut" }),
|
||||
});
|
||||
const c = await hole(dogiAn.keks, "/workspace/api/teamlage");
|
||||
ok(!(c.daten?.eingang || []).some((e) => e.schluessel === p2 && e.person_id === idHand),
|
||||
"„Passt so“ von ihr landet ebenfalls nicht im Eingang");
|
||||
}
|
||||
|
||||
/* ---------- 3. Er meldet etwas --------------------------------------- */
|
||||
@@ -195,7 +262,15 @@ console.log("\n=== 4. Daraus wird eine Aufgabe ===\n");
|
||||
/* Aus dem Eingang verschwunden -- ein Eingang, der nie leer wird,
|
||||
wird nicht mehr angesehen. */
|
||||
const c = await hole(dogiAn.keks, "/workspace/api/teamlage");
|
||||
ok(!(c.daten?.eingang || []).some((e) => e.schluessel === ersterPunkt),
|
||||
/* NACH SCHLUESSEL UND PERSON, nicht nur nach Schluessel (11.09.2026).
|
||||
|
||||
Seit die rechte Hand denselben Katalog benutzt wie die Modis,
|
||||
koennen zwei Menschen denselben Punkt melden -- und tun es in
|
||||
dieser Pruefung auch. Die Frage "ist SEINE Meldung behandelt?"
|
||||
laesst sich dann nicht mehr am Schluessel allein beantworten; die
|
||||
Pruefung meldete einen Fehler, den es nicht gab. */
|
||||
ok(!(c.daten?.eingang || []).some(
|
||||
(e) => e.schluessel === ersterPunkt && e.person_id === idModi),
|
||||
"und ist aus dem Eingang verschwunden");
|
||||
|
||||
/* UND DER MODI MERKT ES. Eine Meldung, auf die nichts folgt, sieht
|
||||
@@ -274,13 +349,34 @@ console.log("\n=== 6. Spicy Media bekommt nichts davon ===\n");
|
||||
|
||||
/* ---------- 7. Die Kachel -------------------------------------------- */
|
||||
console.log("\n=== 7. Die Kachel für euch beide ===\n");
|
||||
for (const [name, an, soll] of [
|
||||
/* GEZAEHLT WIRD NICHT MEHR AUF EINE FESTE ZAHL (11.09.2026).
|
||||
|
||||
Hier stand `1`. Seither sind zwei Kacheln dazugekommen (Ideen-Board
|
||||
und Rueckmeldung), und die Pruefung war ab dem Tag rot, an dem die
|
||||
erste kam -- gemerkt habe ich es erst heute, weil ich sie nach der
|
||||
Aenderung nicht noch einmal habe laufen lassen. Genau der Fehler, vor
|
||||
dem im Haus an drei Stellen gewarnt wird: Eine Pruefung, die bei
|
||||
jeder neuen Kachel rot wird, erzieht dazu, ihr Rotwerden zu
|
||||
ignorieren.
|
||||
|
||||
Geprueft wird deshalb die AUSSAGE statt der Anzahl: Wer welche
|
||||
bekommen soll, bekommt welche -- und JEDE davon gehoert in die
|
||||
Gruppe "Team Dogi". Eine Kachel in der falschen Gruppe faellt damit
|
||||
weiterhin auf, eine zusaetzliche in der richtigen kostet keinen
|
||||
Handgriff mehr. */
|
||||
for (const [name, an, wenigstens] of [
|
||||
["DogFather", dogiAn, 1], ["VanVan", vanAn, 1],
|
||||
["Spicy Media", spicyAn, 0], ["Creator", creatAn, 0], ["Modi", modiAn, 0],
|
||||
]) {
|
||||
const a = await hole(an.keks, "/workspace/api/ich");
|
||||
const n = (a.daten?.bereiche_zusatz || []).length;
|
||||
ok(n === soll, `${name.padEnd(12)} bekommt ${n} Zusatzkachel(n), erwartet ${soll}`);
|
||||
const zusatz = a.daten?.bereiche_zusatz || [];
|
||||
const falsch = zusatz.filter((k) => k.gruppe !== "Team Dogi").map((k) => k.name);
|
||||
ok(wenigstens ? zusatz.length >= 1 : zusatz.length === 0,
|
||||
`${name.padEnd(12)} bekommt ${zusatz.length} Zusatzkachel(n)`
|
||||
+ `, erwartet ${wenigstens ? "mindestens eine" : "keine"}`);
|
||||
ok(falsch.length === 0,
|
||||
`${name.padEnd(12)} und alle stehen in der Gruppe Team Dogi`
|
||||
+ (falsch.length ? ` -- ausser: ${falsch.join(", ")}` : ""));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -73,8 +73,8 @@ function anlegen(name, rolle, code, aktiv = 1, erstellt = jetzt) {
|
||||
andere Aussage (Lehre vom 06.09.2026). */
|
||||
const vor40Tagen = new Date(Date.now() - 40 * 86400000).toISOString();
|
||||
|
||||
anlegen("Filipe", "admin", "CODE-DOGI-0001");
|
||||
anlegen("Rieke", "hand", "CODE-HAND-0001");
|
||||
const idDogi = anlegen("Filipe", "admin", "CODE-DOGI-0001");
|
||||
const idHand = anlegen("Rieke", "hand", "CODE-HAND-0001");
|
||||
const idMarina = anlegen("Marina", "modi", "CODE-MODI-0001", 1, vor40Tagen);
|
||||
const idKim = anlegen("Kim", "modi", "CODE-MODI-0002", 0); // pausiert
|
||||
const idCreator = anlegen("Tili", "creator", "CODE-TILI-0001");
|
||||
@@ -113,7 +113,22 @@ ok(a1.status === 200, `DogFather bekommt die Lage (${a1.status})`);
|
||||
const lage = await a1.json();
|
||||
const leute = lage.modis || [];
|
||||
|
||||
ok(leute.length === 2, `beide Modis stehen da, auch der pausierte (${leute.length})`);
|
||||
/* SEIT DEM 11.09.2026 GEHOERT DIE RECHTE HAND DAZU.
|
||||
|
||||
Filipe: "die rechte hand ist da um mir zu helfen aber auch wie die
|
||||
modis um mir zu sagen was passt und nicht." Damit steht sie in
|
||||
derselben Liste -- sonst kaemen ihre Rueckmeldungen nirgends an.
|
||||
|
||||
Die Zahl steht hier trotzdem, und zwar mit der Rechnung dahinter:
|
||||
zwei Modis (einer pausiert) plus die rechte Hand, minus die Person,
|
||||
die gerade liest. Eine Pruefung, die nur `> 0` verlangt, haette den
|
||||
Umbau nicht bemerkt. */
|
||||
ok(leute.length === 3,
|
||||
`beide Modis und die rechte Hand stehen da, auch der pausierte (${leute.length})`);
|
||||
ok(!leute.some((p) => p.id === idDogi),
|
||||
"und DogFather selbst nicht -- er liest die Seite, er steht nicht darauf");
|
||||
ok(leute.some((p) => p.id === idHand),
|
||||
"die rechte Hand steht wirklich darin (sonst waere die 3 oben Zufall)");
|
||||
|
||||
const marina = leute.find((m) => m.id === idMarina);
|
||||
const kim = leute.find((m) => m.id === idKim);
|
||||
|
||||
@@ -36,7 +36,7 @@ import express from "express";
|
||||
import {
|
||||
db, sitzungLesen, istLeitung, istDogFather, siehtAlles, darfCreator, betreuteIds,
|
||||
protokolliere, echteIp,
|
||||
siehtModis,
|
||||
siehtModis, TEAM_DOGI_ROLLEN,
|
||||
} from "./workspace.js";
|
||||
import { MODI_PUNKTE, MODI_GRUPPENTEXTE } from "./workspace-modi-punkte.js";
|
||||
import {
|
||||
@@ -290,7 +290,23 @@ function gleicheHerkunft(req, res, next) {
|
||||
* und jede davon waere eine Gelegenheit fuer einen Fehler.
|
||||
*/
|
||||
function creatorAus(req) {
|
||||
if (req.person.rolle === "creator" || req.person.rolle === "modi") return req.person.id;
|
||||
/* DIE RECHTE HAND ARBEITET AN IHRER EIGENEN LISTE (11.09.2026).
|
||||
|
||||
Filipe: "die rechte hand soll bei diesen aufgaben auch wie die
|
||||
modis sagen koennen ob es passt oder nicht ... die rechte hand ist
|
||||
da um mir zu helfen aber auch wie die modis um mir zu sagen was
|
||||
passt und nicht."
|
||||
|
||||
Sie stand bis hierher in keinem der beiden Zweige: nicht bei denen
|
||||
mit einer eigenen Liste, und die Auswahl "fuer wen?" darunter gab
|
||||
ihr nur fremde. Ergebnis: Sie konnte ueberall antworten und
|
||||
nirgends etwas beurteilen.
|
||||
|
||||
Aus der MENGE gelesen und nicht als zwei Vergleiche hingeschrieben
|
||||
-- sonst steht hier beim naechsten Mal einer zu wenig. */
|
||||
if (req.person.rolle === "creator" || TEAM_DOGI_ROLLEN.has(req.person.rolle)) {
|
||||
return req.person.id;
|
||||
}
|
||||
const id = Number(req.body?.creator_id || req.query?.creator_id) || 0;
|
||||
if (!id) return 0;
|
||||
return darfPerson(req.person, id) ? id : -1; /* -1 = verboten */
|
||||
@@ -307,7 +323,10 @@ function creatorAus(req) {
|
||||
function darfPerson(person, zielId) {
|
||||
const ziel = db().prepare("SELECT id, rolle FROM personen WHERE id = ?").get(Number(zielId));
|
||||
if (!ziel) return false;
|
||||
if (ziel.rolle === "modi") return siehtModis(person);
|
||||
/* Fuer die rechte Hand gilt dasselbe wie fuer einen Modi: Ihre Liste
|
||||
geht Spicy Media und die Manager nichts an. Aus derselben Menge --
|
||||
zwei Vergleiche waeren zwei Gelegenheiten, einen zu vergessen. */
|
||||
if (TEAM_DOGI_ROLLEN.has(ziel.rolle)) return siehtModis(person);
|
||||
return darfCreator(person, ziel.id);
|
||||
}
|
||||
|
||||
@@ -387,7 +406,20 @@ checklisteRouter.get("/workspace/api/checkliste/:bereich", (req, res) => {
|
||||
const zielRolle = creatorId > 0
|
||||
? db().prepare("SELECT rolle FROM personen WHERE id = ?").get(creatorId)?.rolle
|
||||
: req.person.rolle;
|
||||
const gruppen = gruppenFuer(bereich, zielRolle === "modi");
|
||||
/* WELCHER KATALOG? (11.09.2026 erweitert)
|
||||
|
||||
Es gibt zwei Punktsaetze: den fuer Creator ("Ton geprueft") und
|
||||
den fuer das Team ("Der Ton war durchgehend verstaendlich") --
|
||||
Beobachtungen ueber die Sendung statt Pflichten.
|
||||
|
||||
Die rechte Hand bekam bis hierher den CREATOR-Satz. Sie durfte
|
||||
seit heute frueh zwar urteilen, aber ueber die falschen Punkte:
|
||||
Ihre Meldung trug einen Schluessel, den der Eingang gar nicht
|
||||
kennt -- und wurde dort stillschweigend uebersprungen. Gemessen,
|
||||
nicht vermutet: Die Pruefung meldete "sie darf urteilen (200)"
|
||||
und eine Zeile spaeter "ihre Meldung steht NICHT in DogFathers
|
||||
Eingang". Beides stimmte. */
|
||||
const gruppen = gruppenFuer(bereich, TEAM_DOGI_ROLLEN.has(zielRolle));
|
||||
|
||||
res.json({
|
||||
bereich, name: liste.name,
|
||||
@@ -426,9 +458,9 @@ checklisteRouter.get("/workspace/api/checkliste/:bereich", (req, res) => {
|
||||
DogFather und VanVan LESEN ihn und handeln im Eingang: Aus
|
||||
"Verbessern" wird dort mit einem Klick eine Aufgabe -- oder eine
|
||||
begruendete Absage, die beim Verfasser ankommt. */
|
||||
darf_bewerten: zielRolle === "modi"
|
||||
darf_bewerten: TEAM_DOGI_ROLLEN.has(zielRolle)
|
||||
? req.person.id === creatorId
|
||||
: (req.person.rolle !== "creator" && req.person.rolle !== "modi"),
|
||||
: (req.person.rolle !== "creator" && !TEAM_DOGI_ROLLEN.has(req.person.rolle)),
|
||||
ich: req.person.id,
|
||||
});
|
||||
} catch (fehler) {
|
||||
@@ -450,8 +482,11 @@ checklisteRouter.put("/workspace/api/checkliste/:bereich/:schluessel", gleicheHe
|
||||
const zielRolle = zielId > 0
|
||||
? db().prepare("SELECT rolle FROM personen WHERE id = ?").get(zielId)?.rolle
|
||||
: null;
|
||||
const eigenerBericht = zielRolle === "modi" && req.person.id === zielId;
|
||||
if (zielRolle === "modi" && !eigenerBericht) {
|
||||
/* "Der eigene Bericht" heisst jetzt: eine Liste aus dem Team,
|
||||
und ich bin die Person, um die es geht. Das trifft auf einen
|
||||
Modi zu und seit dem 11.09.2026 ebenso auf die rechte Hand. */
|
||||
const eigenerBericht = TEAM_DOGI_ROLLEN.has(zielRolle) && req.person.id === zielId;
|
||||
if (TEAM_DOGI_ROLLEN.has(zielRolle) && !eigenerBericht) {
|
||||
/* Auch DogFather nicht: Es ist der Bericht des Modis. Er
|
||||
handelt im Eingang, nicht hier.
|
||||
|
||||
@@ -462,12 +497,16 @@ checklisteRouter.put("/workspace/api/checkliste/:bereich/:schluessel", gleicheHe
|
||||
falsche Seite zeigt, ist schlimmer als keiner: Man geht hin,
|
||||
findet nichts und glaubt, die Funktion sei kaputt. */
|
||||
return res.status(403).json({
|
||||
fehler: "Das ist die Rückmeldung des Modis. Sie wird nicht überschrieben, "
|
||||
+ "sondern im Eingang behandelt.",
|
||||
/* DER NAME DER KACHEL, DRITTE FASSUNG. Er stand hier schon
|
||||
einmal falsch ("Team-Lage"); seit dem 11.09.2026 heisst sie
|
||||
"Dein Team". Ein Hinweis, der auf eine Seite zeigt, die es
|
||||
unter diesem Namen nicht gibt, ist schlimmer als keiner. */
|
||||
fehler: "Das ist die Rückmeldung aus dem Team. Sie wird nicht überschrieben, "
|
||||
+ "sondern unter „Dein Team“ behandelt.",
|
||||
});
|
||||
}
|
||||
if (!eigenerBericht
|
||||
&& (req.person.rolle === "creator" || req.person.rolle === "modi")) {
|
||||
&& (req.person.rolle === "creator" || TEAM_DOGI_ROLLEN.has(req.person.rolle))) {
|
||||
return res.status(403).json({
|
||||
fehler: "Die Bewertung setzt deine Betreuung. Du kannst hier antworten.",
|
||||
});
|
||||
|
||||
@@ -147,10 +147,26 @@ teamlageRouter.get("/workspace/api/teamlage", (req, res) => {
|
||||
niemand mehr.
|
||||
|
||||
Aktive zuerst, dann nach Namen -- wer pausiert ist, steht unten
|
||||
und nicht mittendrin. */
|
||||
und nicht mittendrin.
|
||||
|
||||
DIE RECHTE HAND GEHOERT DAZU (11.09.2026). Filipe: "die rechte
|
||||
hand ist da um mir zu helfen aber auch wie die modis um mir zu
|
||||
sagen was passt und nicht."
|
||||
|
||||
Bis hierher stand hier `rolle = 'modi'`. Damit war sie zwar die
|
||||
Empfaengerin dieser Seite, kam auf ihr aber nicht vor -- und vor
|
||||
allem: Ihre Rueckmeldungen landeten nirgends. Der Eingang weiter
|
||||
unten sammelt genau aus dieser Liste; wer nicht darin steht, kann
|
||||
melden, so viel er will, es kommt nicht an.
|
||||
|
||||
`id <> ?` LAESST DEN LESER SELBST HERAUS. Ohne das saehe die
|
||||
rechte Hand eine Karte ueber sich selbst -- mit ihrer eigenen
|
||||
Ampel, ihrer eigenen Stufe und ihren eigenen offenen Punkten.
|
||||
Das ist kein Ueberblick ueber das Team, das ist ein Spiegel. */
|
||||
const modis = db().prepare(
|
||||
`SELECT id, name, bild, letzter_login, aktiv, erstellt, stufe FROM personen
|
||||
WHERE rolle = 'modi' ORDER BY aktiv DESC, name`).all();
|
||||
WHERE rolle IN ('hand','modi') AND id <> ?
|
||||
ORDER BY aktiv DESC, name`).all(person.id);
|
||||
|
||||
if (!modis.length) {
|
||||
/* `eingang` auch hier -- die Oberflaeche darf nicht raten
|
||||
|
||||
+20
-1
@@ -4256,7 +4256,26 @@ export function termineSichtbar(person, praefix = "t") {
|
||||
`teilnehmer_id` gehoert in die Liste. Ein Gespraech mit einem
|
||||
Creator haengt oft an gar keiner creator_id -- der Creator IST das
|
||||
Gegenueber. Wer nur zwei Spalten prueft, hat hier nichts geprueft. */
|
||||
if (person.haus === "crew") {
|
||||
/* EINE AUSNAHME, UND ZWAR GENAU EINE (11.09.2026).
|
||||
|
||||
Filipe: "mein kalender (dogfather) auf dieser seite hier soll
|
||||
komplett verbunden sein mit dem kalender in der workspace seite
|
||||
ABER NUR IN DER DOGFATHER ROLLE BEI DOGFATHER: NICHT BEI VANVAN."
|
||||
|
||||
Ein Kalender ist etwas anderes als eine Liste. Bei den Aufgaben,
|
||||
den Bereichen und den Dateien ist die Trennung eine Hilfe -- man
|
||||
will das andere Haus gerade NICHT sehen. Beim Kalender waere sie
|
||||
eine Falle: Wer auf der Team-Seite einen Termin einträgt und die
|
||||
Haelfte seines Tages nicht sieht, legt ihn auf eine Zeit, in der er
|
||||
schon woanders sitzt. Ein Kalender, der nur die halbe Wahrheit
|
||||
zeigt, ist schlimmer als keiner.
|
||||
|
||||
NUR FUER DIE DOGFATHER-ROLLE, und das ist sein ausdrueckliches
|
||||
Wort. Die rechte Hand behaelt die Trennung: Sie arbeitet auf dieser
|
||||
Adresse mit dem Team, und die Termine der Agentur gehen sie dort
|
||||
nichts an. Geprueft wird die ROLLE und nicht der Name -- ein Name
|
||||
waere die Stelle, an der es beim naechsten Menschen bricht. */
|
||||
if (person.haus === "crew" && person.rolle !== "admin") {
|
||||
return {
|
||||
wo: `(${eigen}) AND ${ohneAgentur(p, ["creator_id", "teilnehmer_id", "erstellt_von"])}`,
|
||||
werte,
|
||||
|
||||
Reference in New Issue
Block a user