import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { useState } from "react"; import { ProtectedLayout } from "@/components/protected-layout"; import { PageContainer, PageHeader } from "@/components/app-shell"; import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { supabase } from "@/integrations/supabase/client"; import { useAuth } from "@/lib/auth"; import { toast } from "sonner"; import { Loader2, Plus, Save, Trash2 } from "lucide-react"; export const Route = createFileRoute("/documents/templates/new")({ component: NewTemplatePage, }); interface FieldDef { key: string; label: string; type: "text" | "textarea" | "date" | "number" } function NewTemplatePage() { const { user } = useAuth(); const navigate = useNavigate(); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [fields, setFields] = useState([]); const [body, setBody] = useState("Dear {{client_name}},\n\n"); const [saving, setSaving] = useState(false); const addField = () => setFields((f) => [...f, { key: `field_${f.length + 1}`, label: `Field ${f.length + 1}`, type: "text" }]); const removeField = (i: number) => setFields((f) => f.filter((_, idx) => idx !== i)); const updateField = (i: number, patch: Partial) => setFields((f) => f.map((x, idx) => (idx === i ? { ...x, ...patch } : x))); const insertToken = (key: string) => setBody((b) => b + `{{${key}}}`); const onSave = async () => { if (!name.trim()) { toast.error("Name is required"); return; } setSaving(true); const { data, error } = await supabase.from("document_templates").insert({ name: name.trim(), description: description.trim() || null, kind: "general", body, fields: fields as any, created_by: user?.id, }).select().single(); setSaving(false); if (error) { toast.error(error.message); return; } toast.success("Template created"); navigate({ to: "/documents/templates/$templateId", params: { templateId: data.id } }); }; return ( {saving ? : } Save template } />
setName(e.target.value)} placeholder="e.g. Demand Letter" />
setDescription(e.target.value)} placeholder="Optional" />
{fields.length === 0 &&
No fields yet. Add fields like client_name, amount_due, due_date.
}
{fields.map((f, i) => (
updateField(i, { key: e.target.value.replace(/[^a-zA-Z0-9_]/g, "_") })} placeholder="key" /> updateField(i, { label: e.target.value })} placeholder="Label" />
))}