import { Task } from "@/model/task"; import { TASK_STATUS_META, TASK_STATUS_ORDER, type TaskStatus, } from "@/model/taskStatus"; export type KanbanColumn = { status: TaskStatus; label: string; tasks: Task[]; }; export type KanbanBoard = { columns: KanbanColumn[]; }; export type BuildKanbanBoardOptions = { /** When false (default), columns with meta.defaultHidden are omitted. */ showHiddenStatuses?: boolean; }; /** Build status columns; empty columns kept. Hidden statuses optional. */ export function buildKanbanBoard( tasks: Task[], options: BuildKanbanBoardOptions = {}, ): KanbanBoard { const showHidden = options.showHiddenStatuses ?? false; const statuses = TASK_STATUS_ORDER.filter( (status) => showHidden || !TASK_STATUS_META[status].defaultHidden, ); const columns: KanbanColumn[] = statuses.map((status) => { const columnTasks = tasks .filter((task) => task.status === status) .slice() .sort( (a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime(), ); return { status, label: TASK_STATUS_META[status].label, tasks: columnTasks, }; }); return { columns }; }