import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; import { Paperclip, Pencil, Trash2 } from 'lucide-react'; import { RowActions } from '@/components/row-actions'; import { Badge } from '@/components/ui/badge'; import type { LetterRequest, LetterStatus } from '@/types/letter-request'; import { LetterStatusLabels } from '@/types/letter-request'; export type { LetterRequest } from '@/types/letter-request'; type CreateColumnsParams = { handleEdit: (letterRequest: LetterRequest) => void; handleDeleteClick: (letterRequest: LetterRequest) => void; canUpdate: boolean; canDelete: boolean; }; export function createLetterRequestColumns( params: CreateColumnsParams, ): ColumnDef[] { const { handleEdit, handleDeleteClick, canUpdate, canDelete } = params; return [ { accessorKey: 'student.student_number', header: () => Mahasiswa, cell: ({ row }) => { const student = row.original.student; return (

{student?.user?.profile?.full_name ?? 'N/A'}

{student?.student_number} ·{' '} {student?.department?.name ?? '-'}

); }, }, { accessorKey: 'letter_type', header: () => Jenis Surat, cell: ({ row }) => { const letterRequest = row.original; return (

{letterRequest.letter_type}

{letterRequest.purpose && (

{letterRequest.purpose}

)}
); }, }, { accessorKey: 'status', header: () => Status, meta: { className: 'w-[120px] text-center', headerClassName: 'w-[120px] text-center', }, cell: ({ row }) => { const status = row.getValue('status') as LetterStatus | null; const variant = status === 'completed' ? 'default' : status === 'rejected' ? 'destructive' : status === 'in_process' ? 'secondary' : 'outline'; return (
{status ? ( {LetterStatusLabels[status]} ) : ( - )}
); }, }, { accessorKey: 'processor.profile.full_name', header: () => Diproses Oleh, cell: ({ row }) => row.original.processor?.profile?.full_name ?? '-', }, { accessorKey: 'submitted_at', header: () => Diajukan, cell: ({ row }) => { const submittedAt = row.original.submitted_at; return submittedAt ? format(new Date(submittedAt), 'd MMM yyyy, HH:mm') : '-'; }, }, { accessorKey: 'result_name', header: () => Dokumen, cell: ({ row }) => { const letterRequest = row.original; if (!letterRequest.result_url) { return -; } return ( {letterRequest.result_name} ); }, }, { id: 'actions', header: () => Aksi, meta: { className: 'w-[100px] text-center', headerClassName: 'w-[100px] text-center', }, cell: ({ row }) => ( , show: canUpdate, onClick: () => handleEdit(row.original), }, { label: 'Hapus', icon: ( ), show: canDelete, onClick: () => handleDeleteClick(row.original), }, ]} /> ), }, ]; }