From a76d75d912004fc3d9a8cbbc9529eab276cacaa8 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 00:40:52 +0000 Subject: [PATCH] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/forms/itf-form.tsx | 32 ++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/components/forms/itf-form.tsx b/src/components/forms/itf-form.tsx index 21f6c22..58d1675 100644 --- a/src/components/forms/itf-form.tsx +++ b/src/components/forms/itf-form.tsx @@ -11,12 +11,14 @@ import { fmtCurrency, fmtDateLong, 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"; export function ItfForm() { @@ -26,6 +28,7 @@ export function ItfForm() { const [homeownerId, setHomeownerId] = useState(""); const [firm, setFirm] = useState(null); const [template, setTemplate] = useState(null); + const [saveToCaseOpen, setSaveToCaseOpen] = useState(false); const [letterDate, setLetterDate] = useState(new Date().toISOString().slice(0, 10)); const [certifiedNo, setCertifiedNo] = useState(""); @@ -55,10 +58,10 @@ export function ItfForm() { (parseFloat(adminFees) || 0) - (parseFloat(lessPayments) || 0); - const handleExport = () => { + const buildPdf = () => { if (!client || !template) { toast.error("Select a client first"); - return; + return null; } const returnAddress = [client.name]; @@ -68,7 +71,6 @@ export function ItfForm() { const recipient: string[] = [ownerFullName(homeowner) || "[Homeowner]"]; if (homeowner?.address) recipient.push(homeowner.address); - // Compose lien reference inline so users don't need to edit raw template. const lienRef = lienBookPage || lienRecordedDate ? ` A Claim of Lien was recorded against the subject property${ @@ -95,7 +97,7 @@ export function ItfForm() { extra: { lienRef }, }); - const doc = renderLetterPdf({ + return renderLetterPdf({ template, returnAddress, topRightLine: tokens.date as string, @@ -106,13 +108,33 @@ export function ItfForm() { total: { label: labels.totalDue ?? "TOTAL DUE", amount: total }, filename: `ITF_${ownerFullName(homeowner) || "draft"}_${letterDate}`, }); + }; - const name = promptFilename(`ITF_${ownerFullName(homeowner) || "draft"}_${letterDate}`, "pdf"); + const defaultName = `ITF_${ownerFullName(homeowner) || "draft"}_${letterDate}`; + + const handleExport = () => { + const doc = buildPdf(); + if (!doc) return; + const name = promptFilename(defaultName, "pdf"); if (!name) return; doc.save(`${name}.pdf`); toast.success("ITF 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 (