Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-04-19 19:57:50 +00:00
co-authored by renee-png
parent 9325238a87
commit 9e45c4005a
2 changed files with 21 additions and 14 deletions
-9
View File
@@ -1046,12 +1046,3 @@ const rootRouteChildren: RootRouteChildren = {
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
._addFileTypes<FileRouteTypes>()
import type { getRouter } from './router.tsx'
import type { createStart } from '@tanstack/react-start'
declare module '@tanstack/react-start' {
interface Register {
ssr: true
router: Awaited<ReturnType<typeof getRouter>>
}
}
+21 -5
View File
@@ -116,11 +116,11 @@ function InvoicesIndex() {
const loadUnbilled = async () => {
try {
setTabsLoaded(false);
const [t, e] = await Promise.all([
const [timeRows, expenseRows] = await Promise.all([
fetchAllPages<any>(async (from, to) => {
const result = await supabase
.from("time_entries")
.select("id, work_date, description, hours, hourly_rate, billable, user_id, invoice_id, case_id, case:cases(id, case_number, title, client_id, client:clients(id, name)), profile:profiles!time_entries_user_id_fkey(id, full_name, email)")
.select("id, work_date, description, hours, hourly_rate, billable, user_id, invoice_id, case_id, case:cases(id, case_number, title, client_id, client:clients(id, name))")
.eq("billable", true)
.order("work_date", { ascending: false })
.range(from, to);
@@ -129,15 +129,31 @@ function InvoicesIndex() {
fetchAllPages<any>(async (from, to) => {
const result = await supabase
.from("expenses")
.select("id, expense_date, description, amount, billable, user_id, invoice_id, case_id, case:cases(id, case_number, title, client_id, client:clients(id, name)), profile:profiles!expenses_user_id_fkey(id, full_name, email)")
.select("id, expense_date, description, amount, billable, user_id, invoice_id, case_id, case:cases(id, case_number, title, client_id, client:clients(id, name))")
.eq("billable", true)
.order("expense_date", { ascending: false })
.range(from, to);
return { data: result.data, error: result.error ? { message: result.error.message } : null };
}),
]);
setTime(t);
setExpenses(e);
const userIds = Array.from(new Set([
...timeRows.map((row) => row.user_id).filter(Boolean),
...expenseRows.map((row) => row.user_id).filter(Boolean),
]));
let profileMap: Record<string, any> = {};
if (userIds.length) {
const { data: profiles, error: profilesError } = await supabase
.from("profiles")
.select("id, full_name, email")
.in("id", userIds);
if (profilesError) throw new Error(profilesError.message);
profileMap = Object.fromEntries((profiles ?? []).map((profile: any) => [profile.id, profile]));
}
setTime(timeRows.map((row) => ({ ...row, profile: row.user_id ? profileMap[row.user_id] ?? null : null })));
setExpenses(expenseRows.map((row) => ({ ...row, profile: row.user_id ? profileMap[row.user_id] ?? null : null })));
} catch (error: any) {
toast.error(error?.message ?? "Could not load unbilled items");
setTime([]);