From 32410d41a22e184e436a9da3cd373507d2f7a4e4 Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Fri, 15 May 2026 01:24:38 +0200 Subject: [PATCH] feat(ST-1369): SprintSwitcher op deriveScreenState + draft op trigger (G5) De trigger-knop toont nu de concept-sprint zodra er een sprint-draft loopt, niet langer alleen de (disabled) dropdown-regel. Schermstaat-afleiding loopt via de pure deriveScreenState() i.p.v. losse flags. Co-Authored-By: Claude Opus 4.7 (1M context) --- components/shared/sprint-switcher.tsx | 30 ++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/components/shared/sprint-switcher.tsx b/components/shared/sprint-switcher.tsx index 11fa596..e718a42 100644 --- a/components/shared/sprint-switcher.tsx +++ b/components/shared/sprint-switcher.tsx @@ -18,6 +18,7 @@ import { switchActiveSprintAction, } from '@/actions/active-sprint' import { useProductWorkspaceStore } from '@/stores/product-workspace/store' +import { deriveScreenState } from '@/stores/product-workspace/screen-state' import { useUserSettingsStore } from '@/stores/user-settings/store' import type { SprintStatusApi } from '@/lib/task-status' import { debugProps } from '@/lib/debug' @@ -57,6 +58,20 @@ export function SprintSwitcher({ const draftGoal = useUserSettingsStore( (s) => s.entities.settings.workflow?.pendingSprintDraft?.[productId]?.goal ?? null, ) + const pendingAdds = useProductWorkspaceStore( + (s) => s.sprintMembership.pending.adds, + ) + const pendingRemoves = useProductWorkspaceStore( + (s) => s.sprintMembership.pending.removes, + ) + + const screenState = deriveScreenState({ + activeSprintItem: activeSprint, + buildingSprintIds, + hasPendingDraft: draftGoal !== null, + pendingAdds, + pendingRemoves, + }) const visibleSprints = sprints.filter(s => { if (showClosed) return true @@ -139,10 +154,19 @@ export function SprintSwitcher({ disabled={isPending} className="flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors px-2 py-1 rounded-md hover:bg-surface-container focus:outline-none" > - - {activeSprint ? activeSprint.code : 'Selecteer sprint'} + + {screenState.kind === 'DRAFT' + ? `⚙ Concept — ${draftGoal}` + : activeSprint + ? activeSprint.code + : 'Selecteer sprint'} - {activeSprint && ( + {screenState.kind !== 'DRAFT' && activeSprint && (