Der Rollenname stand in zwei Dateien, die jeder bekommt
SELBST EINGEBAUT, EINE STUNDE VORHER. Beim Bau der Kategorien habe ich
SECHS Vergleiche und VIER Kommentare mit dem Rollennamen nach
assets/js/aufgaben.js und assets/js/start.js geschrieben -- waehrend ich
an anderer Stelle penibel darauf achtete, ihn herauszuhalten.
Alles unter workspace/ geht an JEDEN, der die Seite oeffnet. Ein Blick in
den Quelltext, und der ganze verborgene Zugang waere gefunden gewesen:
nicht wer ein Modi ist, aber dass es die Rolle ueberhaupt gibt -- und
genau das war Filipes Bedingung ("damit die von der workspace auch nicht
mal sehen dass die modis von mir einen eigenen zugang haben").
Gefunden habe ich es durch Nachsehen, nicht durch Nachdenken. Nachgedacht
hatte ich vorher schon, und zwar richtig -- beim Anzeigenamen und bei der
Rollenauswahl habe ich es sauber ueber den Server geloest. Eine Stunde
spaeter habe ich dieselbe Regel dreimal gebrochen, ohne es zu merken.
WAS AN DIE STELLE TRITT, dreimal derselbe Gedanke:
* Das Vorlagenbrett: /workspace/api/vorlagen liefert den Katalog jetzt
schlicht nicht an die Betroffenen. `if (!vorlagen) return` laesst das
Brett dann verborgen -- dieselbe Wirkung, ohne eine Zeile, die
verraet, fuer wen sie gilt.
* Das Kategorie-Feld: statt `ich.rolle === '...'` kommt vom Server
`kategorie_fuer` -- NUMMERN statt eines Rollennamens. Aus Nummern
laesst sich nichts schliessen; wer keine bekommt, sieht eine leere
Liste, und eine leere Liste sagt nichts. `null` heisst "gilt immer"
und muss `null` bleiben: Ein `|| []` daraus zu machen waere der
stille Fehler, aus "gilt immer" wuerde "gilt nie".
* Die Kommentare sagen jetzt, WAS gilt, ohne zu sagen, FUER WEN.
UND EINE SPERRE DAGEGEN: pruef-modi-wortleck durchsucht alle 73
ausgelieferten Dateien nach dem Rollennamen. Die Regel ist damit kein
Vorsatz mehr, sondern ein Werkzeug -- wer ihn dort hineinschreibt,
bekommt einen roten Lauf statt eines erhobenen Zeigefingers im Kommentar.
Mit Gegenprobe in beide Richtungen: Eine eingebaute Fundstelle MUSS
erkannt werden, und "modifiziert", "Modul", "Modus" duerfen NICHT
anschlagen -- eine Pruefung, die staendig Fehlalarm gibt, wird
abgeschaltet und faengt dann auch den echten Fall nicht mehr.
Die Dateizahl steht in der Bedingung, nicht nur im Meldetext: Faende die
Suche keine einzige Datei, waere sonst alles gruen, ohne dass etwas
angesehen wurde.
AUSSERDEM BELEGT statt behauptet: Dass das Kategorie-Feld bei DogFather
nur erscheint, wenn er wirklich einen Modi eintraegt, steht jetzt in der
Pruefung -- erst ein Creator (Feld bleibt weg), dann ein Modi (Feld
kommt). Ohne den zweiten Schritt waere "bleibt weg" auch dann gruen,
wenn es NIE kaeme.
GEPRUEFT: pruef-modi-wortleck (4, neu), pruef-modi-kategorien (25),
pruef-modi-verborgen (57), pruef-vorlagen, pruef-aufgabenbrett.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -699,10 +699,18 @@
|
||||
die Frage auf, fuer wen sie da ist. Genau die soll niemand stellen.
|
||||
===================================================================== */
|
||||
let kategorien = [];
|
||||
/* Wer ein Modi ist -- gefuellt aus der Personenliste, die ohnehin
|
||||
geladen wird. Sie enthaelt Modis nur fuer den, der sie sehen darf;
|
||||
fuer alle anderen bleibt diese Menge leer. */
|
||||
const modis = new Set();
|
||||
/* FUER WESSEN AUFGABEN die Kategorie gilt. Kommt fertig vom Server:
|
||||
|
||||
null -> fuer alle eigenen (das Feld steht immer da)
|
||||
[Nummern] -> nur wenn eine dieser Personen gewaehlt ist
|
||||
[] -> nie
|
||||
|
||||
ALS NUMMERN UND NICHT ALS ROLLENNAME, und das ist kein Zufall: Beim
|
||||
ersten Anlauf stand hier ein Vergleich auf einen Rollennamen -- in
|
||||
einer Datei, die JEDER bekommt, der die Seite oeffnet. Aus Nummern
|
||||
laesst sich nichts schliessen; wer keine bekommt, sieht eine leere
|
||||
Liste, und eine leere Liste sagt nichts. */
|
||||
let kategorieFuer = [];
|
||||
|
||||
function kategorienEinsetzen() {
|
||||
if (!kategorien.length) return;
|
||||
@@ -718,22 +726,24 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* Gehoert diese Aufgabe zu einem Modi?
|
||||
/* Braucht diese Aufgabe eine Kategorie?
|
||||
|
||||
Fuer einen Modi immer (es sind seine eigenen). Fuer die
|
||||
DogFather-Rolle nur dann, wenn die gewaehlte Person eine ist --
|
||||
sonst stuende das Feld auch an jeder Creator-Aufgabe, und genau das
|
||||
wollte Filipe nicht ("nur bei den Modis"). */
|
||||
function gehoertModi(creatorId, verantId) {
|
||||
if (ich?.rolle === 'modi') return true;
|
||||
return modis.has(Number(creatorId)) || modis.has(Number(verantId));
|
||||
`null` heisst "immer" -- dann arbeitet die angemeldete Person
|
||||
ausschliesslich an eigenen Aufgaben, und dort gilt sie unabhaengig
|
||||
davon, wen sie eintraegt. Sonst entscheidet die gewaehlte Person.
|
||||
Wer eine leere Liste bekommt, sieht das Feld nie. */
|
||||
function kategorieNoetig(creatorId, verantId) {
|
||||
if (kategorieFuer === null) return true;
|
||||
if (!Array.isArray(kategorieFuer) || !kategorieFuer.length) return false;
|
||||
return kategorieFuer.includes(Number(creatorId))
|
||||
|| kategorieFuer.includes(Number(verantId));
|
||||
}
|
||||
|
||||
function kategorieFeldZeigen(praefix) {
|
||||
const huelle = $(praefix === 'f' ? 'feld-kategorie' : 'b-feld-kategorie');
|
||||
if (!huelle) return;
|
||||
const zeigen = kategorien.length
|
||||
&& gehoertModi($(`${praefix}-creator`)?.value, $(`${praefix}-verant`)?.value);
|
||||
&& kategorieNoetig($(`${praefix}-creator`)?.value, $(`${praefix}-verant`)?.value);
|
||||
huelle.hidden = !zeigen;
|
||||
/* Verborgen heisst auch: nichts mitschicken. Ein Wert, der in einem
|
||||
unsichtbaren Feld stehenbleibt, wandert sonst beim naechsten
|
||||
@@ -748,6 +758,10 @@
|
||||
const daten = await antwort.json();
|
||||
alleAufgaben = daten.aufgaben || [];
|
||||
kategorien = daten.kategorien || [];
|
||||
/* `null` muss `null` BLEIBEN -- ein `|| []` daraus zu machen waere
|
||||
der stille Fehler: Aus "gilt immer" wuerde "gilt nie", und das
|
||||
Feld verschwaende fuer genau die, die es brauchen. */
|
||||
kategorieFuer = daten.kategorie_fuer === undefined ? [] : daten.kategorie_fuer;
|
||||
kategorienEinsetzen();
|
||||
kategorieFeldZeigen('f');
|
||||
lageZeigen(alleAufgaben);
|
||||
@@ -905,11 +919,6 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
|
||||
try {
|
||||
const { personen } = await (await hole('/workspace/api/personen')).json();
|
||||
for (const p of personen) {
|
||||
/* Wer ein Modi ist, entscheidet spaeter, ob das Kategorie-Feld
|
||||
ueberhaupt erscheint. Die Liste enthaelt Modis nur fuer den,
|
||||
der sie sehen darf -- fuer alle anderen bleibt die Menge
|
||||
leer, und das Feld bleibt weg. */
|
||||
if (p.rolle === 'modi') modis.add(Number(p.id));
|
||||
for (const ziel of ['f-creator', 'f-verant', 'b-creator', 'b-verant']) {
|
||||
const o = el('option', null, `${p.name} (${p.rolle})`);
|
||||
o.value = String(p.id);
|
||||
@@ -1010,23 +1019,14 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
|
||||
async function vorlagenbrettZeigen() {
|
||||
const ziel = $('vorlagenbrett');
|
||||
if (!ziel || !ich) return;
|
||||
/* NICHT FUER EINEN MODI (10.09.2026).
|
||||
/* WER DIESEN KATALOG BEKOMMT, ENTSCHEIDET DER SERVER.
|
||||
|
||||
Das Vorlagenbrett haelt 80 fertige Aufgaben in vier Bereichen und
|
||||
vier Stufen bereit -- den Begleitplan fuer einen CREATOR, von
|
||||
"Ton aufnehmen und anhoeren" bis "Monatsbericht mit drei festen
|
||||
Zahlen". Fuer einen Modi ist davon nichts gedacht: Er moderiert,
|
||||
er baut keinen Kanal auf.
|
||||
|
||||
Aufgefallen ist das auf dem Bildschirmfoto der Browserpruefung,
|
||||
nicht im Code -- die Kachel laedt fehlerfrei, sie zeigt nur das
|
||||
Falsche. Ein Vorschlag, der nicht passt, ist schlimmer als
|
||||
keiner: Man raeumt ihn nicht weg, man arbeitet um ihn herum.
|
||||
|
||||
SEIN Katalog steht in Teil 2 des Anforderungsdokuments (die 60+
|
||||
Aufgaben aus Phase 1 bis 6). Bis der da ist, steht hier nichts --
|
||||
das ist ehrlicher als etwas Fremdes. */
|
||||
if (ich.rolle === 'modi') { ziel.hidden = true; return; }
|
||||
Hier stand kurzzeitig ein Vergleich auf einen Rollennamen -- in
|
||||
einer Datei, die JEDER bekommt, der die Seite oeffnet. Jetzt
|
||||
liefert /workspace/api/vorlagen fuer die Betroffenen schlicht
|
||||
nichts, und `if (!vorlagen) return` weiter unten laesst das Brett
|
||||
verborgen. Dieselbe Wirkung, ohne eine Zeile, die verraet, fuer
|
||||
wen sie gilt. */
|
||||
if (!vorlagen) {
|
||||
try {
|
||||
const a = await hole('/workspace/api/vorlagen');
|
||||
|
||||
Reference in New Issue
Block a user