import { useTranslation } from "react-i18next"; import type { CategoryOverTimeData } from "../../shared/types"; const cadFormatter = (value: number) => new Intl.NumberFormat("en-CA", { style: "currency", currency: "CAD", maximumFractionDigits: 0 }).format(value); function formatMonth(month: string): string { const [year, m] = month.split("-"); const date = new Date(Number(year), Number(m) - 1); return date.toLocaleDateString("default", { month: "short", year: "2-digit" }); } interface CategoryOverTimeTableProps { data: CategoryOverTimeData; hiddenCategories?: Set; } export default function CategoryOverTimeTable({ data, hiddenCategories }: CategoryOverTimeTableProps) { const { t } = useTranslation(); if (data.data.length === 0) { return (
{t("dashboard.noData")}
); } const visibleCategories = hiddenCategories?.size ? data.categories.filter((name) => !hiddenCategories.has(name)) : data.categories; const months = data.data.map((d) => d.month); return (
{months.map((month) => ( ))} {visibleCategories.map((category) => { const rowTotal = data.data.reduce((sum, d) => sum + ((d as Record)[category] as number || 0), 0); return ( {months.map((month) => { const monthData = data.data.find((d) => d.month === month); const value = (monthData as Record)?.[category] as number || 0; return ( ); })} ); })} {months.map((month) => { const monthData = data.data.find((d) => d.month === month); const monthTotal = visibleCategories.reduce( (sum, cat) => sum + ((monthData as Record)?.[cat] as number || 0), 0, ); return ( ); })}
{t("budget.category")} {formatMonth(month)} {t("common.total")}
{category} {value ? cadFormatter(value) : "—"} {cadFormatter(rowTotal)}
{t("common.total")} {cadFormatter(monthTotal)} {cadFormatter( visibleCategories.reduce( (sum, cat) => sum + data.data.reduce((s, d) => s + ((d as Record)[cat] as number || 0), 0), 0, ), )}
); }