summaryrefslogtreecommitdiff
path: root/lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-08-19 09:23:47 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-08-19 09:23:47 +0000
commit8077419e40368dc703f94d558fc746b73fbc6702 (patch)
tree333bdfb3b0d84336f1bf7d4f0f1bbced6bec2d4c /lib/vendor-regular-registrations/table/safety-qualification-update-dialog.tsx
parentaa71f75ace013b2fe982e5a104e61440458e0fd2 (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.tsx143
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>
+ )
+}