import { useState } from 'react' import { useTranslation } from 'react-i18next' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Input } from '@/components/ui/input' import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend } from 'recharts' import type { BudgetDetail } from '@/lib/api' import { formatCurrency } from '@/lib/format' interface Props { budget: BudgetDetail onUpdate: (itemId: string, data: { actual_amount?: number }) => Promise } export function VariableExpenses({ budget, onUpdate }: Props) { const { t } = useTranslation() const expenses = budget.items.filter((i) => i.category_type === 'variable_expense') const chartData = expenses.map((item) => ({ name: item.category_name, [t('dashboard.budget')]: item.budgeted_amount, [t('dashboard.actual')]: item.actual_amount, })) return ( {t('dashboard.variableExpenses')} {t('dashboard.budget')} {t('dashboard.actual')} {t('dashboard.remaining')} {expenses.map((item) => ( onUpdate(item.id, { actual_amount: actual })} /> ))} {t('dashboard.budget')} {formatCurrency(expenses.reduce((s, i) => s + i.budgeted_amount, 0), budget.currency)} {formatCurrency(expenses.reduce((s, i) => s + i.actual_amount, 0), budget.currency)} {formatCurrency(expenses.reduce((s, i) => s + (i.budgeted_amount - i.actual_amount), 0), budget.currency)}
{chartData.length > 0 && (
)}
) } function InlineEditRow({ label, budgeted, actual, currency, onSave, }: { label: string budgeted: number actual: number currency: string onSave: (value: number) => Promise }) { const [editing, setEditing] = useState(false) const [value, setValue] = useState(String(actual)) const handleBlur = async () => { const num = parseFloat(value) if (!isNaN(num) && num !== actual) { await onSave(num) } setEditing(false) } const remaining = budgeted - actual return ( {label} {formatCurrency(budgeted, currency)} {editing ? ( setValue(e.target.value)} onBlur={handleBlur} onKeyDown={(e) => e.key === 'Enter' && handleBlur()} className="ml-auto w-28 text-right" autoFocus /> ) : ( { setValue(String(actual)); setEditing(true) }} > {formatCurrency(actual, currency)} )} {formatCurrency(remaining, currency)} ) }