Feat #16: Karten je Spalte begrenzen #17

Merged
florian.wilde merged 1 commits from feat/16-max-aufgaben-anzeigen into main 2026-08-18 21:27:06 +00:00
Owner

Ein Projekt mit vierzig offenen Aufgaben macht das Brett unbrauchbar: die Spalte läuft über die halbe Seite, und was darunter steht — Beschreibung, Notizen, Repository, Verlauf — rutscht aus dem Blick.

Was jetzt passiert

Eine Spalte zeigt höchstens n Karten, darunter steht „25 weitere anzeigen". Entfaltet wird je Spalte einzeln, der Knopf wechselt dann auf „weniger anzeigen". Die Zahl neben der Spaltenüberschrift nennt weiterhin den vollen Bestand — sonst wäre nicht zu erkennen, dass etwas fehlt.

Eingestellt wird das unter Admin-Einstellungen → Aufgabenbrett, global für alle Projekte, im Muster von autoSyncBatchSize und staleAfterDays. Voreinstellung 15, 0 schaltet die Begrenzung ab — dieselbe Lesart wie bei SESSION_IDLE_HOURS.

Beides war im Chat geklärt, weil die Alternativen zu ganz anderen Umsetzungen geführt hätten: ein Feld am Projekt hätte eine Migration am Project-Modell gekostet und eine Einstellung, die man vierzigmal pflegt; ein harter Schnitt hätte Aufgaben unerreichbar gemacht.

Der eigentliche Fallstrick

persist() schickt beim Umsortieren je Spalte die vollständige Liste an /tasks/reorder. Eine dort schon gekürzte Liste hätte beim ersten Ziehen die verborgenen 25 Aufgaben aus dem Brett gelöscht — lautlos, und erst beim nächsten Laden zu bemerken.

Deshalb bleibt der Zustand im Brett ganz; gekürzt wird erst beim Rendern der Spalte. Gegengeprobt nicht am Quelltext, sondern am echten PATCH-Rumpf nach einem Ziehen mit der Maus: { TODO: 40, DOING: 3, BLOCKED: 0, DONE: 22 } bei 15 sichtbaren Karten.

Im SortableContext stehen nur die sichtbaren Karten — was nicht im DOM ist, kann dnd-kit ohnehin nicht treffen.

Die Admin-Sektion zeigt die längste Spalte

Ohne diese Zahl steht die Einstellung im Leeren: eine Grenze von 15 sagt nichts, wenn die größte Spalte im Bestand aus drei Karten besteht. Daneben steht, ob die Einstellung gerade greift, noch nicht greift oder aus ist.

Migration

20260818230000_task_column_limit — eine Spalte an AppSettings, NOT NULL DEFAULT 15. Beim Ausrollen läuft prisma migrate deploy (in scripts/update.sh enthalten). Erzeugt über migrate diff --from-migrations gegen eine Schattendatenbank; der zweite Durchlauf meldet „empty migration", Schema und Migrationen stimmen also überein.

Geprüft

  • tsc sauber · 281 Unit-Tests (6 neue zu spaltenAnzeige, angehängt an die bestehenden) · npm run build durch
  • Angesehen an einem Brett mit 40 / 3 / 0 / 22 Aufgaben, gegen eine Wegwerf-Datenbank:
    • Grenze 15 → 15 sichtbar, Knöpfe „25 weitere" und „7 weitere", Zähler weiter 40 und 22
    • entfaltet → 40 Karten, aria-expanded wechselt, Beschriftung wechselt
    • Umstellung auf „ohne Begrenzung" → 40 Karten, kein Knopf mehr
    • Reorder-PATCH schickt die vollen Spalten
  • axe-core 0 Verstöße in vier Zuständen: Brett auf 1280 px und 375 px, Brett entfaltet, Admin-Seite. Kein seitlicher Überlauf.

Closes #16

Ein Projekt mit vierzig offenen Aufgaben macht das Brett unbrauchbar: die Spalte läuft über die halbe Seite, und was darunter steht — Beschreibung, Notizen, Repository, Verlauf — rutscht aus dem Blick. ## Was jetzt passiert Eine Spalte zeigt höchstens *n* Karten, darunter steht „**25 weitere anzeigen**". Entfaltet wird je Spalte einzeln, der Knopf wechselt dann auf „weniger anzeigen". Die Zahl neben der Spaltenüberschrift nennt weiterhin den **vollen** Bestand — sonst wäre nicht zu erkennen, dass etwas fehlt. Eingestellt wird das unter **Admin-Einstellungen → Aufgabenbrett**, global für alle Projekte, im Muster von `autoSyncBatchSize` und `staleAfterDays`. Voreinstellung 15, `0` schaltet die Begrenzung ab — dieselbe Lesart wie bei `SESSION_IDLE_HOURS`. Beides war im Chat geklärt, weil die Alternativen zu ganz anderen Umsetzungen geführt hätten: ein Feld am Projekt hätte eine Migration am `Project`-Modell gekostet und eine Einstellung, die man vierzigmal pflegt; ein harter Schnitt hätte Aufgaben unerreichbar gemacht. ## Der eigentliche Fallstrick `persist()` schickt beim Umsortieren **je Spalte die vollständige Liste** an `/tasks/reorder`. Eine dort schon gekürzte Liste hätte beim ersten Ziehen die verborgenen 25 Aufgaben aus dem Brett gelöscht — lautlos, und erst beim nächsten Laden zu bemerken. Deshalb bleibt der Zustand im Brett ganz; gekürzt wird erst beim Rendern der Spalte. Gegengeprobt nicht am Quelltext, sondern am echten `PATCH`-Rumpf nach einem Ziehen mit der Maus: `{ TODO: 40, DOING: 3, BLOCKED: 0, DONE: 22 }` bei 15 sichtbaren Karten. Im `SortableContext` stehen nur die sichtbaren Karten — was nicht im DOM ist, kann dnd-kit ohnehin nicht treffen. ## Die Admin-Sektion zeigt die längste Spalte Ohne diese Zahl steht die Einstellung im Leeren: eine Grenze von 15 sagt nichts, wenn die größte Spalte im Bestand aus drei Karten besteht. Daneben steht, ob die Einstellung gerade **greift**, **noch nicht** greift oder **aus** ist. ## Migration `20260818230000_task_column_limit` — eine Spalte an `AppSettings`, `NOT NULL DEFAULT 15`. Beim Ausrollen läuft `prisma migrate deploy` (in `scripts/update.sh` enthalten). Erzeugt über `migrate diff --from-migrations` gegen eine Schattendatenbank; der zweite Durchlauf meldet „empty migration", Schema und Migrationen stimmen also überein. ## Geprüft - `tsc` sauber · **281 Unit-Tests** (6 neue zu `spaltenAnzeige`, angehängt an die bestehenden) · `npm run build` durch - **Angesehen** an einem Brett mit 40 / 3 / 0 / 22 Aufgaben, gegen eine Wegwerf-Datenbank: - Grenze 15 → 15 sichtbar, Knöpfe „25 weitere" und „7 weitere", Zähler weiter 40 und 22 - entfaltet → 40 Karten, `aria-expanded` wechselt, Beschriftung wechselt - Umstellung auf „ohne Begrenzung" → 40 Karten, kein Knopf mehr - Reorder-`PATCH` schickt die vollen Spalten - **axe-core 0 Verstöße** in vier Zuständen: Brett auf 1280 px und 375 px, Brett entfaltet, Admin-Seite. Kein seitlicher Überlauf. Closes #16
florian.wilde added 1 commit 2026-08-18 21:20:40 +00:00
Ein Projekt mit vierzig offenen Aufgaben macht das Brett unbrauchbar: die
Spalte laeuft ueber die halbe Seite, und die Bloecke darunter - Notizen,
Repository, Verlauf - rutschen aus dem Blick.

Die Grenze steht in den Admin-Einstellungen und gilt fuer alle Projekte,
wie autoSyncBatchSize und staleAfterDays. Kein Feld am Projekt: das haette
eine Migration am Project-Modell gekostet und eine Einstellung, die man
vierzig Mal pflegt. 0 heisst "ohne Begrenzung", dieselbe Lesart wie bei
SESSION_IDLE_HOURS.

Begrenzt wird ausschliesslich die Anzeige. Das ist der Kern: persist()
schickt je Spalte die vollstaendige Liste an /tasks/reorder, und eine dort
schon gekuerzte Liste wuerde beim ersten Ziehen die verborgenen Aufgaben
aus dem Brett loeschen. Der Zustand im Brett bleibt deshalb ganz, gekuerzt
wird erst beim Rendern der Spalte. Gegengeprobt am echten PATCH-Rumpf:
40 IDs bei 15 sichtbaren Karten.

Die Zahl neben der Spaltenueberschrift nennt weiter den vollen Bestand.
Nur die sichtbaren Karten stehen im SortableContext - was nicht im DOM
ist, kann dnd-kit ohnehin nicht treffen.

Die Admin-Sektion zeigt neben der Einstellung die laengste Spalte im
Bestand. Ohne die steht die Zahl im Leeren: eine Grenze von 15 sagt
nichts, wenn die groesste Spalte aus drei Karten besteht.

Refs #16
florian.wilde merged commit d11dd9c4ac into main 2026-08-18 21:27:06 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/nebula#17