feat: shared backlog filter popover + sprint header polish (v1.3.3) (#184)

- Move sprint switcher into sprint header, centered between title and actions
- Extract BacklogFilterPopover as shared component used by sprint and product backlog
- Add sort options (code/priority/status) with single-pill asc/desc toggle
- Default sprint backlog status filter to OPEN, remove "alleen niet klaar" button
- Persist collapsed state and filter popover open in localStorage
- Fix hydration flicker: defer localStorage read to useEffect with prefsLoaded gate for writes
- Increase sprint switcher text size for readability

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-05-10 11:12:04 +02:00 committed by GitHub
parent a9b53dedf0
commit 1f8cbacb0a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 424 additions and 330 deletions

View file

@ -11,7 +11,6 @@ import {
import { SprintTaskDialogMount } from '@/components/sprint/sprint-task-dialog-mount'
import { SprintUrlTaskSync } from '@/components/sprint/sprint-url-task-sync'
import { SyncActiveSprintCookie } from '@/components/sprint/sync-active-sprint-cookie'
import { SprintSwitcher } from '@/components/shared/sprint-switcher'
import { getSprintSwitcherData } from '@/lib/sprint-switcher-data'
import { SprintHeader } from '@/components/sprint/sprint-header'
import { SprintRunControls } from '@/components/sprint/sprint-run-controls'
@ -182,22 +181,17 @@ export default async function SprintBoardPage({ params, searchParams }: Props) {
}
return (
<div className="flex flex-col h-full">
<div id="wrapper2" className="flex flex-col h-full">
<SyncActiveSprintCookie productId={id} sprintId={sprint.id} />
<div className="px-4 py-3 border-b border-border bg-surface-container-low shrink-0 flex items-center justify-center">
<SprintSwitcher
productId={id}
sprints={switcherData.sprintItems}
activeSprint={switcherData.activeSprintItem}
buildingSprintIds={switcherData.buildingSprintIds}
/>
</div>
<SprintHeader
productId={id}
productName={product.name}
sprint={sprint}
isDemo={isDemo}
sprintStories={sprintStoryItems}
switcherSprints={switcherData.sprintItems}
switcherActiveSprint={switcherData.activeSprintItem}
switcherBuildingSprintIds={switcherData.buildingSprintIds}
/>
<div className="border-b border-border bg-surface-container-low px-4 py-2 shrink-0">