import { Head, Link, router } from '@inertiajs/react'; import { Plus } from 'lucide-react'; import { useCallback, 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 { 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 cuttingCreate, index as cuttingIndex, edit as cuttingEdit, materials as cuttingMaterials, complete as cuttingComplete, } from '@/routes/admin/manage/cuttings'; import type { Cutting, CuttingMaterialDetail, CuttingCombination } from './columns'; import { CuttingCardRow } from './cutting-card'; import { CuttingItemSubRow } from './cutting-sub-row'; type Props = { cuttings: { data: Cutting[]; current_page: number; last_page: number; per_page: number; total: number; }; filters: { product_name?: string; status?: string; }; filterOptions: { statusOptions: Array<{ value: string; label: string }>; productNames: Array<{ product_name: string }>; }; highlight?: number; }; export default function CuttingIndex({ cuttings, filters, filterOptions, highlight, }: Props) { const { can } = useCan(); const [deleting, setDeleting] = useState(null); const [completing, setCompleting] = useState(null); const [loadedMaterials, setLoadedMaterials] = useState>({}); const [loadedCombinations, setLoadedCombinations] = useState>({}); const [loadingMaterials, setLoadingMaterials] = useState>({}); const expand = useCardTableExpand(false); const pagination = { current_page: cuttings.current_page, last_page: cuttings.last_page, per_page: cuttings.per_page, total: cuttings.total, }; const { search, filterOpen, setFilterOpen, handlePageChange, handlePerPageChange, handleSearchChange, applyFilter, clearFilters, } = useServerTable({ route: () => cuttingIndex.url(), pagination, filters, filterWithParams: false, }); const hasActiveFilters = Boolean(filters.product_name || filters.status); function handleDelete() { if (!deleting) { return; } router.delete(destroy.url(deleting.id), { onSuccess: () => setDeleting(null), }); } function handleComplete() { if (!completing) { return; } router.patch(cuttingComplete.url(completing.id), {}, { onSuccess: () => setCompleting(null), }); } const selectedProductName = useMemo( () => filterOptions.productNames.find( (p) => p.product_name === filters.product_name, ) ?? null, [filterOptions.productNames, filters.product_name], ); const fetchMaterials = useCallback((cutting: Cutting) => { if (loadedMaterials[cutting.id] || loadingMaterials[cutting.id]) { return; } setLoadingMaterials((prev) => ({ ...prev, [cutting.id]: true })); fetch(cuttingMaterials.url(cutting.id)) .then((res) => res.json()) .then((data) => { setLoadedMaterials((prev) => ({ ...prev, [cutting.id]: data.materials ?? [], })); setLoadedCombinations((prev) => ({ ...prev, [cutting.id]: data.combinations ?? [], })); }) .catch(() => { setLoadedMaterials((prev) => ({ ...prev, [cutting.id]: [] })); setLoadedCombinations((prev) => ({ ...prev, [cutting.id]: [] })); }) .finally(() => { setLoadingMaterials((prev) => ({ ...prev, [cutting.id]: false })); }); }, [loadedMaterials, loadingMaterials]); const filterToolbar = (
product.product_name} value={selectedProductName} onValueChange={(value) => applyFilter( 'product_name', value ? value.product_name : '', ) } > Tidak ada produk ditemukan. {(product) => ( {product.product_name} )}
); return ( <>
Menampilkan cutting dari notifikasi.

) } actions={ can('cuttings.create') ? ( ) : undefined } /> c.id} expandedKeys={expand.expandedKeys} onToggleExpand={(key) => { const c = cuttings.data.find((r) => r.id === key); const isCurrentlyExpanded = expand.expandedKeys === 'all' || expand.expandedKeys.has(key); if (c && !isCurrentlyExpanded) { fetchMaterials(c); } expand.toggleExpand(key); }} searchValue={search} onSearchChange={handleSearchChange} toolbar={filterToolbar} pagination={pagination} onPageChange={handlePageChange} onPerPageChange={handlePerPageChange} rowClassName={(c) => c.status === 'in_progress' ? 'border-l-4 border-l-yellow-500' : '' } renderCard={({ item, index, isExpanded, onToggleExpand, }) => ( setCompleting(c)} onEdit={(c) => { router.visit(cuttingEdit.url(c.id)); }} onDelete={(c) => setDeleting(c)} /> )} renderSubContent={(cutting) => ( )} /> { if (!open) { setDeleting(null); } }} title="Hapus Cutting" description={(cutting) => `Apakah Anda yakin ingin menghapus cutting "${cutting.cutting_results?.[0]?.product_name ?? '-'}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} /> { if (!open) { setCompleting(null); } }} title="Selesaikan Cutting" description={(cutting) => `Apakah Anda yakin ingin menyelesaikan cutting "${cutting.cutting_results?.[0]?.product_name ?? '-'}"?` } confirmLabel="Selesaikan" onConfirm={handleComplete} />
); }