import type { ColumnDef } from '@tanstack/react-table'; import { format } from 'date-fns'; import { Eye } from 'lucide-react'; import { RowActions } from '@/components/row-actions'; import { Badge } from '@/components/ui/badge'; import type { LogEntry, LogLevel } from '@/types/log-entry'; function levelVariant( level: LogLevel, ): 'default' | 'secondary' | 'destructive' | 'outline' { if (['EMERGENCY', 'ALERT', 'CRITICAL', 'ERROR'].includes(level)) { return 'destructive'; } if (['WARNING', 'NOTICE'].includes(level)) { return 'secondary'; } if (level === 'INFO') { return 'default'; } return 'outline'; } function firstLine(message: string): string { return message.split('\n')[0]; } type CreateColumnsParams = { handleViewDetail: (entry: LogEntry) => void; }; export function createLogColumns( params: CreateColumnsParams, ): ColumnDef[] { const { handleViewDetail } = params; return [ { accessorKey: 'timestamp', header: () => Waktu, meta: { className: 'w-[180px]', headerClassName: 'w-[180px]', }, cell: ({ row }) => { const timestamp = row.getValue('timestamp') as string; const date = new Date(timestamp.replace(' ', 'T')); return ( {Number.isNaN(date.getTime()) ? timestamp : format(date, 'd MMM yyyy, HH:mm:ss')} ); }, }, { accessorKey: 'level', header: () => Level, meta: { className: 'w-[110px] text-center', headerClassName: 'w-[110px] text-center', }, cell: ({ row }) => { const level = row.getValue('level') as LogLevel; return (
{level}
); }, }, { accessorKey: 'message', header: () => Pesan, cell: ({ row }) => (

{firstLine(row.original.message)}

), }, { id: 'actions', header: () => Aksi, meta: { className: 'w-[80px] text-center', headerClassName: 'w-[80px] text-center', }, cell: ({ row }) => ( , onClick: () => handleViewDetail(row.original), }, ]} /> ), }, ]; }