import { ClipboardCheck, ChevronDown, Pencil, Send, Trash2, XCircle } from 'lucide-react'; import { RowActions } 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 { formatDateTime, formatNumber } from '@/lib/format'; import type { StokOpname, StokOpnameStatus } from './columns'; const STATUS_CONFIG: Record = { draft: { label: 'Draft', className: 'bg-gray-100 text-gray-800 hover:bg-gray-100' }, in_progress: { label: 'Diajukan', className: 'bg-blue-100 text-blue-800 hover:bg-blue-100' }, completed: { label: 'Selesai', className: 'bg-yellow-100 text-yellow-800 hover:bg-yellow-100' }, verified: { label: 'Terverifikasi', className: 'bg-green-100 text-green-800 hover:bg-green-100' }, cancelled: { label: 'Dibatalkan', className: 'bg-red-100 text-red-800 hover:bg-red-100' }, }; export type StokOpnameCardRowParams = { stokOpname: StokOpname; index: number; isExpanded: boolean; onToggleExpand: () => void; onEdit: (stokOpname: StokOpname) => void; onDelete: (stokOpname: StokOpname) => void; onSubmit: (stokOpname: StokOpname) => void; onVerify: (stokOpname: StokOpname) => void; onReject: (stokOpname: StokOpname) => void; onCancel: (stokOpname: StokOpname) => void; }; export function StokOpnameCardRow({ stokOpname, index, isExpanded, onToggleExpand, onEdit, onDelete, onSubmit, onVerify, onReject, onCancel, }: StokOpnameCardRowParams) { const { can } = useCan(); const variantCount = stokOpname.items_count ?? 0; const totalDifference = stokOpname.total_difference ?? 0; const productNamesStr = stokOpname.product_names ?? ''; const productNames = productNamesStr ? productNamesStr.split(', ') : []; const statusConfig = STATUS_CONFIG[stokOpname.status] ?? STATUS_CONFIG.draft; return (
{index}.

{productNames.length > 0 ? productNames.join(', ') : '-'}

{statusConfig.label}
{variantCount > 0 && ( ({variantCount} varian) )}
{formatDateTime(stokOpname.opname_date)} Oleh:{' '} {stokOpname.created_by?.user_profile ?.full_name ?? '-'} {stokOpname.notes && ( {stokOpname.notes} )}
Total Selisih:{' '} 0 ? 'text-green-600 font-medium' : totalDifference < 0 ? 'text-red-600 font-medium' : ''}> {totalDifference > 0 ? '+' : ''}{formatNumber(totalDifference)} {stokOpname.verified_by && ( Diverifikasi oleh:{' '} {stokOpname.verified_by?.user_profile ?.full_name ?? '-'} )}
{can('stok_opnames.update') && stokOpname.status === 'draft' && ( , show: true, onClick: () => onEdit(stokOpname), }, { label: 'Submit', icon: , show: can('stok_opnames.submit'), onClick: () => onSubmit(stokOpname), }, { label: 'Hapus', icon: , show: can('stok_opnames.delete'), onClick: () => onDelete(stokOpname), }, ]} /> )} {can('stok_opnames.submit') && stokOpname.status === 'in_progress' && ( , show: true, onClick: () => onCancel(stokOpname), }, ]} /> )} {can('stok_opnames.verify') && stokOpname.status === 'in_progress' && ( , show: true, onClick: () => onVerify(stokOpname), }, { label: 'Tolak', icon: , show: true, onClick: () => onReject(stokOpname), }, ]} /> )}
); }