mirror of
https://github.com/temetro/temetro.git
synced 2026-08-20 15:12:18 +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:
@@ -1,11 +1,13 @@
|
||||
"use client";
|
||||
|
||||
import { Trash2 } from "lucide-react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import {
|
||||
Sheet,
|
||||
SheetFooter,
|
||||
SheetHeader,
|
||||
SheetPanel,
|
||||
SheetPopup,
|
||||
@@ -37,11 +39,13 @@ export function TaskDetailSheet({
|
||||
open,
|
||||
onOpenChange,
|
||||
onMove,
|
||||
onDelete,
|
||||
}: {
|
||||
task: Task | null;
|
||||
open: boolean;
|
||||
onOpenChange: (open: boolean) => void;
|
||||
onMove: (id: string, status: TaskStatus) => void;
|
||||
onDelete?: () => void;
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
@@ -132,6 +136,14 @@ export function TaskDetailSheet({
|
||||
</div>
|
||||
)}
|
||||
</SheetPanel>
|
||||
{task && onDelete && (
|
||||
<SheetFooter>
|
||||
<Button onClick={onDelete} type="button" variant="destructive">
|
||||
<Trash2 className="size-4" />
|
||||
{t("tasks.detail.delete")}
|
||||
</Button>
|
||||
</SheetFooter>
|
||||
)}
|
||||
</SheetPopup>
|
||||
</Sheet>
|
||||
);
|
||||
|
||||
@@ -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