"use client"; import * as React from "react"; import { type ColumnDef } from "@tanstack/react-table"; import { format } from "date-fns"; import { ko } from "date-fns/locale"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuShortcut, } from "@/components/ui/dropdown-menu"; import { MoreHorizontal, Eye, Download, Trash2 } from "lucide-react"; import type { DataTableRowAction } from "@/types/table"; import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header"; interface GetResponseColumnsProps { setRowAction: React.Dispatch | null>>; } export function getResponseColumns({ setRowAction }: GetResponseColumnsProps): ColumnDef[] { // ---------------------------------------------------------------- // 1) select 컬럼 (체크박스) // ---------------------------------------------------------------- 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" /> ), size: 40, enableSorting: false, enableHiding: false, }; // ---------------------------------------------------------------- // 2) actions 컬럼 (Dropdown 메뉴) // ---------------------------------------------------------------- const actionsColumn: ColumnDef = { id: "actions", header: "작업", enableHiding: false, cell: ({ row }) => { const response = row.original; return ( window.location.href = `/evcp/compliance/${response.templateId}/responses/${response.id}`}> Detail setRowAction({ type: 'delete', row: row })}> Delete ⌘⌫ ); }, size: 40, }; // ---------------------------------------------------------------- // 3) 일반 컬럼들 (정렬 가능) // ---------------------------------------------------------------- const dataColumns: ColumnDef[] = [ { accessorKey: "templateName", header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue("templateName")}
), enableResizing: true, }, { accessorKey: "vendorId", header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue("vendorId") || '-'}
), enableResizing: true, }, { accessorKey: "vendorName", header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue("vendorName") || '-'}
), enableResizing: true, }, { accessorKey: "contractName", header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue("contractName") || '-'}
), enableResizing: true, }, { accessorKey: "status", header: ({ column }) => ( ), cell: ({ row }) => { const status = row.getValue("status") as string; const getStatusBadge = (status: string) => { switch (status) { case "COMPLETED": return 제출완료; case "IN_PROGRESS": return 진행중; case "REVIEWED": return 검토완료; default: return {status}; } }; return getStatusBadge(status); }, enableResizing: true, }, { accessorKey: "reviewerName", header: ({ column }) => ( ), cell: ({ row }) => { const reviewerName = row.getValue("reviewerName") as string; return reviewerName || '-'; }, enableResizing: true, }, { accessorKey: "reviewedAt", header: ({ column }) => ( ), cell: ({ row }) => { const date = row.getValue("reviewedAt") as Date; return date ? format(new Date(date), 'yyyy-MM-dd HH:mm', { locale: ko }) : '-'; }, enableResizing: true, }, ]; // ---------------------------------------------------------------- // 4) 최종 컬럼 배열: select, dataColumns, actions // ---------------------------------------------------------------- return [ selectColumn, ...dataColumns, actionsColumn, ]; }