"use client"; import { useState, useEffect } from "react"; import { ResizableDialog, ResizableDialogContent, ResizableDialogHeader, ResizableDialogTitle, ResizableDialogDescription, ResizableDialogFooter, } from "@/components/ui/resizable-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 { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, SelectGroup, SelectLabel, } from "@/components/ui/select"; import { Loader2, Save } from "lucide-react"; import { menuApi } from "@/lib/api/menu"; interface MenuItem { id: string; name: string; url?: string; parent_id?: string; children?: MenuItem[]; } interface DashboardSaveModalProps { isOpen: boolean; onClose: () => void; onSave: (data: { title: string; description: string; assignToMenu: boolean; menuType?: "admin" | "user"; menuId?: string; }) => Promise; initialTitle?: string; initialDescription?: string; isEditing?: boolean; } export function DashboardSaveModal({ isOpen, onClose, onSave, initialTitle = "", initialDescription = "", isEditing = false, }: DashboardSaveModalProps) { const [title, setTitle] = useState(initialTitle); const [description, setDescription] = useState(initialDescription); const [assignToMenu, setAssignToMenu] = useState(false); const [menuType, setMenuType] = useState<"admin" | "user">("admin"); const [selectedMenuId, setSelectedMenuId] = useState(""); const [adminMenus, setAdminMenus] = useState([]); const [userMenus, setUserMenus] = useState([]); const [loading, setLoading] = useState(false); const [loadingMenus, setLoadingMenus] = useState(false); useEffect(() => { if (isOpen) { setTitle(initialTitle); setDescription(initialDescription); setAssignToMenu(false); setMenuType("admin"); setSelectedMenuId(""); loadMenus(); } }, [isOpen, initialTitle, initialDescription]); const loadMenus = async () => { setLoadingMenus(true); try { const [adminData, userData] = await Promise.all([menuApi.getAdminMenus(), menuApi.getUserMenus()]); // API 응답이 배열인지 확인하고 처리 const adminMenuList = Array.isArray(adminData) ? adminData : adminData?.data || []; const userMenuList = Array.isArray(userData) ? userData : userData?.data || []; setAdminMenus(adminMenuList); setUserMenus(userMenuList); } catch (error) { // console.error("메뉴 목록 로드 실패:", error); setAdminMenus([]); setUserMenus([]); } finally { setLoadingMenus(false); } }; const flattenMenus = ( menus: MenuItem[], prefix = "", parentPath = "", ): { id: string; label: string; uniqueKey: string }[] => { if (!Array.isArray(menus)) { return []; } const result: { id: string; label: string; uniqueKey: string }[] = []; menus.forEach((menu, index) => { // 메뉴 ID 추출 (objid 또는 id) const menuId = (menu as any).objid || menu.id || ""; const uniqueKey = `${parentPath}-${menuId}-${index}`; // 메뉴 이름 추출 const menuName = menu.name || (menu as any).menu_name_kor || (menu as any).MENU_NAME_KOR || (menu as any).menuNameKor || (menu as any).title || "이름없음"; // lev 필드로 레벨 확인 (lev > 1인 메뉴만 추가) const menuLevel = (menu as any).lev || 0; if (menuLevel > 1) { result.push({ id: menuId, label: prefix + menuName, uniqueKey, }); } // 하위 메뉴가 있으면 재귀 호출 if (menu.children && Array.isArray(menu.children) && menu.children.length > 0) { result.push(...flattenMenus(menu.children, prefix + menuName + " > ", uniqueKey)); } }); return result; }; const handleSave = async () => { if (!title.trim()) { alert("대시보드 이름을 입력해주세요."); return; } if (assignToMenu && !selectedMenuId) { alert("메뉴를 선택해주세요."); return; } setLoading(true); try { await onSave({ title: title.trim(), description: description.trim(), assignToMenu, menuType: assignToMenu ? menuType : undefined, menuId: assignToMenu ? selectedMenuId : undefined, }); onClose(); } catch (error) { // console.error("저장 실패:", error); } finally { setLoading(false); } }; const currentMenus = menuType === "admin" ? adminMenus : userMenus; const flatMenus = flattenMenus(currentMenus); return ( {isEditing ? "대시보드 수정" : "대시보드 저장"}
{/* 대시보드 이름 */}
setTitle(e.target.value)} onKeyDown={(e) => { // 모든 키보드 이벤트를 input 필드 내부에서만 처리 e.stopPropagation(); }} placeholder="예: 생산 현황 대시보드" className="w-full" />
{/* 대시보드 설명 */}