From defda07c0bb4b0bd444ca8dc4fd3f89322bda0ce Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 3 Oct 2025 04:48:47 +0000 Subject: (대표님) edp, tbe, dolce 등 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ship/import-from-dolce-button.tsx | 188 ++++++++++++++++----- 1 file changed, 143 insertions(+), 45 deletions(-) (limited to 'lib/vendor-document-list') diff --git a/lib/vendor-document-list/ship/import-from-dolce-button.tsx b/lib/vendor-document-list/ship/import-from-dolce-button.tsx index fe7f55c7..76d66960 100644 --- a/lib/vendor-document-list/ship/import-from-dolce-button.tsx +++ b/lib/vendor-document-list/ship/import-from-dolce-button.tsx @@ -1,4 +1,4 @@ -// import-from-dolce-button.tsx - 최적화된 버전 +// import-from-dolce-button.tsx - 리비전/첨부파일 포함 버전 "use client" import * as React from "react" @@ -223,20 +223,30 @@ export function ImportFromDOLCEButton({ } }, [debouncedProjectIds, fetchAllImportStatus]) - - - // 🔥 전체 통계 메모이제이션 + // 🔥 전체 통계 메모이제이션 - 리비전과 첨부파일 추가 const totalStats = React.useMemo(() => { const statuses = Array.from(importStatusMap.values()) return statuses.reduce((acc, status) => ({ availableDocuments: acc.availableDocuments + (status.availableDocuments || 0), newDocuments: acc.newDocuments + (status.newDocuments || 0), updatedDocuments: acc.updatedDocuments + (status.updatedDocuments || 0), + availableRevisions: acc.availableRevisions + (status.availableRevisions || 0), + newRevisions: acc.newRevisions + (status.newRevisions || 0), + updatedRevisions: acc.updatedRevisions + (status.updatedRevisions || 0), + availableAttachments: acc.availableAttachments + (status.availableAttachments || 0), + newAttachments: acc.newAttachments + (status.newAttachments || 0), + updatedAttachments: acc.updatedAttachments + (status.updatedAttachments || 0), importEnabled: acc.importEnabled || status.importEnabled }), { availableDocuments: 0, newDocuments: 0, updatedDocuments: 0, + availableRevisions: 0, + newRevisions: 0, + updatedRevisions: 0, + availableAttachments: 0, + newAttachments: 0, + updatedAttachments: 0, importEnabled: false }) }, [importStatusMap]) @@ -347,7 +357,14 @@ export function ImportFromDOLCEButton({ } }, [projectIds, fetchAllImportStatus, onImportComplete, t]) - // 🔥 상태 뱃지 메모이제이션 + // 🔥 전체 변경 사항 계산 + const totalChanges = React.useMemo(() => { + return totalStats.newDocuments + totalStats.updatedDocuments + + totalStats.newRevisions + totalStats.updatedRevisions + + totalStats.newAttachments + totalStats.updatedAttachments + }, [totalStats]) + + // 🔥 상태 뱃지 메모이제이션 - 리비전과 첨부파일 포함 const statusBadge = React.useMemo(() => { if (loadingVendorProjects) { return {t('dolceImport.status.loadingProjectInfo')} @@ -365,7 +382,7 @@ export function ImportFromDOLCEButton({ return {t('dolceImport.status.importDisabled')} } - if (totalStats.newDocuments > 0 || totalStats.updatedDocuments > 0) { + if (totalChanges > 0) { return ( @@ -380,10 +397,10 @@ export function ImportFromDOLCEButton({ {t('dolceImport.status.synchronized')} ) - }, [loadingVendorProjects, statusLoading, importStatusMap.size, totalStats, projectIds.length, t]) + }, [loadingVendorProjects, statusLoading, importStatusMap.size, totalStats.importEnabled, totalChanges, projectIds.length, t]) - const canImport = totalStats.importEnabled && - (totalStats.newDocuments > 0 || totalStats.updatedDocuments > 0) + // 🔥 가져오기 가능 여부 - 리비전과 첨부파일도 체크 + const canImport = totalStats.importEnabled && totalChanges > 0 // 🔥 새로고침 핸들러 최적화 const handleRefresh = React.useCallback(() => { @@ -391,24 +408,20 @@ export function ImportFromDOLCEButton({ fetchAllImportStatus() }, [fetchAllImportStatus]) - - // 🔥 자동 동기화 실행 (기존 useEffect들 다음에 추가) - React.useEffect(() => { + // 🔥 자동 동기화 실행 (기존 useEffect들 다음에 추가) + React.useEffect(() => { // 조건: 가져오기 가능하고, 동기화할 항목이 있고, 현재 진행중이 아닐 때 - if (canImport && - (totalStats.newDocuments > 0 || totalStats.updatedDocuments > 0) && - !isImporting && - !isDialogOpen) { + if (canImport && totalChanges > 0 && !isImporting && !isDialogOpen) { // 상태 로딩이 완료된 후 잠깐 대기 (사용자가 상태를 확인할 수 있도록) const timer = setTimeout(() => { - console.log(`🔄 자동 동기화 시작: 새 문서 ${totalStats.newDocuments}개, 업데이트 ${totalStats.updatedDocuments}개`) + console.log(`🔄 자동 동기화 시작: ${totalChanges}개 항목`) // 동기화 시작 알림 toast.info( - '새로운 문서가 발견되어 자동 동기화를 시작합니다', + '새로운 변경사항이 발견되어 자동 동기화를 시작합니다', { - description: `새 문서 ${totalStats.newDocuments}개, 업데이트 ${totalStats.updatedDocuments}개`, + description: `총 ${totalChanges}개 항목 (문서/리비전/첨부파일)`, duration: 3000 } ) @@ -424,9 +437,8 @@ export function ImportFromDOLCEButton({ return () => clearTimeout(timer) } - }, [canImport, totalStats.newDocuments, totalStats.updatedDocuments, isImporting, isDialogOpen, handleImport]) + }, [canImport, totalChanges, isImporting, isDialogOpen, handleImport]) - // 로딩 중이거나 projectIds가 없으면 버튼을 표시하지 않음 if (projectIds.length === 0) { return null @@ -449,12 +461,12 @@ export function ImportFromDOLCEButton({ )} {t('dolceImport.buttons.getList')} - {totalStats.newDocuments + totalStats.updatedDocuments > 0 && ( + {totalChanges > 0 && ( - {totalStats.newDocuments + totalStats.updatedDocuments} + {totalChanges} )} @@ -493,21 +505,75 @@ export function ImportFromDOLCEButton({
-
-
-
{t('dolceImport.labels.newDocuments')}
-
{totalStats.newDocuments || 0}
-
-
-
{t('dolceImport.labels.updates')}
-
{totalStats.updatedDocuments || 0}
+ {/* 문서 정보 */} +
+
{t('dolceImport.labels.documents')}
+
+
+
{t('dolceImport.labels.total')}
+
{totalStats.availableDocuments || 0}
+
+
+
{t('dolceImport.labels.new')}
+
{totalStats.newDocuments || 0}
+
+
+
{t('dolceImport.labels.updates')}
+
{totalStats.updatedDocuments || 0}
+
-
-
{t('dolceImport.labels.totalDocuments')}
-
{totalStats.availableDocuments || 0}
-
+ {/* 리비전 정보 */} + {(totalStats.availableRevisions > 0 || totalStats.newRevisions > 0 || totalStats.updatedRevisions > 0) && ( +
+
{t('dolceImport.labels.revisions')}
+
+
+
{t('dolceImport.labels.total')}
+
{totalStats.availableRevisions || 0}
+
+
+
{t('dolceImport.labels.new')}
+
{totalStats.newRevisions || 0}
+
+
+
{t('dolceImport.labels.updates')}
+
{totalStats.updatedRevisions || 0}
+
+
+
+ )} + + {/* 첨부파일 정보 */} + {(totalStats.availableAttachments > 0 || totalStats.newAttachments > 0 || totalStats.updatedAttachments > 0) && ( +
+
{t('dolceImport.labels.attachments')}
+
+
+
{t('dolceImport.labels.total')}
+
{totalStats.availableAttachments || 0}
+
+
+
{t('dolceImport.labels.new')}
+
{totalStats.newAttachments || 0}
+
+
+
{t('dolceImport.labels.updates')}
+
{totalStats.updatedAttachments || 0}
+
+
+
+ )} + + {/* 요약 */} + {totalChanges > 0 && ( +
+
+ {t('dolceImport.labels.totalChanges')}: {totalChanges} +
+
+ )} {/* 각 프로젝트별 세부 정보 */} {projectIds.length > 1 && ( @@ -522,11 +588,29 @@ export function ImportFromDOLCEButton({
{t('dolceImport.labels.projectLabel', { projectId })}
{status ? ( -
- {t('dolceImport.descriptions.projectDetails', { - newDocuments: status.newDocuments, - updatedDocuments: status.updatedDocuments - })} +
+
+ {t('dolceImport.descriptions.projectDocuments', { + newDocuments: status.newDocuments, + updatedDocuments: status.updatedDocuments + })} +
+ {(status.newRevisions > 0 || status.updatedRevisions > 0) && ( +
+ {t('dolceImport.descriptions.projectRevisions', { + newRevisions: status.newRevisions, + updatedRevisions: status.updatedRevisions + })} +
+ )} + {(status.newAttachments > 0 || status.updatedAttachments > 0) && ( +
+ {t('dolceImport.descriptions.projectAttachments', { + newAttachments: status.newAttachments, + updatedAttachments: status.updatedAttachments + })} +
+ )}
) : (
{t('dolceImport.status.statusCheckFailed')}
@@ -595,14 +679,28 @@ export function ImportFromDOLCEButton({
{t('dolceImport.labels.itemsToImport')} - - {totalStats.newDocuments + totalStats.updatedDocuments} - + {totalChanges} +
+ +
+ {totalStats.newDocuments + totalStats.updatedDocuments > 0 && ( +
+ • {t('dolceImport.labels.documents')}: {totalStats.newDocuments} {t('dolceImport.labels.new')}, {totalStats.updatedDocuments} {t('dolceImport.labels.updates')} +
+ )} + {totalStats.newRevisions + totalStats.updatedRevisions > 0 && ( +
+ • {t('dolceImport.labels.revisions')}: {totalStats.newRevisions} {t('dolceImport.labels.new')}, {totalStats.updatedRevisions} {t('dolceImport.labels.updates')} +
+ )} + {totalStats.newAttachments + totalStats.updatedAttachments > 0 && ( +
+ • {t('dolceImport.labels.attachments')}: {totalStats.newAttachments} {t('dolceImport.labels.new')}, {totalStats.updatedAttachments} {t('dolceImport.labels.updates')} +
+ )}
- {t('dolceImport.descriptions.includesNewAndUpdated')} -
{t('dolceImport.descriptions.b4DocumentsNote')} {projectIds.length > 1 && ( <> -- cgit v1.2.3