import { Fragment, useState } from "react"; import { useTranslation } from "react-i18next"; import { ChevronUp, ChevronDown, MessageSquare } from "lucide-react"; import type { TransactionRow, TransactionSort, Category, } from "../../shared/types"; interface TransactionTableProps { rows: TransactionRow[]; sort: TransactionSort; categories: Category[]; onSort: (column: TransactionSort["column"]) => void; onCategoryChange: (txId: number, categoryId: number | null) => void; onNotesChange: (txId: number, notes: string) => void; } function SortIcon({ column, sort, }: { column: TransactionSort["column"]; sort: TransactionSort; }) { if (sort.column !== column) return ; return sort.direction === "asc" ? ( ) : ( ); } export default function TransactionTable({ rows, sort, categories, onSort, onCategoryChange, onNotesChange, }: TransactionTableProps) { const { t } = useTranslation(); const [expandedId, setExpandedId] = useState(null); const [editingNotes, setEditingNotes] = useState(""); if (rows.length === 0) { return (

{t("transactions.noTransactions")}

); } const columns: Array<{ key: TransactionSort["column"]; label: string; align: string; }> = [ { key: "date", label: t("transactions.date"), align: "text-left" }, { key: "description", label: t("transactions.description"), align: "text-left" }, { key: "amount", label: t("transactions.amount"), align: "text-right" }, { key: "category_name", label: t("transactions.category"), align: "text-left" }, ]; const toggleNotes = (row: TransactionRow) => { if (expandedId === row.id) { setExpandedId(null); } else { setExpandedId(row.id); setEditingNotes(row.notes ?? ""); } }; const handleNotesSave = (txId: number) => { onNotesChange(txId, editingNotes); setExpandedId(null); }; return (
{columns.map((col) => ( ))} {rows.map((row) => ( {expandedId === row.id && (
onSort(col.key)} className={`px-3 py-2 ${col.align} text-xs font-medium text-[var(--muted-foreground)] cursor-pointer select-none hover:text-[var(--foreground)] transition-colors`} > {col.label}
{row.date} {row.description} = 0 ? "text-[var(--positive)]" : "text-[var(--negative)]" }`} > {row.amount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2, })}