import { useMemo } from "react"; import { flexRender, getCoreRowModel, useReactTable, type ColumnDef, } from "@tanstack/react-table"; import type { PeriodicExpense } from "@/lib/api"; import { Button } from "@/components/ui/button"; import { Pencil, Trash2 } from "lucide-react"; const monthLabels = [ "", "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic", ]; function formatPeriods(periods: number[]): string { if (periods.length === 0) return ""; if (periods.length === 12) return "Ene-Dic"; const sorted = [...periods].sort((a, b) => a - b); const ranges: string[] = []; let start = sorted[0]; let prev = sorted[0]; for (let i = 1; i <= sorted.length; i++) { const curr = sorted[i]; if (curr === prev + 1) { prev = curr; } else { ranges.push(start === prev ? monthLabels[start] : `${monthLabels[start]}-${monthLabels[prev]}`); start = curr; prev = curr; } } return ranges.join(", "); } interface PeriodicExpensesTableProps { data: PeriodicExpense[]; onEdit: (item: PeriodicExpense) => void; onDelete: (id: number) => void; } export function PeriodicExpensesTable({ data, onEdit, onDelete }: PeriodicExpensesTableProps) { const columns = useMemo[]>( () => [ { header: "Descripción", accessorKey: "description", cell: ({ row }) => ( {row.getValue("description")} ), }, { header: "Monto", accessorKey: "defaultAmount", cell: ({ row }) => { const amount = Number(row.getValue("defaultAmount")); return ( ${amount.toLocaleString("es-AR", { minimumFractionDigits: 2 })} ); }, }, { header: "Vence", accessorKey: "defaultDueDay", cell: ({ row }) => Día {row.getValue("defaultDueDay")}, }, { header: "Meses", accessorKey: "periods", cell: ({ row }) => { const periods: number[] = row.getValue("periods"); return ( {formatPeriods(periods)} ); }, }, { id: "actions", cell: ({ row }) => (
), }, ], [onEdit, onDelete], ); const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), }); return (
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ))} ))} {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} ))} {table.getRowModel().rows.length === 0 && ( )}
{flexRender(header.column.columnDef.header, header.getContext())}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
No hay gastos periódicos todavía.
); }