"use client"; import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, } from "@/components/ui/resizable-dialog"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { toast } from "sonner"; import { menuApi, MenuItem } from "@/lib/api/menu"; import { Loader2 } from "lucide-react"; interface MenuAssignmentModalProps { isOpen: boolean; onClose: () => void; onConfirm: (assignToMenu: boolean, menuId?: string, menuType?: "0" | "1") => void; dashboardId: string; dashboardTitle: string; } export const MenuAssignmentModal: React.FC = ({ isOpen, onClose, onConfirm, dashboardId, dashboardTitle, }) => { const [assignToMenu, setAssignToMenu] = useState(false); const [selectedMenuId, setSelectedMenuId] = useState(""); const [selectedMenuType, setSelectedMenuType] = useState<"0" | "1">("0"); const [adminMenus, setAdminMenus] = useState([]); const [userMenus, setUserMenus] = useState([]); const [loading, setLoading] = useState(false); // 메뉴 목록 로드 useEffect(() => { if (isOpen && assignToMenu) { loadMenus(); } }, [isOpen, assignToMenu]); const loadMenus = async () => { try { setLoading(true); const [adminResponse, userResponse] = await Promise.all([ menuApi.getAdminMenus(), // 관리자 메뉴 menuApi.getUserMenus(), // 사용자 메뉴 ]); if (adminResponse.success) { setAdminMenus(adminResponse.data || []); } if (userResponse.success) { setUserMenus(userResponse.data || []); } } catch (error) { // console.error("메뉴 목록 로드 실패:", error); toast.error("메뉴 목록을 불러오는데 실패했습니다."); } finally { setLoading(false); } }; // 메뉴 트리를 평탄화하여 Select 옵션으로 변환 const flattenMenus = (menus: MenuItem[], level: number = 0): Array<{ id: string; name: string; level: number }> => { const result: Array<{ id: string; name: string; level: number }> = []; menus.forEach((menu) => { const menuId = menu.objid || menu.OBJID || ""; const menuName = menu.menu_name_kor || menu.MENU_NAME_KOR || ""; const parentId = menu.parent_obj_id || menu.PARENT_OBJ_ID || "0"; // 메뉴 이름이 있고, 최상위가 아닌 경우에만 추가 if (menuName && parentId !== "0") { result.push({ id: menuId, name: " ".repeat(level) + menuName, level, }); // 하위 메뉴가 있으면 재귀 호출 const children = menus.filter((m) => (m.parent_obj_id || m.PARENT_OBJ_ID) === menuId); if (children.length > 0) { result.push(...flattenMenus(children, level + 1)); } } }); return result; }; const currentMenus = selectedMenuType === "0" ? adminMenus : userMenus; const flatMenus = flattenMenus(currentMenus); const handleConfirm = () => { if (assignToMenu && !selectedMenuId) { toast.error("메뉴를 선택해주세요."); return; } onConfirm(assignToMenu, selectedMenuId, selectedMenuType); }; const handleClose = () => { setAssignToMenu(false); setSelectedMenuId(""); setSelectedMenuType("0"); onClose(); }; return ( 대시보드 저장 완료 '{dashboardTitle}' 대시보드가 저장되었습니다.
setAssignToMenu(value === "yes")} className="flex space-x-4" >
{assignToMenu && ( <>
{ setSelectedMenuType(value as "0" | "1"); setSelectedMenuId(""); // 메뉴 타입 변경 시 선택 초기화 }} className="flex space-x-4" >
{loading ? (
) : ( )}
)}
); };