({
task,
subtasks,
documents = [],
content,
isEditing,
onEdit,
onCancel,
onSave,
onContentChange,
isUpdating = false,
}: ParentTaskViewProps)
| 29 | } |
| 30 | |
| 31 | export function ParentTaskView({ |
| 32 | task, |
| 33 | subtasks, |
| 34 | documents = [], |
| 35 | content, |
| 36 | isEditing, |
| 37 | onEdit, |
| 38 | onCancel, |
| 39 | onSave, |
| 40 | onContentChange, |
| 41 | isUpdating = false, |
| 42 | }: ParentTaskViewProps) { |
| 43 | const navigate = useNavigate(); |
| 44 | const metadata = task.metadata || task; |
| 45 | const deleteTask = useDeleteTask(); |
| 46 | const [showDeleteDialog, setShowDeleteDialog] = useState(false); |
| 47 | const [cascadeDelete, setCascadeDelete] = useState(false); |
| 48 | |
| 49 | const handleDelete = async () => { |
| 50 | try { |
| 51 | await deleteTask.mutateAsync({ id: task.id, cascade: cascadeDelete }); |
| 52 | // Navigate back to the workflow list |
| 53 | navigate({ to: `/workflow/${metadata.workflowState || 'current'}` }); |
| 54 | } catch (error) { |
| 55 | console.error('Failed to delete task:', error); |
| 56 | // Error handling will be improved in a later step |
| 57 | } |
| 58 | }; |
| 59 | |
| 60 | // Ensure subtasks have parent context for proper URL generation |
| 61 | const subtasksWithParent = subtasks.map((subtask) => ({ |
| 62 | ...subtask, |
| 63 | // Add parent task reference if not already present |
| 64 | parent_task: |
| 65 | subtask.parent_task || subtask.metadata?.parentTask || task.id || task.metadata?.id, |
| 66 | })); |
| 67 | |
| 68 | return ( |
| 69 | <div className="min-h-screen bg-background"> |
| 70 | {/* Header */} |
| 71 | <div className="bg-card border-b"> |
| 72 | <div className="max-w-6xl mx-auto px-6 py-4"> |
| 73 | <div className="flex items-start justify-between gap-4"> |
| 74 | <div className="flex items-start gap-3 flex-1 min-w-0"> |
| 75 | <TaskTypeIcon type={metadata.type || 'feature'} /> |
| 76 | <div className="flex-1 min-w-0"> |
| 77 | <h1 className="text-2xl font-bold text-foreground">{metadata.title}</h1> |
| 78 | <div className="flex items-center flex-wrap gap-2 mt-2"> |
| 79 | <StatusBadge status={metadata.status || 'To Do'} /> |
| 80 | <PriorityIndicator priority={metadata.priority || 'Medium'} /> |
| 81 | <WorkflowStateBadge workflow={metadata.workflowState || 'backlog'} /> |
| 82 | {metadata.tags && metadata.tags.length > 0 && ( |
| 83 | <> |
| 84 | <span className="text-muted-foreground">•</span> |
| 85 | {metadata.tags.map((tag) => ( |
| 86 | <span key={tag} className="font-mono text-xs bg-muted px-2 py-1 rounded"> |
| 87 | #{tag} |
| 88 | </span> |
nothing calls this directly
no test coverage detected
searching dependent graphs…