Womit anfangen? -- Stufe 9 ist damit vollstaendig

Letztes Stueck aus dem Plan zur Perfektion: "Wichtig-vs-Aufwand im
Report".

DIE FRAGE, DIE EINE AUFGABENLISTE NICHT BEANTWORTET

Ein Brett mit dreissig offenen Karten sagt, WAS zu tun ist. Es sagt
nicht, WOMIT man anfaengt. "Wichtig" allein hilft dabei nicht: Sind
acht Karten wichtig, ist keine davon die erste.

Die zweite Angabe, die dafuer fehlte, ist der AUFWAND -- eine Spalte,
mehr nicht. "Wichtig" gibt es schon, das ist die Prioritaet; es wird
kein zweites Feld dafuer erfunden.

VIER FELDER, UND JEDES SAGT, WAS ZU TUN IST

  wichtig + klein   SOFORT      in einer halben Stunde erledigt, und es zaehlt
  wichtig + gross   EINPLANEN   braucht einen Termin, keinen guten Willen
  normal  + klein   NEBENBEI    wenn zwischendurch Luft ist
  normal  + gross   SPAETER     ehrlich: das wird gerade nichts

Die Namen sind Handlungsanweisungen, keine Etiketten. "Quadrant 2" sagt
niemandem, was er tun soll.

OHNE SCHAETZUNG VERSCHWINDET NICHTS

Der Aufwand ist freiwillig -- und laesst sich zuruecknehmen. Aufgaben
ohne Schaetzung landen deshalb nicht stillschweigend irgendwo, sondern
in einer eigenen, klar benannten Gruppe: "noch nicht eingeschaetzt".
Eine Uebersicht, die einen Teil der Arbeit unsichtbar macht, ist
schlimmer als keine -- man verlaesst sich darauf und uebersieht genau
das, was fehlt. Die Pruefung zaehlt deshalb nach, dass die Summe der
Felder die Summe der offenen Aufgaben ist.

DREI STUFEN, NICHT FUENF. Fuenf klingen genauer und sind es nicht:
Niemand unterscheidet verlaesslich zwischen "eher mittel" und "eher
gross". Drei kann man ohne Nachdenken vergeben, und nur was ohne
Nachdenken geht, wird auch gepflegt.

KEINE CHECK-LISTE IN DER DATENBANK. Die erlaubten Werte stehen in
workspace-womit.js; eine CHECK-Liste daneben waere eine zweite
Wahrheit, die beim naechsten Wert ueber einen Tabellenneubau
nachgezogen werden muesste -- und dabei sind im Projekt schon dreimal
Spalten verlorengegangen. Geprueft wird beim Schreiben, an der Stelle,
die die Liste kennt. Die Oberflaeche baut ihre Auswahl ebenfalls aus
dieser Liste, statt drei <option>-Zeilen zu fuehren.

PRUEFUNGEN: pruef-womit neu mit 41, davon 10 im Browser. Darunter die
Zeile, die zaehlt: nichts verschwindet.

STUFE 9 IST DAMIT DURCH: Idee -> Aufgabe, Dateifassungen, Anhaenge an
Aufgaben, Eskalationsstufe, Wichtig-vs-Aufwand.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-15 13:29:39 +02:00
co-authored by Claude Opus 5
parent 2d5972f45f
commit 2712473f16
37 changed files with 982 additions and 348 deletions
+44
View File
@@ -284,3 +284,47 @@
}
/* Ohne Trend soll die zweite Zeile keinen Platz belegen. */
.block .kachel:not(:has(.trend)) { row-gap: 0; }
/* =====================================================================
WOMIT ANFANGEN? (15.09.2026)
Vier Felder plus das fuenfte fuer alles ohne Schaetzung. Die
Reihenfolge ist die Aussage: "Sofort" steht oben links, "Spaeter"
unten. Wer von links oben nach rechts unten liest, liest die
Rangfolge.
Die Kante links sagt die Dringlichkeit -- aber der NAME sagt sie
auch. Farbe allein waere hier besonders schlecht: Es geht um eine
Entscheidung, nicht um eine Stimmung.
===================================================================== */
.womit {
display: grid; gap: 12px;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}
.womit__feld {
padding: 14px 16px;
background: color-mix(in srgb, var(--tinte) 94%, #ffffff 6%);
border: 1px solid var(--rand);
border-left: 3px solid var(--rand-hell);
}
.womit__feld[data-feld="sofort"] { border-left-color: #6f9e77; }
.womit__feld[data-feld="einplanen"] { border-left-color: #8ec9ff; }
.womit__feld[data-feld="nebenbei"] { border-left-color: var(--rand-hell); }
.womit__feld[data-feld="spaeter"] { border-left-color: var(--rand); }
.womit__feld[data-feld="offen"] { border-left-style: dashed; }
.womit__kopf { display: flex; align-items: baseline; gap: 10px; }
.womit__name { margin: 0; font-size: 1rem; font-weight: 660; color: var(--text); }
.womit__zahl {
margin-left: auto; font-size: 1.15rem; font-weight: 700;
color: var(--text-leise); font-variant-numeric: tabular-nums;
}
.womit__satz {
margin: 5px 0 10px; font-size: .82rem; line-height: 1.55; color: var(--text-still);
}
.womit__liste { margin: 0; padding: 0 0 0 16px; display: grid; gap: 4px; }
.womit__eintrag { font-size: .84rem; }
.womit__eintrag a { color: var(--text-leise); text-decoration: none; }
.womit__eintrag a:hover { color: var(--text); text-decoration: underline; }
.womit__mehr { margin: 8px 0 0; font-size: .78rem; color: var(--text-still); }
+42
View File
@@ -773,12 +773,20 @@
if (!zeigen && $(`${praefix}-kategorie`)) $(`${praefix}-kategorie`).value = '';
}
/* Die Aufwandsstufen kommen mit der Aufgabenliste. Hier
weitergereicht, damit die Auswahl im Dialog dieselbe Liste zeigt,
die der Server annimmt. */
function aufwandUebernehmen(daten) {
window.aufwandStufenSetzen?.(daten?.aufwand);
}
async function laden() {
try {
const antwort = await hole('/workspace/api/aufgaben');
if (!antwort.ok) { melde('Aufgaben konnten nicht geladen werden.'); return; }
const daten = await antwort.json();
alleAufgaben = daten.aufgaben || [];
aufwandUebernehmen(daten);
kategorien = daten.kategorien || [];
/* `null` muss `null` BLEIBEN -- ein `|| []` daraus zu machen waere
der stille Fehler: Aus "gilt immer" wuerde "gilt nie", und das
@@ -865,6 +873,7 @@
}
kategorieFeldZeigen('b');
if ($('b-kategorie')) $('b-kategorie').value = a.kategorie || '';
if ($('b-aufwand')) $('b-aufwand').value = a.aufwand || '';
window.anhaengeLaden?.(a.id);
dialog.showModal();
$('b-titel').focus();
@@ -880,6 +889,7 @@
$('b-speichern').addEventListener('click', async () => {
const daten = {
aufwand: $('b-aufwand') ? $('b-aufwand').value : undefined,
titel: $('b-titel').value,
beschreibung: $('b-text').value,
prioritaet: $('b-prio').value,
@@ -1510,3 +1520,35 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe
}
});
})();
/* =====================================================================
DIE AUFWANDSSTUFEN KOMMEN VOM SERVER (15.09.2026)
Die Auswahl wird aus der Liste gebaut, die mit den Aufgaben kommt --
nicht aus drei <option>-Zeilen im HTML. Eine zweite Liste im Browser
waere die, die beim naechsten Wert veraltet; genau dieser Fehler ist
im Projekt schon bei den Rollen und bei den Brettern passiert.
===================================================================== */
(() => {
const feld = document.getElementById('b-aufwand');
if (!feld) return;
window.aufwandStufenSetzen = function (stufen) {
if (!Array.isArray(stufen) || !stufen.length) return;
/* Der gewaehlte Wert muss den Neuaufbau ueberleben -- sonst steht
im Dialog etwas anderes als in der Aufgabe. */
const vorher = feld.value;
feld.textContent = '';
const leer = document.createElement('option');
leer.value = '';
leer.textContent = 'noch nicht eingeschätzt';
feld.append(leer);
for (const s of stufen) {
const o = document.createElement('option');
o.value = s.schluessel;
o.textContent = s.etwa ? s.name + ' · ' + s.etwa : s.name;
feld.append(o);
}
feld.value = vorher;
};
})();
+46
View File
@@ -143,6 +143,52 @@
{ ziel: 'dateien.html?zeigen=frei' }));
ziel.append(block('Was wurde erledigt?', null, k1));
/* ---- WOMIT ANFANGEN? (15.09.2026, Stufe 9) ---------------------
Ein Brett mit dreissig offenen Karten sagt, WAS zu tun ist. Es
sagt nicht, WOMIT man anfaengt -- "wichtig" allein hilft dabei
nicht: Wenn acht Karten wichtig sind, ist keine davon die erste.
Die Verteilung kommt fertig vom Server. Der Browser rechnet hier
nichts nach; eine zweite Rechnung waere die, die irgendwann
anders antwortet als das Brett.
DIE GRUPPE "noch nicht eingeschaetzt" STEHT MIT DA, auch wenn sie
gross ist. Eine Uebersicht, die einen Teil der Arbeit unsichtbar
macht, ist schlimmer als keine -- man verlaesst sich darauf und
uebersieht genau das, was fehlt. */
if (Array.isArray(d.womit) && d.womit.some((f) => f.anzahl > 0)) {
const w = el('div', 'womit');
for (const f of d.womit) {
if (!f.anzahl) continue;
const k = el('section', 'womit__feld');
k.dataset.feld = f.schluessel;
const kopf = el('div', 'womit__kopf');
kopf.append(el('h3', 'womit__name', f.name));
kopf.append(el('span', 'womit__zahl', String(f.anzahl)));
k.append(kopf);
k.append(el('p', 'womit__satz', f.satz));
const liste = el('ul', 'womit__liste');
for (const a of f.aufgaben || []) {
const z = el('li', 'womit__eintrag');
const v = el('a', null, a.titel);
v.href = 'aufgaben.html#a' + a.id;
z.append(v);
liste.append(z);
}
k.append(liste);
if (f.gekuerzt) {
k.append(el('p', 'womit__mehr',
'und ' + (f.anzahl - (f.aufgaben || []).length) + ' weitere'));
}
w.append(k);
}
ziel.append(block('Womit anfangen?',
'Wichtig und Aufwand nebeneinander – daraus fällt die Entscheidung von selbst.', w));
}
/* Was blockiert? */
const k2 = el('div', 'kacheln');
k2.append(kachel(d.aufgaben.offen, 'Aufgaben offen',