From 802aa5815705e1e48896f06b17b34798331879e4 Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Sun, 26 Apr 2026 16:26:07 +0200 Subject: [PATCH] feat(ST-354): add bulk-claim button to Sprint Backlog panel header Co-Authored-By: Claude Sonnet 4.6 --- components/sprint/sprint-backlog.tsx | 35 ++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/components/sprint/sprint-backlog.tsx b/components/sprint/sprint-backlog.tsx index fbab7ea..7d5714b 100644 --- a/components/sprint/sprint-backlog.tsx +++ b/components/sprint/sprint-backlog.tsx @@ -15,7 +15,7 @@ import { PanelNavBar } from '@/components/shared/panel-nav-bar' import { UserAvatar } from '@/components/shared/user-avatar' import { DemoTooltip } from '@/components/shared/demo-tooltip' import { useSprintStore } from '@/stores/sprint-store' -import { claimStoryAction, unclaimStoryAction, reassignStoryAction } from '@/actions/stories' +import { claimStoryAction, unclaimStoryAction, reassignStoryAction, claimAllUnassignedInActiveSprintAction } from '@/actions/stories' import { cn } from '@/lib/utils' const STATUS_COLORS: Record = { @@ -222,6 +222,24 @@ export function SprintBacklogLeft({ }: SprintBacklogLeftProps) { const { sprintStoryOrder } = useSprintStore() const { setNodeRef, isOver } = useDroppable({ id: 'sprint-zone' }) + const [isPending, startTransition] = useTransition() + + const unassignedCount = stories.filter(s => s.assignee_id === null).length + const currentUserUsername = members.find(m => m.userId === currentUserId)?.username ?? null + + function handleClaimAll() { + const unassigned = stories.filter(s => s.assignee_id === null) + unassigned.forEach(s => onAssigneeChange(s.id, currentUserId, currentUserUsername)) + startTransition(async () => { + const result = await claimAllUnassignedInActiveSprintAction(productId) + if (!result.success) { + unassigned.forEach(s => onAssigneeChange(s.id, null, null)) + toast.error(result.error ?? 'Claimen mislukt') + } else { + toast.success(`${result.count} ${result.count === 1 ? 'story' : 'stories'} geclaimd`) + } + }) + } const storyMap = Object.fromEntries(stories.map(s => [s.id, s])) const order = sprintStoryOrder[sprintId] ?? stories.map(s => s.id) @@ -229,7 +247,20 @@ export function SprintBacklogLeft({ return (
- + + + + } + />