From c72d0897f7b37843109c86f61d97eba05ba3ca0d Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 13 Jun 2025 07:08:01 +0000 Subject: (대표님) 20250613 16시 08분 b-rfq, document 등 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/b-rfq/attachment/vendor-responses-panel.tsx | 205 ++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 lib/b-rfq/attachment/vendor-responses-panel.tsx (limited to 'lib/b-rfq/attachment/vendor-responses-panel.tsx') diff --git a/lib/b-rfq/attachment/vendor-responses-panel.tsx b/lib/b-rfq/attachment/vendor-responses-panel.tsx new file mode 100644 index 00000000..901af3bf --- /dev/null +++ b/lib/b-rfq/attachment/vendor-responses-panel.tsx @@ -0,0 +1,205 @@ +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" +import { Skeleton } from "@/components/ui/skeleton" +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" +import { RefreshCw, Download, MessageSquare, Clock, CheckCircle2, XCircle, AlertCircle } from "lucide-react" +import { formatDate } from "@/lib/utils" + +interface VendorResponsesPanelProps { + attachment: any + responses: any[] + isLoading: boolean + onRefresh: () => void +} + +export function VendorResponsesPanel({ + attachment, + responses, + isLoading, + onRefresh +}: VendorResponsesPanelProps) { + + const getStatusIcon = (status: string) => { + switch (status) { + case 'RESPONDED': + return + case 'NOT_RESPONDED': + return + case 'WAIVED': + return + case 'REVISION_REQUESTED': + return + default: + return + } + } + + const getStatusBadgeVariant = (status: string) => { + switch (status) { + case 'RESPONDED': + return 'default' + case 'NOT_RESPONDED': + return 'secondary' + case 'WAIVED': + return 'outline' + case 'REVISION_REQUESTED': + return 'destructive' + default: + return 'secondary' + } + } + + if (isLoading) { + return ( +
+
+ + +
+
+ {Array.from({ length: 3 }).map((_, i) => ( + + ))} +
+
+ ) + } + + return ( +
+ {/* 헤더 */} +
+
+

+ + 벤더 응답 현황: {attachment.originalFileName} +

+
+ + {attachment.attachmentType} + + 시리얼: {attachment.serialNo} + 등록: {formatDate(attachment.createdAt)} + {attachment.responseStats && ( + + 응답률: {attachment.responseStats.responseRate}% + + )} +
+
+ +
+ + {/* 테이블 */} + {responses.length === 0 ? ( +
+ 이 문서에 대한 벤더 응답 정보가 없습니다. +
+ ) : ( +
+ + + + 벤더 + 국가 + 응답 상태 + 리비전 + 요청일 + 응답일 + 벤더 코멘트 + 액션 + + + + {responses.map((response) => ( + + +
+
{response.vendorName}
+
+ {response.vendorCode} +
+
+
+ + + {response.vendorCountry} + + + +
+ {getStatusIcon(response.responseStatus)} + + {response.responseStatus} + +
+
+ + +
+
현재: {response.currentRevision}
+ {response.respondedRevision && ( +
+ 응답: {response.respondedRevision} +
+ )} +
+
+ + + {formatDate(response.requestedAt)} + + + + {response.respondedAt ? formatDate(response.respondedAt) : '-'} + + + + {response.vendorComment ? ( +
+ {response.vendorComment} +
+ ) : ( + '-' + )} +
+ + +
+ {response.responseStatus === 'RESPONDED' && ( + + )} + +
+
+
+ ))} +
+
+
+ )} +
+ ) +} \ No newline at end of file -- cgit v1.2.3