Janpeter Visser
71319e629d
feat(PBI-71): UX-fix 'lege sprint' + sprint-switch data-refresh ( #175 )
...
- StartSprintButton dialog toont 3-state banner: info met accurate vrije-
stories count + PBI-context, of waarschuwing als geen PBI geselecteerd
is, of waarschuwing als de geselecteerde PBI 0 vrije stories heeft
- Voeg sprint_id toe aan BacklogStory/Story/SprintStory + select in PB-
pagina's en sprint-board mappings, zodat de banner accuraat kan tellen
- createSprintAction: revalidatePath met 'layout' flag voor consistency
met createSprintWithPbisAction (top-nav 'Sprint' link ververst direct)
Sprint-switch data-refresh op alle relevante pagina's:
- BacklogHydrationWrapper: fingerprint-based re-hydratie zodat PB-data
na router.refresh opnieuw uit nieuwe initialData komt (was: useEffect
met lege deps draaide alleen 1x)
- SprintBoardClient: key={sprint.id} forceert remount bij sprint-switch
zodat lokale sprintStories/sprintStoryIds-state vers ge-init wordt
- Solo (desktop + mobile): gebruik resolveActiveSprint(id) ipv eerste
OPEN-sprint, plus key={sprint.id} op SoloBoard voor remount
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:27:24 +02:00
8877ea469d
feat(M14): 3-pane backlog — generic SplitPane, BacklogStore, SSE realtime, card-grid TaskPanel ( #22 )
...
* feat(split-pane): refactor to generic n-pane SplitPane with cookie persistence
New API: panes[], defaultSplit[], cookieKey, tabLabels. Supports arbitrary
number of panes with n-1 draggable dividers and JSON cookie persistence.
Replaces TriplePane; mobile renders tabs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(split-pane): migrate callers to new panes[] API
Backlog page and sprint board now use generic SplitPane.
TriplePane removed; sprint board uses 3-pane with defaultSplit=[28,35,37].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(split-pane): add unit tests for 2/3-pane, cookie-restore, mobile tabs
Added jsdom + @testing-library/react devDeps for component testing.
7 cases: render, divider count, cookie restore, invalid cookie fallback,
mobile tab render/switch, and no-dividers-on-mobile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): add BacklogStore Zustand store with applyChange reducer
State: pbis, storiesByPbi, tasksByStory. setInitialData for server
hydration; applyChange(entity, op, data) handles I/U/D for SSE events.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): server-fetch tasks + hydrate BacklogStore on page load
Page now fetches tasks parallel to stories and groups by story_id.
BacklogHydrationWrapper calls setInitialData on mount so the store
is ready for downstream SSE consumers.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): add EmptyPanel shared component, replace inline empty states
EmptyPanel takes title?, message, and optional action with DemoTooltip.
Replaces duplicate inline empty-state markup in pbi-list and story-panel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): add TaskPanel with sortable rows and TaskDialog wiring
Reads selectedStoryId + tasksByStory from stores. DnD reorder via
reorderTasksAction. Row click → ?editTask, + button → ?newTask&storyId.
DemoTooltip on drag handles and + button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): wire TaskPanel + TaskDialog into backlog page
3-pane SplitPane [20,45,35]. searchParams for newTask/editTask.
TaskDialog and EditTaskLoader render on ?newTask and ?editTask.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(backlog): add TaskPanel tests for render states and click handlers
7 cases: no-story empty, no-tasks empty+action, tasks render, + button
router.push, row click router.push, demo disabled button, demo disabled handles.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): migrate PbiList to store-driven via useBacklogStore
Removes pbis prop; reads from useBacklogStore(s => s.pbis) so SSE
updates reflect in real-time without prop drilling.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(backlog): migrate StoryPanel to store-driven + selectStory on click
Removes storiesByPbi prop; reads from useBacklogStore. Card click now
dispatches selectStory(id) + shows isSelected highlight. Edit moved to
inline pencil button. page.tsx drops pbis/storiesByPbi props.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(backlog): add 3-pane integration tests for click-cascade flow
Covers: empty states, PBI→stories, story→tasks, cascade-reset,
isSelected highlight. localStorage mocked for sort-mode persistence.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ST-1115): SSE backlog realtime — endpoint, hook, hydration mount, tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ST-1116): mobile auto-switch tabs + back button in BacklogSplitPane
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs(ST-1116): update functional-spec (3-pane backlog + mobile) and architecture (backlog SSE + backlog-store)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ST-1117): TaskPanel card-grid — BacklogCard + rectSortingStrategy, tests updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(tests): correct PbiStatusApi type and remove duplicate mock keys
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-30 18:16:07 +02:00