From 8642ee064ddf96f1db2b948b4cc8bbbd6cfee820 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 12 Nov 2025 10:42:36 +0000 Subject: (최겸) 구매 일반계약, 입찰 수정 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/bidding/failure/biddings-closure-dialog.tsx | 142 ++++++++++++ lib/bidding/failure/biddings-failure-columns.tsx | 130 +++++++---- lib/bidding/failure/biddings-failure-table.tsx | 266 ++++++++++++++++++++--- 3 files changed, 463 insertions(+), 75 deletions(-) create mode 100644 lib/bidding/failure/biddings-closure-dialog.tsx (limited to 'lib/bidding/failure') diff --git a/lib/bidding/failure/biddings-closure-dialog.tsx b/lib/bidding/failure/biddings-closure-dialog.tsx new file mode 100644 index 00000000..64aba42f --- /dev/null +++ b/lib/bidding/failure/biddings-closure-dialog.tsx @@ -0,0 +1,142 @@ +// 폐찰하기 다이얼로그 +"use client" + +import { useState } from "react" +import { toast } from "sonner" +import { bidClosureAction } from "@/lib/bidding/actions" +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" +import { Label } from "@/components/ui/label" +import { Textarea } from "@/components/ui/textarea" +import { Input } from "@/components/ui/input" +import { Button } from "@/components/ui/button" +import { FileXIcon } from "lucide-react" + +interface BiddingsClosureDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + bidding: { + id: number; + title: string; + biddingNumber: string; + } | null; + userId: string; + onSuccess?: () => void; + } + + export function BiddingsClosureDialog({ + open, + onOpenChange, + bidding, + userId, + onSuccess + }: BiddingsClosureDialogProps) { + const [description, setDescription] = useState('') + const [files, setFiles] = useState([]) + const [isSubmitting, setIsSubmitting] = useState(false) + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + + if (!bidding || !description.trim()) { + toast.error('폐찰 사유를 입력해주세요.') + return + } + + setIsSubmitting(true) + + try { + const result = await bidClosureAction(bidding.id, { + description: description.trim(), + files + }, userId) + + if (result.success) { + toast.success(result.message) + onOpenChange(false) + onSuccess?.() + // 페이지 새로고침 또는 상태 업데이트 + window.location.reload() + } else { + toast.error(result.error || '폐찰 처리 중 오류가 발생했습니다.') + } + } catch (error) { + toast.error('폐찰 처리 중 오류가 발생했습니다.') + } finally { + setIsSubmitting(false) + } + } + + const handleFileChange = (e: React.ChangeEvent) => { + if (e.target.files) { + setFiles(Array.from(e.target.files)) + } + } + + if (!bidding) return null + + return ( + + + + + + 폐찰하기 + + + {bidding.title} ({bidding.biddingNumber})를 폐찰합니다. + + + +
+
+ +