From 6becc98850e01f317027a2eb653340a1f2633a82 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:27:12 +0000 Subject: [PATCH 1/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/time-tab.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/components/cases/time-tab.tsx b/src/components/cases/time-tab.tsx index 83693d6..ce376fb 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; From 62c9b79d0b138c4b5445de10d982d7010cc85f89 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:27:25 +0000 Subject: [PATCH 2/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/time-tab.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/components/cases/time-tab.tsx b/src/components/cases/time-tab.tsx index ce376fb..1b1b855 100644 --- a/src/components/cases/time-tab.tsx +++ b/src/components/cases/time-tab.tsx @@ -46,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") @@ -64,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; From 3ed1f2a0f46004b8e7ab9f76317924c7fd252f6b Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:27:37 +0000 Subject: [PATCH 3/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/time-tab.tsx | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/components/cases/time-tab.tsx b/src/components/cases/time-tab.tsx index 1b1b855..0046930 100644 --- a/src/components/cases/time-tab.tsx +++ b/src/components/cases/time-tab.tsx @@ -160,6 +160,37 @@ export function CaseTimeTab({ caseRecord, onInvoice }: CaseTimeTabProps) { {showForm && ( + {fees.length > 0 && ( +
+ + +
+ )}
From 30b32fe30092335578ff65e8f6bff83fdc3b0040 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:27:45 +0000 Subject: [PATCH 4/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/expenses-tab.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/components/cases/expenses-tab.tsx b/src/components/cases/expenses-tab.tsx index 615a363..5c29b66 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(); From b2d6d2c5371eddd751b6a339cc6918dc79b51d53 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:27:51 +0000 Subject: [PATCH 5/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/expenses-tab.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/cases/expenses-tab.tsx b/src/components/cases/expenses-tab.tsx index 5c29b66..07e4d90 100644 --- a/src/components/cases/expenses-tab.tsx +++ b/src/components/cases/expenses-tab.tsx @@ -39,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") From 345b58a626bba38ecfa17d1846b998d32e136032 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:27:59 +0000 Subject: [PATCH 6/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/expenses-tab.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/cases/expenses-tab.tsx b/src/components/cases/expenses-tab.tsx index 07e4d90..f20afa4 100644 --- a/src/components/cases/expenses-tab.tsx +++ b/src/components/cases/expenses-tab.tsx @@ -53,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); From ac7a84c62c10038a4f6b9c8e6b617d6e440f5573 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 01:28:10 +0000 Subject: [PATCH 7/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/expenses-tab.tsx | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/components/cases/expenses-tab.tsx b/src/components/cases/expenses-tab.tsx index f20afa4..8affb91 100644 --- a/src/components/cases/expenses-tab.tsx +++ b/src/components/cases/expenses-tab.tsx @@ -139,6 +139,37 @@ export function CaseExpensesTab({ caseId }: { caseId: string }) { {showForm && ( + {fees.length > 0 && ( +
+ + +
+ )}