summaryrefslogtreecommitdiff
path: root/lib/swp/table/swp-upload-result-dialog.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/swp/table/swp-upload-result-dialog.tsx')
-rw-r--r--lib/swp/table/swp-upload-result-dialog.tsx108
1 files changed, 108 insertions, 0 deletions
diff --git a/lib/swp/table/swp-upload-result-dialog.tsx b/lib/swp/table/swp-upload-result-dialog.tsx
new file mode 100644
index 00000000..7b79fa68
--- /dev/null
+++ b/lib/swp/table/swp-upload-result-dialog.tsx
@@ -0,0 +1,108 @@
+"use client";
+
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog";
+import { Button } from "@/components/ui/button";
+import { CheckCircle2, XCircle, FileText } from "lucide-react";
+import { ScrollArea } from "@/components/ui/scroll-area";
+
+interface UploadResult {
+ fileName: string;
+ success: boolean;
+ error?: string;
+}
+
+interface SwpUploadResultDialogProps {
+ open: boolean;
+ onOpenChange: (open: boolean) => void;
+ results: UploadResult[];
+}
+
+export function SwpUploadResultDialog({
+ open,
+ onOpenChange,
+ results,
+}: SwpUploadResultDialogProps) {
+ const successCount = results.filter((r) => r.success).length;
+ const failCount = results.filter((r) => !r.success).length;
+ const totalCount = results.length;
+
+ return (
+ <Dialog open={open} onOpenChange={onOpenChange}>
+ <DialogContent className="max-w-3xl max-h-[80vh]">
+ <DialogHeader>
+ <DialogTitle>파일 업로드 결과</DialogTitle>
+ <DialogDescription>
+ 총 {totalCount}개 파일 중 성공 {successCount}개, 실패 {failCount}개
+ </DialogDescription>
+ </DialogHeader>
+
+ <ScrollArea className="max-h-[500px] pr-4">
+ <div className="space-y-3">
+ {results.map((result, index) => (
+ <div
+ key={index}
+ className={`flex items-start gap-3 p-4 rounded-lg border ${
+ result.success
+ ? "bg-green-50 border-green-200 dark:bg-green-950 dark:border-green-800"
+ : "bg-red-50 border-red-200 dark:bg-red-950 dark:border-red-800"
+ }`}
+ >
+ <div className="flex-shrink-0 mt-0.5">
+ {result.success ? (
+ <CheckCircle2 className="h-5 w-5 text-green-600 dark:text-green-400" />
+ ) : (
+ <XCircle className="h-5 w-5 text-red-600 dark:text-red-400" />
+ )}
+ </div>
+
+ <div className="flex-1 min-w-0">
+ <div className="flex items-center gap-2 mb-1">
+ <FileText className="h-4 w-4 text-muted-foreground flex-shrink-0" />
+ <span className="font-medium text-sm break-all">
+ {result.fileName}
+ </span>
+ </div>
+
+ {result.success ? (
+ <p className="text-sm text-green-700 dark:text-green-300">
+ 업로드 성공
+ </p>
+ ) : (
+ <div className="space-y-1">
+ <p className="text-sm font-medium text-red-700 dark:text-red-300">
+ 업로드 실패
+ </p>
+ {result.error && (
+ <p className="text-sm text-red-600 dark:text-red-400 break-words">
+ 사유: {result.error}
+ </p>
+ )}
+ </div>
+ )}
+ </div>
+ </div>
+ ))}
+ </div>
+ </ScrollArea>
+
+ <div className="flex justify-between items-center pt-4 border-t">
+ <div className="text-sm text-muted-foreground">
+ {failCount > 0 && (
+ <span className="text-red-600 dark:text-red-400 font-medium">
+ 실패한 파일을 확인하고 다시 업로드해주세요.
+ </span>
+ )}
+ </div>
+ <Button onClick={() => onOpenChange(false)}>확인</Button>
+ </div>
+ </DialogContent>
+ </Dialog>
+ );
+}
+