diff --git a/src/components/forms/nola-form.tsx b/src/components/forms/nola-form.tsx index a5d4f29..8251b0e 100644 --- a/src/components/forms/nola-form.tsx +++ b/src/components/forms/nola-form.tsx @@ -10,12 +10,14 @@ import { fetchFirm, fmtCurrency, ownerFullName, + savePdfToDocuments, type ClientLite, type HomeownerLite, type FirmInfo, } from "@/lib/forms-shared"; import { buildLetterTokens, loadFormTemplate, renderLetterPdf, type FormTemplateConfig } from "@/lib/form-templates"; import { promptFilename } from "@/lib/prompt-filename"; +import { SaveToCaseDialog } from "./save-to-case-dialog"; import { toast } from "sonner"; interface Item { @@ -30,6 +32,7 @@ export function NolaForm() { const [homeownerId, setHomeownerId] = useState(""); const [firm, setFirm] = useState(null); const [template, setTemplate] = useState(null); + const [saveToCaseOpen, setSaveToCaseOpen] = useState(false); const [date, setDate] = useState(new Date().toISOString().slice(0, 10)); const [dueDate, setDueDate] = useState(() => { @@ -61,10 +64,10 @@ export function NolaForm() { const addItem = () => setItems((p) => [...p, { description: "", amount: "0.00" }]); const removeItem = (i: number) => setItems((p) => p.filter((_, idx) => idx !== i)); - const handleExport = () => { + const buildPdf = () => { if (!client || !template) { toast.error("Select a client first"); - return; + return null; } const returnAddress = [client.name]; @@ -83,7 +86,7 @@ export function NolaForm() { total, }); - const doc = renderLetterPdf({ + return renderLetterPdf({ template, returnAddress, topRightLine: tokens.date as string, @@ -94,13 +97,33 @@ export function NolaForm() { total: { label: template.itemLabels?.totalDue ?? "TOTAL DUE", amount: total }, filename: `NOLA_${ownerFullName(homeowner) || "draft"}_${date}`, }); + }; - const name = promptFilename(`NOLA_${ownerFullName(homeowner) || "draft"}_${date}`, "pdf"); + const defaultName = `NOLA_${ownerFullName(homeowner) || "draft"}_${date}`; + + const handleExport = () => { + const doc = buildPdf(); + if (!doc) return; + const name = promptFilename(defaultName, "pdf"); if (!name) return; doc.save(`${name}.pdf`); toast.success("NOLA PDF downloaded"); }; + const handleSaveToCase = async ({ caseId, name, folder }: { caseId: string; name: string; folder: string }) => { + const doc = buildPdf(); + if (!doc) return; + const filename = name.endsWith(".pdf") ? name : `${name}.pdf`; + await savePdfToDocuments({ + blob: doc.output("blob"), + caseId, + name: filename, + folder, + mimeType: "application/pdf", + }); + toast.success("Saved to case files"); + }; + return (