refactor: move from union type to object enum

This commit is contained in:
2026-07-15 02:41:17 +05:00
parent 35465f581f
commit 84f64af62d
30 changed files with 490 additions and 193 deletions
+24 -8
View File
@@ -1,5 +1,9 @@
import { Task, TaskStatus } from "@/model/task";
import { TASK_STATUS_LABELS, TASK_STATUS_ORDER } from "@/ui/taskLabels";
import { Task } from "@/model/task";
import {
TASK_STATUS_META,
TASK_STATUS_ORDER,
type TaskStatus,
} from "@/model/taskStatus";
export type KanbanColumn = {
status: TaskStatus;
@@ -11,20 +15,32 @@ export type KanbanBoard = {
columns: KanbanColumn[];
};
/** Build fixed-order status columns; empty columns are kept (unlike groupTasks). */
export function buildKanbanBoard(tasks: Task[]): KanbanBoard {
const columns: KanbanColumn[] = TASK_STATUS_ORDER.map((status) => {
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(),
(a, b) => new Date(b.updated).getTime() - new Date(a.updated).getTime(),
);
return {
status,
label: TASK_STATUS_LABELS[status],
label: TASK_STATUS_META[status].label,
tasks: columnTasks,
};
});