From f1676f41e6edadd5841bff6a097dc93fbd195b92 Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Mon, 17 Nov 2025 09:04:34 +0000
Subject: (임수민) 서명 알림 수정
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../viewer/basic-contract-sign-viewer.tsx          | 71 +++++++++-------------
 1 file changed, 29 insertions(+), 42 deletions(-)

(limited to 'lib/basic-contract/viewer/basic-contract-sign-viewer.tsx')

diff --git a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx
index 4d98675b..75862506 100644
--- a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx
+++ b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx
@@ -1292,39 +1292,27 @@ export function BasicContractSignViewer({
     }
   };
 
-  // 서명 상태 표시 컴포넌트
+  // 서명 상태 표시 컴포넌트 - 처리 중이거나 오류일 때만 표시
   const SignatureFieldsStatus = () => {
-    if (!hasSignatureFields && !isAutoSignProcessing && !autoSignError && !hasValidSignature) return null;
-
-    const currentInstance = webViewerInstance.current || instance;
+    // 처리 중이거나 오류가 있을 때만 표시 (완료 후에는 자동으로 사라짐)
+    if (!isAutoSignProcessing && !autoSignError) return null;
 
     return (
-      <div className="mb-2 flex items-center space-x-2">
-        {isAutoSignProcessing ? (
-          <Badge variant="secondary" className="text-xs">
-            <Loader2 className="h-3 w-3 mr-1 animate-spin" />
-            서명 필드 생성 중...
-          </Badge>
-        ) : autoSignError ? (
-          <Badge variant="destructive" className="text-xs bg-red-50 text-red-700 border-red-200">
-            <AlertTriangle className="h-3 w-3 mr-1" />
-            자동 생성 실패
-          </Badge>
-        ) : hasSignatureFields ? (
-          <>
-            <Badge variant="outline" className="text-xs bg-blue-50 text-blue-700 border-blue-200">
-              <Target className="h-3 w-3 mr-1" />
-              {signatureFields.length}개 서명 필드 자동 생성됨 {mode === 'buyer' ? '(왼쪽 하단)' : ''}
+      <div className="sticky top-0 z-50 bg-blue-50 border-b border-blue-200 px-4 py-2 shadow-sm">
+        <div className="flex items-center justify-center space-x-2">
+          {isAutoSignProcessing && (
+            <Badge variant="secondary" className="text-xs">
+              <Loader2 className="h-3 w-3 mr-1 animate-spin" />
+              서명 필드 생성 중...
             </Badge>
-          </>
-        ) : null}
-
-        {hasValidSignature && (
-          <Badge variant="outline" className="text-xs bg-green-50 text-green-700 border-green-200">
-            <CheckCircle2 className="h-3 w-3 mr-1" />
-            서명 완료됨
-          </Badge>
-        )}
+          )}
+          {autoSignError && (
+            <Badge variant="destructive" className="text-xs bg-red-50 text-red-700 border-red-200">
+              <AlertTriangle className="h-3 w-3 mr-1" />
+              자동 생성 실패 - 수동으로 서명해주세요
+            </Badge>
+          )}
+        </div>
       </div>
     );
   };
@@ -1333,11 +1321,13 @@ export function BasicContractSignViewer({
   if (!isOpen && !onClose) {
     return (
       <div className="h-full w-full flex flex-col overflow-hidden">
+        {/* 서명 필드 생성 중 알림 - 상단 고정 */}
+        <SignatureFieldsStatus />
+        
         {/* 구매자 모드에서는 탭 없이 단일 뷰어만 표시 */}
         {allFiles.length > 1 && mode !== 'buyer' ? (
           <Tabs value={activeTab} onValueChange={handleTabChange} className="h-full flex flex-col">
             <div className="border-b bg-gray-50 px-3 py-2 flex-shrink-0">
-              <SignatureFieldsStatus />
               <TabsList className="grid w-full h-8" style={{ gridTemplateColumns: `repeat(${allFiles.length}, 1fr)` }}>
                 {allFiles.map((file, index) => {
                   let tabId: string;
@@ -1447,9 +1437,6 @@ export function BasicContractSignViewer({
           </Tabs>
         ) : (
           <div className="h-full w-full flex flex-col">
-            <div className="flex-shrink-0 p-2">
-              <SignatureFieldsStatus />
-            </div>
             <div className="flex-1 min-h-0 overflow-hidden relative">
               <div className="absolute inset-0">
                 <div className="w-full h-full overflow-auto">
@@ -1492,9 +1479,8 @@ export function BasicContractSignViewer({
     <Dialog open={showDialog} onOpenChange={handleClose}>
       <DialogContent className="w-[90vw] max-w-6xl h-[90vh] flex flex-col p-0">
         <DialogHeader className="px-6 py-4 border-b flex-shrink-0">
-          <DialogTitle className="flex items-center justify-between">
-            <span>{mode === 'buyer' ? '구매자 최종승인' : '기본계약서 서명'}</span>
-            <SignatureFieldsStatus />
+          <DialogTitle>
+            {mode === 'buyer' ? '구매자 최종승인' : '기본계약서 서명'}
           </DialogTitle>
           <DialogDescription>
             계약서를 확인하고 {mode === 'buyer' ? '최종승인을' : '서명을'} 진행해주세요.
@@ -1504,7 +1490,7 @@ export function BasicContractSignViewer({
             {mode !== 'buyer' && isGTCTemplate && (
               <span className="block mt-1 text-blue-600">📋 협의 코멘트를 확인하고 모든 협의가 완료되었는지 확인해주세요.</span>
             )}
-            {hasSignatureFields && (
+            {hasSignatureFields && !isAutoSignProcessing && (
               <span className="block mt-1 text-green-600">
                 🎯 서명 위치가 자동으로 감지되었습니다{mode === 'buyer' ? ' (왼쪽 하단)' : ''}.
               </span>
@@ -1514,11 +1500,6 @@ export function BasicContractSignViewer({
                 ✅ {mode === 'buyer' ? '승인이' : '서명이'} 완료되었습니다.
               </span>
             )}
-            {mode !== 'buyer' && isGTCTemplate && gtcCommentStatus.hasComments && (
-              <span className="block mt-1 text-red-600">
-                ⚠️ {gtcCommentStatus.commentCount}개의 코멘트가 있어 서명할 수 없습니다.
-              </span>
-            )}
             {mode !== 'buyer' && isGTCTemplate && gtcCommentStatus.hasComments && !gtcCommentStatus.isComplete && (
               <span className="block mt-1 text-red-600">
                 ⚠️ {gtcCommentStatus.commentCount}개의 미해결 코멘트가 있어 서명할 수 없습니다.
@@ -1533,6 +1514,9 @@ export function BasicContractSignViewer({
         </DialogHeader>
 
         <div className="flex-1 min-h-0 overflow-hidden">
+          {/* 서명 필드 생성 중 알림 - 상단 고정 */}
+          <SignatureFieldsStatus />
+          
           {/* 구매자 모드에서는 탭 없이 단일 뷰어만 표시 */}
           {allFiles.length > 1 && mode !== 'buyer' ? (
             <Tabs value={activeTab} onValueChange={handleTabChange} className="h-full flex flex-col">
@@ -1641,6 +1625,9 @@ export function BasicContractSignViewer({
             </Tabs>
           ) : (
             <div className="h-full flex flex-col">
+              {/* 서명 필드 생성 중 알림 - 상단 고정 */}
+              <SignatureFieldsStatus />
+              
               <div className="flex-1 min-h-0 overflow-hidden relative">
                 <div className="absolute inset-0">
                   <div className="w-full h-full overflow-auto">
-- 
cgit v1.2.3

