Aufgaben: dauerhafte Aufgaben, die nicht abgehakt werden

VanVan im Support: „Man kann bei den Aufgaben, wenn man sie verteilt,
ob selbst erstellt oder über die Vorlage noch nicht festlegen, dass
die Aufgabe dauerhaft sein soll und somit nicht vom Modi in den Status
erledigt gesetzt werden kann."

Nachgesehen: Das Wort kam im Aufgabenmodul kein einziges Mal vor. Es
war keine vergessene Zeile, es fehlte ganz.

WAS EINE DAUERHAFTE AUFGABE IST: keine, die man abarbeitet, sondern
eine, die man TUT. „Neue begruessen" ist nicht fertig, wenn man es
einmal gemacht hat.

ZWEI FOLGEN, und die zweite faellt leicht durchs Raster

1. Der Zugeteilte kann sie nicht auf „erledigt" setzen. Die Sperre
   steht im SERVER -- ein fehlender Knopf ist eine Bitte, abgelehnt
   wird an der Route. „Ich fange an" bleibt erlaubt: Auch eine
   stehende Aufgabe hat einen Anfang.

2. SIE HAT KEINE FRIST. Eine dauerhafte Aufgabe mit Frist waere ab
   dem naechsten Tag fuer immer ueberfaellig -- und eine Warnung, die
   immer kommt, ist keine mehr. Die Frist wird GELOESCHT, nicht
   ignoriert: Ein Datum, das dasteht und nicht gilt, ist schlimmer
   als keins.

WER DARF DAS SETZEN: nur, wer verteilt. Koennte der Zugeteilte seine
eigene Aufgabe dauerhaft machen, waere das eine Ausrede; koennte er
es zuruecknehmen, waere die Sperre ein Knopf weiter offen. Beides
nachgemessen.

UND SIE LAESST SICH BEENDEN. Eine Pflicht, die niemand mehr beenden
kann, waere eine Falle statt einer Regel.

DREI STELLEN, KEINE VIERTE: das Anlegeformular auf „Aufgaben", das
auf „Eure Aufgaben" (dort wird verteilt) und das Bearbeiten-Feld.
Ueber das letzte laeuft VanVans „oder ueber die Vorlage" -- eine
Vorlagen-Aufgabe entsteht ohne Formular, ein Schalter im
Vorlagenbrett waere eine vierte Stelle fuer dieselbe Frage.

An der Karte steht die Marke fuer ALLE, nicht nur fuer den
Zugeteilten: Wer sie ansieht, soll wissen, warum dort kein „Fertig"
steht. Ein fehlender Knopf ohne Erklaerung liest sich wie ein Fehler.

GEPRUEFT
pruef-bewerbung-aufgaben 154/0 (10 neue) mit vier Gegenproben: eine
GEWOEHNLICHE Aufgabe laesst sich sehr wohl abhaken (sonst hiesse 409
nur, dass niemand je etwas abhaken kann), „Ich fange an" geht
weiterhin, der Zugeteilte setzt und nimmt „dauerhaft" nicht, und nach
dem Beenden durch die Leitung geht das Abhaken wieder.

ZWEI EIGENE FEHLER, beide von Pruefungen gefunden

* Ein BACKTICK in einem Kommentar -- mitten in einem Template-String
  (`SPALTEN`). Er hat ihn beendet, die Datei war syntaktisch kaputt.
  Dieselbe Familie wie die deutsche Anfuehrung in einem
  Anfuehrungsstring: ein Zeichen, das in der Umgebung etwas bedeutet.
* `toISOString().slice(0,10)` fuer „morgen" -- pruef-struktur hat es
  noch am selben Abend gefunden. Zwischen 00:00 und 02:00 liegt der
  UTC-Tag noch auf gestern; die Pruefung haette nachts falsch
  angeschlagen. Jetzt ueber `tagLokal()`.

Und einer, den nur die Messung zeigen konnte: `holen()` in
workspace-zuteilung liest die Aufgabe mit einer eigenen, kurzen
Spaltenliste. Ohne `dauerhaft` darin fragte die Sperre `a.dauerhaft`
und bekam `undefined` -- sie war still wirkungslos, und im Quelltext
daneben sah alles richtig aus.

pruef-aufgabenbrett, pruef-zuteilung, pruef-aufgaben-vorlagen,
pruef-entwicklung 79/0, pruef-css-klassen, pruef-deutsche-texte,
pruef-struktur, pruef-zwischenspeicher 34/0.

Schemaaenderung: ADD COLUMN dauerhaft. Datenbank vorher gesichert und
geprueft (integrity_check ok, 12 Aufgaben).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-30 18:52:37 +02:00
co-authored by Claude Opus 5
parent 5e26df788b
commit d4a3e54a72
54 changed files with 1026 additions and 674 deletions
+48
View File
@@ -2156,3 +2156,51 @@
font-size: .8rem; line-height: 1.5;
color: var(--text-leise);
}
/* =====================================================================
DAUERHAFTE AUFGABEN (30.09.2026)
VanVan im Support: „… dass die Aufgabe dauerhaft sein soll und somit
nicht vom Modi in den Status erledigt gesetzt werden kann."
===================================================================== */
/* Der Schalter im Formular. Ein Kästchen mit Satz daneben und nicht
nur ein Häkchen: „Dauerhaft" allein lässt offen, was daraus folgt --
und die Folge ist der ganze Zweck. */
.dauerhaft-schalter {
display: flex; align-items: flex-start; gap: 9px;
/* 40 px hoch wie alles, was ein Daumen trifft. */
min-height: 40px;
padding: 8px 0;
cursor: pointer;
font-size: .86rem; line-height: 1.45;
color: var(--text-still);
}
.dauerhaft-schalter input {
flex: none;
/* 20 px und nicht kleiner: Ein Kästchen, das man dreimal antippt,
bis es sitzt, ist kein Kästchen. */
width: 20px; height: 20px;
margin: 1px 0 0;
accent-color: var(--akzent);
}
.dauerhaft-schalter:hover { color: var(--text); }
/* Die Marke an der Karte. Sie steht für ALLE da, nicht nur für den
Zugeteilten: Wer die Karte ansieht, soll wissen, warum dort kein
„Fertig" steht. Ein fehlender Knopf ohne Erklärung liest sich wie
ein Fehler.
KEIN ALARMTON. Eine dauerhafte Aufgabe ist nichts Schlimmes, sie
ist eine Gewohnheit -- gedeckter Akzent, kein Rot, kein Bernstein
(der heißt im Haus „liegt an"). */
.z-karte__zeile--dauer {
display: flex; align-items: baseline; gap: 8px;
color: var(--text-still);
}
.z-karte__zeile--dauer::before {
content: "∞";
flex: none;
font-size: 1rem; line-height: 1;
color: color-mix(in srgb, var(--akzent) 72%, transparent);
}
+20
View File
@@ -370,6 +370,14 @@
/* WER VERTEILT, DARF AUCH SEHEN, WOHIN (21.09.2026). Dieselbe
Frage wie bei den Feldern, also dieselbe Antwort -- und nicht
eine Rollenmenge, die daneben altert. */
/* DER SCHALTER „DAUERHAFT" NUR FUER DIE, DIE VERTEILEN
(30.09.2026). Ein Modi legt sich Aufgaben selbst an -- eine,
die er danach nicht mehr abhaken kann, waere eine Falle, die er
sich selbst stellt. Die Schranke sitzt im Server; das hier ist
die Hoeflichkeit davor. */
var dfeld = document.getElementById('feld-dauerhaft');
if (dfeld) dfeld.hidden = !(ich.darf_verteilen ?? LEITUNG.has(ich.rolle));
if ((ich.darf_verteilen ?? LEITUNG.has(ich.rolle))
&& a.creator_name && a.creator_name !== a.verantwortlich_name) {
zeile.append(el('span', null, '· Bereich ' + a.creator_name));
@@ -1669,6 +1677,10 @@
beschreibung: $('f-text').value,
prioritaet: $('f-prio').value,
frist: $('f-frist').value,
/* DAUERHAFT (30.09.2026). Der Server nimmt es nur an, wenn die
Person verteilen darf -- steht das Feld gar nicht da, ist es
`false`, und das ist die richtige Vorgabe. */
dauerhaft: !!$('f-dauerhaft')?.checked,
};
/* DER SERVER SAGT ES (20.09.2026). Hier stand `LEITUNG.has(ich.rolle)`
-- eine zweite Fassung der Regel im Browser. Seit die rechte Hand
@@ -1726,6 +1738,13 @@
$('b-text').value = a.beschreibung || '';
$('b-prio').value = a.prioritaet;
$('b-frist').value = a.frist || '';
/* DAUERHAFT (30.09.2026) -- fuellen und nur denen zeigen, die
verteilen duerfen. Der Server nimmt es ohnehin nur von ihnen
an; das hier ist die Hoeflichkeit davor. */
var bd = document.getElementById('b-dauerhaft');
var bdFeld = document.getElementById('b-feld-dauerhaft');
if (bd) bd.checked = !!a.dauerhaft;
if (bdFeld) bdFeld.hidden = !(ich.darf_verteilen ?? LEITUNG.has(ich.rolle));
$('b-fehler').textContent = '';
/* AUCH HIER DER SERVER (21.09.2026). Stand `LEITUNG.has(ich.rolle)`.
Fuer die rechte Hand blieben die Felder beim BEARBEITEN leer --
@@ -1773,6 +1792,7 @@
beschreibung: $('b-text').value,
prioritaet: $('b-prio').value,
frist: $('b-frist').value,
dauerhaft: !!document.getElementById('b-dauerhaft')?.checked,
};
/* DIE GEFAEHRLICHSTE DER VIER STELLEN (berichtigt 21.09.2026).
+4
View File
@@ -980,6 +980,10 @@
titel,
beschreibung: $('e-text').value.trim() || null,
frist: $('e-frist').value || null,
/* DAUERHAFT (30.09.2026) -- siehe workspace-aufgaben.js.
Der Server nimmt es nur von denen an, die verteilen
duerfen, und loescht dann die Frist. */
dauerhaft: !!$('e-dauerhaft')?.checked,
/* DIE GEWAEHLTE PERSON STEHT VORN. `zuteilen` leitet die
Art ab; bei einer Person wird daraus „einzeln", und
genau das ist gemeint. */
+10 -1
View File
@@ -469,7 +469,16 @@
+ 'Feld, dann passt das Format von allein.',
fenster_verkehrt:
'Das Ende liegt vor dem Anfang. Dreh die beiden Daten um — oder '
+ 'lass eins davon leer, wenn es nur nach einer Seite begrenzt ist.'
+ 'lass eins davon leer, wenn es nur nach einer Seite begrenzt ist.',
/* ---- Dauerhafte Aufgaben (30.09.2026) ----------------------
Der Satz sagt, WARUM es nicht geht, und WER es beenden kann.
„Geht nicht" allein laesst einen an der eigenen Bedienung
zweifeln. */
dauerhafte_aufgabe:
'Das ist eine dauerhafte Aufgabe — sie wird nicht fertig, sie '
+ 'gehört dazu. Wenn sie nicht mehr gelten soll, kann DogFather '
+ 'oder die rechte Hand sie beenden.'
};
/* Sieht das wie eine Maschinenkennung aus?
+24
View File
@@ -360,6 +360,25 @@
});
}
/* ==== EINE DAUERHAFTE AUFGABE WIRD NICHT FERTIG (30.09.2026) ==
VanVan im Support: „… dass die Aufgabe dauerhaft sein soll und
somit nicht vom Modi in den Status erledigt gesetzt werden
kann."
Sie ist keine Aufgabe, die man abarbeitet, sondern eine, die man
TUT. „Neue begrüßen" ist nicht fertig, wenn man es einmal
gemacht hat.
DIE MARKE STEHT FÜR ALLE DA, nicht nur für den Zugeteilten: Wer
die Karte ansieht, soll wissen, warum dort kein „Fertig" steht.
Ein fehlender Knopf ohne Erklärung liest sich wie ein Fehler. */
if (a.dauerhaft) {
var dauer = el('p', 'z-karte__zeile z-karte__zeile--dauer',
'Dauerhafte Aufgabe — sie wird nicht abgehakt, sie gehört dazu.');
kasten.append(dauer);
}
if (mein && (mein.zustand === 'angenommen' || mein.zustand === 'arbeit')) {
if (mein.zustand === 'angenommen') {
knopf('Ich fange an', '', async function (b) {
@@ -371,6 +390,11 @@
sagen(meldung, window.sagWas ? window.sagWas(r.json.fehler) : 'Hat nicht geklappt.', false);
});
}
/* KEIN „FERTIG" BEI EINER DAUERHAFTEN AUFGABE. Der Server
lehnt es ohnehin ab (`dauerhafte_aufgabe`) -- ein Knopf, der
eine Absage holt, ist schlimmer als keiner. Die Zeile
darüber sagt, warum er fehlt. */
if (!a.dauerhaft)
knopf('Fertig', 'knopf--klar', async function (b) {
b.disabled = true;
var r = await schicken('/workspace/api/aufgaben/' + a.id + '/mein-stand',