From 208ed7ff11d0f822d3d243c5833d31973904349e Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Wed, 5 Nov 2025 16:07:43 +0900 Subject: (김준회) vendor-pool: excel-import 코드기반검색처리, 템플릿 변경 (구매 김수진 프로 요청사항) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/vendor-pool/table/import-result-dialog.tsx | 167 +++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 lib/vendor-pool/table/import-result-dialog.tsx (limited to 'lib/vendor-pool/table/import-result-dialog.tsx') diff --git a/lib/vendor-pool/table/import-result-dialog.tsx b/lib/vendor-pool/table/import-result-dialog.tsx new file mode 100644 index 00000000..2e541271 --- /dev/null +++ b/lib/vendor-pool/table/import-result-dialog.tsx @@ -0,0 +1,167 @@ +"use client" + +import React from 'react' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" +import { Button } from "@/components/ui/button" +import { ScrollArea } from "@/components/ui/scroll-area" +import { CheckCircle2, XCircle, AlertCircle, RefreshCw, FileText } from "lucide-react" +import { Separator } from "@/components/ui/separator" +import { Badge } from "@/components/ui/badge" + +export interface ImportResultItem { + rowNumber: number + status: 'success' | 'error' | 'duplicate' | 'warning' + message: string + data?: { + vendorName?: string + materialGroupName?: string + designCategory?: string + } +} + +export interface ImportResult { + totalRows: number + successCount: number + errorCount: number + duplicateCount: number + items: ImportResultItem[] // 실패한 건만 포함 +} + +interface ImportResultDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + result: ImportResult | null +} + +export function ImportResultDialog({ open, onOpenChange, result }: ImportResultDialogProps) { + if (!result) return null + + const getStatusIcon = (status: ImportResultItem['status']) => { + switch (status) { + case 'success': + return + case 'error': + return + case 'duplicate': + return + case 'warning': + return + } + } + + const getStatusBadge = (status: ImportResultItem['status']) => { + switch (status) { + case 'success': + return 성공 + case 'error': + return 실패 + case 'duplicate': + return 중복 + case 'warning': + return 경고 + } + } + + return ( + + + + + + 엑셀 Import 결과 + + + 총 {result.totalRows}건의 데이터를 처리했습니다. + + + + {/* 요약 정보 */} +
+
+ +
{result.successCount}
+
성공
+
+ +
+ +
{result.duplicateCount}
+
중복
+
+ +
+ +
{result.errorCount}
+
실패
+
+
+ + {/* 상세 정보 - 실패한 건만 표시 */} + {result.errorCount > 0 && ( + <> + +
+

실패한 항목 ({result.errorCount}건)

+ +
+ {result.items.map((item, index) => ( +
+
+ {getStatusIcon(item.status)} +
+
+
+ + 행 {item.rowNumber} + + {getStatusBadge(item.status)} +
+

{item.message}

+ {item.data && ( +
+ {item.data.vendorName && ( +
• 협력업체: {item.data.vendorName}
+ )} + {item.data.materialGroupName && ( +
• 자재그룹: {item.data.materialGroupName}
+ )} + {item.data.designCategory && ( +
• 설계기능: {item.data.designCategory}
+ )} +
+ )} +
+
+ ))} + + {result.items.length === 0 && ( +
+ 모든 항목이 정상적으로 처리되었습니다. +
+ )} +
+
+
+ + )} + + {/* 하단 버튼 */} +
+ +
+
+
+ ) +} + -- cgit v1.2.3