'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, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { PenToolIcon, TrashIcon } from 'lucide-react'; import { REG_EVAL_CRITERIA_CATEGORY, REG_EVAL_CRITERIA_CATEGORY2, REG_EVAL_CRITERIA_ITEM, type RegEvalCriteriaView, } 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', }, }, { 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', }, }, { 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', }, }, { accessorKey: 'classification', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('classification')}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Classification', type: 'text', }, }, { accessorKey: 'range', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('range') || '-'}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Range', type: 'text', }, }, { accessorKey: 'detail', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('detail')}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Detail', type: 'text', }, }, ]; // [3] SCORE COLUMNS const scoreEquipColumns: ColumnDef[] = [ { accessorKey: 'scoreEquipShip', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('scoreEquipShip'); const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return (
{displayValue}
); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Equipment-Shipbuilding Score', group: 'Equipment Score', type: 'number', }, }, { accessorKey: 'scoreEquipMarine', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('scoreEquipMarine'); const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return (
{displayValue}
); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Equipment-Marine Engineering Score', group: 'Equipment Score', type: 'number', }, }, ]; const scoreBulkColumns: ColumnDef[] = [ { accessorKey: 'scoreBulkShip', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('scoreBulkShip'); const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return (
{displayValue}
); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Bulk-Shipbuilding Score', group: 'Bulk Score', type: 'number', }, }, { accessorKey: 'scoreBulkMarine', header: ({ column }) => ( ), cell: ({ row }) => { const value = row.getValue('scoreBulkMarine'); const displayValue = typeof value === 'string' ? parseFloat(parseFloat(value).toFixed(2)).toString() : '-'; return (
{displayValue}
); }, enableSorting: true, enableHiding: false, meta: { excelHeader: 'Bulk-Marine Engineering Score', group: 'Bulk Score', type: 'number', }, }, ]; // [4] REMARKS COLUMN const remarksColumn: ColumnDef = { accessorKey: 'remarks', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('remarks') || '-'}
), enableSorting: true, enableHiding: false, meta: { excelHeader: 'Remarks', type: 'text', }, }; // [5] HIDDEN ID COLUMN 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: 'criteriaId', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('criteriaId')}
), enableSorting: true, enableHiding: true, meta: { excelHeader: 'Criteria ID', group: 'Meta Data', type: 'criteriaId', }, }, { accessorKey: 'orderIndex', header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue('orderIndex')}
), enableSorting: true, enableHiding: true, meta: { excelHeader: 'Order Index', group: 'Meta Data', type: 'number', }, }, ]; // [6] ACTIONS COLUMN - DROPDOWN MENU const actionsColumn: ColumnDef = { id: 'actions', header: '작업', enableHiding: false, cell: function Cell({ row }) { return ( setRowAction({ row, type: 'update' })} > Modify Criteria setRowAction({ row, type: 'delete' })} className="text-destructive" > Delete Criteria ) }, size: 80, }; return [ selectColumn, ...criteriaColumns, { id: 'score', header: '배점', columns: [ { id: 'scoreEquip', header: '기자재', columns: scoreEquipColumns, }, { id: 'scoreBulk', header: '벌크', columns: scoreBulkColumns, }, ], }, ...hiddenColumns, remarksColumn, actionsColumn, ]; }; // ---------------------------------------------------------------------------------------------------- /* EXPORT */ export default getColumns;