-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathTaskBoardContent.tsx
More file actions
85 lines (80 loc) · 2.17 KB
/
Copy pathTaskBoardContent.tsx
File metadata and controls
85 lines (80 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
'use client';
import { useMemo } from 'react';
import { TaskColumn } from './TaskColumn';
import type { Task, TaskStatus, ProofRequirement } from '@/types';
/** Column display order matches the task lifecycle. */
const COLUMN_ORDER: TaskStatus[] = [
'BACKLOG',
'READY',
'IN_PROGRESS',
'BLOCKED',
'FAILED',
'DONE',
];
interface TaskBoardContentProps {
tasks: Task[];
selectionMode: boolean;
selectedTaskIds: Set<string>;
onTaskClick: (taskId: string) => void;
onToggleSelect: (taskId: string) => void;
onExecute: (taskId: string) => void;
onMarkReady: (taskId: string) => void;
onStop?: (taskId: string) => void;
onReset?: (taskId: string) => void;
onSelectAll?: (taskIds: string[]) => void;
onDeselectAll?: (taskIds: string[]) => void;
loadingTaskIds?: Set<string>;
requirementsMap?: Map<string, ProofRequirement>;
}
export function TaskBoardContent({
tasks,
selectionMode,
selectedTaskIds,
onTaskClick,
onToggleSelect,
onExecute,
onMarkReady,
onStop,
onReset,
onSelectAll,
onDeselectAll,
loadingTaskIds,
requirementsMap,
}: TaskBoardContentProps) {
/** Group flat task array into per-status buckets. */
const tasksByStatus = useMemo(() => {
const grouped: Record<string, Task[]> = {};
for (const status of COLUMN_ORDER) {
grouped[status] = [];
}
for (const task of tasks) {
if (grouped[task.status]) {
grouped[task.status].push(task);
}
}
return grouped;
}, [tasks]);
return (
<div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-6">
{COLUMN_ORDER.map((status) => (
<TaskColumn
key={status}
status={status}
tasks={tasksByStatus[status]}
selectionMode={selectionMode}
selectedTaskIds={selectedTaskIds}
onTaskClick={onTaskClick}
onToggleSelect={onToggleSelect}
onExecute={onExecute}
onMarkReady={onMarkReady}
onStop={onStop}
onReset={onReset}
onSelectAll={onSelectAll}
onDeselectAll={onDeselectAll}
loadingTaskIds={loadingTaskIds}
requirementsMap={requirementsMap}
/>
))}
</div>
);
}