mirror of
https://github.com/temetro/temetro.git
synced 2026-08-31 04:47:57 +00:00
feat: delete controls across add-pages (lab, dispense, rx, inventory, tasks)
Backend: - DELETE /api/patients/:fileNumber/labs (remove one lab result, lab:write) - DELETE /api/dispenses/:id (void a ledger entry, inventory:write) Frontend (all guarded by ConfirmDialog): - lab "Recent results" rows: delete result - pharmacy "Recently dispensed" rows: delete record - prescriptions/tasks detail sheets + inventory detail dialog gain a delete action (prescription delete stays off the shared Pharmacy sheet) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -24,6 +24,7 @@ import {
|
||||
DialogPopup,
|
||||
DialogTitle,
|
||||
} from "@/components/ui/dialog";
|
||||
import { ConfirmDialog } from "@/components/ui/confirm-dialog";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Tabs, TabsList, TabsPanel, TabsTab } from "@/components/ui/tabs";
|
||||
import { Textarea } from "@/components/ui/textarea";
|
||||
@@ -35,6 +36,7 @@ import {
|
||||
type TaskInput,
|
||||
type TaskStatus,
|
||||
createTask,
|
||||
deleteTask,
|
||||
listTasks,
|
||||
updateTask,
|
||||
} from "@/lib/tasks";
|
||||
@@ -306,6 +308,7 @@ export function TasksView() {
|
||||
const [tasks, setTasks] = useState<Task[]>([]);
|
||||
const [selectedId, setSelectedId] = useState<string | null>(null);
|
||||
const [sheetOpen, setSheetOpen] = useState(false);
|
||||
const [confirmOpen, setConfirmOpen] = useState(false);
|
||||
const [addOpen, setAddOpen] = useState(false);
|
||||
const [addStatus, setAddStatus] = useState<TaskStatus>("todo");
|
||||
const [dragId, setDragId] = useState<string | null>(null);
|
||||
@@ -362,6 +365,24 @@ export function TasksView() {
|
||||
setSheetOpen(true);
|
||||
};
|
||||
|
||||
const removeTask = async () => {
|
||||
if (!selected) return;
|
||||
const id = selected.id;
|
||||
try {
|
||||
await deleteTask(id);
|
||||
setTasks((prev) => prev.filter((task) => task.id !== id));
|
||||
setSheetOpen(false);
|
||||
notify.success(t("tasks.delete.doneTitle"), selected.title);
|
||||
} catch {
|
||||
notify.error(
|
||||
t("tasks.delete.failedTitle"),
|
||||
t("tasks.delete.failedBody"),
|
||||
);
|
||||
} finally {
|
||||
setConfirmOpen(false);
|
||||
}
|
||||
};
|
||||
|
||||
const addTask = async (task: TaskInput) => {
|
||||
try {
|
||||
const created = await createTask(task);
|
||||
@@ -481,11 +502,26 @@ export function TasksView() {
|
||||
/>
|
||||
|
||||
<TaskDetailSheet
|
||||
onDelete={() => setConfirmOpen(true)}
|
||||
onMove={moveTask}
|
||||
onOpenChange={setSheetOpen}
|
||||
open={sheetOpen}
|
||||
task={selected}
|
||||
/>
|
||||
|
||||
<ConfirmDialog
|
||||
cancelLabel={t("tasks.delete.cancel")}
|
||||
confirmLabel={t("tasks.delete.confirm")}
|
||||
description={
|
||||
selected
|
||||
? t("tasks.delete.body", { title: selected.title })
|
||||
: undefined
|
||||
}
|
||||
onConfirm={removeTask}
|
||||
onOpenChange={setConfirmOpen}
|
||||
open={confirmOpen}
|
||||
title={t("tasks.delete.title")}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user