From 53ad72732f781e6c6d5ddb3776ea47aec010af8e Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 4 Aug 2025 09:39:21 +0000 Subject: (최겸) PQ/실사 수정 및 개발 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edit-investigation-dialog.tsx | 217 +++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 lib/pq/pq-review-table-new/edit-investigation-dialog.tsx (limited to 'lib/pq/pq-review-table-new/edit-investigation-dialog.tsx') diff --git a/lib/pq/pq-review-table-new/edit-investigation-dialog.tsx b/lib/pq/pq-review-table-new/edit-investigation-dialog.tsx new file mode 100644 index 00000000..4df7a7ec --- /dev/null +++ b/lib/pq/pq-review-table-new/edit-investigation-dialog.tsx @@ -0,0 +1,217 @@ +"use client" + +import * as React from "react" +import { zodResolver } from "@hookform/resolvers/zod" +import { useForm } from "react-hook-form" +import { CalendarIcon, Loader } from "lucide-react" +import { format } from "date-fns" +import { toast } from "sonner" + +import { Button } from "@/components/ui/button" +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form" +import { Textarea } from "@/components/ui/textarea" +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { Calendar } from "@/components/ui/calendar" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" +import { z } from "zod" + +// Validation schema for editing investigation +const editInvestigationSchema = z.object({ + confirmedAt: z.union([ + z.date(), + z.string().transform((str) => str ? new Date(str) : undefined) + ]).optional(), + evaluationResult: z.enum(["APPROVED", "SUPPLEMENT", "REJECTED"]).optional(), + investigationNotes: z.string().max(1000, "QM 의견은 1000자 이내로 입력해주세요.").optional(), +}) + +type EditInvestigationSchema = z.infer + +interface EditInvestigationDialogProps { + isOpen: boolean + onClose: () => void + investigation: { + id: number + confirmedAt?: Date | null + evaluationResult?: string | null + investigationNotes?: string | null + } | null + onSubmit: (data: EditInvestigationSchema) => Promise +} + +export function EditInvestigationDialog({ + isOpen, + onClose, + investigation, + onSubmit, +}: EditInvestigationDialogProps) { + const [isPending, startTransition] = React.useTransition() + + const form = useForm({ + resolver: zodResolver(editInvestigationSchema), + defaultValues: { + confirmedAt: investigation?.confirmedAt || undefined, + evaluationResult: investigation?.evaluationResult as "APPROVED" | "SUPPLEMENT" | "REJECTED" | undefined, + investigationNotes: investigation?.investigationNotes || "", + }, + }) + + // Reset form when investigation changes + React.useEffect(() => { + if (investigation) { + form.reset({ + confirmedAt: investigation.confirmedAt || undefined, + evaluationResult: investigation.evaluationResult as "APPROVED" | "SUPPLEMENT" | "REJECTED" | undefined, + investigationNotes: investigation.investigationNotes || "", + }) + } + }, [investigation, form]) + + const handleSubmit = async (values: EditInvestigationSchema) => { + startTransition(async () => { + try { + await onSubmit(values) + toast.success("실사 정보가 업데이트되었습니다!") + onClose() + } catch (error) { + console.error("실사 정보 업데이트 오류:", error) + toast.error("실사 정보 업데이트 중 오류가 발생했습니다.") + } + }) + } + + return ( + + + + 실사 정보 수정 + + 구매자체평가 실사 정보를 수정합니다. + + + +
+ + {/* 실사 확정일 */} + ( + + 실사 확정일 + + + + + + + + + + + + + )} + /> + + {/* 평가 결과 */} + ( + + 평가 결과 + + + + + + )} + /> + + {/* QM 의견 */} + ( + + QM 의견 + +