From c49c3e0fd92ee8d1b1064156a6a6ad9bb804c0a9 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 18:23:42 +0000 Subject: [PATCH 1/3] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/lib/status-pdf.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/status-pdf.ts b/src/lib/status-pdf.ts index 24c6e50..d8ebf61 100644 --- a/src/lib/status-pdf.ts +++ b/src/lib/status-pdf.ts @@ -98,7 +98,6 @@ export function generateStatusReportPdf(opts: StatusReportOptions): jsPDF { items.map((e) => [ fmtDateTime(e.title), e.body, - `${initials(e.author_name, e.author_email)}\n${fmtDateTime(e.created_at)}`, ]); for (const g of groups) { From a0b6c5cae8f2bca595cd3efe9a300fc97cce49a7 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 18:23:53 +0000 Subject: [PATCH 2/3] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/lib/status-pdf.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/status-pdf.ts b/src/lib/status-pdf.ts index d8ebf61..5e0bdee 100644 --- a/src/lib/status-pdf.ts +++ b/src/lib/status-pdf.ts @@ -124,7 +124,7 @@ export function generateStatusReportPdf(opts: StatusReportOptions): jsPDF { autoTable(doc, { startY: y + 6, - head: [["Event date", "Details", "Logged by"]], + head: [["Date", "Details"]], body: rowsForGroup(g.items), margin: { left: margin, right: margin }, styles: { @@ -144,9 +144,8 @@ export function generateStatusReportPdf(opts: StatusReportOptions): jsPDF { }, alternateRowStyles: { fillColor: [248, 248, 246] }, columnStyles: { - 0: { cellWidth: 96 }, + 0: { cellWidth: 110 }, 1: { cellWidth: "auto" }, - 2: { cellWidth: 96, fontSize: 8.5, textColor: 80 }, }, didDrawPage: () => { // Footer with page number From 4516fd400ae0e139f415706aa841aaf68131da11 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 18:24:24 +0000 Subject: [PATCH 3/3] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/status-tab.tsx | 57 +++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/src/components/cases/status-tab.tsx b/src/components/cases/status-tab.tsx index 7fd49d9..ea79d19 100644 --- a/src/components/cases/status-tab.tsx +++ b/src/components/cases/status-tab.tsx @@ -6,7 +6,7 @@ import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/lib/auth"; -import { Plus, Trash2, Loader2, FileDown } from "lucide-react"; +import { Plus, Trash2, Loader2, FileDown, Pencil } from "lucide-react"; import { formatDateTime } from "@/lib/format"; import { toast } from "sonner"; import { downloadStatusReport } from "@/lib/status-pdf"; @@ -16,11 +16,18 @@ export function CaseStatusTab({ caseId, caseLabel }: { caseId: string; caseLabel const [items, setItems] = useState([]); const [showForm, setShowForm] = useState(false); const [submitting, setSubmitting] = useState(false); + const [editingId, setEditingId] = useState(null); const nowLocal = () => { const d = new Date(); d.setMinutes(d.getMinutes() - d.getTimezoneOffset()); return d.toISOString().slice(0, 16); }; + const toLocalInput = (iso: string) => { + const d = new Date(iso); + if (isNaN(d.getTime())) return nowLocal(); + d.setMinutes(d.getMinutes() - d.getTimezoneOffset()); + return d.toISOString().slice(0, 16); + }; const [form, setForm] = useState({ title: nowLocal(), body: "" }); const load = async () => { @@ -41,19 +48,29 @@ export function CaseStatusTab({ caseId, caseLabel }: { caseId: string; caseLabel useEffect(() => { load(); }, [caseId]); + const resetForm = () => { + setEditingId(null); + setShowForm(false); + setForm({ title: nowLocal(), body: "" }); + }; + + const startEdit = (item: any) => { + setEditingId(item.id); + setForm({ title: toLocalInput(item.title), body: item.body }); + setShowForm(true); + }; + const submit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.title.trim() || !form.body.trim()) { toast.error("Date/time and details required"); return; } setSubmitting(true); - const { error } = await supabase.from("status_updates").insert({ - case_id: caseId, - title: form.title.trim(), - body: form.body.trim(), - created_by: user?.id, - }); + const payload = { title: form.title.trim(), body: form.body.trim() }; + const { error } = editingId + ? await supabase.from("status_updates").update(payload).eq("id", editingId) + : await supabase.from("status_updates").insert({ case_id: caseId, created_by: user?.id, ...payload }); setSubmitting(false); if (error) toast.error(error.message); - else { toast.success("Update logged"); setShowForm(false); setForm({ title: nowLocal(), body: "" }); load(); } + else { toast.success(editingId ? "Update saved" : "Update logged"); resetForm(); load(); } }; const del = async (item: any) => { @@ -83,7 +100,7 @@ export function CaseStatusTab({ caseId, caseLabel }: { caseId: string; caseLabel - @@ -105,10 +122,13 @@ export function CaseStatusTab({ caseId, caseLabel }: { caseId: string; caseLabel