"use client" import * as React from "react" import { useRouter } from "next/navigation" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import { Loader2 } from "lucide-react" import { toast } from "sonner" import { useSession } from "next-auth/react" import { Button } from "@/components/ui/button" import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription, } from "@/components/ui/form" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Switch } from "@/components/ui/switch" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { updateBidding, type UpdateBiddingInput } from "@/lib/bidding/service" import { updateBiddingSchema, type UpdateBiddingSchema } from "@/lib/bidding/validation" import { BiddingListView } from "@/db/schema" import { biddingStatusLabels, contractTypeLabels, biddingTypeLabels, awardCountLabels } from "@/db/schema" import { formatDate } from "@/lib/utils" interface EditBiddingSheetProps { open: boolean onOpenChange: (open: boolean) => void bidding: BiddingListView | null onSuccess?: () => void } export function EditBiddingSheet({ open, onOpenChange, bidding, onSuccess }: EditBiddingSheetProps) { const router = useRouter() const [isSubmitting, setIsSubmitting] = React.useState(false) const { data: session } = useSession() const form = useForm({ resolver: zodResolver(updateBiddingSchema), defaultValues: { biddingNumber: "", revision: 0, projectName: "", itemName: "", title: "", description: "", content: "", contractType: "general", biddingType: "equipment", awardCount: "single", contractStartDate: "", contractEndDate: "", preQuoteDate: "", biddingRegistrationDate: "", submissionStartDate: "", submissionEndDate: "", evaluationDate: "", hasSpecificationMeeting: false, hasPrDocument: false, prNumber: "", currency: "KRW", budget: "", targetPrice: "", finalBidPrice: "", isPublic: false, isUrgent: false, status: "bidding_generated", managerName: "", managerEmail: "", managerPhone: "", remarks: "", }, }) // 시트가 열릴 때 기존 데이터로 폼 초기화 React.useEffect(() => { if (open && bidding) { form.reset({ biddingNumber: bidding.biddingNumber || "", revision: bidding.revision || 0, projectName: bidding.projectName || "", itemName: bidding.itemName || "", title: bidding.title || "", description: bidding.description || "", content: bidding.content || "", contractType: bidding.contractType || "general", biddingType: bidding.biddingType || "equipment", awardCount: bidding.awardCount || "single", contractStartDate: formatDate(bidding.contractStartDate, "kr"), contractEndDate: formatDate(bidding.contractEndDate, "kr"), preQuoteDate: formatDate(bidding.preQuoteDate, "kr"), biddingRegistrationDate: formatDate(bidding.biddingRegistrationDate, "kr"), submissionStartDate: formatDate(bidding.submissionStartDate, "kr"), submissionEndDate: formatDate(bidding.submissionEndDate, "kr"), evaluationDate: formatDate(bidding.evaluationDate, "kr"), hasSpecificationMeeting: bidding.hasSpecificationMeeting || false, hasPrDocument: bidding.hasPrDocument || false, prNumber: bidding.prNumber || "", currency: bidding.currency || "KRW", budget: bidding.budget?.toString() || "", targetPrice: bidding.targetPrice?.toString() || "", finalBidPrice: bidding.finalBidPrice?.toString() || "", status: bidding.status || "bidding_generated", isPublic: bidding.isPublic || false, isUrgent: bidding.isUrgent || false, managerName: bidding.managerName || "", managerEmail: bidding.managerEmail || "", managerPhone: bidding.managerPhone || "", remarks: bidding.remarks || "", }) } }, [open, bidding, form]) // 폼 제출 async function onSubmit(data: UpdateBiddingSchema) { if (!bidding) return setIsSubmitting(true) try { const userId = session?.user?.id?.toString() || "1" const input: UpdateBiddingInput = { id: bidding.id, ...data, } const result = await updateBidding(input, userId) if (result.success) { toast.success(result.message) onOpenChange(false) onSuccess?.() } else { toast.error(result.error || "입찰 수정에 실패했습니다.") } } catch (error) { console.error("Error updating bidding:", error) toast.error("입찰 수정 중 오류가 발생했습니다.") } finally { setIsSubmitting(false) } } // 시트 닫기 핸들러 const handleOpenChange = (open: boolean) => { onOpenChange(open) if (!open) { form.reset() } } if (!bidding) { return null } return ( 입찰 수정 입찰 정보를 수정합니다. ({bidding.biddingNumber})
{/* 스크롤 가능한 컨텐츠 영역 */}
{/* 기본 정보 */} 기본 정보
( 입찰번호 )} /> ( 리비전 field.onChange(parseInt(e.target.value) || 0)} /> )} />
( 입찰명 )} />
( 프로젝트명 )} /> ( 품목명 )} />
{/* 계약 정보 */} 계약 정보
( 계약구분 )} /> ( 입찰유형 )} />
{/* 계약 기간 */}
( 계약 시작일 )} /> ( 계약 종료일 )} />
{/* ( 상태 )} /> */}
(
공개 입찰 공개 입찰 여부를 설정합니다
)} /> (
긴급 입찰 긴급 입찰 여부를 설정합니다
)} />
{/* 담당자 정보 */} 담당자 정보 ( 담당자명 )} />
( 이메일 )} /> ( 전화번호 )} />
{/* 비고 */} 비고 (