import type { ColumnDef } from '@tanstack/react-table'; import { Pencil, Trash2 } from 'lucide-react'; import { ActiveStatusSwitch } from '@/components/active-status-switch'; import { RowActions } from '@/components/row-actions'; import { SemesterLabels } from '@/types/academic-term'; import type { AcademicTerm } from '@/types/academic-term'; import type { Semester } from '@/types/academic-term'; export type { AcademicTerm } from '@/types/academic-term'; type CreateColumnsParams = { handleEdit: (academicTerm: AcademicTerm) => void; handleDeleteClick: (academicTerm: AcademicTerm) => void; handleStatusChange: (academicTerm: AcademicTerm, isActive: boolean) => void; canUpdate: boolean; canDelete: boolean; canUpdateStatus: boolean; }; export function createAcademicTermColumns( params: CreateColumnsParams, ): ColumnDef[] { const { handleEdit, handleDeleteClick, handleStatusChange, canUpdate, canDelete, canUpdateStatus, } = params; return [ { accessorKey: 'name', header: () => Nama, cell: ({ row }) => ( {row.getValue('name') as string} ), }, { accessorKey: 'semester', header: () => Semester, cell: ({ row }) => { const semester = row.getValue('semester') as Semester; return {SemesterLabels[semester]}; }, }, { accessorKey: 'formatted_start_date', header: () => Tanggal Mulai, cell: ({ row }) => ( {row.getValue('formatted_start_date') as string | null} ), }, { accessorKey: 'formatted_end_date', header: () => Tanggal Selesai, cell: ({ row }) => ( {row.getValue('formatted_end_date') as string | null} ), }, { accessorKey: 'is_active', header: () => Status, meta: { className: 'w-[100px] text-center', headerClassName: 'w-[100px] text-center', }, cell: ({ row }) => { const academicTerm = row.original; return (
handleStatusChange(academicTerm, isActive) } disabled={!canUpdateStatus} />
); }, }, { id: 'actions', header: () => Aksi, meta: { className: 'w-[100px] text-center', headerClassName: 'w-[100px] text-center', }, cell: ({ row }) => { const academicTerm = row.original; return ( , show: canUpdate, onClick: () => handleEdit(academicTerm), }, { label: 'Hapus', icon: ( ), show: canDelete, onClick: () => handleDeleteClick(academicTerm), }, ]} /> ); }, }, ]; }