docs(ST-509/510): verfijn plan — multi-select bulk-archiveer + promote in kaart

ST-509: selectie-checkbox voor bulk-archivering (archiveSelectedTodosAction),
aparte rij-klik voor detail-kaart, paginatelling toegevoegd.
ST-510: done-toggle in kaart, promote-knoppen in kaart (→ PBI / → Story),
updateTodoAction dekt title + product_id + done.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-04-25 19:45:19 +02:00
parent e156ff1c61
commit fbd56aa934

View file

@ -273,21 +273,28 @@ De MVP is klaar wanneer Lars — de primaire persona — de volledige cyclus kan
- [ ] **ST-509** Todo Data Table
- Installeer `@tanstack/react-table`; voeg shadcn `data-table`-patroon toe
- Kolommen: afvink-checkbox (inline toggle via `toggleTodoAction`), titel (max 2 regels, text-ellipsis), productnaam-badge, aanmaakdatum
- Toolbar boven de tabel: product-filter dropdown (Alles / Geen product / per product), "Archiveer afgerond"-knop (actief als er afgevinkte todos zijn)
- Paginering: max 10 rijen per pagina; vorige/volgende knoppen; paginatelling
- Rij-selectie: één rij tegelijk; geselecteerde rij visueel gemarkeerd; klik op geselecteerde rij deselecteert
- Lege staat: "Geen todo's voor deze selectie." als filter geen resultaten geeft; "Nog geen todo's. Maak er een aan hieronder." als de lijst helemaal leeg is
- Done when: tabel toont alle actieve todos; paginering werkt; filter werkt; afvinken persistent na herlaad; archiveer-knop verbergt afgevinkte todos
- **Kolommen:**
- Selectie-checkbox (kolom 1): multi-select voor bulk-archivering; header-checkbox selecteert/deselecteert alle zichtbare rijen
- Titel (kolom 2): max 2 regels, `line-clamp-2 truncate`; afgevinkte todos doorgestreept; klik op rij (buiten checkbox) opent detail-kaart
- Productnaam-badge (kolom 3)
- Aanmaakdatum (kolom 4)
- **Toolbar boven de tabel:**
- Product-filter dropdown (Alles / Geen product / per product)
- "+" knop: opent lege detail-kaart voor nieuw aanmaken (erft geselecteerd filter-product)
- "Archiveer geselecteerde (N)" knop: actief zodra ≥ 1 checkbox aangevinkt; roept `archiveSelectedTodosAction` aan met de geselecteerde IDs; resettet selectie na afloop
- **Paginering:** max 10 rijen per pagina; vorige/volgende knoppen; paginatelling ("110 van 23")
- **Lege staat:** "Geen todo's voor deze selectie." bij lege filter; "Nog geen todo's. Gebruik + om er een aan te maken." bij volledig lege lijst
- **`archiveSelectedTodosAction`** toevoegen aan `actions/todos.ts`: valideert dat alle meegegeven IDs bij de ingelogde gebruiker horen vóór schrijven; `archiveMany` via `updateMany`
- Done when: tabel toont alle actieve todos; paginering werkt; product-filter werkt; selectie-checkbox selecteert meerdere rijen; bulk-archiveren verwijdert geselecteerde rijen uit de weergave
- [ ] **ST-510** Todo detail-kaart
- Kaart onder de tabel; altijd zichtbaar
- **Aanmaken:** "+" knop in toolbar; kaart toont leeg formulier met product-dropdown (erft geselecteerd filter-product, of "Geen product" als filter op "Alles" staat), titel-invoer; opslaan via `createTodoAction`; na opslaan: kaart leegmaken, tabel ververst
- **Bewerken:** klik op tabelrij laadt todo in kaart; velden: product-dropdown, titel, done-toggle; opslaan via nieuwe `updateTodoAction` (title + product_id); annuleren deselecteert rij en leegt kaart
- **Promoveren:** twee knoppen in de kaart — "→ PBI" en "→ Story"; openen de bestaande `PromotePbiDialog` en `PromoteStoryDialog`; alleen zichtbaar als een bestaande todo geselecteerd is
- **Demo-modus:** kaart-invoer uitgeschakeld; promote-knoppen verborgen
- `updateTodoAction` toevoegen aan `actions/todos.ts`: valideert eigenaarschap, past title en/of product_id aan, `revalidatePath('/todos')`
- Done when: aanmaken via kaart persisteert; bewerken van titel en product werkt; promote vanuit kaart opent juist dialoog; kaart leeg bij geen selectie; demo-gebruiker ziet uitgeschakelde kaart
- Kaart onder de tabel; altijd zichtbaar (leeg als geen todo geselecteerd of aangemaakt wordt)
- **Aanmaken:** "+" in toolbar zet kaart in aanmaak-modus; velden: product-dropdown (erft filter-product, of "Geen product" bij "Alles"), titel; opslaan via `createTodoAction`; na opslaan kaart leegmaken en tabel ververst
- **Bewerken:** klik op tabelrij (buiten checkbox) laadt todo in kaart; velden: product-dropdown, titel, done-toggle; opslaan via nieuwe `updateTodoAction` (title + product_id + done); annuleren deselecteert rij en leegt kaart
- **Promoveren:** knoppen "→ PBI" en "→ Story" in de kaart; openen de bestaande `PromotePbiDialog` en `PromoteStoryDialog`; alleen zichtbaar bij een bestaande geselecteerde todo
- **Demo-modus:** kaart-invoervelden uitgeschakeld; knoppen verborgen of disabled
- **`updateTodoAction`** toevoegen aan `actions/todos.ts`: valideert eigenaarschap; past `title`, `product_id` en/of `done` aan; `revalidatePath('/todos')`
- Done when: aanmaken via kaart persisteert; bewerken van titel, product en done-status werkt; promote vanuit kaart opent juist dialoog en verwijdert todo na bevestiging; kaart leeg bij geen selectie; demo-gebruiker ziet uitgeschakelde kaart
- [ ] **ST-506** Rolbeheer in instellingen
- `/settings` pagina met roltoewijzing (checkbox per rol: Product Owner, Scrum Master, Developer); minimaal één rol verplicht; `updateRoles` Server Action; geselecteerde rollen zichtbaar in profielbalk