From 37f55540833c2d5894513eca9fc8f7c6233fc2d2 Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Thu, 29 May 2025 05:17:13 +0000
Subject: (대표님) 0529 14시 16분 변경사항 저장 (Vendor Data, Docu)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 components/form-data/form-data-table-columns.tsx | 47 ++++++++++++++++++------
 1 file changed, 35 insertions(+), 12 deletions(-)

(limited to 'components/form-data/form-data-table-columns.tsx')

diff --git a/components/form-data/form-data-table-columns.tsx b/components/form-data/form-data-table-columns.tsx
index de479efb..b088276e 100644
--- a/components/form-data/form-data-table-columns.tsx
+++ b/components/form-data/form-data-table-columns.tsx
@@ -57,6 +57,7 @@ interface GetColumnsProps<TData> {
   // 체크박스 선택 관련 props
   selectedRows?: Record<string, boolean>;
   onRowSelectionChange?: (updater: Record<string, boolean> | ((prev: Record<string, boolean>) => Record<string, boolean>)) => void;
+  editableFieldsMap?: Map<string, string[]>; // 새로 추가
 }
 
 /**
@@ -72,6 +73,7 @@ export function getColumns<TData extends object>({
   tempCount,
   selectedRows = {},
   onRowSelectionChange,
+  editableFieldsMap = new Map(), // 새로 추가
 }: GetColumnsProps<TData>): ColumnDef<TData>[] {
   const columns: ColumnDef<TData>[] = [];
 
@@ -139,42 +141,64 @@ export function getColumns<TData extends object>({
       minWidth: 80,
       paddingFactor: 1.2,
       maxWidth: col.key === "TAG_NO" ? 120 : 150,
-      isReadOnly: col.shi === true,  // shi 정보를 메타데이터에 저장
+      isReadOnly: col.shi === true,
     },
-    // (3) 실제 셀(cell) 렌더링: type에 따라 분기 가능
+    
     cell: ({ row }) => {
       const cellValue = row.getValue(col.key);
       
-      // shi 속성이 true인 경우 적용할 스타일
-      const isReadOnly = col.shi === true;
-      const readOnlyClass = isReadOnly ? "read-only-cell" : "";
+      // 기본 읽기 전용 여부 (shi 속성 기반)
+      let isReadOnly = col.shi === true;
       
-      // 읽기 전용 셀의 스타일 (인라인 스타일과 클래스 동시 적용)
+      // 동적 읽기 전용 여부 계산
+      if (!isReadOnly && col.key !== 'TAG_NO' && col.key !== 'TAG_DESC') {
+        const tagNo = row.getValue('TAG_NO') as string;
+        if (tagNo && editableFieldsMap.has(tagNo)) {
+          const editableFields = editableFieldsMap.get(tagNo) || [];
+          // 해당 TAG의 편집 가능 필드 목록에 없으면 읽기 전용
+          isReadOnly = !editableFields.includes(col.key);
+        } else {
+          // TAG_NO가 없거나 editableFieldsMap에 없으면 읽기 전용
+          isReadOnly = true;
+        }
+      }
+      
+      const readOnlyClass = isReadOnly ? "read-only-cell" : "";
       const cellStyle = isReadOnly 
         ? { backgroundColor: '#f5f5f5', color: '#666', cursor: 'not-allowed' } 
         : {};
 
+      // 툴팁 메시지 설정
+      let tooltipMessage = "";
+      if (isReadOnly) {
+        if (col.shi === true) {
+          tooltipMessage = "SHI 전용 필드입니다";
+        } else if (col.key === 'TAG_NO' || col.key === 'TAG_DESC') {
+          tooltipMessage = "기본 필드는 수정할 수 없습니다";
+        } else {
+          tooltipMessage = "이 TAG 클래스에서는 편집할 수 없는 필드입니다";
+        }
+      }
+
       // 데이터 타입별 처리
       switch (col.type) {
         case "NUMBER":
-          // 예: number인 경우 콤마 등 표시
           return (
             <div 
               className={readOnlyClass} 
               style={cellStyle} 
-              title={isReadOnly ? "읽기 전용 필드입니다" : ""}
+              title={tooltipMessage}
             >
               {cellValue ? Number(cellValue).toLocaleString() : ""}
             </div>
           );
 
         case "LIST":
-          // 예: select인 경우 label만 표시
           return (
             <div 
               className={readOnlyClass} 
               style={cellStyle}
-              title={isReadOnly ? "읽기 전용 필드입니다" : ""}
+              title={tooltipMessage}
             >
               {String(cellValue ?? "")}
             </div>
@@ -186,7 +210,7 @@ export function getColumns<TData extends object>({
             <div 
               className={readOnlyClass} 
               style={cellStyle}
-              title={isReadOnly ? "읽기 전용 필드입니다" : ""}
+              title={tooltipMessage}
             >
               {String(cellValue ?? "")}
             </div>
@@ -196,7 +220,6 @@ export function getColumns<TData extends object>({
   }));
 
   columns.push(...baseColumns);
-
   // (4) 액션 칼럼 - update 버튼 예시
   const actionColumn: ColumnDef<TData> = {
     id: "update",
-- 
cgit v1.2.3

