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}
/>