"use client" import * as React from "react" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { toast } from "sonner" import * as z from "zod" import { Plus } from "lucide-react" 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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { createDocumentClassCodeGroup } from "@/lib/docu-list-rule/document-class/service" import { getProjectLists } from "@/lib/projects/service" const createDocumentClassSchema = z.object({ projectId: z.string().min(1, "프로젝트는 필수입니다."), value: z.string().min(1, "Value는 필수입니다."), description: z.string().optional(), }) type CreateDocumentClassSchema = z.infer interface DocumentClassAddDialogProps { onSuccess?: () => void } export function DocumentClassAddDialog({ onSuccess, }: DocumentClassAddDialogProps) { const [open, setOpen] = React.useState(false) const [isPending, startTransition] = React.useTransition() const [projects, setProjects] = React.useState>([]) const form = useForm({ resolver: zodResolver(createDocumentClassSchema), defaultValues: { projectId: "", value: "", description: "", }, mode: "onChange" }) // 프로젝트 목록 로드 React.useEffect(() => { if (open) { const loadProjects = async () => { try { const result = await getProjectLists({ page: 1, perPage: 1000, search: "", sort: [], filters: [], joinOperator: "and", flags: [], code: "", name: "", type: "" }) if (result.data) { // plant 타입의 프로젝트만 필터링 const plantProjects = result.data.filter(project => project.type === 'plant') setProjects(plantProjects) } } catch (error) { console.error("Failed to load projects:", error) toast.error("프로젝트 목록을 불러오는데 실패했습니다.") } } loadProjects() } }, [open]) async function onSubmit(input: CreateDocumentClassSchema) { startTransition(async () => { try { const result = await createDocumentClassCodeGroup({ projectId: parseInt(input.projectId), value: input.value, description: input.description, }) if (result.success) { toast.success("Document Class가 생성되었습니다.") form.reset() setOpen(false) onSuccess?.() } else { toast.error(result.error || "생성에 실패했습니다.") } } catch (error) { console.error("Create error:", error) toast.error("Document Class 생성 중 오류가 발생했습니다.") } }) } const handleCancel = () => { form.reset() setOpen(false) } return ( Document Class 추가 새로운 Document Class를 추가합니다. * 표시된 항목은 필수 입력사항입니다.
( 프로젝트 * )} /> ( Value * )} /> ( Description )} />
) }