import { createFileRoute, Link } from "@tanstack/react-router"; import { useEffect, useState } from "react"; import { ProtectedLayout } from "@/components/protected-layout"; import { PageContainer, PageHeader } from "@/components/app-shell"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { supabase } from "@/integrations/supabase/client"; import { formatDate } from "@/lib/format"; import { FilePlus2, FileText, Gavel, LayoutTemplate, Plus, Download, Trash2 } from "lucide-react"; import { toast } from "sonner"; export const Route = createFileRoute("/documents/")({ component: DocumentsIndex, }); function DocumentsIndex() { const [generated, setGenerated] = useState([]); const [templates, setTemplates] = useState([]); const load = async () => { const [g, t] = await Promise.all([ supabase.from("generated_documents").select("*").order("created_at", { ascending: false }).limit(20), supabase.from("document_templates").select("*").order("name"), ]); setGenerated(g.data ?? []); setTemplates(t.data ?? []); }; useEffect(() => { load(); }, []); const removeGenerated = async (row: any) => { if (!confirm(`Delete ${row.name}?`)) return; if (row.storage_path) await supabase.storage.from("generated-documents").remove([row.storage_path]); const { error } = await supabase.from("generated_documents").delete().eq("id", row.id); if (error) toast.error(error.message); else { toast.success("Deleted"); load(); } }; const downloadGenerated = async (row: any) => { if (!row.storage_path) { toast.error("No file stored for this document"); return; } const { data, error } = await supabase.storage.from("generated-documents").createSignedUrl(row.storage_path, 60); if (error) { toast.error(error.message); return; } window.open(data.signedUrl, "_blank"); }; return ( } />
Florida Pleading
Court caption header in Bookman Old Style 12pt.
New template
Define custom merge fields and reuse them.
Template library
{templates.length} template{templates.length === 1 ? "" : "s"} available.
Recent documents {generated.length === 0 ? (
No documents yet. Create a pleading or use a template.
) : ( {generated.map((d) => ( ))}
Name Type Created Actions
{d.name}
{d.kind} {formatDate(d.created_at)} {d.storage_path && ( )}
)}
); }