Beim Verteilen sehen, wer schon wie viel hat

Weiter an derselben Sache: die Kategorien, aus denen Aufgaben an das
Team gehen.

ZWEI DINGE WAREN UNBEQUEM:

Die Person kam aus dem Formular GANZ OBEN auf der Seite. Man waehlt
sie dort, scrollt herunter zum Vorlagenbrett und drueckt "Uebernehmen"
-- und wer das nicht weiss, bekommt "Bitte zuerst eine Person waehlen"
und sucht, wo.

Und beim Vergeben sah man nicht, wer schon wie viel offen hat. Das ist
die wichtigere Haelfte: Zu wenig Zeit ist in den Untersuchungen zu
Moderatoren der meistgenannte Grund fuers Aufhoeren, und die Person,
die verteilt, ist die einzige, die das verhindern kann. Dafuer muss
die Zahl dort stehen, wo entschieden wird -- nicht auf einer
Auswertung, die man hinterher aufruft.

Jetzt steht ueber den Aufgaben eine Reihe mit den Namen des Teams und
der Zahl daneben. Ein Klick, und die uebernommenen Aufgaben gehen
dorthin; das Formular oben bleibt als Rueckfall, damit der bisherige
Weg weiter funktioniert.

KEINE SCHWELLE, KEINE WARNFARBE AUF DER ZAHL. Was "zu viel" ist, haengt
vom Menschen ab -- eine feste Grenze waere geraten, und geraten ist bei
dieser Frage schlimmer als nichts. Was NICHT geraten ist: dass etwas
ueberfaellig liegt. Nur das wird markiert, und zwar gedeckt. Ein
Warnton an einem Namen liest sich sonst wie ein Vorwurf gegen die
Person, dabei ist es eine Auskunft ueber die Verteilung.

Ohne eine einzige neue Abfrage: Die Personen und ihre Aufgaben liegen
im Browser ohnehin schon. Ein zweiter Abruf waere ein zweiter Weg, auf
dem eine andere Liste herauskommen kann.

  server/pruef-modi-katalog.mjs   45 Pruefungen (vorher 36), 0 Fehler

  Der neue Abschnitt meldet sich als DogFather an -- der bisherige
  Browserteil ist ein Modi, und der sieht diese Auswahl gar nicht. Er
  drueckt wirklich: Marina waehlen (9 offen), eine Aufgabe uebernehmen,
  nachsehen ob sie bei ihr liegt (9 -> 10). Ein Knopf, den niemand
  betaetigt hat, ist kein geprueter Knopf.

  Und er prueft die Gegenrichtung mit: Ein Creator und eine Managerin
  stehen NICHT zur Auswahl -- sie arbeiten im anderen Haus.

  pruef-aufgabenbrett, pruef-sicht, pruef-womit 41, pruef-css-klassen
  -- alle 0 Fehler

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-16 19:21:38 +02:00
co-authored by Claude Opus 5
parent 4802954263
commit 76fa8b95fc
33 changed files with 545 additions and 360 deletions
+16
View File
@@ -7620,6 +7620,22 @@ body.start .k-leiste .feldschild::after {
.stufenleiter--fein { margin: -6px 0 14px; }
.stufenleiter--fein .stufenleiter__knopf { padding: 5px 11px; font-size: .76rem; }
/* WER SCHON ETWAS LIEGEN HAT (16.09.2026).
Beim Vergeben einer Aufgabe steht neben jedem Namen, wie viel offen
ist. Die Zahl allein bekommt KEINE Farbe: Was "zu viel" ist, haengt
vom Menschen ab, und eine feste Grenze waere geraten.
Was nicht geraten ist: dass etwas ueberfaellig liegt. Nur das wird
markiert -- und zwar gedeckt, nicht grell. Ein Warnton an einem
Namen liest sich sonst wie ein Vorwurf gegen die Person, dabei ist
es eine Auskunft ueber die Verteilung. */
.stufenleiter__knopf[data-spaet="ja"] { --sf: #cc9451; }
.stufenleiter__spaet {
font-size: .72rem; color: #d8a76a;
font-variant-numeric: tabular-nums;
}
.stufenleiter__knopf:hover {
color: var(--text);
box-shadow:
+63 -1
View File
@@ -969,6 +969,11 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
$('b-feld-verant').hidden = false;
try {
const { personen } = await (await hole('/workspace/api/personen')).json();
/* AUCH ALS DATEN BEHALTEN, nicht nur als <option>. Das
Vorlagenbrett braucht sie unten noch einmal -- und sie ein
zweites Mal zu holen waere ein zweiter Weg, auf dem eine
andere Liste herauskommen kann. */
personenListe = personen;
for (const p of personen) {
for (const ziel of ['f-creator', 'f-verant', 'b-creator', 'b-verant']) {
const o = el('option', null, `${p.name} (${p.rolle})`);
@@ -1053,6 +1058,10 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
/* WELCHE STUFE. `null` heisst alle -- und das ist die Vorgabe:
Wer eine Kategorie aufmacht, will erst sehen, was es gibt. */
let kStufe = null;
/* An WEN die Aufgabe geht. `null` heisst: das Feld oben im Formular
entscheidet, so wie bisher. */
let kZiel = null;
let personenListe = [];
/* 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. */
@@ -1400,6 +1409,56 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
const schonDa = new Map();
for (const a of alleAufgaben) if (a.vorlage) schonDa.set(a.vorlage, a);
/* ---- AN WEN? Mit der Last daneben (16.09.2026) -------------------
Bis heute kam die Person aus dem Formular GANZ OBEN auf der
Seite: Man wählt sie dort, scrollt herunter und drückt hier
„Übernehmen". Wer das nicht weiß, bekommt „Bitte zuerst eine
Person wählen" und sucht.
UND DAS WICHTIGERE: Man sah beim Vergeben nicht, wer schon wie
viel hat. Zu wenig Zeit ist in den Untersuchungen zu
Moderatoren der meistgenannte Grund fürs Aufhören — und die
Person, die Aufgaben verteilt, ist die einzige, die das
verhindern kann. Dafür muss die Zahl dort stehen, wo entschieden
wird, nicht auf einer Auswertung, die man hinterher aufruft.
KEINE SCHWELLE, KEINE WARNFARBE. Was „zu viel" ist, hängt vom
Menschen ab; eine feste Grenze wäre geraten. Was NICHT geraten
ist: dass etwas überfällig liegt. Nur das wird markiert. */
const zielbar = personenListe.filter((p) => p.rolle === 'modi' || p.rolle === 'hand');
if (zielbar.length && $('feld-verant') && !$('feld-verant').hidden) {
koerper.append(el('p', 'feldschild', 'An wen'));
const wer = el('div', 'stufenleiter stufenleiter--fein');
wer.setAttribute('role', 'group');
wer.setAttribute('aria-label', 'Person wählen');
for (const p of zielbar) {
const seine = alleAufgaben.filter((a) => a.verantwortlich_id === p.id);
const offenN = seine.filter(istOffen).length;
const spaet = seine.filter(istFaellig).length;
const k = el('button', 'stufenleiter__knopf');
k.type = 'button';
if (spaet) k.dataset.spaet = 'ja';
k.setAttribute('aria-pressed', String(String(kZiel) === String(p.id)));
k.title = spaet
? `${p.name}: ${offenN} offen, davon ${spaet} überfällig`
: `${p.name}: ${offenN} offen`;
k.append(el('span', 'stufenleiter__name', p.name));
k.append(el('span', 'stufenleiter__zahl', String(offenN)));
if (spaet) k.append(el('span', 'stufenleiter__spaet', `${spaet} spät`));
k.addEventListener('click', () => {
kZiel = String(kZiel) === String(p.id) ? null : String(p.id);
vorlagenbrettZeigen();
});
wer.append(k);
}
koerper.append(wer);
const gewaehlt = zielbar.find((p) => String(p.id) === String(kZiel));
koerper.append(el('p', 'vorlagenbrett__stand', gewaehlt
? `Übernommene Aufgaben gehen an ${gewaehlt.name}.`
: 'Niemand gewählt – es gilt die Person aus dem Formular oben.'));
}
const liste = katalog.aufgaben
.map((v, nr) => ({ ...v, nr }))
.filter((v) => v.gruppe === kGruppe)
@@ -1462,7 +1521,10 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
Wer fuer andere eintragen darf, muss die Person oben ausgewaehlt
haben; sonst sagt der Server es. */
function katalogZiel() {
return $('f-verant')?.value || $('f-creator')?.value || null;
/* Die Auswahl im Vorlagenbrett geht vor -- sie steht dort, wo man
gerade hinsieht. Das Formular oben bleibt als Rueckfall, damit
der bisherige Weg weiter funktioniert. */
return kZiel || $('f-verant')?.value || $('f-creator')?.value || null;
}
/* Ein Weg fuer beide Knoepfe -- einzeln und alle. Zwei fast gleiche