summaryrefslogtreecommitdiff
path: root/components/form-data/form-data-report-temp-uploaded-list-tab.tsx
diff options
context:
space:
mode:
authorrlaks5757 <rlaks5757@gmail.com>2025-04-01 11:58:20 +0900
committerrlaks5757 <rlaks5757@gmail.com>2025-04-01 11:58:20 +0900
commitcc2c3def63f47063d4fa8b01f9f61eafdd52805c (patch)
treef67b6e61d8f353a7f5fb06828ed93a65414c8f92 /components/form-data/form-data-report-temp-uploaded-list-tab.tsx
parent3e47b8275454452324e3b6a7607f2db361110b0e (diff)
template-upload-dialog component 세분화
Diffstat (limited to 'components/form-data/form-data-report-temp-uploaded-list-tab.tsx')
-rw-r--r--components/form-data/form-data-report-temp-uploaded-list-tab.tsx211
1 files changed, 211 insertions, 0 deletions
diff --git a/components/form-data/form-data-report-temp-uploaded-list-tab.tsx b/components/form-data/form-data-report-temp-uploaded-list-tab.tsx
new file mode 100644
index 00000000..7379a312
--- /dev/null
+++ b/components/form-data/form-data-report-temp-uploaded-list-tab.tsx
@@ -0,0 +1,211 @@
+"use client";
+
+import React, {
+ FC,
+ Dispatch,
+ SetStateAction,
+ useState,
+ useEffect,
+} from "react";
+import { useToast } from "@/hooks/use-toast";
+import { toast as toastMessage } from "sonner";
+import { Download, Trash2 } from "lucide-react";
+import { saveAs } from "file-saver";
+import { ScrollArea } from "@/components/ui/scroll-area";
+import { Label } from "@/components/ui/label";
+import {
+ FileList,
+ FileListAction,
+ FileListHeader,
+ FileListIcon,
+ FileListInfo,
+ FileListItem,
+ FileListName,
+} from "@/components/ui/file-list";
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+ AlertDialogTrigger,
+} from "@/components/ui/alert-dialog";
+import { getReportTempList, deleteReportTempFile } from "@/lib/forms/services";
+import { VendorDataReportTemps } from "@/db/schema/vendorData";
+
+interface FormDataReportTempUploadedListTabProps {
+ packageId: number;
+ formId: number;
+}
+
+export const FormDataReportTempUploadedListTab: FC<
+ FormDataReportTempUploadedListTabProps
+> = ({ packageId, formId }) => {
+ const [prevReportTemp, setPrevReportTemp] = useState<VendorDataReportTemps[]>(
+ []
+ );
+ const [isLoading, setIsLoading] = useState(true);
+
+ useEffect(() => {
+ const getTempFiles = async () => {
+ await updateReportTempList(packageId, formId, setPrevReportTemp);
+ setIsLoading(false);
+ };
+
+ getTempFiles();
+ }, [packageId, formId]);
+
+ return (
+ <div>
+ <Label>Uploaded Template File List</Label>
+ <UploadedTempFiles
+ prevReportTemp={prevReportTemp}
+ updateReportTempList={() =>
+ updateReportTempList(packageId, formId, setPrevReportTemp)
+ }
+ isLoading={isLoading}
+ />
+ </div>
+ );
+};
+
+type UpdateReportTempList = (
+ packageId: number,
+ formId: number,
+ setPrevReportTemp: Dispatch<SetStateAction<VendorDataReportTemps[]>>
+) => Promise<void>;
+
+const updateReportTempList: UpdateReportTempList = async (
+ packageId,
+ formId,
+ setPrevReportTemp
+) => {
+ const tempList = await getReportTempList(packageId, formId);
+ setPrevReportTemp(tempList);
+};
+
+interface UploadedTempFiles {
+ prevReportTemp: VendorDataReportTemps[];
+ updateReportTempList: () => void;
+ isLoading: boolean;
+}
+
+const UploadedTempFiles: FC<UploadedTempFiles> = ({
+ prevReportTemp,
+ updateReportTempList,
+ isLoading,
+}) => {
+ const { toast } = useToast();
+
+ const downloadTempFile = async (fileName: string, filePath: string) => {
+ try {
+ const getTempFile = await fetch(filePath);
+
+ if (getTempFile.ok) {
+ const blob = await getTempFile.blob();
+
+ saveAs(blob, fileName);
+
+ toastMessage.success("Report 다운로드 완료!");
+ } else {
+ const err = await getTempFile.json();
+ console.error("에러:", err);
+ throw new Error(err.message);
+ }
+
+ toastMessage.success("Template File 다운로드 완료!");
+ } catch (err) {
+ console.error(err);
+ toast({
+ title: "Error",
+ description: "Template File 다운로드 중 오류가 발생했습니다.",
+ variant: "destructive",
+ });
+ }
+ };
+
+ const deleteTempFile = async (id: number) => {
+ try {
+ const { result, error } = await deleteReportTempFile(id);
+
+ if (result) {
+ updateReportTempList();
+ toastMessage.success("Template File 삭제 완료!");
+ } else {
+ throw new Error(error);
+ }
+ } catch (err) {
+ toast({
+ title: "Error",
+ description: "Template File 삭제 중 오류가 발생했습니다.",
+ variant: "destructive",
+ });
+ }
+ };
+
+ if (isLoading) {
+ return (
+ <div className="min-h-[157px]">
+ <Label>로딩 중...</Label>
+ </div>
+ );
+ }
+
+ return (
+ <ScrollArea className="min-h-[157px] max-h-[337px] overflow-auto">
+ <FileList className="gap-3">
+ {prevReportTemp.map((c) => {
+ const { fileName, filePath, id } = c;
+
+ return (
+ <AlertDialog key={id}>
+ <FileListItem className="p-3">
+ <FileListHeader>
+ <FileListIcon />
+ <FileListInfo>
+ <FileListName>{fileName}</FileListName>
+ </FileListInfo>
+ <FileListAction
+ onClick={() => {
+ downloadTempFile(fileName, filePath);
+ }}
+ >
+ <Download className="h-4 w-4" />
+ <span className="sr-only">Download</span>
+ </FileListAction>
+ <AlertDialogTrigger asChild>
+ <FileListAction>
+ <Trash2 className="h-4 w-4" />
+ <span className="sr-only">Delete</span>
+ </FileListAction>
+ </AlertDialogTrigger>
+ <AlertDialogContent>
+ <AlertDialogHeader>
+ <AlertDialogTitle>
+ Report Templete File({fileName})을 삭제하시겠습니까?
+ </AlertDialogTitle>
+ <AlertDialogDescription />
+ </AlertDialogHeader>
+ <AlertDialogFooter>
+ <AlertDialogCancel>취소</AlertDialogCancel>
+ <AlertDialogAction
+ onClick={() => {
+ deleteTempFile(id);
+ }}
+ >
+ 삭제
+ </AlertDialogAction>
+ </AlertDialogFooter>
+ </AlertDialogContent>
+ </FileListHeader>
+ </FileListItem>
+ </AlertDialog>
+ );
+ })}
+ </FileList>
+ </ScrollArea>
+ );
+};