Files
kandev/apps/web/lib/tasks/tasks-list-options.ts
T
2026-07-03 22:56:13 +01:00

76 lines
2.6 KiB
TypeScript

import type { Task, TaskState } from "@/lib/types/http";
export const TASKS_LIST_SORT_OPTIONS = [
{ value: "updated_desc", label: "Updated newest" },
{ value: "updated_asc", label: "Updated oldest" },
{ value: "created_desc", label: "Created newest" },
{ value: "created_asc", label: "Created oldest" },
{ value: "title_asc", label: "Title A-Z" },
{ value: "title_desc", label: "Title Z-A" },
] as const;
export const TASKS_LIST_GROUP_OPTIONS = [
{ value: "state", label: "State" },
{ value: "workflow", label: "Workflow" },
{ value: "repository", label: "Repository" },
{ value: "none", label: "None" },
] as const;
export type TasksListSort = (typeof TASKS_LIST_SORT_OPTIONS)[number]["value"];
export type TasksListGroup = (typeof TASKS_LIST_GROUP_OPTIONS)[number]["value"];
export const DEFAULT_TASKS_LIST_SORT: TasksListSort = "updated_desc";
export const DEFAULT_TASKS_LIST_GROUP: TasksListGroup = "state";
export const TASK_STATE_ORDER: TaskState[] = [
"CREATED",
"SCHEDULING",
"TODO",
"IN_PROGRESS",
"REVIEW",
"BLOCKED",
"WAITING_FOR_INPUT",
"COMPLETED",
"FAILED",
"CANCELLED",
];
export function parseTasksListSort(value: string | null | undefined): TasksListSort {
return TASKS_LIST_SORT_OPTIONS.some((option) => option.value === value)
? (value as TasksListSort)
: DEFAULT_TASKS_LIST_SORT;
}
export function parseTasksListGroup(value: string | null | undefined): TasksListGroup {
return TASKS_LIST_GROUP_OPTIONS.some((option) => option.value === value)
? (value as TasksListGroup)
: DEFAULT_TASKS_LIST_GROUP;
}
export function sortTasksForList(tasks: Task[], sort: TasksListSort): Task[] {
return [...tasks].sort((a, b) => compareTasksForList(a, b, sort));
}
export function compareTasksForList(a: Task, b: Task, sort: TasksListSort): number {
const titleCompare = a.title.localeCompare(b.title, undefined, { sensitivity: "base" });
switch (sort) {
case "updated_asc":
return compareDate(a.updated_at, b.updated_at) || titleCompare;
case "created_desc":
return compareDate(b.created_at, a.created_at) || titleCompare;
case "created_asc":
return compareDate(a.created_at, b.created_at) || titleCompare;
case "title_asc":
return titleCompare || compareDate(b.updated_at, a.updated_at);
case "title_desc":
return -titleCompare || compareDate(b.updated_at, a.updated_at);
case "updated_desc":
default:
return compareDate(b.updated_at, a.updated_at) || titleCompare;
}
}
function compareDate(a: string, b: string): number {
return Date.parse(a) - Date.parse(b);
}