import { Form, Head, router } from '@inertiajs/react'; import { Plus } from 'lucide-react'; import { useCallback, useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { DataTable } from '@/components/data-table'; import type { PaginationState, SortState } from '@/components/data-table'; import InputError from '@/components/input-error'; import { PhoneNumberInput } from '@/components/phone-number-input'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { destroy, store, index as supplierIndex, update, } from '@/routes/admin/master/suppliers'; import type { Supplier } from './columns'; import { createSupplierColumns } from './columns'; type Props = { suppliers: { data: Supplier[]; current_page: number; last_page: number; per_page: number; total: number; }; }; export default function SupplierIndex({ suppliers }: Props) { const [createOpen, setCreateOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [search, setSearch] = useState(''); const [sort, setSort] = useState({ column: 'created_at', direction: 'desc', }); const pagination: PaginationState = { current_page: suppliers.current_page, last_page: suppliers.last_page, per_page: suppliers.per_page, total: suppliers.total, }; function handlePageChange(page: number) { router.get( supplierIndex.url(), { page, per_page: pagination.per_page, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true, }, ); } function handlePerPageChange(perPage: number) { router.get( supplierIndex.url(), { page: 1, per_page: perPage, search, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true, }, ); } const handleSearchChange = useCallback( (value: string) => { setSearch(value); router.get( supplierIndex.url(), { page: 1, per_page: pagination.per_page, search: value, sort: sort.column, direction: sort.direction, }, { preserveState: true, replace: true, }, ); }, [pagination.per_page, sort], ); function handleSortChange(column: string, direction: 'asc' | 'desc') { setSort({ column, direction }); router.get( supplierIndex.url(), { page: 1, per_page: pagination.per_page, search, sort: column, direction, }, { preserveState: true, replace: true, }, ); } function handleDelete() { if (!deleting) { return; } router.delete(destroy(deleting.id), { onSuccess: () => setDeleting(null), }); } const columns = createSupplierColumns({ handleEdit: (supplier) => setEditing(supplier), handleDeleteClick: (supplier) => setDeleting(supplier), }); return ( <>

Supplier

setCreateOpen(false)} > {({ errors, processing }) => { return ( <> Tambah Supplier
); }}
{ if (!open) { setEditing(null); } }} > {editing && (
setEditing(null)} > {({ errors, processing }) => { return ( <> Edit Supplier
); }}
)}
{ if (!open) { setDeleting(null); } }} title="Hapus Supplier" description={`Apakah Anda yakin ingin menghapus supplier "${deleting?.name}"? Tindakan ini tidak dapat dibatalkan.`} confirmLabel="Hapus" onConfirm={handleDelete} />
); } SupplierIndex.layout = { breadcrumbs: [ { title: 'Master', href: supplierIndex(), }, { title: 'Supplier', href: supplierIndex(), }, ], };