"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 * as z from "zod" import { Loader2, Check, ChevronsUpDown, Edit } from "lucide-react" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Switch } from "@/components/ui/switch" import { ScrollArea } from "@/components/ui/scroll-area" import { cn } from "@/lib/utils" import { getVendorsForSelection } from "@/lib/b-rfq/service" import { LegalWorksDetailView } from "@/db/schema" // import { updateLegalWork } from "../service" type LegalWorkData = LegalWorksDetailView interface EditLegalWorkSheetProps { open: boolean onOpenChange: (open: boolean) => void work: LegalWorkData | null onSuccess?: () => void onDataChange?: () => void } // 편집용 폼 스키마 (신규등록 상태에서만 기본 정보만 편집) const editLegalWorkSchema = z.object({ category: z.enum(["CP", "GTC", "기타"]), vendorId: z.number().min(1, "벤더를 선택해주세요"), isUrgent: z.boolean().default(false), requestDate: z.string().min(1, "답변요청일을 선택해주세요"), }) type EditLegalWorkFormValues = z.infer interface Vendor { id: number vendorName: string vendorCode: string country: string taxId: string status: string } export function EditLegalWorkSheet({ open, onOpenChange, work, onSuccess, onDataChange }: EditLegalWorkSheetProps) { const router = useRouter() const [isSubmitting, setIsSubmitting] = React.useState(false) const [vendors, setVendors] = React.useState([]) const [vendorsLoading, setVendorsLoading] = React.useState(false) const [vendorOpen, setVendorOpen] = React.useState(false) const loadVendors = React.useCallback(async () => { setVendorsLoading(true) try { const vendorList = await getVendorsForSelection() setVendors(vendorList) } catch (error) { console.error("Failed to load vendors:", error) toast.error("벤더 목록을 불러오는데 실패했습니다.") } finally { setVendorsLoading(false) } }, []) const form = useForm({ resolver: zodResolver(editLegalWorkSchema), defaultValues: { category: "CP", vendorId: 0, isUrgent: false, requestDate: "", }, }) // work 데이터가 변경될 때 폼 값 업데이트 React.useEffect(() => { if (work && open) { form.reset({ category: work.category as "CP" | "GTC" | "기타", vendorId: work.vendorId || 0, isUrgent: work.isUrgent || false, requestDate: work.requestDate ? new Date(work.requestDate).toISOString().split('T')[0] : "", }) } }, [work, open, form]) React.useEffect(() => { if (open) { loadVendors() } }, [open, loadVendors]) // 폼 제출 async function onSubmit(data: EditLegalWorkFormValues) { if (!work) return console.log("Updating legal work with data:", data) setIsSubmitting(true) try { const result = await updateLegalWork(work.id, data) if (result.success) { toast.success(result.data?.message || "법무업무가 성공적으로 수정되었습니다.") onOpenChange(false) onSuccess?.() onDataChange?.() router.refresh() } else { toast.error(result.error || "수정 중 오류가 발생했습니다.") } } catch (error) { console.error("Error updating legal work:", error) toast.error("수정 중 오류가 발생했습니다.") } finally { setIsSubmitting(false) } } // 시트 닫기 핸들러 const handleOpenChange = (openState: boolean) => { onOpenChange(openState) if (!openState) { form.reset() } } // 선택된 벤더 정보 const selectedVendor = vendors.find(v => v.id === form.watch("vendorId")) if (!work) { return null } return ( {/* 고정 헤더 */} 법무업무 편집 법무업무 #{work.id}의 기본 정보를 수정합니다. (신규등록 상태에서만 편집 가능)
{/* 스크롤 가능한 콘텐츠 영역 */}
{/* 기본 정보 */} 기본 정보 {/* 구분 */} ( 구분 )} /> {/* 긴급여부 */} (
긴급 요청
긴급 처리가 필요한 경우 체크
)} /> {/* 벤더 선택 */} ( 벤더 검색 결과가 없습니다. {vendors.map((vendor) => ( { field.onChange(vendor.id) setVendorOpen(false) }} >
{vendor.vendorCode} {vendor.vendorName}
))}
)} /> {/* 답변요청일 */} ( 답변요청일 )} />
{/* 안내 메시지 */}

편집 제한 안내

기본 정보는 '신규등록' 상태에서만 편집할 수 있습니다. 검토요청이 발송된 후에는 담당자를 통해 변경해야 합니다.

{/* 고정 버튼 영역 */}
) }