import type { RuntimeConfig } from '@nuxt/schema' import type { AnyAbility } from '@casl/ability' import type { Router } from 'vue-router' import MainMenuBuilder from '~/services/layout/menuBuilder/mainMenuBuilder' import type { AccessProfile, LayoutState, organizationState, } from '~/types/interfaces' import WebsiteListMenuBuilder from '~/services/layout/menuBuilder/websiteListMenuBuilder' import MyAccessesMenuBuilder from '~/services/layout/menuBuilder/myAccessesMenuBuilder' import MyFamilyMenuBuilder from '~/services/layout/menuBuilder/myFamilyMenuBuilder' import ConfigurationMenuBuilder from '~/services/layout/menuBuilder/configurationMenuBuilder' import AccountMenuBuilder from '~/services/layout/menuBuilder/accountMenuBuilder' import type { MenuBuilder, MenuGroup } from '~/types/layout' import ParametersMenuBuilder from '~/services/layout/menuBuilder/parametersMenuBuilder' /** * Gestionnaire principal des menus de l'application */ export default class MenuComposer { // Private constructor to prevent instantiation private constructor() { // This utility class is not meant to be instantiated } // eslint-disable-next-line @typescript-eslint/no-explicit-any protected static readonly builders: Array = [ MainMenuBuilder, WebsiteListMenuBuilder, MyAccessesMenuBuilder, MyFamilyMenuBuilder, ConfigurationMenuBuilder, AccountMenuBuilder, ParametersMenuBuilder, ] /** * Construit l'ensemble des menus et les insère dans le store Layout * * @param runtimeConfig * @param ability * @param organizationProfile * @param accessProfile * @param router * @param layoutState */ public static build( runtimeConfig: RuntimeConfig, ability: AnyAbility, organizationProfile: organizationState, accessProfile: AccessProfile, router: Router, layoutState: LayoutState, ) { for (const builderClass of MenuComposer.builders) { const builder: MenuBuilder = new builderClass( runtimeConfig, ability, organizationProfile, accessProfile, router, ) const menuName = builder.getMenuName() const menu = builder.build() if (!menu) { continue } // Store a ref to the menu in the store layoutState.menus[menuName] = menu // On enregistre l'état du menu dans le store de la page if (((menu as MenuGroup).children ?? []).length > 0) { layoutState.menusOpened[menuName] = false } } } }