import { router } from '@inertiajs/react'; import { CheckCircle, ChevronDown, Clock, Pencil, RotateCw, Trash2, XCircle } from 'lucide-react'; import { RowActions } from '@/components/data-display'; import { ToggleStatus } from '@/components/data-display'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { useCan } from '@/hooks/use-can'; import { formatNumber } from '@/lib/format'; import type { Product } from './columns'; function getStatusLabel(status: string): string { const labels: Record = { active: 'Aktif', inactive: 'Non Aktif', draft: 'Draft', pending: 'Menunggu Verifikasi', rejected: 'Ditolak', }; return labels[status] ?? status; } function getStatusVariant(status: string): string { const variants: Record = { active: 'bg-green-100 text-green-800', inactive: 'bg-red-100 text-red-800', draft: 'bg-yellow-100 text-yellow-800', pending: 'bg-orange-100 text-orange-800', rejected: 'bg-red-100 text-red-800', }; return variants[status] ?? 'bg-gray-100 text-gray-800'; } export type ProductCardRowParams = { product: Product; index: number; isExpanded: boolean; onToggleExpand: () => void; onEdit: (product: Product) => void; onDelete: (product: Product) => void; onReject: (product: Product) => void; toggleStatusUrl: (id: number) => string; toggleFeaturedUrl: (id: number) => string; approveUrl: (id: number) => string; resubmitUrl: (id: number) => string; }; export function ProductCardRow({ product, index, isExpanded, onToggleExpand, onEdit, onDelete, onReject, toggleStatusUrl, toggleFeaturedUrl, approveUrl, resubmitUrl, }: ProductCardRowParams) { const { can, hasRole } = useCan(); const isVerifier = hasRole('developer') || hasRole('owner'); const variants = product.product_variants ?? []; const totalStock = variants.reduce((sum, v) => sum + (v.stock ?? 0), 0); const totalReject = variants.reduce( (sum, v) => sum + (v.reject_stock ?? 0), 0, ); const totalRetail = variants.reduce( (sum, v) => sum + (v.retail_stock ?? 0), 0, ); const totalAll = totalStock + totalReject + totalRetail; const isPending = product.status === 'pending'; const isRejected = product.status === 'rejected'; const isChecked = product.status === 'active'; return (
{index}.

{product.name}

{isPending && ( Menunggu Verifikasi )} {isRejected && ( Ditolak )} {product.categories?.length > 0 && ( ( {product.categories .map((c) => c.name) .join(', ')} ) )}
{isRejected && product.rejection_reason && (
Alasan penolakan: {product.rejection_reason}
)}
{variants.length} varian Bagus:{' '} {formatNumber(totalStock)} Reject:{' '} {formatNumber(totalReject)} Ecer:{' '} {formatNumber(totalRetail)} Total:{' '} {formatNumber(totalAll)}
{(product.status === 'active' || product.status === 'inactive') ? ( ) : ( {getStatusLabel(product.status)} )}
{(product.status === 'active' || product.status === 'inactive') && (
)}
{/* Actions */} {isPending && isVerifier ? ( , onClick: () => router.post(approveUrl(product.id), {}, { preserveScroll: true }), }, { label: 'Tolak', icon: , onClick: () => onReject(product), }, ]} wrapperClassName="flex shrink-0 items-center gap-1" /> ) : isRejected && !isVerifier ? ( , onClick: () => router.post(resubmitUrl(product.id), {}, { preserveScroll: true }), }, { label: 'Edit', icon: , show: can('products.update'), onClick: () => onEdit(product), }, { label: 'Hapus', icon: , show: can('products.delete'), onClick: () => onDelete(product), }, ]} wrapperClassName="flex shrink-0 items-center gap-1" /> ) : !isPending && !(isRejected && isVerifier) && (can('products.update') || can('products.delete')) ? ( , show: can('products.update'), onClick: () => onEdit(product), }, { label: 'Hapus', icon: , show: can('products.delete'), onClick: () => onDelete(product), }, ]} wrapperClassName="flex shrink-0 items-center gap-1" /> ) : null}
); }