From 2381832c6736b1428da6ce2d14b76afb56d1caad Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Wed, 29 Apr 2026 17:13:36 +0200 Subject: [PATCH] feat(ST-1109.7): add status select to PBI dialog - New components/shared/pbi-status-select.tsx mirrors PrioritySelect: PBI_STATUS_LABELS (NL), PBI_STATUS_COLORS, PbiStatusSelect component - Reuses existing --status-todo/blocked/done MD3 tokens - PbiDialog: status state with sync-on-open; default 'ready' for create, pbi.status for edit; hidden input submits lowercase API value - Priority + Status sit side-by-side in 2-col grid - PbiDialogPbi.status is optional; pbi-list.tsx will populate in ST-1109.8 Co-Authored-By: Claude Opus 4.7 (1M context) --- components/backlog/pbi-dialog.tsx | 23 +++++++++++--- components/shared/pbi-status-select.tsx | 41 +++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 components/shared/pbi-status-select.tsx diff --git a/components/backlog/pbi-dialog.tsx b/components/backlog/pbi-dialog.tsx index b93de29..6af393a 100644 --- a/components/backlog/pbi-dialog.tsx +++ b/components/backlog/pbi-dialog.tsx @@ -16,7 +16,9 @@ import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { PrioritySelect } from '@/components/shared/priority-select' +import { PbiStatusSelect } from '@/components/shared/pbi-status-select' import { createPbiAction, updatePbiAction } from '@/actions/pbis' +import type { PbiStatusApi } from '@/lib/task-status' export interface PbiDialogPbi { id: string @@ -24,6 +26,7 @@ export interface PbiDialogPbi { priority: number description?: string | null code?: string | null + status?: PbiStatusApi } type CreateState = { mode: 'create'; productId: string; defaultPriority?: number } @@ -51,11 +54,16 @@ export function PbiDialog({ state, onClose }: PbiDialogProps) { const initialPriority = isEdit ? pbi!.priority : (state?.defaultPriority ?? 2) const [priority, setPriority] = useState(initialPriority) - // Sync priority when dialog opens for a different PBI or switches create/edit mode + const initialStatus: PbiStatusApi = isEdit ? (pbi!.status ?? 'ready') : 'ready' + const [status, setStatus] = useState(initialStatus) + + // Sync priority + status when dialog opens for a different PBI or switches create/edit mode useEffect(() => { if (state) { // eslint-disable-next-line react-hooks/set-state-in-effect setPriority(isEdit ? (state as EditState).pbi.priority : ((state as CreateState).defaultPriority ?? 2)) + + setStatus(isEdit ? ((state as EditState).pbi.status ?? 'ready') : 'ready') } }, [state, isEdit]) @@ -105,6 +113,7 @@ export function PbiDialog({ state, onClose }: PbiDialogProps) { {isEdit && } {!isEdit && } +
@@ -135,9 +144,15 @@ export function PbiDialog({ state, onClose }: PbiDialogProps) {
-
- - +
+
+ + +
+
+ + +
diff --git a/components/shared/pbi-status-select.tsx b/components/shared/pbi-status-select.tsx new file mode 100644 index 0000000..ae93522 --- /dev/null +++ b/components/shared/pbi-status-select.tsx @@ -0,0 +1,41 @@ +'use client' + +import { Select, SelectContent, SelectItem, SelectTrigger } from '@/components/ui/select' +import { cn } from '@/lib/utils' +import type { PbiStatusApi } from '@/lib/task-status' + +export const PBI_STATUS_LABELS: Record = { + ready: 'Klaar voor sprint', + blocked: 'Geblokkeerd', + done: 'Afgerond', +} + +export const PBI_STATUS_COLORS: Record = { + ready: 'bg-status-todo/15 text-status-todo border-status-todo/30', + blocked: 'bg-status-blocked/15 text-status-blocked border-status-blocked/30', + done: 'bg-status-done/15 text-status-done border-status-done/30', +} + +interface PbiStatusSelectProps { + value: PbiStatusApi + onChange: (value: PbiStatusApi) => void + className?: string +} + +export function PbiStatusSelect({ value, onChange, className }: PbiStatusSelectProps) { + return ( + + ) +}