"use client" import * as React from "react" import { useForm } from "react-hook-form" import { zodResolver } from "@hookform/resolvers/zod" import * as z from "zod" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { Switch } from "@/components/ui/switch" import { Plus, Loader2 } from "lucide-react" import { toast } from "sonner" import { createComplianceSurveyTemplate } from "../services" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { complianceSurveyTemplates } from "@/db/schema/compliance" const createTemplateSchema = z.object({ name: z.string().min(1, "템플릿명을 입력해주세요.").max(100, "템플릿명은 100자 이하여야 합니다."), description: z.string().min(1, "설명을 입력해주세요.").max(500, "설명은 500자 이하여야 합니다."), isActive: z.boolean().default(true), }) type CreateTemplateFormValues = z.infer interface ComplianceTemplateCreateDialogProps { templates?: typeof complianceSurveyTemplates.$inferSelect[] } export function ComplianceTemplateCreateDialog({ templates = [], }: ComplianceTemplateCreateDialogProps) { const [open, setOpen] = React.useState(false) const [isSubmitting, setIsSubmitting] = React.useState(false) const [selectedTemplateId, setSelectedTemplateId] = React.useState("none") // react-hook-form 세팅 const form = useForm({ resolver: zodResolver(createTemplateSchema), defaultValues: { name: "", description: "", isActive: true, }, mode: "onChange", }) const selectedTemplate = React.useMemo(() => { if (selectedTemplateId === "none") { return undefined } return templates.find((template) => String(template.id) === selectedTemplateId) }, [selectedTemplateId, templates]) const nextVersionLabel = React.useMemo(() => { if (!selectedTemplate) { return null } const baseVersion = selectedTemplate.version || "1.0" const numericValue = Number(baseVersion) if (!Number.isNaN(numericValue)) { const hasDecimal = baseVersion.includes(".") const decimalDigits = hasDecimal ? baseVersion.split(".")[1]?.length ?? 0 : 0 const incremented = numericValue + 1 return hasDecimal ? incremented.toFixed(decimalDigits) : String(incremented) } return "1.0" }, [selectedTemplate]) React.useEffect(() => { if (selectedTemplate) { form.setValue("name", selectedTemplate.name ?? "") form.setValue("description", selectedTemplate.description ?? "") } }, [selectedTemplate, form]) async function onSubmit(data: CreateTemplateFormValues) { setIsSubmitting(true) try { const baseTemplateNumericId = selectedTemplateId !== "none" ? Number(selectedTemplateId) : undefined const result = await createComplianceSurveyTemplate({ ...data, baseTemplateId: baseTemplateNumericId, }) if (result) { toast.success("새로운 설문조사 템플릿이 생성되었습니다.") form.reset() setSelectedTemplateId("none") setOpen(false) // 페이지 새로고침으로 데이터 업데이트 window.location.reload() } } catch (error) { console.error("템플릿 생성 오류:", error) toast.error("템플릿 생성에 실패했습니다.") } finally { setIsSubmitting(false) } } function handleDialogOpenChange(nextOpen: boolean) { if (!nextOpen) { form.reset() setSelectedTemplateId("none") } setOpen(nextOpen) } return ( 새 설문조사 템플릿 생성 새로운 준법 설문조사 템플릿을 생성합니다. 템플릿 생성 후 질문을 추가할 수 있습니다.
( 템플릿명 * )} /> ( 설명 *