import { Head, Link, router } from '@inertiajs/react'; import { Plus } from 'lucide-react'; import { useMemo, useState } from 'react'; import { CardTable } from '@/components/data-display'; import { DeleteConfirmDialog } from '@/components/dialogs'; import { FilterPopover } from '@/components/data-display'; import { useCardTableExpand } from '@/components/hooks/use-card-table-expand'; import { PageHeader } from '@/components/layout'; import { Button } from '@/components/ui/button'; import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem, ComboboxList, } from '@/components/ui/combobox'; import { useCan } from '@/hooks/use-can'; import { useServerTable } from '@/hooks/use-server-table'; import { destroy, create as purchaseCreate, edit as purchaseEdit, index as purchaseIndex, } from '@/routes/admin/manage/purchases'; import type { Purchase } from './columns'; import { PurchaseCardRow } from './purchase-card'; import { PurchaseItemSubRow } from './purchase-sub-row'; type Props = { purchases: { data: Purchase[]; current_page: number; last_page: number; per_page: number; total: number; }; suppliers: { id: number; name: string; }[]; filters: { supplier_id?: string; }; }; export default function PurchaseIndex({ purchases, filters, suppliers, }: Props) { const { can } = useCan(); const [deleting, setDeleting] = useState(null); const expand = useCardTableExpand(true); const pagination = { current_page: purchases.current_page, last_page: purchases.last_page, per_page: purchases.per_page, total: purchases.total, }; const { search, filterOpen, setFilterOpen, handlePageChange, handlePerPageChange, handleSearchChange, applyFilter, clearFilters, } = useServerTable({ route: () => purchaseIndex.url(), pagination, filters, filterWithParams: false, }); const selectedSupplier = useMemo( () => suppliers.find( (s) => String(s.id) === filters.supplier_id, ) ?? null, [suppliers, filters.supplier_id], ); function handleDelete() { if (!deleting) { return; } router.delete(destroy.url(deleting.id), { onSuccess: () => setDeleting(null), }); } const filterToolbar = (
supplier.name} value={selectedSupplier} onValueChange={(value) => applyFilter( 'supplier_id', value ? String(value.id) : '', ) } > Tidak ada supplier ditemukan. {(supplier) => ( {supplier.name} )}
); return ( <>
Tambah ) : undefined } /> p.id} expandedKeys={expand.expandedKeys} onToggleExpand={expand.toggleExpand} searchValue={search} onSearchChange={handleSearchChange} toolbar={filterToolbar} pagination={pagination} onPageChange={handlePageChange} onPerPageChange={handlePerPageChange} renderCard={({ item, index, isExpanded, onToggleExpand, }) => ( { router.visit(purchaseEdit.url(p.id)); }} onDelete={(p) => setDeleting(p)} /> )} renderSubContent={(purchase) => ( )} /> { if (!open) { setDeleting(null); } }} title="Hapus Belanja" description={(purchase) => `Apakah Anda yakin ingin menghapus belanja dari "${purchase.supplier?.name}"? Stok akan dikembalikan. Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} />
); }