diff --git a/src/routes/calendar.index.tsx b/src/routes/calendar.index.tsx index b229a67..862fc16 100644 --- a/src/routes/calendar.index.tsx +++ b/src/routes/calendar.index.tsx @@ -341,6 +341,7 @@ function CalendarPage() { }; const openCreate = (presetDate?: Date) => { + setEditingId(null); setFTitle(""); setFType("client_meeting"); setFStart(presetDate ?? selected); @@ -348,12 +349,33 @@ function CalendarPage() { setFEndTime("10:00"); setFAllDay(false); setFCase("none"); + setFClient("none"); setFLocation(""); setFNotes(""); setFAssignee("self"); setDialogOpen(true); }; + const openEdit = (evt: Evt) => { + if (evt.source !== "event") return; // tasks/hearings edit elsewhere + setEditingId(evt.id); + setFTitle(evt.title); + setFType((EVENT_TYPE_MAP[evt.event_type] ? evt.event_type : "other") as EventTypeKey); + const dt = parseISO(evt.start); + setFStart(dt); + setFAllDay(evt.all_day); + if (!evt.all_day) { + setFStartTime(format(dt, "HH:mm")); + setFEndTime(evt.end ? format(parseISO(evt.end), "HH:mm") : format(dt, "HH:mm")); + } + setFCase(evt.case_id ?? "none"); + setFClient(evt.client_id ?? "none"); + setFLocation(evt.location ?? ""); + setFNotes(evt.description ?? ""); + setFAssignee(evt.owner_id ?? "self"); + setDialogOpen(true); + }; + const handleCreate = async () => { if (!user || !fTitle.trim() || !fStart) { toast.error("Title and date are required"); @@ -365,23 +387,42 @@ function CalendarPage() { const endISO = fAllDay ? null : `${dateStr}T${fEndTime}:00`; const ownerId = fAssignee === "self" ? user.id : fAssignee; - const { error } = await supabase.from("events").insert({ + const payload = { title: fTitle.trim(), event_type: fType, start_at: startISO, end_at: endISO, all_day: fAllDay, case_id: fCase === "none" ? null : fCase, + client_id: fClient === "none" ? null : fClient, location: fLocation.trim() || null, description: fNotes.trim() || null, - created_by: ownerId, - }); + }; + + const { error } = editingId + ? await supabase.from("events").update(payload).eq("id", editingId) + : await supabase.from("events").insert({ ...payload, created_by: ownerId }); setSaving(false); if (error) { toast.error(error.message); return; } - toast.success("Event scheduled"); + toast.success(editingId ? "Event updated" : "Event scheduled"); + setDialogOpen(false); + reload(); + }; + + const handleDelete = async () => { + if (!editingId) return; + if (!confirm("Delete this event?")) return; + setSaving(true); + const { error } = await supabase.from("events").delete().eq("id", editingId); + setSaving(false); + if (error) { + toast.error(error.message); + return; + } + toast.success("Event deleted"); setDialogOpen(false); reload(); };