mirror of
https://github.com/elisiariocouto/leggen.git
synced 2025-12-14 12:02:19 +00:00
fix(frontend): Remove broken running balance feature in transactions table.
This commit is contained in:
@@ -31,7 +31,7 @@ import { DataTablePagination } from "./ui/data-table-pagination";
|
|||||||
import { Card, CardContent } from "./ui/card";
|
import { Card, CardContent } from "./ui/card";
|
||||||
import { Alert, AlertDescription, AlertTitle } from "./ui/alert";
|
import { Alert, AlertDescription, AlertTitle } from "./ui/alert";
|
||||||
import { Button } from "./ui/button";
|
import { Button } from "./ui/button";
|
||||||
import type { Account, Transaction, ApiResponse, Balance } from "../types/api";
|
import type { Account, Transaction, ApiResponse } from "../types/api";
|
||||||
|
|
||||||
export default function TransactionsTable() {
|
export default function TransactionsTable() {
|
||||||
// Filter state consolidated into a single object
|
// Filter state consolidated into a single object
|
||||||
@@ -47,7 +47,6 @@ export default function TransactionsTable() {
|
|||||||
const [showRawModal, setShowRawModal] = useState(false);
|
const [showRawModal, setShowRawModal] = useState(false);
|
||||||
const [selectedTransaction, setSelectedTransaction] =
|
const [selectedTransaction, setSelectedTransaction] =
|
||||||
useState<Transaction | null>(null);
|
useState<Transaction | null>(null);
|
||||||
const [showRunningBalance, setShowRunningBalance] = useState(true);
|
|
||||||
|
|
||||||
// Pagination state
|
// Pagination state
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
@@ -102,11 +101,6 @@ export default function TransactionsTable() {
|
|||||||
queryFn: apiClient.getAccounts,
|
queryFn: apiClient.getAccounts,
|
||||||
});
|
});
|
||||||
|
|
||||||
const { data: balances } = useQuery<Balance[]>({
|
|
||||||
queryKey: ["balances"],
|
|
||||||
queryFn: apiClient.getBalances,
|
|
||||||
enabled: showRunningBalance,
|
|
||||||
});
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
data: transactionsResponse,
|
data: transactionsResponse,
|
||||||
@@ -185,53 +179,6 @@ export default function TransactionsTable() {
|
|||||||
filterState.minAmount ||
|
filterState.minAmount ||
|
||||||
filterState.maxAmount;
|
filterState.maxAmount;
|
||||||
|
|
||||||
// Calculate running balances
|
|
||||||
const calculateRunningBalances = (transactions: Transaction[]) => {
|
|
||||||
if (!balances || !showRunningBalance) return {};
|
|
||||||
|
|
||||||
const runningBalances: { [key: string]: number } = {};
|
|
||||||
const accountBalanceMap = new Map<string, number>();
|
|
||||||
|
|
||||||
// Create a map of account current balances
|
|
||||||
balances.forEach((balance) => {
|
|
||||||
if (balance.balance_type === "expected") {
|
|
||||||
accountBalanceMap.set(balance.account_id, balance.balance_amount);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Group transactions by account
|
|
||||||
const transactionsByAccount = new Map<string, Transaction[]>();
|
|
||||||
transactions.forEach((txn) => {
|
|
||||||
if (!transactionsByAccount.has(txn.account_id)) {
|
|
||||||
transactionsByAccount.set(txn.account_id, []);
|
|
||||||
}
|
|
||||||
transactionsByAccount.get(txn.account_id)!.push(txn);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Calculate running balance for each account
|
|
||||||
transactionsByAccount.forEach((accountTransactions, accountId) => {
|
|
||||||
const currentBalance = accountBalanceMap.get(accountId) || 0;
|
|
||||||
let runningBalance = currentBalance;
|
|
||||||
|
|
||||||
// Sort transactions by date (newest first) to work backwards
|
|
||||||
const sortedTransactions = [...accountTransactions].sort(
|
|
||||||
(a, b) =>
|
|
||||||
new Date(b.transaction_date).getTime() -
|
|
||||||
new Date(a.transaction_date).getTime(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Calculate running balance by working backwards from current balance
|
|
||||||
sortedTransactions.forEach((txn) => {
|
|
||||||
runningBalances[`${txn.account_id}-${txn.transaction_id}`] =
|
|
||||||
runningBalance;
|
|
||||||
runningBalance -= txn.transaction_value;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return runningBalances;
|
|
||||||
};
|
|
||||||
|
|
||||||
const runningBalances = calculateRunningBalances(transactions);
|
|
||||||
|
|
||||||
// Define columns
|
// Define columns
|
||||||
const columns: ColumnDef<Transaction>[] = [
|
const columns: ColumnDef<Transaction>[] = [
|
||||||
@@ -308,29 +255,6 @@ export default function TransactionsTable() {
|
|||||||
},
|
},
|
||||||
sortingFn: "basic",
|
sortingFn: "basic",
|
||||||
},
|
},
|
||||||
...(showRunningBalance
|
|
||||||
? [
|
|
||||||
{
|
|
||||||
id: "running_balance",
|
|
||||||
header: "Running Balance",
|
|
||||||
cell: ({ row }: { row: { original: Transaction } }) => {
|
|
||||||
const transaction = row.original;
|
|
||||||
const balanceKey = `${transaction.account_id}-${transaction.transaction_id}`;
|
|
||||||
const balance = runningBalances[balanceKey];
|
|
||||||
|
|
||||||
if (balance === undefined) return null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="text-right">
|
|
||||||
<p className="text-sm font-medium text-foreground">
|
|
||||||
{formatCurrency(balance, transaction.transaction_currency)}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
: []),
|
|
||||||
{
|
{
|
||||||
accessorKey: "transaction_date",
|
accessorKey: "transaction_date",
|
||||||
header: "Date",
|
header: "Date",
|
||||||
@@ -446,10 +370,6 @@ export default function TransactionsTable() {
|
|||||||
onClearFilters={handleClearFilters}
|
onClearFilters={handleClearFilters}
|
||||||
accounts={accounts}
|
accounts={accounts}
|
||||||
isSearchLoading={isSearchLoading}
|
isSearchLoading={isSearchLoading}
|
||||||
showRunningBalance={showRunningBalance}
|
|
||||||
onToggleRunningBalance={() =>
|
|
||||||
setShowRunningBalance(!showRunningBalance)
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* Results Summary */}
|
{/* Results Summary */}
|
||||||
@@ -669,17 +589,6 @@ export default function TransactionsTable() {
|
|||||||
transaction.transaction_currency,
|
transaction.transaction_currency,
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
{showRunningBalance && (
|
|
||||||
<p className="text-xs text-muted-foreground mb-1">
|
|
||||||
Balance:{" "}
|
|
||||||
{formatCurrency(
|
|
||||||
runningBalances[
|
|
||||||
`${transaction.account_id}-${transaction.transaction_id}`
|
|
||||||
] || 0,
|
|
||||||
transaction.transaction_currency,
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
<button
|
<button
|
||||||
onClick={() => handleViewRaw(transaction)}
|
onClick={() => handleViewRaw(transaction)}
|
||||||
className="inline-flex items-center px-2 py-1 text-xs bg-muted text-muted-foreground rounded hover:bg-accent transition-colors"
|
className="inline-flex items-center px-2 py-1 text-xs bg-muted text-muted-foreground rounded hover:bg-accent transition-colors"
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ export interface FilterBarProps {
|
|||||||
onClearFilters: () => void;
|
onClearFilters: () => void;
|
||||||
accounts?: Account[];
|
accounts?: Account[];
|
||||||
isSearchLoading?: boolean;
|
isSearchLoading?: boolean;
|
||||||
showRunningBalance: boolean;
|
|
||||||
onToggleRunningBalance: () => void;
|
|
||||||
className?: string;
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,8 +32,6 @@ export function FilterBar({
|
|||||||
onClearFilters,
|
onClearFilters,
|
||||||
accounts,
|
accounts,
|
||||||
isSearchLoading = false,
|
isSearchLoading = false,
|
||||||
showRunningBalance,
|
|
||||||
onToggleRunningBalance,
|
|
||||||
className,
|
className,
|
||||||
}: FilterBarProps) {
|
}: FilterBarProps) {
|
||||||
const hasActiveFilters =
|
const hasActiveFilters =
|
||||||
@@ -59,13 +55,6 @@ export function FilterBar({
|
|||||||
<h3 className="text-lg font-semibold text-card-foreground">
|
<h3 className="text-lg font-semibold text-card-foreground">
|
||||||
Transactions
|
Transactions
|
||||||
</h3>
|
</h3>
|
||||||
<Button
|
|
||||||
onClick={onToggleRunningBalance}
|
|
||||||
variant={showRunningBalance ? "default" : "outline"}
|
|
||||||
size="sm"
|
|
||||||
>
|
|
||||||
Balance
|
|
||||||
</Button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Primary Filters Row */}
|
{/* Primary Filters Row */}
|
||||||
|
|||||||
Reference in New Issue
Block a user