"use client"; import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { PlusIcon, SettingsIcon, MenuIcon, ModuleIcon } from "@/components/icons"; import { MasterMenu, MasterModule, MenuModule, getMasterMenus, getMasterModules, getMenuModulesByMenuId, createMenuModulesBatch, deleteMenuModule, } from "@/service/menu-modules"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import SiteBreadcrumb from "@/components/site-breadcrumb"; import Swal from "sweetalert2"; export default function MenuSettingsPage() { const [menus, setMenus] = useState([]); const [modules, setModules] = useState([]); const [selectedMenu, setSelectedMenu] = useState(null); const [menuModules, setMenuModules] = useState([]); const [isLoading, setIsLoading] = useState(false); const [isDialogOpen, setIsDialogOpen] = useState(false); const [selectedModuleIds, setSelectedModuleIds] = useState([]); useEffect(() => { loadData(); }, []); useEffect(() => { if (selectedMenu) { loadMenuModules(selectedMenu.id); } }, [selectedMenu]); const loadData = async () => { setIsLoading(true); try { const [menusRes, modulesRes] = await Promise.all([ getMasterMenus({ limit: 100 }), getMasterModules({ limit: 100 }), ]); if (!menusRes?.error) { setMenus(menusRes?.data?.data || []); } if (!modulesRes?.error) { setModules(modulesRes?.data?.data || []); } } catch (error) { console.error("Error loading data:", error); } finally { setIsLoading(false); } }; const loadMenuModules = async (menuId: number) => { try { const res = await getMenuModulesByMenuId(menuId); if (!res?.error) { setMenuModules(res?.data?.data || []); setSelectedModuleIds((res?.data?.data || []).map((mm: MenuModule) => mm.moduleId)); } } catch (error) { console.error("Error loading menu modules:", error); } }; const handleSaveModules = async () => { if (!selectedMenu) return; try { // Delete existing menu modules for (const menuModule of menuModules) { await deleteMenuModule(menuModule.id); } // Create new menu modules in batch if (selectedModuleIds.length > 0) { const res = await createMenuModulesBatch({ menuId: selectedMenu.id, moduleIds: selectedModuleIds, }); if (res?.error) { Swal.fire({ title: "Error", text: res?.message || "Failed to save modules", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); } else { Swal.fire({ title: "Success", text: "Modules saved successfully", icon: "success", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); await loadMenuModules(selectedMenu.id); setIsDialogOpen(false); } } } catch (error) { console.error("Error saving modules:", error); Swal.fire({ title: "Error", text: "An unexpected error occurred", icon: "error", confirmButtonText: "OK", customClass: { popup: 'swal-z-index-9999' } }); } }; const toggleModuleSelection = (moduleId: number) => { setSelectedModuleIds((prev) => prev.includes(moduleId) ? prev.filter((id) => id !== moduleId) : [...prev, moduleId] ); }; return ( <>

Menu Settings

Manage menu and module associations

{/* Menu List */} Menus {isLoading ? (
) : menus.length > 0 ? (
{menus.map((menu) => ( ))}
) : (
No menus found
)}
{/* Selected Menu Modules */}
{selectedMenu ? `${selectedMenu.name} - Modules` : "Select a Menu"} {selectedMenu && ( Manage Modules for {selectedMenu.name}
{modules.map((module) => ( ))}
)}
{selectedMenu ? ( menuModules.length > 0 ? (
{menuModules.map((menuModule) => (
{menuModule.module?.name || `Module ${menuModule.moduleId}`}
{menuModule.module?.description || "No description"}
{menuModule.position && ( Position: {menuModule.position} )} {menuModule.isActive ? ( Active ) : ( Inactive )}
))}
) : (

No modules assigned to this menu

) ) : (

Select a menu to view its modules

)}
); }