import type { Task, TaskDetail, TaskCreateInput, Column as ColumnType } from "@hai/core"; import { COLUMNS } from "@hai/core"; import { Column } from "./Column"; import type { ToastType } from "../hooks/useToast"; interface BoardProps { tasks: Task[]; maxConcurrent: number; onMoveTask: (id: string, column: ColumnType) => Promise; onOpenDetail: (task: TaskDetail) => void; addToast: (message: string, type?: ToastType) => void; isCreating: boolean; onCancelCreate: () => void; onCreateTask: (input: TaskCreateInput) => Promise; onNewTask: () => void; autoMerge: boolean; onToggleAutoMerge: () => void; } export function Board({ tasks, maxConcurrent, onMoveTask, onOpenDetail, addToast, isCreating, onCancelCreate, onCreateTask, onNewTask, autoMerge, onToggleAutoMerge }: BoardProps) { return (
{COLUMNS.map((col) => ( t.column === col) .sort((a, b) => { // Tasks with columnMovedAt sort descending (most recent first) // Tasks without it (legacy) fall to the bottom, sorted by createdAt ascending if (a.columnMovedAt && b.columnMovedAt) { return b.columnMovedAt.localeCompare(a.columnMovedAt); } if (a.columnMovedAt && !b.columnMovedAt) return -1; if (!a.columnMovedAt && b.columnMovedAt) return 1; return a.createdAt.localeCompare(b.createdAt); })} allTasks={tasks} maxConcurrent={maxConcurrent} onMoveTask={onMoveTask} onOpenDetail={onOpenDetail} addToast={addToast} {...(col === "triage" ? { isCreating, onCancelCreate, onCreateTask, onNewTask } : {})} {...(col === "in-review" ? { autoMerge, onToggleAutoMerge } : {})} /> ))}
); }