diff --git a/src/components/cases/expenses-tab.tsx b/src/components/cases/expenses-tab.tsx index 615a363..8affb91 100644 --- a/src/components/cases/expenses-tab.tsx +++ b/src/components/cases/expenses-tab.tsx @@ -9,6 +9,21 @@ import { useAuth } from "@/lib/auth"; import { Plus, Trash2, Loader2, Receipt as ReceiptIcon } from "lucide-react"; import { formatCurrency, formatDate } from "@/lib/format"; import { toast } from "sonner"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +interface FeeItem { + id: string; + name: string; + description: string | null; + amount: number; + billable: boolean; +} export function CaseExpensesTab({ caseId }: { caseId: string }) { const { user } = useAuth(); @@ -24,6 +39,9 @@ export function CaseExpensesTab({ caseId }: { caseId: string }) { const [receipt, setReceipt] = useState(null); const fileRef = useRef(null); + const [fees, setFees] = useState([]); + const [selectedFeeId, setSelectedFeeId] = useState(""); + const load = async () => { const { data } = await supabase .from("expenses") @@ -35,6 +53,19 @@ export function CaseExpensesTab({ caseId }: { caseId: string }) { useEffect(() => { load(); }, [caseId]); + useEffect(() => { + (async () => { + const { data } = await supabase + .from("fee_schedule_items") + .select("id, name, description, amount, billable") + .eq("category", "expense") + .eq("active", true) + .order("sort_order") + .order("name"); + setFees((data ?? []) as FeeItem[]); + })(); + }, []); + const submit = async (e: React.FormEvent) => { e.preventDefault(); const amount = parseFloat(form.amount); @@ -108,6 +139,37 @@ export function CaseExpensesTab({ caseId }: { caseId: string }) { {showForm && ( + {fees.length > 0 && ( +
+ + +
+ )}
diff --git a/src/components/cases/time-tab.tsx b/src/components/cases/time-tab.tsx index 83693d6..0046930 100644 --- a/src/components/cases/time-tab.tsx +++ b/src/components/cases/time-tab.tsx @@ -11,6 +11,21 @@ import { Plus, Trash2, Loader2, FilePlus } from "lucide-react"; import { formatCurrency, formatDate } from "@/lib/format"; import { roundToTenth } from "@/lib/timer"; import { toast } from "sonner"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +interface FeeItem { + id: string; + name: string; + description: string | null; + amount: number; + billable: boolean; +} interface CaseTimeTabProps { caseRecord: any; @@ -31,6 +46,9 @@ export function CaseTimeTab({ caseRecord, onInvoice }: CaseTimeTabProps) { billable: true, }); + const [fees, setFees] = useState([]); + const [selectedFeeId, setSelectedFeeId] = useState(""); + const load = async () => { const { data, error } = await supabase .from("time_entries") @@ -49,6 +67,20 @@ export function CaseTimeTab({ caseRecord, onInvoice }: CaseTimeTabProps) { useEffect(() => { load(); }, [caseRecord.id]); + // Load fee schedule (time category) + useEffect(() => { + (async () => { + const { data } = await supabase + .from("fee_schedule_items") + .select("id, name, description, amount, billable") + .eq("category", "time") + .eq("active", true) + .order("sort_order") + .order("name"); + setFees((data ?? []) as FeeItem[]); + })(); + }, []); + // Pull this user's default hourly rate; use it to prefill when case has no override. useEffect(() => { if (!user?.id) return; @@ -128,6 +160,37 @@ export function CaseTimeTab({ caseRecord, onInvoice }: CaseTimeTabProps) { {showForm && ( + {fees.length > 0 && ( +
+ + +
+ )}