From c228a89c2834ee63b209bad608837c39643f350e Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Mon, 28 Jul 2025 11:44:16 +0000
Subject: (대표님) 의존성 docx 추가, basicContract API, gtc(계약일반조건),
 벤더평가 esg 평가데이터 내보내기 개선, S-EDP 피드백 대응(CLS_ID, ITEM NO 등)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../status/gtc-documents-table-columns.tsx         | 175 ++++++++-------------
 1 file changed, 65 insertions(+), 110 deletions(-)

(limited to 'lib/gtc-contract/status/gtc-documents-table-columns.tsx')

diff --git a/lib/gtc-contract/status/gtc-documents-table-columns.tsx b/lib/gtc-contract/status/gtc-documents-table-columns.tsx
index f6eb81d0..cd02a3e5 100644
--- a/lib/gtc-contract/status/gtc-documents-table-columns.tsx
+++ b/lib/gtc-contract/status/gtc-documents-table-columns.tsx
@@ -4,8 +4,9 @@ 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 type { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"
 
-import { formatDate, formatDateTime } from "@/lib/utils"
+import { formatDate } from "@/lib/utils"
 import { Badge } from "@/components/ui/badge"
 import { Button } from "@/components/ui/button"
 import { Checkbox } from "@/components/ui/checkbox"
@@ -23,16 +24,11 @@ import { type GtcDocumentWithRelations } from "@/db/schema/gtc"
 
 interface GetColumnsProps {
   setRowAction: React.Dispatch<React.SetStateAction<DataTableRowAction<GtcDocumentWithRelations> | null>>
+  router: AppRouterInstance // ← 추가
 }
 
-/**
- * GTC Documents 테이블 컬럼 정의
- */
+/** GTC Documents 테이블 컬럼 정의 (그룹 헤더 제거) */
 export function getColumns({ setRowAction, router }: GetColumnsProps): ColumnDef<GtcDocumentWithRelations>[] {
-
-  // ----------------------------------------------------------------
-  // 1) select 컬럼 (체크박스)
-  // ----------------------------------------------------------------
   const selectColumn: ColumnDef<GtcDocumentWithRelations> = {
     id: "select",
     header: ({ table }) => (
@@ -59,165 +55,145 @@ export function getColumns({ setRowAction, router }: GetColumnsProps): ColumnDef
     enableHiding: false,
   }
 
-  // ----------------------------------------------------------------
-  // 2) 기본 정보 그룹
-  // ----------------------------------------------------------------
   const basicInfoColumns: ColumnDef<GtcDocumentWithRelations>[] = [
     {
       accessorKey: "type",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="구분" />,
       cell: ({ row }) => {
-        const type = row.getValue("type") as string;
+        const type = row.getValue("type") as string
         return (
           <Badge variant={type === "standard" ? "default" : "secondary"}>
             {type === "standard" ? "표준" : "프로젝트"}
           </Badge>
-        );
+        )
       },
       size: 100,
       enableResizing: true,
-      meta: {
-        excelHeader: "구분",
-      },
+      meta: { excelHeader: "구분" },
     },
     {
       accessorKey: "project",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="프로젝트" />,
       cell: ({ row }) => {
-        const project = row.original.project;
-        if (!project) {
-          return <span className="text-muted-foreground">-</span>;
-        }
+        const project = row.original.project
+        if (!project) return <span className="text-muted-foreground">-</span>
         return (
           <div className="flex flex-col min-w-0">
             <span className="font-medium truncate">{project.name}</span>
             <span className="text-xs text-muted-foreground">{project.code}</span>
           </div>
-        );
+        )
       },
       size: 200,
       enableResizing: true,
-      meta: {
-        excelHeader: "프로젝트",
+      meta: { excelHeader: "프로젝트" },
+    },
+    {
+      accessorKey: "title",
+      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="GTC 제목" />,
+      cell: ({ row }) => {
+        const title = row.original.title
+        if (!title) return <span className="text-muted-foreground">-</span>
+        return (
+          <div className="flex flex-col min-w-0">
+            <span className="font-medium truncate">{title}</span>
+          </div>
+        )
       },
+      size: 200,
+      enableResizing: true,
+      meta: { excelHeader: "GTC 제목" },
     },
     {
       accessorKey: "revision",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="Rev." />,
       cell: ({ row }) => {
-        const revision = row.getValue("revision") as number;
-        return <span className="font-mono text-sm">v{revision}</span>;
+        const revision = row.getValue("revision") as number
+        return <span className="font-mono text-sm">v{revision}</span>
       },
       size: 80,
       enableResizing: true,
-      meta: {
-        excelHeader: "Rev.",
-      },
+      meta: { excelHeader: "Rev." },
     },
-  ];
+  ]
 
-  // ----------------------------------------------------------------
-  // 3) 등록/수정 정보 그룹
-  // ----------------------------------------------------------------
   const auditColumns: ColumnDef<GtcDocumentWithRelations>[] = [
     {
       accessorKey: "createdAt",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="최초등록일" />,
       cell: ({ row }) => {
-        const date = row.getValue("createdAt") as Date;
-        return date ? formatDate(date, "KR") : "-";
+        const date = row.getValue("createdAt") as Date
+        return date ? formatDate(date, "KR") : "-"
       },
       size: 120,
       enableResizing: true,
-      meta: {
-        excelHeader: "최초등록일",
-      },
+      meta: { excelHeader: "최초등록일" },
     },
     {
       accessorKey: "createdBy",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="최초등록자" />,
       cell: ({ row }) => {
-        const createdBy = row.original.createdBy;
-        return createdBy ? (
-          <span className="text-sm">{createdBy.name}</span>
-        ) : (
-          <span className="text-muted-foreground">-</span>
-        );
+        const createdBy = row.original.createdBy
+        return createdBy ? <span className="text-sm">{createdBy.name}</span> : <span className="text-muted-foreground">-</span>
       },
       size: 120,
       enableResizing: true,
-      meta: {
-        excelHeader: "최초등록자",
-      },
+      meta: { excelHeader: "최초등록자" },
     },
     {
       accessorKey: "updatedAt",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="최종수정일" />,
       cell: ({ row }) => {
-        const date = row.getValue("updatedAt") as Date;
-        return date ? formatDate(date, "KR") : "-";
+        const date = row.getValue("updatedAt") as Date
+        return date ? formatDate(date, "KR") : "-"
       },
       size: 120,
       enableResizing: true,
-      meta: {
-        excelHeader: "최종수정일",
-      },
+      meta: { excelHeader: "최종수정일" },
     },
     {
       accessorKey: "updatedBy",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="최종수정자" />,
       cell: ({ row }) => {
-        const updatedBy = row.original.updatedBy;
-        return updatedBy ? (
-          <span className="text-sm">{updatedBy.name}</span>
-        ) : (
-          <span className="text-muted-foreground">-</span>
-        );
+        const updatedBy = row.original.updatedBy
+        return updatedBy ? <span className="text-sm">{updatedBy.name}</span> : <span className="text-muted-foreground">-</span>
       },
       size: 120,
       enableResizing: true,
-      meta: {
-        excelHeader: "최종수정자",
-      },
+      meta: { excelHeader: "최종수정자" },
     },
     {
       accessorKey: "editReason",
       header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="최종 편집사유" />,
       cell: ({ row }) => {
-        const reason = row.getValue("editReason") as string;
+        const reason = row.getValue("editReason") as string
         return reason ? (
           <span className="text-sm" title={reason}>
             {reason.length > 30 ? `${reason.substring(0, 30)}...` : reason}
           </span>
         ) : (
           <span className="text-muted-foreground">-</span>
-        );
+        )
       },
       size: 200,
       enableResizing: true,
-      meta: {
-        excelHeader: "최종 편집사유",
-      },
+      meta: { excelHeader: "최종 편집사유" },
     },
-  ];
+  ]
 
-  // ----------------------------------------------------------------
-  // 4) actions 컬럼 (Dropdown 메뉴)
-  // ----------------------------------------------------------------
   const actionsColumn: ColumnDef<GtcDocumentWithRelations> = {
     id: "actions",
     enableHiding: false,
-    cell: function Cell({ row }) {
-      const [isUpdatePending, startUpdateTransition] = React.useTransition()
-      const gtcDocument = row.original;
+    cell: ({ row }) => {
+      const gtcDocument = row.original
 
       const handleViewDetails = () => {
-        router.push(`/evcp/gtc-documents/${gtcDocument.id}`);
-      };
+        router.push(`/evcp/basic-contract-template/gtc/${gtcDocument.id}`)
+      }
 
       const handleCreateNewRevision = () => {
-        setRowAction({ row, type: "createRevision" });
-      };
+        setRowAction({ row, type: "createRevision" })
+      }
 
       return (
         <DropdownMenu>
@@ -227,32 +203,28 @@ export function getColumns({ setRowAction, router }: GetColumnsProps): ColumnDef
               variant="ghost"
               className="flex size-8 p-0 data-[state=open]:bg-muted"
             >
-              <Ellipsis className="size-4" aria-hidden="true" />
+              <Ellipsis className="size-4" aria-hidden />
             </Button>
           </DropdownMenuTrigger>
           <DropdownMenuContent align="end" className="w-48">
             <DropdownMenuItem onSelect={handleViewDetails}>
               <Eye className="mr-2 h-4 w-4" />
-              View Details
+              상세
             </DropdownMenuItem>
-            
+
             <DropdownMenuSeparator />
-            
-            <DropdownMenuItem
-              onSelect={() => setRowAction({ row, type: "update" })}
-            >
-              Edit
+
+            <DropdownMenuItem onSelect={() => setRowAction({ row, type: "update" })}>
+              수정 
             </DropdownMenuItem>
 
             <DropdownMenuItem onSelect={handleCreateNewRevision}>
-              Create New Revision
+              새 리비전 생성
             </DropdownMenuItem>
 
             <DropdownMenuSeparator />
-            <DropdownMenuItem
-              onSelect={() => setRowAction({ row, type: "delete" })}
-            >
-              Delete
+            <DropdownMenuItem onSelect={() => setRowAction({ row, type: "delete" })}>
+              삭제
               <DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>
             </DropdownMenuItem>
           </DropdownMenuContent>
@@ -262,28 +234,11 @@ export function getColumns({ setRowAction, router }: GetColumnsProps): ColumnDef
     size: 40,
   }
 
-  // ----------------------------------------------------------------
-  // 5) 중첩 컬럼 그룹 생성
-  // ----------------------------------------------------------------
-  const nestedColumns: ColumnDef<GtcDocumentWithRelations>[] = [
-    {
-      id: "기본 정보",
-      header: "기본 정보",
-      columns: basicInfoColumns,
-    },
-    {
-      id: "등록/수정 정보",
-      header: "등록/수정 정보",
-      columns: auditColumns,
-    },
-  ]
-
-  // ----------------------------------------------------------------
-  // 6) 최종 컬럼 배열
-  // ----------------------------------------------------------------
+  // 그룹 없이 평평한 배열 반환
   return [
     selectColumn,
-    ...nestedColumns,
+    ...basicInfoColumns,
+    ...auditColumns,
     actionsColumn,
   ]
-}
\ No newline at end of file
+}
-- 
cgit v1.2.3

