summaryrefslogtreecommitdiff
path: root/lib/vendor-regular-registrations/table/safety-qualification-update-sheet.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-regular-registrations/table/safety-qualification-update-sheet.tsx')
-rw-r--r--lib/vendor-regular-registrations/table/safety-qualification-update-sheet.tsx143
1 files changed, 143 insertions, 0 deletions
diff --git a/lib/vendor-regular-registrations/table/safety-qualification-update-sheet.tsx b/lib/vendor-regular-registrations/table/safety-qualification-update-sheet.tsx
new file mode 100644
index 00000000..c2aeba70
--- /dev/null
+++ b/lib/vendor-regular-registrations/table/safety-qualification-update-sheet.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 {
+ Sheet,
+ SheetContent,
+ SheetDescription,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet"
+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 SafetyQualificationUpdateSheetProps {
+ open: boolean
+ onOpenChange: (open: boolean) => void
+ registrationId?: number
+ vendorName?: string
+ currentContent?: string | null
+ onSuccess?: () => void
+}
+
+export function SafetyQualificationUpdateSheet({
+ open,
+ onOpenChange,
+ registrationId,
+ vendorName,
+ currentContent,
+ onSuccess,
+}: SafetyQualificationUpdateSheetProps) {
+ 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 (
+ <Sheet open={open} onOpenChange={onOpenChange}>
+ <SheetContent className="w-[400px] sm:w-[540px]">
+ <SheetHeader>
+ <SheetTitle>안전적격성 평가 입력</SheetTitle>
+ <SheetDescription>
+ {vendorName && `${vendorName}의 `}안전적격성 평가 내용을 입력해주세요.
+ </SheetDescription>
+ </SheetHeader>
+
+ <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>
+ </SheetContent>
+ </Sheet>
+ )
+}