From c228a89c2834ee63b209bad608837c39643f350e Mon Sep 17 00:00:00 2001 From: dujinkim 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 --- .../gtc-clauses/table/preview-document-dialog.tsx | 189 +++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 lib/gtc-contract/gtc-clauses/table/preview-document-dialog.tsx (limited to 'lib/gtc-contract/gtc-clauses/table/preview-document-dialog.tsx') diff --git a/lib/gtc-contract/gtc-clauses/table/preview-document-dialog.tsx b/lib/gtc-contract/gtc-clauses/table/preview-document-dialog.tsx new file mode 100644 index 00000000..29ab1b5a --- /dev/null +++ b/lib/gtc-contract/gtc-clauses/table/preview-document-dialog.tsx @@ -0,0 +1,189 @@ +"use client" + +import * as React from "react" +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog" +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Separator } from "@/components/ui/separator" + +import { + Eye, + Download, + Loader2, + FileText, + RefreshCw, + Settings +} from "lucide-react" +import { toast } from "sonner" + +import { type GtcClauseTreeView } from "@/db/schema/gtc" +import { ClausePreviewViewer } from "./clause-preview-viewer" + +interface PreviewDocumentDialogProps + extends React.ComponentPropsWithRef { + clauses: GtcClauseTreeView[] + document: any + onExport?: () => void +} + +export function PreviewDocumentDialog({ + clauses, + document, + onExport, + ...props +}: PreviewDocumentDialogProps) { + const [isGenerating, setIsGenerating] = React.useState(false) + const [documentGenerated, setDocumentGenerated] = React.useState(false) + const [viewerInstance, setViewerInstance] = React.useState(null) + + // 조항 통계 계산 + const stats = React.useMemo(() => { + const activeClausesCount = clauses.filter(c => c.isActive !== false).length + const topLevelCount = clauses.filter(c => !c.parentId && c.isActive !== false).length + const hasContentCount = clauses.filter(c => c.content && c.isActive !== false).length + + return { + total: activeClausesCount, + topLevel: topLevelCount, + withContent: hasContentCount, + withoutContent: activeClausesCount - hasContentCount + } + }, [clauses]) + + const handleGeneratePreview = async () => { + setIsGenerating(true) + try { + // 잠시 후 문서 생성 완료로 설정 (실제로는 뷰어에서 처리) + setTimeout(() => { + setDocumentGenerated(true) + setIsGenerating(false) + toast.success("문서 미리보기가 생성되었습니다.") + }, 1500) + } catch (error) { + setIsGenerating(false) + toast.error("문서 생성 중 오류가 발생했습니다.") + } + } + + const handleExportDocument = () => { + if (viewerInstance) { + // PDFTron의 다운로드 기능 실행 + viewerInstance.UI.downloadPdf({ + filename: `${document?.title || 'GTC계약서'}_미리보기.pdf` + }) + toast.success("문서가 다운로드됩니다.") + } + } + + const handleRegenerateDocument = () => { + setDocumentGenerated(false) + handleGeneratePreview() + } + + React.useEffect(() => { + // 다이얼로그가 열릴 때 자동으로 미리보기 생성 + if (props.open && !documentGenerated && !isGenerating) { + handleGeneratePreview() + } + }, [props.open]) + + return ( + + + + + + 문서 미리보기 + + + 현재 조항들을 기반으로 생성된 문서를 미리보기합니다. + + + + {/* 문서 정보 및 통계 */} +
+
+
+ + {document?.title || 'GTC 계약서'} + {stats.total}개 조항 +
+
+ {documentGenerated && ( + <> + + + + )} +
+
+ +
+
+
{stats.total}
+
총 조항
+
+
+
{stats.topLevel}
+
최상위 조항
+
+
+
{stats.withContent}
+
내용 있음
+
+
+
{stats.withoutContent}
+
제목만
+
+
+
+ + + + {/* PDFTron 뷰어 영역 */} +
+ {isGenerating ? ( +
+ +

문서 생성 중...

+

+ {stats.total}개의 조항을 배치하고 있습니다. +

+
+ ) : documentGenerated ? ( + + ) : ( +
+ +

문서 미리보기 준비 중

+ +
+ )} +
+
+
+ ) +} \ No newline at end of file -- cgit v1.2.3