From 90f79a7a691943a496f67f01c1e493256070e4de Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Mon, 7 Jul 2025 01:44:45 +0000
Subject: (대표님) 변경사항 20250707 10시 43분 - unstaged 변경사항 추가
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../status/basic-contract-columns.tsx              | 153 +++++++++------------
 1 file changed, 68 insertions(+), 85 deletions(-)

(limited to 'lib/basic-contract/status/basic-contract-columns.tsx')

diff --git a/lib/basic-contract/status/basic-contract-columns.tsx b/lib/basic-contract/status/basic-contract-columns.tsx
index 6ca4a096..54504be4 100644
--- a/lib/basic-contract/status/basic-contract-columns.tsx
+++ b/lib/basic-contract/status/basic-contract-columns.tsx
@@ -3,29 +3,16 @@
 import * as React from "react"
 import { type DataTableRowAction } from "@/types/table"
 import { type ColumnDef } from "@tanstack/react-table"
-import {  Paperclip } from "lucide-react"
-import { toast } from "sonner"
 
-import { getErrorMessage } from "@/lib/handle-error"
-import { formatDate, formatDateTime } from "@/lib/utils"
+import { 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,
-  DropdownMenuRadioGroup,
-  DropdownMenuRadioItem,
-  DropdownMenuSeparator,
-  DropdownMenuShortcut,
-  DropdownMenuSub,
-  DropdownMenuSubContent,
-  DropdownMenuSubTrigger,
-  DropdownMenuTrigger,
-} from "@/components/ui/dropdown-menu"
-
 import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header"
+import { 
+  FileActionsDropdown, 
+  FileNameLink 
+} from "@/components/ui/file-actions"
+
 import { basicContractColumnsConfig } from "@/config/basicContractColumnsConfig"
 import { BasicContractView } from "@/db/schema"
 
@@ -34,38 +21,7 @@ interface GetColumnsProps {
 }
 
 /**
- * 파일 다운로드 함수
- */
-/**
- * 파일 다운로드 함수
- */
-const handleFileDownload = (filePath: string | null, fileName: string | null) => {
-  if (!filePath || !fileName) {
-    toast.error("파일 정보가 없습니다.");
-    return;
-  }
-
-  try {
-    // 전체 URL 생성
-    const fullUrl = `${window.location.origin}${filePath}`;
-    
-    // a 태그를 생성하여 다운로드 실행
-    const link = document.createElement('a');
-    link.href = fullUrl;
-    link.download = fileName; // 다운로드될 파일명 설정
-    document.body.appendChild(link);
-    link.click();
-    document.body.removeChild(link);
-    
-    toast.success("파일 다운로드를 시작합니다.");
-  } catch (error) {
-    console.error("파일 다운로드 오류:", error);
-    toast.error("파일 다운로드 중 오류가 발생했습니다.");
-  }
-};
-
-/**
- * tanstack table 컬럼 정의 (중첩 헤더 버전)
+ * 공용 파일 다운로드 유틸리티를 사용하는 간소화된 컬럼 정의
  */
 export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicContractView>[] {
   // ----------------------------------------------------------------
@@ -98,7 +54,7 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo
   }
 
   // ----------------------------------------------------------------
-  // 2) 파일 다운로드 컬럼 (아이콘)
+  // 2) 파일 다운로드 컬럼 (공용 컴포넌트 사용)
   // ----------------------------------------------------------------
   const downloadColumn: ColumnDef<BasicContractView> = {
     id: "download",
@@ -106,39 +62,35 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo
     cell: ({ row }) => {
       const template = row.original;
       
+      if (!template.filePath || !template.fileName) {
+        return null;
+      }
+      
       return (
-        <Button
+        <FileActionsDropdown
+          filePath={template.filePath}
+          fileName={template.fileName}
           variant="ghost"
           size="icon"
-          onClick={() => handleFileDownload(template.filePath, template.fileName)}
-          title={`${template.fileName} 다운로드`}
-          className="hover:bg-muted"
-        >
-          <Paperclip className="h-4 w-4" />
-          <span className="sr-only">다운로드</span>
-        </Button>
+        />
       );
     },
     maxSize: 30,
     enableSorting: false,
   }
 
-
   // ----------------------------------------------------------------
-  // 4) 일반 컬럼들을 "그룹"별로 묶어 중첩 columns 생성
+  // 3) 일반 컬럼들을 "그룹"별로 묶어 중첩 columns 생성
   // ----------------------------------------------------------------
-  // 4-1) groupMap: { [groupName]: ColumnDef<BasicContractView>[] }
   const groupMap: Record<string, ColumnDef<BasicContractView>[]> = {}
 
   basicContractColumnsConfig.forEach((cfg) => {
-    // 만약 group가 없으면 "_noGroup" 처리
     const groupName = cfg.group || "_noGroup"
 
     if (!groupMap[groupName]) {
       groupMap[groupName] = []
     }
 
-    // child column 정의
     const childCol: ColumnDef<BasicContractView> = {
       accessorKey: cfg.id,
       enableResizing: true,
@@ -157,57 +109,88 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo
           return formatDateTime(dateVal)
         }
         
-        // Status 컬럼에 Badge 적용
+        // Status 컬럼에 Badge 적용 (확장)
         if (cfg.id === "status") {
           const status = row.getValue(cfg.id) as string
-          const isActive = status === "ACTIVE"
           
-          return (
-            <Badge 
-              variant={isActive ? "default" : "secondary"}
-            >
-              {isActive ? "활성" : "비활성"}
-            </Badge>
-          )
+          let variant: "default" | "secondary" | "destructive" | "outline" = "secondary";
+          let label = status;
+          
+          switch (status) {
+            case "ACTIVE":
+              variant = "default";
+              label = "활성";
+              break;
+            case "INACTIVE":
+              variant = "secondary";
+              label = "비활성";
+              break;
+            case "PENDING":
+              variant = "outline";
+              label = "대기중";
+              break;
+            case "COMPLETED":
+              variant = "default";
+              label = "완료";
+              break;
+            default:
+              variant = "secondary";
+              label = status;
+          }
+          
+          return <Badge variant={variant}>{label}</Badge>
+        }
+
+        // ✅ 파일 이름 컬럼 (공용 컴포넌트 사용)
+        if (cfg.id === "fileName") {
+          const fileName = cell.getValue() as string;
+          const filePath = row.original.filePath;
+          
+          if (fileName && filePath) {
+            return (
+              <FileNameLink
+                filePath={filePath}
+                fileName={fileName}
+                maxLength={200}
+                showIcon={true}
+              />
+            );
+          }
+          return fileName || "";
         }
 
         // 나머지 컬럼은 그대로 값 표시
         return row.getValue(cfg.id) ?? ""
       },
-    minSize: 80,
-
+      minSize: 80,
     }
 
     groupMap[groupName].push(childCol)
   })
 
   // ----------------------------------------------------------------
-  // 4-2) groupMap에서 실제 상위 컬럼(그룹)을 만들기
+  // 4) groupMap에서 실제 상위 컬럼(그룹)을 만들기
   // ----------------------------------------------------------------
   const nestedColumns: ColumnDef<BasicContractView>[] = []
 
-  // 순서를 고정하고 싶다면 group 순서를 미리 정의하거나 sort해야 함
-  // 여기서는 그냥 Object.entries 순서
   Object.entries(groupMap).forEach(([groupName, colDefs]) => {
     if (groupName === "_noGroup") {
-      // 그룹 없음 → 그냥 최상위 레벨 컬럼
       nestedColumns.push(...colDefs)
     } else {
-      // 상위 컬럼
       nestedColumns.push({
         id: groupName,
-        header: groupName, // "Basic Info", "Metadata" 등
+        header: groupName,
         columns: colDefs,
       })
     }
   })
 
   // ----------------------------------------------------------------
-  // 5) 최종 컬럼 배열: select, download, nestedColumns, actions
+  // 5) 최종 컬럼 배열
   // ----------------------------------------------------------------
   return [
     selectColumn,
-    downloadColumn, // 다운로드 컬럼 추가
+    downloadColumn, // ✅ 공용 파일 액션 컴포넌트 사용
     ...nestedColumns,
   ]
-}
\ No newline at end of file
+}
-- 
cgit v1.2.3

