fix: show full category path (parent · subcategory) everywhere, group filters by hierarchy

Транзакция на подкатегории показывала только её имя — непонятно было,
что это подкатегория и к какой родительской категории она относится.
Фильтры по категории в Транзакциях и Отчётах тоже перечисляли
подкатегории наравне с родительскими, без иерархии.

- categoryLabels.ts: categoryPath() и buildHierarchicalCategories() —
  общая логика, вынесенная из TransactionFormModal.
- Список транзакций и «Последние транзакции» на Dashboard показывают
  счёт, затем родителя, затем подкатегорию.
- Фильтр категорий в Транзакциях сгруппирован по типу (как в Отчётах);
  оба списка показывают подкатегорию с отступом под родителем.
This commit is contained in:
ZProger
2026-08-30 19:30:49 +03:00
parent 87b37a10ff
commit dbae7938da
6 changed files with 111 additions and 28 deletions

View File

@@ -4,7 +4,8 @@ import { Dialog } from "@/components/ui/Dialog";
import { getCategoryIcon } from "@/lib/icons";
import { formatCurrency, formatTransactionDate } from "@/lib/format";
import { useTranslation } from "@/lib/i18n";
import { translateCategoryName } from "@/lib/categoryLabels";
import { categoryPath, translateCategoryName } from "@/lib/categoryLabels";
import { useCategories } from "@/hooks/useCategories";
import type { Transaction } from "@/types";
interface TransactionsTableProps {
@@ -19,6 +20,7 @@ interface TransactionsTableProps {
export function TransactionsTable({ items, onEdit, onDelete, onJumpToMonth }: TransactionsTableProps) {
const { t } = useTranslation();
const { data: categories } = useCategories();
const [noteTransaction, setNoteTransaction] = useState<Transaction | null>(null);
if (items.length === 0) {
@@ -41,7 +43,7 @@ export function TransactionsTable({ items, onEdit, onDelete, onJumpToMonth }: Tr
const categoryLabel = isSplit
? tx.splits.map((split) => (split.category ? translateCategoryName(split.category.name) : "?")).join(" + ")
: tx.category
? translateCategoryName(tx.category.name)
? categoryPath(tx.category, categories)
: null;
return (