import { Head, router } from '@inertiajs/react'; import { ArrowDownToLine, ArrowUpFromLine, Wallet } from 'lucide-react'; import { useState } from 'react'; import type { PaginationState } from '@/components/data-display'; import { DataTable } from '@/components/data-display'; import { DeleteConfirmDialog } from '@/components/dialogs'; import { FileUpload } from '@/components/inputs'; import { FilterPopover } from '@/components/data-display'; import { FormDialog } from '@/components/dialogs'; import { InputError } from '@/components/ui'; import { PageHeader } from '@/components/layout'; import { RupiahInput } from '@/components/inputs'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useCan } from '@/hooks/use-can'; import { useServerTable } from '@/hooks/use-server-table'; import { formatCurrency } from '@/lib/utils'; import { index as cashAccountIndex, deposit, withdrawal, } from '@/routes/admin/finance/cash-accounts'; import { update as updateTransaction, destroy as destroyTransaction, } from '@/routes/admin/finance/cash-accounts/transactions'; import { createTransactionColumns } from './transaction-columns'; import type { CashTransaction } from './transaction-columns'; type CashAccount = { id: number; name: string; balance: number; }; type TypeOption = { value: string; label: string; }; type Props = { cashAccount: CashAccount | null; transactions: { data: CashTransaction[]; current_page: number; last_page: number; per_page: number; total: number; }; filters: { type?: string; }; filterOptions: { typeOptions: TypeOption[]; }; highlight?: number; }; export default function CashAccountIndex({ cashAccount, transactions, filters, filterOptions, highlight, }: Props) { const { can } = useCan(); const [depositOpen, setDepositOpen] = useState(false); const [withdrawalOpen, setWithdrawalOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [depositReceiptKey, setDepositReceiptKey] = useState( null, ); const [depositUploading, setDepositUploading] = useState(false); const [depositFileMeta, setDepositFileMeta] = useState<{ size: number; type: string; } | null>(null); const [withdrawalReceiptKey, setWithdrawalReceiptKey] = useState< string | null >(null); const [withdrawalUploading, setWithdrawalUploading] = useState(false); const [withdrawalFileMeta, setWithdrawalFileMeta] = useState<{ size: number; type: string; } | null>(null); const [editReceiptKey, setEditReceiptKey] = useState(null); const [editUploading, setEditUploading] = useState(false); const [editFileMeta, setEditFileMeta] = useState<{ size: number; type: string; } | null>(null); const pagination: PaginationState = { current_page: transactions.current_page, last_page: transactions.last_page, per_page: transactions.per_page, total: transactions.total, }; const { search, filterOpen, setFilterOpen, handlePageChange, handlePerPageChange, handleSearchChange, applyFilter, clearFilters, } = useServerTable({ route: () => cashAccountIndex.url(), pagination, filters, }); function handleDelete() { if (!deleting) { return; } router.delete(destroyTransaction(deleting.id), { onSuccess: () => setDeleting(null), }); } const columns = createTransactionColumns({ handleEdit: (transaction) => { setEditing(transaction); setEditReceiptKey(transaction.receipt_key ?? null); }, handleDeleteClick: (transaction) => setDeleting(transaction), can, }); const filterToolbar = (
); return ( <>
Menampilkan transaksi kas dari notifikasi.

) } actions={
{can('cash.deposit') && ( )} {can('cash.withdraw') && ( )}
} /> Saldo saat ini
{formatCurrency(cashAccount?.balance ?? 0)}
{ setDepositOpen(open); if (!open) { setDepositReceiptKey(null); setDepositFileMeta(null); } }} title="Deposit" action={deposit()} resetOnSuccess onSuccess={() => { setDepositOpen(false); setDepositReceiptKey(null); setDepositFileMeta(null); }} submitDisabled={depositUploading} submitLabel={depositUploading ? 'Mengunggah...' : 'Simpan'} > {({ errors }) => ( <>
)}
{ setWithdrawalOpen(open); if (!open) { setWithdrawalReceiptKey(null); setWithdrawalFileMeta(null); } }} title="Withdrawal" action={withdrawal()} resetOnSuccess onSuccess={() => { setWithdrawalOpen(false); setWithdrawalReceiptKey(null); setWithdrawalFileMeta(null); }} submitDisabled={withdrawalUploading} submitLabel={ withdrawalUploading ? 'Mengunggah...' : 'Simpan' } > {({ errors }) => ( <>
)}
{ if (!open) { setEditing(null); setEditReceiptKey(null); setEditFileMeta(null); } }} title="Edit Transaksi" action={editing ? updateTransaction(editing.id) : ''} resetOnSuccess onSuccess={() => { setEditing(null); setEditReceiptKey(null); setEditFileMeta(null); }} submitDisabled={editUploading} submitLabel={editUploading ? 'Mengunggah...' : 'Simpan'} > {({ errors }) => editing && ( <>
) }
{ if (!open) { setDeleting(null); } }} title="Hapus Transaksi" description={(transaction) => `Apakah Anda yakin ingin menghapus transaksi "${transaction.description}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} />
); }