Der Aufgabenkatalog fuers Team: Kategorie mal Stufe, 88 Aufgaben

Filipe: "perfektionniere die kategorien wo ich aufgaben an die modis
verteile und so, ich will dass du alles was es gibt auf der welt durch
gehst und wie bei den aufgaben wo sie fuer mich haben auch mit
kategorien und vielen aufgaben."

ERST GEZAEHLT, WAS DA WAR. Es gab einen Katalog: 60 Eintraege in neun
Phasen. Wem sie gehoerten:

  DogFather                13
  DogFather & rechte Hand  12
  rechte Hand              14
  --------------------------------
  zusammen                 39 von 60

Zwei Drittel des "Modi-Katalogs" waren Aufbauarbeiten fuer Filipe
selbst. Nur 20 Eintraege waren wirklich Arbeit fuer jemanden im Team.
Und die Verteilung ueber die vierzehn Kategorien war schief: Planung
10, Events 1, Wachstum 1, Branding 1, Sonstiges 0.

Der Aufbauplan ist nicht falsch, nur etwas anderes -- er bleibt unter
`aufbauplan` erhalten. Ihn zu loeschen hiesse, 60 durchdachte Schritte
wegzuwerfen, weil sie am falschen Platz standen.

NEU: 88 Aufgaben in KATEGORIE mal STUFE, dieselbe Form wie bei den
Creator-Vorlagen. Wer eine Aufgabe vergibt, denkt "Frida macht Chat"
und nicht "wir sind in Phase 3".

  Chat 11, Team 8, Community/Events/Clipping/Technik je 7,
  Social/Planung/Organisation je 6, Kommunikation/Analyse/Wachstum/
  Branding je 5, Sonstiges 3 -- keine Kategorie mehr leer.

  Drei Stufen: neu dabei (24), eingearbeitet (35), erfahren (29).
  Eine Aufgabe der Stufe "erfahren" an einen Neuen zu geben ist kein
  Kompliment, sondern ein Ueberfallen.

UND DIE VIERZEHN KATEGORIEN HABEN JETZT EINEN SATZ. Vorher standen da
vierzehn nackte Namen -- "Organisation" und "Planung" nebeneinander,
ohne dass jemand sagt, was worin gehoert. Dann landet dieselbe Aufgabe
beim einen unter Planung, beim anderen unter Organisation, und jede
Auswertung darueber ist wertlos. Jetzt: Planung ist, was NOCH NICHT
ist; Organisation, was bereits ist, in Ordnung zu halten.

RECHERCHIERT, NICHT AUSGEDACHT (Quellen im Kopf des Katalogs):
Twitch und Discord zu dem, was ein Moderator tatsaechlich tut; TikTok
LIVE im Besonderen (gefilterte Kommentare, Gaesteverwaltung, Regeln zu
Beginn, Matches, Geschenke ohne Betteln); Community-Arbeit zu Rhythmus,
Vertretung und Monatsrueckblick. Dazu die Burnout-Forschung, die schon
in "Wie geht's dir?" steht -- deshalb stehen unter "Team" Aufgaben, die
zu wenig Zeit und Streit frueh sichtbar machen.

WAS DABEI BEINAHE SCHIEFGEGANGEN WAERE, und was es gefunden hat:

  Das Uebernehmen griff noch auf MODI_KATALOG zu -- die alten Phasen.
  Der Browser schickt die Nummer aus der AUSGELIEFERTEN Liste zurueck.
  Ein Klick auf "Uebernehmen" haette damit eine voellig andere Aufgabe
  angelegt, und zwar eine, die es gibt: keine Fehlermeldung, nichts
  Rotes, nur die falsche Aufgabe auf dem Brett. Gefunden hat das
  pruef-modi-katalog, die an der verschwundenen Phase abgestuerzt ist.

  Der Knopf "Alle N uebernehmen" schickte die Stufe nicht mit. Er sagte
  "Alle 4 uebernehmen" und haette elf angelegt -- das merkt man erst
  auf dem Brett.

  Und der Satz ueber dem Brett sagte weiterhin "Nach Etappen sortiert".
  Gesehen im Bildschirmfoto der Pruefung, nicht im Code.

  server/pruef-modi-katalog.mjs   36 Pruefungen, 0 Fehler
  Neu darin: jede Kategorie muss belegt sein (mindestens drei), jede
  Stufe auch, keine Kennung doppelt -- und JEDER TEXT MUSS BEGRUENDEN.
  Die letzte Zeile hat zwei meiner eigenen Texte als zu duenn erwischt.

  pruef-modi-kategorien 25, pruef-aufgabenbrett, pruef-vorlagen,
  pruef-css-klassen, pruef-struktur -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-16 19:05:34 +02:00
co-authored by Claude Opus 5
parent 99f96553c5
commit 4802954263
35 changed files with 1035 additions and 413 deletions
+12
View File
@@ -7607,6 +7607,18 @@ body.start .k-leiste .feldschild::after {
.stufenleiter__knopf[data-stufe="fort"] { --sf: #a78bfa; }
.stufenleiter__knopf[data-stufe="profi"] { --sf: #e8a94e; }
.stufenleiter__knopf[data-stufe="meister"] { --sf: #5fc99a; }
/* DIE DREI STUFEN DES TEAMS (16.09.2026). Dieselbe Reihe, zweite
Ebene: oben die Kategorie, darunter fuer wen die Aufgabe gedacht
ist. Die Toene steigen wie bei den Creator-Stufen -- hell fuer den
Anfang, warm fuer das, was Verantwortung traegt. */
.stufenleiter__knopf[data-stufe="neu"] { --sf: #7ec8f2; }
.stufenleiter__knopf[data-stufe="dabei"] { --sf: #a78bfa; }
.stufenleiter__knopf[data-stufe="erfahren"] { --sf: #e8a94e; }
/* Die zweite Reihe steht dichter unter der ersten und traegt weniger
Gewicht: Sie waehlt innerhalb dessen, was oben schon gewaehlt ist. */
.stufenleiter--fein { margin: -6px 0 14px; }
.stufenleiter--fein .stufenleiter__knopf { padding: 5px 11px; font-size: .76rem; }
.stufenleiter__knopf:hover {
color: var(--text);
+67 -7
View File
@@ -1050,6 +1050,9 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
schliessen laesst, fuer wen er gedacht ist. */
let katalog = null;
let kGruppe = null;
/* WELCHE STUFE. `null` heisst alle -- und das ist die Vorgabe:
Wer eine Kategorie aufmacht, will erst sehen, was es gibt. */
let kStufe = null;
/* Getrennt vom Inhalt, weil "nichts bekommen" ein gueltiges Ergebnis
ist. Ohne dieses Merkmal fragte die Seite bei jedem Neuzeichnen
erneut nach -- und bekaeme jedes Mal wieder nichts. */
@@ -1290,11 +1293,16 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
kopf.setAttribute('aria-controls', 'vorlagenbrett-koerper');
const kText = el('span', 'vorlagenbrett__kopftext');
kText.append(el('span', 'feldschild', 'Aufgaben aus der Vorlage'));
/* DER SATZ MUSS SAGEN, WONACH SORTIERT IST. Bis zum 16.09.2026 stand
hier "Nach Etappen sortiert" -- und seit dem Umbau auf Kategorie
mal Stufe war das schlicht falsch. Ein Satz, der etwas anderes
beschreibt als das, was darunter steht, kostet mehr Zeit als er
spart. */
kText.append(el('span', 'vorlagenbrett__unter', vOffen
? 'Nach Etappen sortiert. Übernommen wird als ganz normale Aufgabe '
+ '– mit Frist und Kategorie, veränderbar, auf dem Brett darunter.'
? 'Nach Kategorie und Stufe sortiert. Übernommen wird als ganz normale '
+ 'Aufgabe – mit Frist und Kategorie, veränderbar, auf dem Brett darunter.'
: `${katalog.aufgaben.length} fertige Aufgaben in `
+ `${katalog.gruppen.length} Etappen – zum Übernehmen.`));
+ `${katalog.gruppen.length} Kategorien – zum Übernehmen.`));
kopf.append(kText);
const pfeil = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
pfeil.setAttribute('viewBox', '0 0 24 24');
@@ -1341,6 +1349,51 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
const gruppe = katalog.gruppen.find((g) => g.schluessel === kGruppe);
if (gruppe?.text) koerper.append(el('p', 'vorlagenbrett__stand', gruppe.text));
/* ---- Die Stufe (16.09.2026) ---------------------------------------
Filipe: "wie bei den aufgaben wo sie für mich haben auch mit
kategorien und vielen aufgaben."
Dieselbe Kategorie bedeutet für jemanden in der ersten Woche
etwas anderes als für jemanden, der einarbeitet. Eine Aufgabe
der Stufe "erfahren" an einen Neuen zu geben ist kein
Kompliment, sondern ein Überfallen.
DIE STUFEN KOMMEN VOM SERVER, nicht aus einer Liste hier: Eine
zweite Liste im Browser wäre die, die beim nächsten Zusatz
veraltet -- und ausgeliefert wird sie an jeden. */
const inGruppe = katalog.aufgaben.filter((v) => v.gruppe === kGruppe);
if (Array.isArray(katalog.stufen) && katalog.stufen.length) {
const sr = el('div', 'stufenleiter stufenleiter--fein');
sr.setAttribute('role', 'group');
sr.setAttribute('aria-label', 'Stufe wählen');
const alle = el('button', 'stufenleiter__knopf');
alle.type = 'button';
alle.setAttribute('aria-pressed', String(kStufe === null));
alle.append(el('span', 'stufenleiter__name', 'Alle'));
alle.append(el('span', 'stufenleiter__zahl', String(inGruppe.length)));
alle.addEventListener('click', () => { kStufe = null; vorlagenbrettZeigen(); });
sr.append(alle);
for (const st of katalog.stufen) {
const n = inGruppe.filter((v) => v.stufe === st.schluessel).length;
if (!n) continue;
const k = el('button', 'stufenleiter__knopf');
k.type = 'button';
k.dataset.stufe = st.schluessel;
k.setAttribute('aria-pressed', String(kStufe === st.schluessel));
k.title = st.text || '';
k.append(el('span', 'stufenleiter__name', st.name));
k.append(el('span', 'stufenleiter__zahl', String(n)));
k.addEventListener('click', () => { kStufe = st.schluessel; vorlagenbrettZeigen(); });
sr.append(k);
}
koerper.append(sr);
const gewaehlt = katalog.stufen.find((x) => x.schluessel === kStufe);
if (gewaehlt?.text) {
koerper.append(el('p', 'vorlagenbrett__stand', gewaehlt.text));
}
}
/* Was schon auf dem Brett liegt -- aus den Aufgaben, die ohnehin
geladen sind. Verglichen wird die Kennung der Vorlage und nicht
der Titel: Der darf geändert werden. */
@@ -1349,7 +1402,8 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
const liste = katalog.aufgaben
.map((v, nr) => ({ ...v, nr }))
.filter((v) => v.gruppe === kGruppe);
.filter((v) => v.gruppe === kGruppe)
.filter((v) => !kStufe || v.stufe === kStufe);
const box = el('div', 'vorlagenbrett__liste');
for (const v of liste) {
const karte = el('div', 'vorlagenbrett__karte');
@@ -1382,17 +1436,23 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
const offen = liste.filter((v) => !schonDa.has(v.schluessel)).length;
koerper.append(el('p', 'vorlagenbrett__stand', offen
? `${offen} von ${liste.length} noch nicht übernommen.`
: `Alle ${liste.length} dieser Etappe sind übernommen.`));
: `Alle ${liste.length} davon sind übernommen.`));
}
koerper.append(box);
if (liste.length > 1) {
const alle = el('button', 'abmelden', `Alle ${liste.length} übernehmen`);
alle.title = 'Legt alle Aufgaben dieser Etappe an – auch die, die schon auf dem Brett liegen.';
alle.title = 'Legt alle Aufgaben an, die gerade in der Liste stehen – '
+ 'auch die, die schon auf dem Brett liegen.';
alle.type = 'button';
alle.style.marginTop = '12px';
/* DIE STUFE WANDERT MIT (16.09.2026). Ohne sie legte dieser Knopf
alle Aufgaben der Kategorie an -- auch die, die gerade
ausgeblendet sind. Der Knopf sagt "Alle 4 übernehmen" und
legte elf an; das merkt man erst auf dem Brett. */
alle.addEventListener('click', () => uebernehmen(alle,
{ art: 'katalog_alle', gruppe: kGruppe, person_id: katalogZiel() }));
{ art: 'katalog_alle', gruppe: kGruppe, stufe: kStufe || '',
person_id: katalogZiel() }));
koerper.append(alle);
}
}