diff --git a/resources/js/components/transactions/transaction-columns.tsx b/resources/js/components/transactions/transaction-columns.tsx index f39f7db0..b5358bbe 100644 --- a/resources/js/components/transactions/transaction-columns.tsx +++ b/resources/js/components/transactions/transaction-columns.tsx @@ -1,5 +1,5 @@ import { ColumnDef } from '@tanstack/react-table'; -import { ArrowDown, ArrowUpDown, MoreHorizontal, Pencil, Trash2 } from 'lucide-react'; +import { ArrowDown, MoreHorizontal } from 'lucide-react'; import { format, parseISO } from 'date-fns'; import { Button } from '@/components/ui/button'; @@ -36,6 +36,7 @@ export function createTransactionColumns({ return [ { accessorKey: 'transaction_date', + meta: { label: 'Date' }, header: ({ column }) => { return ( )} + {actions ? ( +
+ {actions} +
+ ) : null} ); diff --git a/resources/js/components/ui/data-table-view-options.tsx b/resources/js/components/ui/data-table-view-options.tsx new file mode 100644 index 00000000..e3c446b4 --- /dev/null +++ b/resources/js/components/ui/data-table-view-options.tsx @@ -0,0 +1,66 @@ +import { useEffect, useState } from 'react'; +import { type Table as TableType } from '@tanstack/react-table'; +import { SlidersHorizontal } from 'lucide-react'; + +import { Button } from '@/components/ui/button'; +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; + +interface DataTableViewOptionsProps { + table: TableType; +} + +export function DataTableViewOptions({ + table, +}: DataTableViewOptionsProps) { + const columns = table + .getAllLeafColumns() + .filter((column) => column.getCanHide()); + + const visibilityStates = columns.map((col) => col.getIsVisible()).join(','); + const [, forceUpdate] = useState(0); + + useEffect(() => { + forceUpdate((prev) => prev + 1); + }, [visibilityStates]); + + if (columns.length === 0) { + return null; + } + + return ( + + + + + + {columns.map((column) => { + const label: string = + typeof column.columnDef.header === 'string' + ? column.columnDef.header + : ((column.columnDef.meta as Record)?.label as string) ?? column.id.replace(/_/g, ' '); + + return ( + + column.toggleVisibility(!!value) + } + > + {label} + + ); + })} + + + ); +} diff --git a/resources/js/components/ui/data-table.tsx b/resources/js/components/ui/data-table.tsx index d32fd069..a5bad124 100644 --- a/resources/js/components/ui/data-table.tsx +++ b/resources/js/components/ui/data-table.tsx @@ -44,6 +44,8 @@ export function DataTable({ virtualRows.length > 0 ? totalSize - virtualRows[virtualRows.length - 1].end : 0; + const visibleColumnCount = + table.getVisibleLeafColumns().length || columns.length || 1; return (
@@ -76,7 +78,7 @@ export function DataTable({ {paddingTop > 0 && ( @@ -110,7 +112,7 @@ export function DataTable({ {paddingBottom > 0 && ( @@ -119,7 +121,7 @@ export function DataTable({ ) : ( {emptyMessage} diff --git a/resources/js/pages/transactions/index.tsx b/resources/js/pages/transactions/index.tsx index 5f88a3e3..9a3b0c45 100644 --- a/resources/js/pages/transactions/index.tsx +++ b/resources/js/pages/transactions/index.tsx @@ -15,6 +15,7 @@ import AppSidebarLayout from '@/layouts/app/app-sidebar-layout'; import { DataTable } from '@/components/ui/data-table'; import HeadingSmall from '@/components/heading-small'; import { DataTablePagination } from '@/components/ui/data-table-pagination'; +import { DataTableViewOptions } from '@/components/ui/data-table-view-options'; import { Skeleton } from '@/components/ui/skeleton'; import { TransactionFilters } from '@/components/transactions/transaction-filters'; import { EditTransactionDialog } from '@/components/transactions/edit-transaction-dialog'; @@ -452,6 +453,7 @@ export default function Transactions({ categories, accounts, banks }: Props) { categories={categories} accounts={accounts} isKeySet={isKeySet} + actions={} /> {isLoading ? (