"use client" import * as React from "react" import { type DataTableRowAction } from "@/types/table" import { type ColumnDef } from "@tanstack/react-table" import { Ellipsis, Eye } from "lucide-react" import { formatDate, formatDateTime } from "@/lib/utils" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" import { type GtcDocumentWithRelations } from "@/db/schema/gtc" import { useRouter } from "next/navigation" interface GetColumnsProps { setRowAction: React.Dispatch | null>> } /** * GTC Documents 테이블 컬럼 정의 */ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef[] { const router = useRouter() // ---------------------------------------------------------------- // 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) 기본 정보 그룹 // ---------------------------------------------------------------- const basicInfoColumns: ColumnDef[] = [ { accessorKey: "type", header: ({ column }) => , cell: ({ row }) => { const type = row.getValue("type") as string; return ( {type === "standard" ? "표준" : "프로젝트"} ); }, size: 100, enableResizing: true, meta: { excelHeader: "구분", }, }, { accessorKey: "project", header: ({ column }) => , cell: ({ row }) => { const project = row.original.project; if (!project) { return -; } return (
{project.name} {project.code}
); }, size: 200, enableResizing: true, meta: { excelHeader: "프로젝트", }, }, { accessorKey: "revision", header: ({ column }) => , cell: ({ row }) => { const revision = row.getValue("revision") as number; return v{revision}; }, size: 80, enableResizing: true, meta: { excelHeader: "Rev.", }, }, ]; // ---------------------------------------------------------------- // 3) 등록/수정 정보 그룹 // ---------------------------------------------------------------- const auditColumns: ColumnDef[] = [ { accessorKey: "createdAt", header: ({ column }) => , cell: ({ row }) => { const date = row.getValue("createdAt") as Date; return date ? formatDate(date, "KR") : "-"; }, size: 120, enableResizing: true, meta: { excelHeader: "최초등록일", }, }, { accessorKey: "createdBy", header: ({ column }) => , cell: ({ row }) => { const createdBy = row.original.createdBy; return createdBy ? ( {createdBy.name} ) : ( - ); }, size: 120, enableResizing: true, meta: { excelHeader: "최초등록자", }, }, { accessorKey: "updatedAt", header: ({ column }) => , cell: ({ row }) => { const date = row.getValue("updatedAt") as Date; return date ? formatDate(date, "KR") : "-"; }, size: 120, enableResizing: true, meta: { excelHeader: "최종수정일", }, }, { accessorKey: "updatedBy", header: ({ column }) => , cell: ({ row }) => { const updatedBy = row.original.updatedBy; return updatedBy ? ( {updatedBy.name} ) : ( - ); }, size: 120, enableResizing: true, meta: { excelHeader: "최종수정자", }, }, { accessorKey: "editReason", header: ({ column }) => , cell: ({ row }) => { const reason = row.getValue("editReason") as string; return reason ? ( {reason.length > 30 ? `${reason.substring(0, 30)}...` : reason} ) : ( - ); }, size: 200, enableResizing: true, meta: { excelHeader: "최종 편집사유", }, }, ]; // ---------------------------------------------------------------- // 4) actions 컬럼 (Dropdown 메뉴) // ---------------------------------------------------------------- const actionsColumn: ColumnDef = { id: "actions", enableHiding: false, cell: function Cell({ row }) { const [isUpdatePending, startUpdateTransition] = React.useTransition() const gtcDocument = row.original; const handleViewDetails = () => { router.push(`/evcp/gtc-documents/${gtcDocument.id}`); }; const handleCreateNewRevision = () => { setRowAction({ row, type: "createRevision" }); }; return ( View Details setRowAction({ row, type: "update" })} > Edit Create New Revision setRowAction({ row, type: "delete" })} > Delete ⌘⌫ ) }, size: 40, } // ---------------------------------------------------------------- // 5) 중첩 컬럼 그룹 생성 // ---------------------------------------------------------------- const nestedColumns: ColumnDef[] = [ { id: "기본 정보", header: "기본 정보", columns: basicInfoColumns, }, { id: "등록/수정 정보", header: "등록/수정 정보", columns: auditColumns, }, ] // ---------------------------------------------------------------- // 6) 최종 컬럼 배열 // ---------------------------------------------------------------- return [ selectColumn, ...nestedColumns, actionsColumn, ] }