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 type { ImagePreviewItem } 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useCan } from '@/hooks/use-can'; import { useServerTable } from '@/hooks/use-server-table'; import { destroy, create as rawMaterialCreate, edit as rawMaterialEdit, index as rawMaterialIndex, toggleStatus, } from '@/routes/admin/master/raw-materials'; import { destroy as variantDestroy } 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; }; rawMaterialNames: string[]; filters: { is_active?: string; name?: string; stock?: string; }; }; export default function RawMaterialIndex({ rawMaterials, rawMaterialNames, filters }: Props) { const { can } = useCan(); const [deleting, setDeleting] = useState(null); const [deletingVariant, setDeletingVariant] = useState<{ rawMaterial: RawMaterial; variant: RawMaterialVariant; } | null>(null); const expand = useCardTableExpand(true); const pagination = { current_page: rawMaterials.current_page, last_page: rawMaterials.last_page, per_page: rawMaterials.per_page, total: rawMaterials.total, }; const { search, filterOpen, setFilterOpen, handlePageChange, handlePerPageChange, handleSearchChange, applyFilter, clearFilters, } = useServerTable({ route: () => rawMaterialIndex.url(), pagination, filters, filterWithParams: false, }); const sortedRawMaterialNames = useMemo( () => [...rawMaterialNames].sort(), [rawMaterialNames], ); const allPreviewItems: ImagePreviewItem[] = useMemo( () => rawMaterials.data.flatMap((rm) => (rm.raw_material_prices ?? []) .filter((v) => v.photo_url) .map((v) => ({ id: `${rm.id}-${v.id}`, src: v.photo_url, title: v.variant, description: `Stok: ${v.formatted_stock}`, })) ), [rawMaterials.data], ); 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 = (
applyFilter('name', (value as string) ?? '') } > Tidak ada bahan baku ditemukan. {(name) => ( {name} )}
); return ( <>
) : undefined } /> rm.id} expandedKeys={expand.expandedKeys} onToggleExpand={expand.toggleExpand} searchValue={search} onSearchChange={handleSearchChange} pagination={pagination} onPageChange={handlePageChange} onPerPageChange={handlePerPageChange} toolbar={filterToolbar} renderCard={({ item, index, isExpanded, onToggleExpand, }) => ( { router.visit(rawMaterialEdit.url(rm.id)); }} onDelete={(rm) => setDeleting(rm)} toggleStatusUrl={(id) => toggleStatus.url(id)} /> )} renderSubContent={(rawMaterial) => ( )} /> { if (!open) { setDeleting(null); } }} title="Hapus Bahan Baku" description={(rawMaterial) => `Apakah Anda yakin ingin menghapus bahan baku "${rawMaterial.name}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} /> { if (!open) { setDeletingVariant(null); } }} title="Hapus Varian" description={(target) => `Apakah Anda yakin ingin menghapus varian "${target.variant.variant}" dari bahan baku "${target.rawMaterial.name}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDeleteVariant} />
); }