import { Head, router } from '@inertiajs/react'; import { Cell, ColumnDef, ColumnFiltersState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, Row, SortingState, useReactTable, VisibilityState, } from '@tanstack/react-table'; import { ArrowUpDown, MoreHorizontal } from 'lucide-react'; import { useState } from 'react'; import { index as accountsIndex } from '@/actions/App/Http/Controllers/Settings/AccountController'; import { CreateAccountDialog } from '@/components/accounts/create-account-dialog'; import { DeleteAccountDialog } from '@/components/accounts/delete-account-dialog'; import { EditAccountDialog } from '@/components/accounts/edit-account-dialog'; import { EncryptedText } from '@/components/encrypted-text'; import HeadingSmall from '@/components/heading-small'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuTrigger, } from '@/components/ui/context-menu'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Input } from '@/components/ui/input'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import AppLayout from '@/layouts/app-layout'; import SettingsLayout from '@/layouts/settings/layout'; import { type BreadcrumbItem } from '@/types'; import { type Account, formatAccountType } from '@/types/account'; const breadcrumbs: BreadcrumbItem[] = [ { title: 'Bank accounts', href: accountsIndex.url(), }, ]; function AccountActions({ account, onSuccess, }: { account: Account; onSuccess?: () => void; }) { const [editOpen, setEditOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); return ( <> Open menu Actions setEditOpen(true)}> Edit setDeleteOpen(true)} className="text-red-600" > Delete > ); } function AccountRow({ row, onSuccess, }: { row: Row; onSuccess?: () => void; }) { const account = row.original; const [editOpen, setEditOpen] = useState(false); const [deleteOpen, setDeleteOpen] = useState(false); const [contextMenuOpen, setContextMenuOpen] = useState(false); return ( <> {row .getVisibleCells() .map((cell: Cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext(), )} ))} Actions setEditOpen(true)}> Edit setDeleteOpen(true)} className="text-red-600" > Delete > ); } interface AccountsPageProps { accounts: Account[]; } export default function Accounts({ accounts }: AccountsPageProps) { const [sorting, setSorting] = useState([]); const [columnFilters, setColumnFilters] = useState([]); const [columnVisibility, setColumnVisibility] = useState( {}, ); const handleAccountCreated = () => { router.reload({ only: ['accounts'] }); }; const columns: ColumnDef[] = [ { accessorKey: 'name', header: ({ column }) => { return ( column.toggleSorting(column.getIsSorted() === 'asc') } > Name ); }, cell: ({ row }) => { return ( ); }, }, { accessorKey: 'bank', header: 'Bank', cell: ({ row }) => { const bank = row.original.bank; return ( {bank.logo ? ( ) : ( )} {bank.name} ); }, }, { accessorKey: 'type', header: 'Type', cell: ({ row }) => { return ( {formatAccountType(row.getValue('type'))} ); }, }, { accessorKey: 'currency_code', header: 'Currency', cell: ({ row }) => { return ( {row.getValue('currency_code')} ); }, }, { id: 'actions', enableHiding: false, cell: ({ row }) => ( ), }, ]; const table = useReactTable({ data: accounts, columns, onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, state: { sorting, columnFilters, columnVisibility, }, }); return ( table .getColumn('name') ?.setFilterValue(event.target.value) } className="max-w-sm" /> {table .getHeaderGroups() .map((headerGroup) => ( {headerGroup.headers.map( (header) => { return ( {header.isPlaceholder ? null : flexRender( header .column .columnDef .header, header.getContext(), )} ); }, )} ))} {table.getRowModel().rows?.length ? ( table .getRowModel() .rows.map((row) => ( )) ) : ( No accounts found. )} ); }