Scrum4Me/components/sprint/sprint-task-dialog-mount.tsx
Janpeter Visser a9b53dedf0
feat(PBI-75): sprint task-edit client-side via workspace-store (#183)
Klik op een taak in het sprint-scherm opent de edit-dialog nu
client-side via setActiveTask op de sprint-workspace-store.
Geen URL-navigatie, geen volledige server re-render — alleen
GET /api/tasks/{id} voor het detail. SSE propageert server-saves
automatisch terug.

- TaskDialog: optionele onClose/onSaved callbacks (closePath
  optional gemaakt — backwards compatible)
- SprintTaskDialogMount: nieuwe client-component die
  selectActiveTask consumeert en TaskDialog rendert
- SprintUrlTaskSync: deeplink (?editTask=<id>) → store
- Sprint page: mounts toegevoegd, editTask searchParam +
  EditTaskLoader-Suspense verwijderd
- TaskList.openEditDialog roept setActiveTask aan ipv router.push
- Vitest integratie-test voor SprintTaskDialogMount

Out-of-scope (follow-up PBIs): newTask-flow, mobile, product-backlog.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 08:21:42 +02:00

41 lines
1.3 KiB
TypeScript

'use client'
import { useSprintWorkspaceStore } from '@/stores/sprint-workspace/store'
import { selectActiveTask } from '@/stores/sprint-workspace/selectors'
import { isDetail } from '@/stores/sprint-workspace/types'
import { TaskDialog } from '@/app/_components/tasks/task-dialog'
import { taskStatusFromApi } from '@/lib/task-status'
import type { TaskStatus } from '@prisma/client'
interface Props {
productId: string
isDemo: boolean
}
export function SprintTaskDialogMount({ productId, isDemo }: Props) {
const task = useSprintWorkspaceStore(selectActiveTask)
const setActiveTask = useSprintWorkspaceStore((s) => s.setActiveTask)
if (!task || !isDetail(task)) return null
const status = (taskStatusFromApi(String(task.status)) ?? 'TO_DO') as TaskStatus
const createdAt = task.created_at instanceof Date ? task.created_at : new Date(task.created_at)
return (
<TaskDialog
task={{
id: task.id,
code: task.code,
title: task.title,
description: task.description,
implementation_plan: task.implementation_plan ?? null,
priority: task.priority,
status,
created_at: createdAt,
}}
productId={productId}
onClose={() => setActiveTask(null)}
isDemo={isDemo}
/>
)
}