'use client'; /* IMPORT */ import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { DataTableColumnHeaderSimple } from '@/components/data-table/data-table-column-simple-header'; import { Dispatch, SetStateAction } from 'react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuShortcut, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Ellipsis, Eye, Edit, Trash2 } from 'lucide-react'; import { REG_EVAL_CRITERIA_CATEGORY, REG_EVAL_CRITERIA_CATEGORY2, REG_EVAL_CRITERIA_ITEM, type RegEvalCriteria, // RegEvalCriteriaView 대신 RegEvalCriteria 사용 } from '@/db/schema'; import { type ColumnDef } from '@tanstack/react-table'; import { type DataTableRowAction } from '@/types/table'; // ---------------------------------------------------------------------------------------------------- /* TYPES */ interface GetColumnsProps { setRowAction: Dispatch | null>>, }; // ---------------------------------------------------------------------------------------------------- /* FUNCTION FOR GETTING COLUMNS SETTING */ function getColumns({ setRowAction }: GetColumnsProps): ColumnDef[] { // [1] SELECT COLUMN - CHECKBOX const selectColumn: ColumnDef = { id: 'select', header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="select-all" className="translate-y-0.5" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="select-row" className="translate-y-0.5" /> ), enableSorting: false, enableHiding: false, size: 40, }; // [2] CRITERIA COLUMNS const criteriaColumns: ColumnDef[] = [ { accessorKey: 'category', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('category'); const label = REG_EVAL_CRITERIA_CATEGORY.find(item => item.value === value)?.label ?? value; return ( {label} ); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Category', type: 'select', }, size: 50, }, { accessorKey: 'category2', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('category2'); const label = REG_EVAL_CRITERIA_CATEGORY2.find(item => item.value === value)?.label ?? value; return ( {label} ); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Score Category', type: 'select', }, size: 50, }, { accessorKey: 'item', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('item'); const label = REG_EVAL_CRITERIA_ITEM.find(item => item.value === value)?.label ?? value; return ( {label} ); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Item', type: 'select', }, size: 50, }, { accessorKey: 'classification', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('classification')}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Classification', type: 'text', }, size: 100, }, { accessorKey: 'range', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('range') || '-'}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Evaluation Name', type: 'text', }, }, { accessorKey: 'scoreType', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('scoreType'); return ( {value === 'fixed' ? '고정점수' : '변동점수'} ); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Score Type', type: 'select', }, }, ]; // [3] VARIABLE SCORE COLUMNS (변동점수 관련 컬럼들) const variableScoreColumns: ColumnDef[] = [ { accessorKey: 'variableScoreMin', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('variableScoreMin'); const scoreType = row.getValue('scoreType'); if (scoreType !== 'variable') return
-
; const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return (
{displayValue}
); }, enableSorting: true, enableHiding: true, meta: { excelHeader: 'Min Score', type: 'number', }, }, { accessorKey: 'variableScoreMax', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('variableScoreMax'); const scoreType = row.getValue('scoreType'); if (scoreType !== 'variable') return
-
; const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return (
{displayValue}
); }, enableSorting: true, enableHiding: true, meta: { excelHeader: 'Max Score', type: 'number', }, }, { accessorKey: 'variableScoreUnit', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('variableScoreUnit'); const scoreType = row.getValue('scoreType'); if (scoreType !== 'variable') return
-
; return (
{value || '-'}
); }, enableSorting: true, enableHiding: true, meta: { excelHeader: 'Score Unit', type: 'text', }, }, ]; // [4] REMARKS COLUMN const remarksColumn: ColumnDef = { accessorKey: 'remarks', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('remarks') || '-'}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Remarks', type: 'text', }, size: 300, }; // [5] HIDDEN ID COLUMNS const hiddenColumns: ColumnDef[] = [ { accessorKey: 'id', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('id')}
), enableSorting: true, enableHiding: true, meta: { excelHeader: 'ID', group: 'Meta Data', type: 'number', }, }, { accessorKey: 'createdAt', header: ({ column }) => ( ), cell: ({ row }) => { const date = row.getValue('createdAt'); return (
{date ? new Date(date).toLocaleDateString('ko-KR') : '-'}
); }, enableSorting: true, enableHiding: true, meta: { excelHeader: 'Created At', group: 'Meta Data', type: 'date', }, }, { accessorKey: 'updatedAt', header: ({ column }) => ( ), cell: ({ row }) => { const date = row.getValue('updatedAt'); return (
{date ? new Date(date).toLocaleDateString('ko-KR') : '-'}
); }, enableSorting: true, enableHiding: true, meta: { excelHeader: 'Updated At', group: 'Meta Data', type: 'date', }, }, ]; // [6] ACTIONS COLUMN - DROPDOWN MENU WITH VIEW ACTION const actionsColumn: ColumnDef = { id: 'actions', enableHiding: false, cell: function Cell({ row }) { return ( setRowAction({ row, type: "view" })} > {/* */} 상세보기 setRowAction({ row, type: "update" })} > {/* */} 수정하기 setRowAction({ row, type: "delete" })} > {/* */} 삭제하기 ⌘⌫ ) }, size: 80, }; return [ selectColumn, ...criteriaColumns, ...variableScoreColumns, remarksColumn, ...hiddenColumns, actionsColumn, ]; }; // ---------------------------------------------------------------------------------------------------- /* EXPORT */ export default getColumns;