import { Head, router } from '@inertiajs/react'; import { Filter, Plus, X } from 'lucide-react'; import { useCallback, useState } from 'react'; import { CardTable } from '@/components/card-table'; import { useCardTableExpand } from '@/components/hooks/use-card-table-expand'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { destroy, create as rawMaterialCreate, index as rawMaterialIndex, edit as rawMaterialEdit, toggleStatus, } from '@/routes/admin/master/raw-materials'; import { destroy as variantDestroy, edit as variantEdit, } from '@/routes/admin/master/raw-materials/variants'; import type { RawMaterial, RawMaterialVariant } from './columns'; import { RawMaterialCardRow } from './raw-material-card'; import { RawMaterialVariantSubRow } from './variant/sub-row'; type Props = { rawMaterials: { data: RawMaterial[]; current_page: number; last_page: number; per_page: number; total: number; }; filters: { is_active?: string; stock?: string; }; }; export default function RawMaterialIndex({ rawMaterials, filters }: Props) { const [deleting, setDeleting] = useState(null); const [deletingVariant, setDeletingVariant] = useState<{ rawMaterial: RawMaterial; variant: RawMaterialVariant; } | null>(null); const [filterOpen, setFilterOpen] = useState(false); const [search, setSearch] = useState(''); const expand = useCardTableExpand(true); const hasActiveFilters = filters.is_active || filters.stock; const pagination = { current_page: rawMaterials.current_page, last_page: rawMaterials.last_page, per_page: rawMaterials.per_page, total: rawMaterials.total, }; function applyFilter(key: string, value: string) { const newFilters = { ...filters }; if (value === '' || value === 'all') { delete newFilters[key as keyof typeof newFilters]; } else { newFilters[key as keyof typeof newFilters] = value; } router.get(rawMaterialIndex(), newFilters, { preserveState: true, replace: true, }); } function clearFilters() { router.get( rawMaterialIndex(), {}, { preserveState: true, replace: true, }, ); setFilterOpen(false); } function handlePageChange(page: number) { router.get( rawMaterialIndex.url(), { page, per_page: pagination.per_page, search, ...filters, }, { preserveState: true, replace: true }, ); } function handlePerPageChange(perPage: number) { router.get( rawMaterialIndex.url(), { page: 1, per_page: perPage, search, ...filters, }, { preserveState: true, replace: true }, ); } const handleSearchChange = useCallback( (value: string) => { setSearch(value); router.get( rawMaterialIndex.url(), { page: 1, per_page: pagination.per_page, search: value, ...filters, }, { preserveState: true, replace: true }, ); }, [pagination.per_page, filters], ); function handleDelete() { if (!deleting) return; router.delete(destroy.url(deleting.id), { onSuccess: () => setDeleting(null), }); } function handleDeleteVariant() { if (!deletingVariant) return; router.delete( variantDestroy.url({ rawMaterial: deletingVariant.rawMaterial.id, variant: deletingVariant.variant.id, }), { onSuccess: () => setDeletingVariant(null), }, ); } const filterToolbar = (
Filter {hasActiveFilters && ( )}
); return ( <>

Bahan Baku

rm.id} expandedKeys={expand.expandedKeys} onToggleExpand={expand.toggleExpand} searchValue={search} onSearchChange={handleSearchChange} searchPlaceholder="Cari bahan baku..." pagination={pagination} onPageChange={handlePageChange} onPerPageChange={handlePerPageChange} toolbar={filterToolbar} renderCard={({ item, index, isExpanded, onToggleExpand, }) => ( { window.location.href = rawMaterialEdit.url(rm.id); }} onDelete={(rm) => setDeleting(rm)} toggleStatusUrl={(id) => toggleStatus.url(id)} /> )} renderSubContent={(rawMaterial) => ( )} /> { if (!open) { setDeleting(null); } }} title="Hapus Bahan Baku" description={`Apakah Anda yakin ingin menghapus bahan baku "${deleting?.name}"? Tindakan ini tidak dapat dibatalkan.`} confirmLabel="Hapus" onConfirm={handleDelete} /> { if (!open) { setDeletingVariant(null); } }} title="Hapus Varian" description={`Apakah Anda yakin ingin menghapus varian "${deletingVariant?.variant.variant}" dari bahan baku "${deletingVariant?.rawMaterial.name}"? Tindakan ini tidak dapat dibatalkan.`} confirmLabel="Hapus" onConfirm={handleDeleteVariant} />
); }