74 lines
1.6 KiB
TypeScript
74 lines
1.6 KiB
TypeScript
export const TaskStatus = {
|
|
BACKLOG: "backlog",
|
|
OPEN: "open",
|
|
IN_PROGRESS: "in-progress",
|
|
DONE: "done",
|
|
CANCELLED: "cancelled",
|
|
UNKNOWN: "unknown",
|
|
} as const;
|
|
|
|
export type TaskStatus = (typeof TaskStatus)[keyof typeof TaskStatus];
|
|
|
|
export type TaskStatusMeta = {
|
|
label: string;
|
|
/** Hide column by default in kanban (toggle can show later). */
|
|
defaultHidden: boolean;
|
|
/** Codicon id for tree; adapters wrap in ThemeIcon. */
|
|
icon: string;
|
|
/**
|
|
* Fallback value assigned when the parsed status is invalid/missing.
|
|
* Excluded from editing choices; hidden in tree when empty.
|
|
*/
|
|
fallback?: boolean;
|
|
};
|
|
|
|
/** Explicit display / column order (not Object.values). */
|
|
export const TASK_STATUS_ORDER: TaskStatus[] = [
|
|
TaskStatus.BACKLOG,
|
|
TaskStatus.OPEN,
|
|
TaskStatus.IN_PROGRESS,
|
|
TaskStatus.DONE,
|
|
TaskStatus.CANCELLED,
|
|
TaskStatus.UNKNOWN,
|
|
];
|
|
|
|
export const TASK_STATUS_META: Record<TaskStatus, TaskStatusMeta> = {
|
|
[TaskStatus.BACKLOG]: {
|
|
label: "Backlog",
|
|
defaultHidden: true,
|
|
icon: "inbox",
|
|
},
|
|
[TaskStatus.OPEN]: {
|
|
label: "Open",
|
|
defaultHidden: false,
|
|
icon: "circle-outline",
|
|
},
|
|
[TaskStatus.IN_PROGRESS]: {
|
|
label: "In Progress",
|
|
defaultHidden: false,
|
|
icon: "sync",
|
|
},
|
|
[TaskStatus.DONE]: {
|
|
label: "Done",
|
|
defaultHidden: false,
|
|
icon: "check",
|
|
},
|
|
[TaskStatus.CANCELLED]: {
|
|
label: "Cancelled",
|
|
defaultHidden: true,
|
|
icon: "close",
|
|
},
|
|
[TaskStatus.UNKNOWN]: {
|
|
label: "Unknown",
|
|
defaultHidden: true,
|
|
icon: "question",
|
|
fallback: true,
|
|
},
|
|
};
|
|
|
|
export function isTaskStatus(value: unknown): value is TaskStatus {
|
|
return (
|
|
typeof value === "string" && (TASK_STATUS_ORDER as string[]).includes(value)
|
|
);
|
|
}
|