Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-04-20 00:41:37 +00:00
co-authored by renee-png
parent f204f9c33e
commit e219a8cd69
+27 -4
View File
@@ -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<FirmInfo | null>(null);
const [template, setTemplate] = useState<FormTemplateConfig | null>(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 (
<div className="space-y-4">
<Card>