Der Modi bekommt seine eigene Seite -- und sein Brett zurueck
DER WICHTIGSTE FUND, und er kam nicht aus dem Nachdenken: Ein Modi sah
auf dem Aufgabenbrett GAR NICHTS -- nicht einmal seine eigenen Aufgaben.
sichtbar() endet mit `default: 0=1`, und 'modi' stand nicht darin.
Genau dieser Fehler ist am 01.09.2026 schon dem Manager passiert; der
Kommentar zwei Zeilen darueber warnt woertlich davor ("Ein leeres Brett
sieht aus wie 'nichts zu tun', nicht wie ein Fehler; deshalb ist das
vermutlich lange niemandem aufgefallen"). Der Rollen-Rundgang meldete
fuer den Modi trotzdem brav "aufgaben.html ok" -- die Seite laedt ja,
sie war nur leer. Gefunden hat es erst eine Pruefung, die eine Aufgabe
ANLEGT und sie danach wiederzufinden versucht.
Ein Modi sieht jetzt die Aufgaben des ganzen Modi-Teams (Filipes
Entscheidung "sie sind untereinander ein Team"), aendern darf er
weiterhin nur seine eigenen. Die Nummern werden bei jeder Abfrage frisch
gelesen -- eine beim Serverstart gebaute Liste waere ab dem naechsten
neuen Modi falsch, und niemand wuesste warum.
DIE STARTSEITE. Ein Modi hatte keine einzige Kachel: Jede traegt eine
feste Rollenliste, und 'modi' darf dort nicht stehen -- bereiche.js
bekommt jeder ausgeliefert, der die Seite oeffnet. Die Kacheln kommen
deshalb vom Server (MODI_BEREICHE), samt Beschriftung. Nur die Ziele zu
schicken haette nicht gereicht: Unter "Dashboard" stuende sonst "Alle
Creator auf einen Blick" -- fuer jemanden ohne Creator. Die Worte
gehoeren zum Empfaenger, nicht zum Ziel.
Neun Kacheln in drei Gruppen: Aufgaben, Chat, Kalender, Dateien /
Live-Ablauf, Community, Technik / Profil, Wissen. Nichts aus der
Agentur -- diese Seiten drehen sich um betreute Creator oder um Rechte.
`null` heisst "nimm deine eigene Liste", eine LEERE Liste hiesse "keine
Kacheln". Verwechselte man die beiden, haetten die fuenf bekannten
Rollen ab sofort eine leere Startseite.
ZWEI DINGE HAT DAS BILDSCHIRMFOTO GEZEIGT, NICHT DER CODE:
* Ueber der Modi-Startseite stand "Spicy Media" -- die Marke einer
Agentur, mit der er nichts zu tun hat. Jetzt "Team Dogi", wie auf
der oeffentlichen Seite. Ersetzt wird nur der Textknoten: In dem
Element sitzen zwei Zierrauten, ein textContent haette sie lautlos
geloescht.
* Auf seinem Aufgabenbrett stand das Creator-Vorlagenbrett, 80
Aufgaben fuer den Aufbau eines Kanals. Fuer einen Moderator ist
davon nichts gedacht. Ausgeblendet, bis sein Katalog aus Teil 2 des
Anforderungsdokuments da ist -- nichts ist ehrlicher als etwas
Fremdes.
Dazu: "0 betreut" stand dauerhaft auf seiner Startseite, eine Zahl, die
nie etwas anderes sagen kann. Jetzt zaehlt sie, wie viele im Modi-Team
sind. Und der Satz unter der Begruessung war nur das Wort "Modi", neben
fuenf Rollen mit einem ganzen Satz -- das sah nicht verborgen aus,
sondern unfertig.
KATEGORIEN (Kapitel 6.1), nach Filipes Entscheidung nur bei den Modis.
Acht Stueck; hier steht, wohin die dreizehn aus Teil 2 fallen
(Branding/Team/Kommunikation -> Planung, Wachstum -> Community).
Der heikelste Fall ist nicht das Setzen, sondern das SCHICKEN durch
jemanden, der es nicht darf: Eine Absage ("Unbekannte Kategorie") waere
die Auskunft, dass es das Feld gibt. Also faellt der Wert lautlos weg
und die Aufgabe entsteht ganz normal. Wer die Kategorien benutzen darf,
bekommt bei einem Tippfehler dagegen sehr wohl eine Absage.
Das Feld erscheint nur, wenn die Aufgabe wirklich zu einem Modi gehoert
-- bei DogFather also erst, wenn er einen als Person auswaehlt. Sonst
stuende es auch an jeder Creator-Aufgabe. Verborgen heisst dabei auch
"nichts mitschicken": Ein Wert in einem unsichtbaren Feld wandert sonst
beim naechsten Speichern mit.
KEINE NEUE CSS-KLASSE fuer die Kategorie auf der Karte. Sie muesste in
sieben gleichlautenden Kopien der Modulliste gepflegt werden -- sieben
Gelegenheiten fuer einen Unterschied, fuer eine Zeile Text.
AUSSERDEM BERICHTIGT, UND ES WAR SCHON VORHER ROT: pruef-start-ansicht
erwartete drei Kachelgruppen. Seit b45de94 gibt es vier ("Rund um das
Team"). Bevor ich die Zahl angefasst habe, habe ich meine Aenderungen
beiseitegelegt und den Lauf wiederholt -- schon auf dem unveraenderten
Stand rot, also nicht von mir. Geprueft werden jetzt die NAMEN: Vier
Gruppen koennten auch drei richtige und eine doppelte sein.
GEPRUEFT: pruef-modi-verborgen (57), pruef-modi-kategorien (22, neu),
pruef-rollen (113 statt 97 -- der Modi laeuft jetzt ueber jede der 16
Seiten), pruef-start-ansicht, pruef-aufgabenbrett, pruef-sicht,
pruef-verborgen, pruef-personen-formular (24), pruef-personen-liste,
pruef-css-klassen, pruef-spicy (60).
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -200,6 +200,23 @@
|
||||
(faellig ? 'überfällig ' : 'bis ') + datumHuebsch(a.frist));
|
||||
zeile.append(f);
|
||||
}
|
||||
/* Die Kategorie als Wort in derselben Zeile wie Frist und Person.
|
||||
Kein eigener Streifen und keine eigene Farbe: Sie ist eine
|
||||
Einordnung, keine Warnung -- und eine Karte, auf der alles
|
||||
hervorsticht, hebt nichts hervor. Der Name kommt aus der Liste
|
||||
des Servers; steht die Aufgabe in einer Kategorie, die es nicht
|
||||
mehr gibt, wird nichts angezeigt statt eines Schluessels.
|
||||
|
||||
KEINE EIGENE CSS-KLASSE. Sie muesste in sieben gleichlautenden
|
||||
Kopien der Modulliste gepflegt werden (pruef-css-klassen wacht
|
||||
darueber, dass die sieben Zeichen fuer Zeichen gleich sind) --
|
||||
viel Aufwand und sieben Gelegenheiten fuer einen Unterschied,
|
||||
fuer eine Zeile Text. Dieselbe schlichte Form wie "· Bereich X"
|
||||
daneben tut es. */
|
||||
if (a.kategorie) {
|
||||
const name = kategorien.find((k) => k.wert === a.kategorie)?.name;
|
||||
if (name) zeile.append(el('span', null, '· ' + name));
|
||||
}
|
||||
if (a.verantwortlich_name) zeile.append(el('span', null, '· ' + a.verantwortlich_name));
|
||||
if (LEITUNG.has(ich.rolle) && a.creator_name && a.creator_name !== a.verantwortlich_name) {
|
||||
zeile.append(el('span', null, '· Bereich ' + a.creator_name));
|
||||
@@ -668,11 +685,71 @@
|
||||
window.zielMarkieren?.(treffer, ZEIG_TEXT[was]);
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
DIE KATEGORIE EINER AUFGABE (10.09.2026, Kapitel 6.1)
|
||||
|
||||
Filipes Entscheidung: nur bei den Modis. Fuer Creator, Scouts und
|
||||
Manager bleibt das Formular unveraendert -- sie bekommen das Feld
|
||||
nicht ausgeblendet, sondern gar nicht: Der Server schickt ihnen
|
||||
keine Kategorien, und ohne Kategorien wird nichts gebaut.
|
||||
|
||||
WARUM DIE NAMEN NICHT HIER STEHEN: Diese Datei bekommt jeder
|
||||
ausgeliefert, der die Seite oeffnet. Eine Liste, die im Browser
|
||||
jedes Menschen liegt und nur bei einem einzigen benutzt wird, wirft
|
||||
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();
|
||||
|
||||
function kategorienEinsetzen() {
|
||||
if (!kategorien.length) return;
|
||||
for (const ziel of ['f-kategorie', 'b-kategorie']) {
|
||||
const feld = $(ziel);
|
||||
if (!feld || feld.dataset.fertig) continue;
|
||||
feld.dataset.fertig = 'ja';
|
||||
for (const k of kategorien) {
|
||||
const o = el('option', null, k.name);
|
||||
o.value = k.wert;
|
||||
feld.append(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Gehoert diese Aufgabe zu einem Modi?
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
huelle.hidden = !zeigen;
|
||||
/* Verborgen heisst auch: nichts mitschicken. Ein Wert, der in einem
|
||||
unsichtbaren Feld stehenbleibt, wandert sonst beim naechsten
|
||||
Speichern mit -- und niemand sieht, woher er kommt. */
|
||||
if (!zeigen && $(`${praefix}-kategorie`)) $(`${praefix}-kategorie`).value = '';
|
||||
}
|
||||
|
||||
async function laden() {
|
||||
try {
|
||||
const antwort = await hole('/workspace/api/aufgaben');
|
||||
if (!antwort.ok) { melde('Aufgaben konnten nicht geladen werden.'); return; }
|
||||
alleAufgaben = (await antwort.json()).aufgaben || [];
|
||||
const daten = await antwort.json();
|
||||
alleAufgaben = daten.aufgaben || [];
|
||||
kategorien = daten.kategorien || [];
|
||||
kategorienEinsetzen();
|
||||
kategorieFeldZeigen('f');
|
||||
lageZeigen(alleAufgaben);
|
||||
neuZeichnen();
|
||||
/* Erst NACH dem Zeichnen -- vorher gibt es die Karten nicht, und
|
||||
@@ -713,6 +790,7 @@
|
||||
daten.creator_extern = $('f-creator').dataset.extern || null;
|
||||
daten.verantwortlich_extern = $('f-verant').dataset.extern || null;
|
||||
}
|
||||
if (!$('feld-kategorie')?.hidden) daten.kategorie = $('f-kategorie').value || '';
|
||||
|
||||
knopfEl.disabled = true;
|
||||
try {
|
||||
@@ -749,6 +827,8 @@
|
||||
$('b-verant').value = a.verantwortlich_id ? String(a.verantwortlich_id) : '';
|
||||
$('b-loeschen').hidden = false;
|
||||
}
|
||||
kategorieFeldZeigen('b');
|
||||
if ($('b-kategorie')) $('b-kategorie').value = a.kategorie || '';
|
||||
dialog.showModal();
|
||||
$('b-titel').focus();
|
||||
}
|
||||
@@ -774,6 +854,7 @@
|
||||
daten.creator_extern = $('b-creator').dataset.extern || null;
|
||||
daten.verantwortlich_extern = $('b-verant').dataset.extern || null;
|
||||
}
|
||||
if (!$('b-feld-kategorie')?.hidden) daten.kategorie = $('b-kategorie').value || '';
|
||||
$('b-speichern').disabled = true;
|
||||
try {
|
||||
const a = await hole(`/workspace/api/aufgaben/${bearbeitet.id}`, {
|
||||
@@ -824,6 +905,11 @@ 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);
|
||||
@@ -849,6 +935,15 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
|
||||
window.personenwahl?.(ziel, { hinweis: "Kein Konto im Workspace – der Name steht nur an diesem Eintrag."
|
||||
+ ' Die Aufgabe steht dann auf keinem persönlichen Aufgabenbrett.' });
|
||||
}
|
||||
/* Das Kategorie-Feld folgt der gewaehlten Person. Auf `change` und
|
||||
nicht einmalig beim Oeffnen: Wer erst den Titel tippt und dann
|
||||
die Person aussucht, bekaeme das Feld sonst nie zu sehen. */
|
||||
for (const ziel of ['f-creator', 'f-verant']) {
|
||||
$(ziel)?.addEventListener('change', () => kategorieFeldZeigen('f'));
|
||||
}
|
||||
for (const ziel of ['b-creator', 'b-verant']) {
|
||||
$(ziel)?.addEventListener('change', () => kategorieFeldZeigen('b'));
|
||||
}
|
||||
}
|
||||
|
||||
await laden();
|
||||
@@ -915,6 +1010,23 @@ 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).
|
||||
|
||||
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; }
|
||||
if (!vorlagen) {
|
||||
try {
|
||||
const a = await hole('/workspace/api/vorlagen');
|
||||
|
||||
@@ -133,13 +133,52 @@
|
||||
zahlen.set(kachel, bisher);
|
||||
}
|
||||
|
||||
/* =================================================================
|
||||
WELCHE KACHELN DIESE PERSON SIEHT (10.09.2026)
|
||||
|
||||
ZWEI QUELLEN, und die Reihenfolge ist die Aussage:
|
||||
|
||||
1. Schickt der Server eine Liste, gilt sie. Das ist der Weg fuer
|
||||
Rollen, die in bereiche.js gar nicht vorkommen duerfen --
|
||||
diese Datei bekommt jeder ausgeliefert, der die Seite
|
||||
oeffnet, und ein Rollenname darin waere mit einem Blick in
|
||||
den Quelltext gefunden.
|
||||
2. Sonst wie bisher: die Rollenliste an der Kachel selbst.
|
||||
|
||||
Nach der ANGESEHENEN Rolle, nicht der eigenen -- 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. Der Server richtet sich beim
|
||||
Bauen seiner Liste nach derselben Person.
|
||||
|
||||
`null` heisst "nimm deine eigene Liste", eine LEERE Liste hiesse
|
||||
"keine Kacheln". Die beiden auseinanderzuhalten ist kein
|
||||
Feinschliff: Verwechselte man sie, haetten die fuenf bekannten
|
||||
Rollen ab sofort eine leere Startseite. */
|
||||
function eigeneGruppen(wer) {
|
||||
const vomServer = ich && ich.bereiche;
|
||||
if (Array.isArray(vomServer)) {
|
||||
/* Nach Gruppen buendeln, in der Reihenfolge, in der sie kommen
|
||||
-- eine Map behaelt sie, ein Objekt sortierte Zahlenschluessel
|
||||
um. Hier sind es Woerter, aber darauf zu bauen waere die Art
|
||||
Annahme, die spaeter jemanden Zeit kostet. */
|
||||
const nach = new Map();
|
||||
for (const b of vomServer) {
|
||||
if (!nach.has(b.gruppe)) {
|
||||
nach.set(b.gruppe, { name: b.gruppe, unter: b.gruppeUnter || '', bereiche: [] });
|
||||
}
|
||||
nach.get(b.gruppe).bereiche.push(b);
|
||||
}
|
||||
return [...nach.values()];
|
||||
}
|
||||
return GRUPPEN
|
||||
.map((g) => ({ ...g, bereiche: g.bereiche.filter((b) => b.rollen.includes(wer.rolle)) }))
|
||||
.filter((g) => g.bereiche.length);
|
||||
}
|
||||
|
||||
let laufNr = 0;
|
||||
for (const gruppe of GRUPPEN) {
|
||||
/* 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));
|
||||
for (const gruppe of eigeneGruppen(zeigt)) {
|
||||
const meine = gruppe.bereiche;
|
||||
if (!meine.length) continue;
|
||||
|
||||
const abschnitt = el('section', 'gruppe');
|
||||
@@ -681,9 +720,34 @@
|
||||
Liste (mit dem erklaerenden Zusatz dahinter), dann der Name vom
|
||||
Server, zuletzt der nackte Schluessel. So aendert sich fuer die
|
||||
fuenf bekannten Rollen nichts. */
|
||||
/* DIE ZIERZEILE UEBER DEM TITEL (10.09.2026).
|
||||
|
||||
Sie nennt den Betrieb -- fest "Spicy Media" in start.html. Fuer
|
||||
einen Modi stimmt das nicht, er gehoert zu Team Dogi; der Server
|
||||
schickt dann den passenden Namen mit.
|
||||
|
||||
ERSETZT WIRD NUR DER TEXTKNOTEN, nicht der ganze Inhalt: In dem
|
||||
Element sitzen zwei <i class="zraute"> als Zierrauten links und
|
||||
rechts. Ein textContent darauf haette sie geloescht -- und zwar
|
||||
lautlos, denn eine fehlende Raute sieht nicht nach Fehler aus,
|
||||
sondern nach Absicht. Ein neues Element drumherum waere die
|
||||
andere naheliegende Loesung und aendert die Flex-Aufteilung; das
|
||||
hier aendert am Aufbau gar nichts. */
|
||||
if (ich.marke) {
|
||||
const marke = document.querySelector('.zmarke');
|
||||
if (marke) {
|
||||
for (const knoten of marke.childNodes) {
|
||||
if (knoten.nodeType === 3 && knoten.textContent.trim()) {
|
||||
knoten.textContent = ` ${ich.marke} `;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$('rollentext').textContent = ich.sicht
|
||||
? `Arbeitsplatz von ${ich.sicht.name} · ${ROLLENTEXT[zeigt.rolle] || zeigt.rolle}`
|
||||
: (ROLLENTEXT[ich.rolle] || ich.rolle_name || ich.rolle);
|
||||
? `Arbeitsplatz von ${ich.sicht.name} · `
|
||||
+ `${ROLLENTEXT[zeigt.rolle] || ich.sicht.rolle_name || zeigt.rolle}`
|
||||
: (ROLLENTEXT[ich.rolle] || ich.rolle_text || ich.rolle_name || ich.rolle);
|
||||
|
||||
/* Datum und Rolle in der Anrede -- wie im Vorbild, wo unter "Noch
|
||||
wach, Dogi" das Datum steht und daneben "ADMIN & PARTNER".
|
||||
|
||||
Reference in New Issue
Block a user