"use client"; import { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Loader2 } from "lucide-react"; import { reportApi } from "@/lib/api/reportApi"; import { useToast } from "@/hooks/use-toast"; import { CreateReportRequest, ReportTemplate } from "@/types/report"; interface ReportCreateModalProps { isOpen: boolean; onClose: () => void; onSuccess: () => void; } export function ReportCreateModal({ isOpen, onClose, onSuccess }: ReportCreateModalProps) { const [formData, setFormData] = useState({ reportNameKor: "", reportNameEng: "", templateId: undefined, reportType: "BASIC", description: "", }); const [templates, setTemplates] = useState([]); const [isLoading, setIsLoading] = useState(false); const [isLoadingTemplates, setIsLoadingTemplates] = useState(false); const { toast } = useToast(); // 템플릿 목록 불러오기 useEffect(() => { if (isOpen) { fetchTemplates(); } }, [isOpen]); const fetchTemplates = async () => { setIsLoadingTemplates(true); try { const response = await reportApi.getTemplates(); if (response.success && response.data) { setTemplates([...response.data.system, ...response.data.custom]); } } catch (error: any) { toast({ title: "오류", description: "템플릿 목록을 불러오는데 실패했습니다.", variant: "destructive", }); } finally { setIsLoadingTemplates(false); } }; const handleSubmit = async () => { // 유효성 검증 if (!formData.reportNameKor.trim()) { toast({ title: "입력 오류", description: "리포트명(한글)을 입력해주세요.", variant: "destructive", }); return; } if (!formData.reportType) { toast({ title: "입력 오류", description: "리포트 타입을 선택해주세요.", variant: "destructive", }); return; } setIsLoading(true); try { const response = await reportApi.createReport(formData); if (response.success) { toast({ title: "성공", description: "리포트가 생성되었습니다.", }); handleClose(); onSuccess(); } } catch (error: any) { toast({ title: "오류", description: error.message || "리포트 생성에 실패했습니다.", variant: "destructive", }); } finally { setIsLoading(false); } }; const handleClose = () => { setFormData({ reportNameKor: "", reportNameEng: "", templateId: undefined, reportType: "BASIC", description: "", }); onClose(); }; return ( 새 리포트 생성 새로운 리포트를 생성합니다. 필수 항목을 입력해주세요.
{/* 리포트명 (한글) */}
setFormData({ ...formData, reportNameKor: e.target.value })} />
{/* 리포트명 (영문) */}
setFormData({ ...formData, reportNameEng: e.target.value })} />
{/* 템플릿 선택 */}
{/* 리포트 타입 */}
{/* 설명 */}