diff --git a/app/(app)/products/[id]/sprint/page.tsx b/app/(app)/products/[id]/sprint/page.tsx index e72bf56..3e3a36c 100644 --- a/app/(app)/products/[id]/sprint/page.tsx +++ b/app/(app)/products/[id]/sprint/page.tsx @@ -3,6 +3,7 @@ import { notFound, redirect } from 'next/navigation' import { getSession } from '@/lib/auth' import { getAccessibleProduct } from '@/lib/product-access' import { prisma } from '@/lib/prisma' +import { pbiStatusToApi } from '@/lib/task-status' import { SprintBoardClient } from '@/components/sprint/sprint-board-client' import { SprintHeader } from '@/components/sprint/sprint-header' import type { SprintStory, PbiWithStories, ProductMember } from '@/components/sprint/sprint-backlog' @@ -69,6 +70,10 @@ export default async function SprintBoardPage({ params, searchParams }: Props) { id: s.id, code: s.code, title: s.title, + description: s.description, + acceptance_criteria: s.acceptance_criteria, + pbi_id: s.pbi_id, + created_at: s.created_at, priority: s.priority, status: s.status, taskCount: s.tasks.length, @@ -108,10 +113,17 @@ export default async function SprintBoardPage({ params, searchParams }: Props) { id: pbi.id, code: pbi.code, title: pbi.title, + priority: pbi.priority, + status: pbiStatusToApi(pbi.status), + description: pbi.description, stories: pbi.stories.map(s => ({ id: s.id, code: s.code, title: s.title, + description: s.description, + acceptance_criteria: s.acceptance_criteria, + pbi_id: s.pbi_id, + created_at: s.created_at, priority: s.priority, status: s.status, taskCount: 0, diff --git a/components/sprint/sprint-backlog.tsx b/components/sprint/sprint-backlog.tsx index 5453896..e65f363 100644 --- a/components/sprint/sprint-backlog.tsx +++ b/components/sprint/sprint-backlog.tsx @@ -1,7 +1,7 @@ 'use client' import { useState, useTransition, useEffect } from 'react' -import { Trash2, MoreHorizontal, ChevronsUp, ChevronsDown, ListFilter } from 'lucide-react' +import { Trash2, MoreHorizontal, ChevronsUp, ChevronsDown, ListFilter, Pencil } from 'lucide-react' import { useDroppable, useDraggable } from '@dnd-kit/core' import { SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' @@ -22,6 +22,9 @@ import { PRIORITY_BORDER } from '@/components/backlog/backlog-card' import { PRIORITY_COLORS } from '@/components/shared/priority-select' import { useSprintStore } from '@/stores/sprint-store' import { claimStoryAction, unclaimStoryAction, reassignStoryAction, claimAllUnassignedInActiveSprintAction } from '@/actions/stories' +import { PbiDialog, type PbiDialogState } from '@/components/backlog/pbi-dialog' +import { StoryDialog, type StoryDialogState } from '@/components/backlog/story-dialog' +import type { PbiStatusApi } from '@/lib/task-status' import { cn } from '@/lib/utils' const STATUS_COLORS: Record = { @@ -35,6 +38,10 @@ export interface SprintStory { id: string code: string | null title: string + description: string | null + acceptance_criteria: string | null + pbi_id: string + created_at: Date priority: number status: string taskCount: number @@ -52,19 +59,23 @@ export interface PbiWithStories { id: string code: string | null title: string + priority: number + status: PbiStatusApi + description: string | null stories: SprintStory[] } // --- Left panel: Sprint Backlog --- function SortableSprintRow({ - story, isDemo, onRemove, onSelect, isSelected, + story, isDemo, onRemove, onSelect, onEdit, isSelected, currentUserId, productId, members, onAssigneeChange, }: { story: SprintStory isDemo: boolean onRemove: () => void onSelect: () => void + onEdit: () => void isSelected: boolean currentUserId: string productId: string @@ -192,6 +203,16 @@ function SortableSprintRow({ + + + + + + + {!collapsed.has(pbi.id) && pbi.stories.map(story => { const inSprint = sprintStoryIds.has(story.id) @@ -654,6 +700,11 @@ export function SprintBacklogRight({ pbisWithStories, sprintStoryIds, isDemo, on ))} + setPbiDialogState(null)} + isDemo={isDemo} + /> ) } diff --git a/components/sprint/sprint-board-client.tsx b/components/sprint/sprint-board-client.tsx index 4a6501a..4437f54 100644 --- a/components/sprint/sprint-board-client.tsx +++ b/components/sprint/sprint-board-client.tsx @@ -210,6 +210,7 @@ export function SprintBoardClient({ pbisWithStories={pbisWithStories} sprintStoryIds={sprintStoryIds} isDemo={isDemo} + productId={productId} onAdd={handleAdd} />,