From 8e9a13dd198697265db27fb19c50651dc00c118c Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Tue, 18 Aug 2026 13:44:06 +0530 Subject: [PATCH] expense list: replace accordion with flat Stripe-style rows - drop the per-row accordion and delete ExpenseDetail (was only used for the expanded view); rows are now static bordered cards with a hover highlight - row layout: logo | name/date + account chip | amount - tag chips were added to the row during iteration but removed for now until a better placement is settled --- src/Expense/ExpenseDetail.tsx | 24 ------- src/Expense/ExpenseList.tsx | 128 ++++++++++++++-------------------- 2 files changed, 51 insertions(+), 101 deletions(-) delete mode 100644 src/Expense/ExpenseDetail.tsx diff --git a/src/Expense/ExpenseDetail.tsx b/src/Expense/ExpenseDetail.tsx deleted file mode 100644 index 203994b..0000000 --- a/src/Expense/ExpenseDetail.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; -import { Box, Divider } from "@mui/material"; -import { DetailFieldRenderer } from "../../react-openapi"; -import type { ExpenseItem, ExpenseFieldConfigs } from "./types"; - -interface ExpenseDetailProps { - item: ExpenseItem; - fields: ExpenseFieldConfigs; -} - -export function ExpenseDetail({ item, fields }: ExpenseDetailProps) { - return ( - - - - - - - - - - - ); -} diff --git a/src/Expense/ExpenseList.tsx b/src/Expense/ExpenseList.tsx index 801ca1f..baa3117 100644 --- a/src/Expense/ExpenseList.tsx +++ b/src/Expense/ExpenseList.tsx @@ -1,18 +1,10 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { - Box, - Typography, - Accordion, - AccordionSummary, - AccordionDetails, -} from "@mui/material"; +import { Box, Typography } from "@mui/material"; import { alpha } from "@mui/material/styles"; -import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; import { ListCellRenderer, CurrencyField, applyDisplayFormat, formatCurrency } from "../../react-openapi"; import type { ExpenseItem, ExpenseFieldConfigs } from "./types"; import { isExpense, monthKey, monthLabel, parseOccurredAt } from "./types"; -import { ExpenseDetail } from "./ExpenseDetail"; interface GroupedMonth { key: string; @@ -43,86 +35,74 @@ function groupByMonth(items: ExpenseItem[]): GroupedMonth[] { .sort((a, b) => b.key.localeCompare(a.key)); } -interface ExpenseCardProps { +interface ExpenseRowProps { item: ExpenseItem; - expanded: boolean; currency: string; fields: ExpenseFieldConfigs; - onToggle: (id: string) => void; } -const ExpenseCard = React.memo(function ExpenseCard({ item, expanded, currency, fields, onToggle }: ExpenseCardProps) { +const ExpenseRow = React.memo(function ExpenseRow({ item, currency, fields }: ExpenseRowProps) { const itemCurrency = item.account?.currency ?? currency; return ( - onToggle(isExpanded ? item.id : "")} - TransitionProps={{ unmountOnExit: true }} + - } + - + ) : ( + + )} + + + - {item.entity?.logo ? ( - - ) : ( - + {item.entity ? applyDisplayFormat(item.entity, fields.formats.entity) : "Unknown"} + + + + + + {item.account?.name && ( + )} - - - {item.entity ? applyDisplayFormat(item.entity, fields.formats.entity) : "Unknown"} - - - - {item.account?.name && ( - - )} - - - - - - - - + + + + ); }); @@ -132,13 +112,9 @@ interface ExpenseListProps { } export function ExpenseList({ items, fields }: ExpenseListProps) { - const [expandedId, setExpandedId] = useState(null); const [activeMonth, setActiveMonth] = useState(null); const groups = useMemo(() => groupByMonth(items), [items]); const listRef = useRef(null); - const handleToggle = useCallback((id: string) => { - setExpandedId((prev) => (prev === id ? null : id)); - }, []); const jumpToActiveMonth = useCallback(() => { if (!activeMonth) return; @@ -239,13 +215,11 @@ export function ExpenseList({ items, fields }: ExpenseListProps) { {group.items.map((item) => ( - ))}