Files
xboct-flow/src/kanban/buildKanbanBoard.ts
T

50 lines
1.1 KiB
TypeScript

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 };
}