Files
temetro/frontend/lib/tasks.ts
T
Khalid Abdi 6fdb7bdb46 feat(tasks): kanban board with To Do / In Progress / Done columns
- add a `status` field to tasks (backend schema/validation/service/types
  + frontend types), kept in sync with the legacy `done` flag
- migration 0017 adds the column and backfills done tasks to "done"
- rewrite the tasks page as a three-column board: per-column add buttons,
  draggable cards, and a status mover in the detail sheet

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 18:35:48 +03:00

63 lines
1.7 KiB
TypeScript

import { apiFetch } from "@/lib/api-client";
// A care-team task. Mirrors the backend `src/types/task.ts`. Scoped to the active
// clinic (shared across the care team).
export type Priority = "high" | "medium" | "low";
// Board column the task sits in. `done` mirrors `status === "done"`.
export type TaskStatus = "todo" | "in_progress" | "done";
export type Task = {
id: string;
title: string;
assignee: string;
// Department (member role) the task is assigned to; null = personal task.
assigneeRole: string | null;
due: string;
priority: Priority;
status: TaskStatus;
patient: string | null;
notes: string | null;
done: boolean;
createdById: string | null;
createdByName: string | null;
createdAt: string;
updatedAt: string;
};
// Fields the "New task" dialog collects.
export type TaskInput = {
title: string;
assignee?: string;
assigneeRole?: string | null;
due?: string;
priority?: Priority;
status?: TaskStatus;
patient?: string | null;
notes?: string | null;
};
// Any subset of fields, plus `done` (used by the complete/reopen toggle).
export type TaskPatch = Partial<TaskInput> & { done?: boolean };
export function listTasks(): Promise<Task[]> {
return apiFetch<Task[]>("/api/tasks");
}
export function createTask(input: TaskInput): Promise<Task> {
return apiFetch<Task>("/api/tasks", {
method: "POST",
body: JSON.stringify(input),
});
}
export function updateTask(id: string, patch: TaskPatch): Promise<Task> {
return apiFetch<Task>(`/api/tasks/${id}`, {
method: "PATCH",
body: JSON.stringify(patch),
});
}
export function deleteTask(id: string): Promise<void> {
return apiFetch<void>(`/api/tasks/${id}`, { method: "DELETE" });
}