Vincent 2 lat temu
rodzic
commit
c9adf7d27f

+ 2 - 35
composables/layout/useMenu.ts

@@ -4,14 +4,9 @@ import {useAbility} from "@casl/vue";
 import {useOrganizationProfileStore} from "~/stores/organizationProfile";
 import {MenuGroup, MenuItem} from "~/types/layout";
 import {MENU_LINK_TYPE} from "~/types/enum/layout";
-import MainMenuBuilder from "~/services/menuBuilder/mainMenuBuilder";
-import WebsiteListMenuBuilder from "~/services/menuBuilder/websiteListMenuBuilder";
-import MyAccessesMenuBuilder from "~/services/menuBuilder/myAccessesMenuBuilder";
-import MyFamilyMenuBuilder from "~/services/menuBuilder/myFamilyMenuBuilder";
-import ConfigurationMenuBuilder from "~/services/menuBuilder/configurationMenuBuilder";
-import AccountMenuBuilder from "~/services/menuBuilder/accountMenuBuilder";
 import {AccessProfile} from "~/types/interfaces";
 import {useLayoutStore} from "~/stores/layout";
+import MenuComposer from "~/services/menuBuilder/menuComposer";
 
 /**
  * Renvoie des méthodes pour interagir avec les menus
@@ -34,35 +29,7 @@ export const useMenu = () => {
    * Construct all Menus
    */
   const buildAllMenu = () => {
-    const menus = [
-      new MainMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile),
-      new WebsiteListMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile),
-      new MyAccessesMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile),
-      new MyFamilyMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile),
-      new ConfigurationMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile),
-      new AccountMenuBuilder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile)
-    ]
-
-    for(let menu of menus){
-      const menuBuilt = menu.build();
-
-      if(menuBuilt){
-        layoutState.menus[menu.getMenuName()] = menuBuilt
-
-        // On enregistre l'état du menu dans le store de la page
-        if ( isMenuGroupWithChildren(menuBuilt) ) {
-          layoutState.menusOpened[menu.getMenuName()] = false
-        }
-      }
-    }
-  }
-
-  /**
-   * Test type d'une menu
-   * @param args
-   */
-  const isMenuGroupWithChildren = (args: MenuGroup|MenuItem): boolean => {
-    return ((args as MenuGroup).children ?? []).length > 0
+    MenuComposer.build(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile, layoutState)
   }
 
   /**

+ 42 - 0
services/menuBuilder/menuComposer.ts

@@ -0,0 +1,42 @@
+import MainMenuBuilder from "~/services/menuBuilder/mainMenuBuilder";
+import {AccessProfile, LayoutState, organizationState} from "~/types/interfaces";
+import WebsiteListMenuBuilder from "~/services/menuBuilder/websiteListMenuBuilder";
+import MyAccessesMenuBuilder from "~/services/menuBuilder/myAccessesMenuBuilder";
+import {RuntimeConfig} from "@nuxt/schema";
+import {AnyAbility} from "@casl/ability";
+import {MenuGroup} from "~/types/layout";
+
+export default class MenuComposer {
+
+    /**
+     * Construit l'ensemble des menus et les insère dans le store Layout
+     * @param runtimeConfig
+     * @param ability
+     * @param organizationProfile
+     * @param accessProfile
+     * @param layoutState
+     */
+    public static build(
+        runtimeConfig: RuntimeConfig,
+        ability: AnyAbility,
+        organizationProfile: organizationState,
+        accessProfile: AccessProfile,
+        layoutState: LayoutState
+    ) {
+        const builders = [MainMenuBuilder, WebsiteListMenuBuilder, MyAccessesMenuBuilder]
+        const menus = builders.map(builder => new builder(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile));
+
+        for(let menu of menus){
+            const menuBuilt = menu.build();
+
+            if(menuBuilt){
+                layoutState.menus[menu.getMenuName()] = menuBuilt
+
+                // On enregistre l'état du menu dans le store de la page
+                if ( ((menuBuilt as MenuGroup).children ?? []).length > 0 ) {
+                    layoutState.menusOpened[menu.getMenuName()] = false
+                }
+            }
+        }
+    }
+}

+ 6 - 0
types/interfaces.d.ts

@@ -5,6 +5,8 @@ import {
   GENDER,
   TYPE_ALERT,
 } from '~/types/enum/enums'
+import {Ref} from "@vue/reactivity";
+import {MenuGroup, MenuItem} from "~/types/layout";
 
 declare module '@vuex-orm/core' {
   interface Query {
@@ -189,3 +191,7 @@ interface SseState {
   events: Array<MercureEntityUpdate>
 }
 
+interface LayoutState {
+  menus: Record<string, MenuGroup | MenuItem>
+  menusOpened: Record<string, boolean>
+}