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 { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { supabase } from "@/integrations/supabase/client"; import { Plus, Search, Archive, ArchiveRestore } from "lucide-react"; import { formatDate, statusBadgeClass } from "@/lib/format"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { setArchived } from "@/lib/archive"; export const Route = createFileRoute("/cases/")({ component: () => ( ), }); function CasesList() { const [cases, setCases] = useState([]); const [q, setQ] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [view, setView] = useState<"active" | "archived">("active"); const load = async () => { const { data } = await supabase .from("cases") .select("*, client:clients(name), assignee:profiles!cases_assigned_attorney_id_fkey(full_name, email)") .order("updated_at", { ascending: false }); setCases(data ?? []); }; useEffect(() => { load(); }, []); const visible = cases.filter((c) => view === "archived" ? c.archived_at : !c.archived_at, ); const filtered = visible.filter((c) => { const okStatus = statusFilter === "all" || c.status === statusFilter; const okQ = [c.title, c.case_number, c.client?.name].filter(Boolean).join(" ").toLowerCase().includes(q.toLowerCase()); return okStatus && okQ; }); const archivedCount = cases.filter((c) => c.archived_at).length; const activeCount = cases.length - archivedCount; const onArchive = async (id: string, archived: boolean) => { if (await setArchived("cases", id, archived)) load(); }; return ( New case } />
setView(v as "active" | "archived")}> Active ({activeCount}) Archived ({archivedCount})
setQ(e.target.value)} placeholder="Search cases…" className="pl-9" />
{filtered.length === 0 && ( )} {filtered.map((c) => ( ))}
Case Client Status Attorney Opened
{view === "archived" ? "No archived cases." : "No cases."}
{c.title}
{c.case_number}
{c.client?.name ?? "—"} {c.status.replace("_", " ")} {c.assignee?.full_name || c.assignee?.email || "—"} {formatDate(c.opened_at)}
); }