- TriplePane component with two resizable dividers, localStorage persistence, mobile tabs
- SprintBoardClient replaces SprintBacklogClient + PlanningRightClient
- Left panel: Product Backlog (PBIs with stories to add to sprint)
- Middle panel: Sprint Backlog (stories in sprint, click to select, sortable)
- Right panel: TaskList for selected story
- /sprint/planning redirects to /sprint
- Remove PlanningLeft, PlanningRightClient, SprintBacklogClient
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Stap 11 toegevoegd voor de todo-tabel (aanmaken, bewerken, bulk-archiveren,
product-filter, rolweergave in navbar). Resultaatblok uitgebreid met
npm test en curl-test verificatie.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
De drie zware split-pane routes hadden al loading.tsx; dashboard,
settings en todos kregen elk een passende animate-pulse skeleton.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Haalt rollen op in AppLayout en geeft ze door aan NavBar.
NavBar toont afkortingen (PO · SM · Dev) rechts van de navigatie.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Aanmaken (+ knop): product-dropdown erft huidige filter, autoFocus op titel
- Bewerken (rij-klik): laadt todo in kaart; velden: product, titel, done-toggle
- Promoveren: → PBI en → Story knoppen openen bestaande dialogs
- key op TodoCard dwingt remount bij ander geselecteerde rij zodat
defaultValue-velden altijd de juiste todo tonen
- SaveButton via useFormStatus voor pending-state op submit
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- @tanstack/react-table voor kolommen, paginering en rij-selectie
- Kolommen: multi-select checkbox, titel (line-clamp-2), productnaam-badge, datum
- Toolbar: product-filter dropdown, bulk-archiveer knop (telt selectie), + knop
- Paginering: 10 rijen per pagina met paginatelling (x–y van n)
- Rij-klik opent detail-kaart (placeholder; volgt in ST-510)
- Promote dialogs behouden voor gebruik in ST-510
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
Voegt ST-509 (Data Table met TanStack, filter, paginering) en ST-510
(detail-kaart voor aanmaken/bewerken/promoveren) toe aan de backlog.
ST-501–505 gemarkeerd als vervangen door het nieuwe ontwerp.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
De product-dropdown fungeert nu als filter voor de lijst:
- 'Alles' (default) toont alle todo's
- 'Geen product' toont alleen ongelinkte todo's
- Een specifiek product toont alleen todo's van dat product
Nieuw aangemaakte todo's krijgen het geselecteerde product mee.
'Alles' en 'Geen product' resulteren in een todo zonder productlink.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace form.reset() with a titleRef so successful submission clears
the title input while leaving the selected product unchanged.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Product select is no longer required; 'Geen product' is the default
- Input and submit button are no longer disabled for users with no products
- Form resets only on success (useEffect on state.success) instead of
resetting on every submit including failures
- Inline error from server action is now displayed below the form
- Removed 'Maak eerst een product aan' message that blocked the form
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use productAccessFilter so users who are product members (not just
owners) see those products in the todo form and promote dialogs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- createTodoAction: productId is now optional; validates with
productAccessFilter when provided so team members can link todos
- promoteTodoToPbiAction: use productAccessFilter for product lookup;
remove product_id from todo WHERE (was breaking unlinked todos)
- promoteTodoToStoryAction: only enforce product match when todo has
a product_id (null means unlinked, any product is acceptable)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Todos can now exist without a product link. Changed relation from
Cascade to SetNull so deleting a product doesn't delete unlinked todos.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Node.js 20 actions are deprecated and will be forced to Node.js 24
from June 2026. Bumps node-version to '24' across all three jobs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Aligns schema with the API and server action, both of which already
require product_id. Changes onDelete from SetNull to Cascade — deleting
a product now also removes its todos.
Run: npx prisma db push
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes TC-TD-09 (product_id required → 400 not 201), TC-NS-08
(check_one_of for 200/404), TC-RO-10 (use TASK_ID directly to avoid
cross-story scope violation). Adds DEMO_TOKEN support for 403 tests
on all 4 write endpoints. Adds check_one_of helper and shorthand
request functions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds 401, 403 demo-block, and cross-user isolation tests for:
GET /api/products/:id/next-story, GET /api/sprints/:id/tasks,
PATCH /api/stories/:id/tasks/reorder, POST /api/stories/:id/log,
POST /api/todos. Expands prisma mock to cover all required models.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vervang productAccessFilter in de WHERE clause door een expliciete
toegangscheck na het ophalen. findFirst haalt de taak op met product
en members (gefilterd op auth.userId); daarna wordt eigenaarschap of
teamlidmaatschap gecontroleerd en 403 teruggegeven bij geen toegang.
Dit herstelt het onderscheid 404 (taak bestaat niet) vs 403 (taak
bestaat maar geen toegang), zoals de beveiligingstest verwacht.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>