From b4dace067307ba64a75a26505c954d3c86b2b1ae Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Sun, 21 Dec 2025 07:35:35 +0100 Subject: [PATCH] feat: enhance transactions page with total amount and count display; integrate collapsible statistics card and update chart data handling --- app/transactions/page.tsx | 113 +++++++++++++++++++++++---- hooks/use-transactions-chart-data.ts | 15 ++++ 2 files changed, 113 insertions(+), 15 deletions(-) diff --git a/app/transactions/page.tsx b/app/transactions/page.tsx index 4704e00..d68fa63 100644 --- a/app/transactions/page.tsx +++ b/app/transactions/page.tsx @@ -2,7 +2,14 @@ import { useCallback, useState } from "react"; import { PageLayout, PageHeader } from "@/components/layout"; -import { RefreshCw, Maximize2, Minimize2 } from "lucide-react"; +import { + RefreshCw, + Maximize2, + Minimize2, + Receipt, + Euro, + ChevronDown, +} from "lucide-react"; import { TransactionFilters, TransactionBulkActions, @@ -16,6 +23,12 @@ import { OFXImportDialog } from "@/components/import/ofx-import-dialog"; import { MonthlyChart } from "@/components/statistics"; import { useQueryClient } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "@/components/ui/collapsible"; import { Upload } from "lucide-react"; import { Dialog, @@ -98,7 +111,12 @@ export default function TransactionsPage() { }); // Chart data - const { monthlyData, isLoading: isLoadingChart } = useTransactionsChartData({ + const { + monthlyData, + isLoading: isLoadingChart, + totalAmount: chartTotalAmount, + totalCount: chartTotalCount, + } = useTransactionsChartData({ selectedAccounts, selectedCategories, period, @@ -138,6 +156,10 @@ export default function TransactionsPage() { ? Math.round((uncategorizedCount / totalTransactions) * 100) : 0; + // Use total from chart data (all filtered transactions) or fallback to paginated data + const totalAmount = chartTotalAmount ?? 0; + const displayTotalCount = chartTotalCount ?? totalTransactions; + // For filter comboboxes, we'll use empty arrays for now // They can be enhanced later with separate queries if needed const transactionsForAccountFilter: never[] = []; @@ -199,19 +221,80 @@ export default function TransactionsPage() { transactionsForCategoryFilter={transactionsForCategoryFilter} /> - {!isLoadingChart && monthlyData.length > 0 && ( -
- -
+ {(!isLoadingChart || !isLoadingTransactions) && ( + + + + + Statistiques + + + + + + + + {/* Summary cards */} + {!isLoadingTransactions && ( +
+ + +
+
+

+ Nombre de transactions +

+

+ {displayTotalCount} +

+
+ +
+
+
+ + +
+
+

+ Total +

+

= 0 + ? "text-emerald-600" + : "text-red-600" + }`} + > + {formatCurrency(totalAmount)} +

+
+ +
+
+
+
+ )} + + {/* Chart */} + {!isLoadingChart && monthlyData.length > 0 && ( + + )} +
+
+
+
)} { + if (!transactionsData) return 0; + return transactionsData.transactions.reduce( + (sum, t) => sum + t.amount, + 0 + ); + }, [transactionsData]); + + const totalCount = useMemo(() => { + return transactionsData?.total || 0; + }, [transactionsData?.total]); + return { monthlyData, categoryData, isLoading, + totalAmount, + totalCount, }; }