diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-19 09:23:47 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-19 09:23:47 +0000 |
| commit | 8077419e40368dc703f94d558fc746b73fbc6702 (patch) | |
| tree | 333bdfb3b0d84336f1bf7d4f0f1bbced6bec2d4c /lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx | |
| parent | aa71f75ace013b2fe982e5a104e61440458e0fd2 (diff) | |
(최겸) 구매 PQ 비밀유지계약서 별첨 첨부파일 추가, 정규업체등록관리 개발
Diffstat (limited to 'lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx')
| -rw-r--r-- | lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx b/lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx new file mode 100644 index 00000000..80084732 --- /dev/null +++ b/lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx @@ -0,0 +1,143 @@ +"use client" + +import * as React from "react" +import { useForm } from "react-hook-form" +import { zodResolver } from "@hookform/resolvers/zod" +import { z } from "zod" +import { toast } from "sonner" + +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form" +import { Button } from "@/components/ui/button" +import { Textarea } from "@/components/ui/textarea" +import { updateSafetyQualification } from "../service" + +const formSchema = z.object({ + safetyQualificationContent: z.string().min(1, "안전적격성 평가 내용을 입력해주세요."), +}) + +interface SafetyQualificationUpdateDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + registrationId?: number + vendorName?: string + currentContent?: string | null + onSuccess?: () => void +} + +export function SafetyQualificationUpdateDialog({ + open, + onOpenChange, + registrationId, + vendorName, + currentContent, + onSuccess, +}: SafetyQualificationUpdateDialogProps) { + const [isLoading, setIsLoading] = React.useState(false) + + const form = useForm<z.infer<typeof formSchema>>({ + resolver: zodResolver(formSchema), + defaultValues: { + safetyQualificationContent: currentContent || "", + }, + }) + + // 폼 값 초기화 + React.useEffect(() => { + if (open) { + form.reset({ + safetyQualificationContent: currentContent || "", + }) + } + }, [open, currentContent, form]) + + async function onSubmit(values: z.infer<typeof formSchema>) { + if (!registrationId) { + toast.error("등록 ID가 없습니다.") + return + } + + setIsLoading(true) + try { + const result = await updateSafetyQualification( + registrationId, + values.safetyQualificationContent + ) + + if (result.success) { + toast.success("안전적격성 평가가 등록되었습니다.") + onOpenChange(false) + onSuccess?.() + } else { + toast.error(result.error || "안전적격성 평가 등록에 실패했습니다.") + } + } catch (error) { + console.error("안전적격성 평가 등록 오류:", error) + toast.error("안전적격성 평가 등록 중 오류가 발생했습니다.") + } finally { + setIsLoading(false) + } + } + + return ( + <Dialog open={open} onOpenChange={onOpenChange}> + <DialogContent className="w-[400px] sm:w-[540px] max-h-[90vh] overflow-y-auto"> + <DialogHeader> + <DialogTitle>안전적격성 평가 입력</DialogTitle> + <DialogDescription> + {vendorName && `${vendorName}의 `}안전적격성 평가 내용을 입력해주세요. + </DialogDescription> + </DialogHeader> + + <Form {...form}> + <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6 mt-6"> + <FormField + control={form.control} + name="safetyQualificationContent" + render={({ field }) => ( + <FormItem> + <FormLabel>안전적격성 평가 내용</FormLabel> + <FormControl> + <Textarea + placeholder="안전적격성 평가 결과 및 내용을 입력해주세요..." + className="min-h-[200px]" + {...field} + /> + </FormControl> + <FormMessage /> + </FormItem> + )} + /> + + <div className="flex justify-end space-x-2"> + <Button + type="button" + variant="outline" + onClick={() => onOpenChange(false)} + disabled={isLoading} + > + 취소 + </Button> + <Button type="submit" disabled={isLoading}> + {isLoading ? "저장 중..." : "저장"} + </Button> + </div> + </form> + </Form> + </DialogContent> + </Dialog> + ) +} |
