From 1a2241c40e10193c5ff7008a7b7b36cc1d855d96 Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Tue, 25 Mar 2025 15:55:45 +0900 Subject: initial commit --- lib/tbe/table/file-dialog.tsx | 141 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 lib/tbe/table/file-dialog.tsx (limited to 'lib/tbe/table/file-dialog.tsx') diff --git a/lib/tbe/table/file-dialog.tsx b/lib/tbe/table/file-dialog.tsx new file mode 100644 index 00000000..b569f2b1 --- /dev/null +++ b/lib/tbe/table/file-dialog.tsx @@ -0,0 +1,141 @@ +"use client" + +import * as React from "react" +import { Download, X } from "lucide-react" +import { toast } from "sonner" + +import { getErrorMessage } from "@/lib/handle-error" +import { formatDateTime } from "@/lib/utils" +import { Button } from "@/components/ui/button" +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" + +import { + FileList, + FileListItem, + FileListIcon, + FileListInfo, + FileListName, + FileListDescription, + FileListAction, +} from "@/components/ui/file-list" +import { getTbeFilesForVendor } from "@/lib/rfqs/service" + +interface TBEFileDialogProps { + isOpen: boolean + onOpenChange: (open: boolean) => void + tbeId: number + vendorId: number + rfqId: number + onRefresh?: () => void +} + +export function TBEFileDialog({ + isOpen, + onOpenChange, + vendorId, + rfqId, + onRefresh, +}: TBEFileDialogProps) { + const [submittedFiles, setSubmittedFiles] = React.useState([]) + const [isFetchingFiles, setIsFetchingFiles] = React.useState(false) + + + // Fetch submitted files when dialog opens + React.useEffect(() => { + if (isOpen && rfqId && vendorId) { + fetchSubmittedFiles() + } + }, [isOpen, rfqId, vendorId]) + + // Fetch submitted files using the service function + const fetchSubmittedFiles = async () => { + if (!rfqId || !vendorId) return + + setIsFetchingFiles(true) + try { + const { files, error } = await getTbeFilesForVendor(rfqId, vendorId) + + if (error) { + throw new Error(error) + } + + setSubmittedFiles(files) + } catch (error) { + toast.error("Failed to load files: " + getErrorMessage(error)) + } finally { + setIsFetchingFiles(false) + } + } + + // Download submitted file + const downloadSubmittedFile = async (file: any) => { + try { + const response = await fetch(`/api/file/${file.id}/download`) + if (!response.ok) { + throw new Error("Failed to download file") + } + + const blob = await response.blob() + const url = window.URL.createObjectURL(blob) + const a = document.createElement("a") + a.href = url + a.download = file.fileName + document.body.appendChild(a) + a.click() + window.URL.revokeObjectURL(url) + document.body.removeChild(a) + } catch (error) { + toast.error("Failed to download file: " + getErrorMessage(error)) + } + } + + return ( + + + + TBE 응답 파일 + 제출된 파일 목록을 확인하고 다운로드하세요. + + + {/* 제출된 파일 목록 */} + {isFetchingFiles ? ( +
+
+
+ ) : submittedFiles.length > 0 ? ( +
+ + {submittedFiles.map((file) => ( + +
+ + + {file.fileName} + + {file.uploadedAt ? formatDateTime(file.uploadedAt) : ""} + + +
+ + + +
+ ))} +
+
+ ) : ( +
제출된 파일이 없습니다.
+ )} +
+
+ ) +} \ No newline at end of file -- cgit v1.2.3