menuComposer.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import type { RuntimeConfig } from '@nuxt/schema'
  2. import type { AnyAbility } from '@casl/ability'
  3. import type { Router } from 'vue-router'
  4. import MainMenuBuilder from '~/services/layout/menuBuilder/mainMenuBuilder'
  5. import type {
  6. AccessProfile,
  7. LayoutState,
  8. organizationState,
  9. } from '~/types/interfaces'
  10. import WebsiteListMenuBuilder from '~/services/layout/menuBuilder/websiteListMenuBuilder'
  11. import MyAccessesMenuBuilder from '~/services/layout/menuBuilder/myAccessesMenuBuilder'
  12. import MyFamilyMenuBuilder from '~/services/layout/menuBuilder/myFamilyMenuBuilder'
  13. import ConfigurationMenuBuilder from '~/services/layout/menuBuilder/configurationMenuBuilder'
  14. import AccountMenuBuilder from '~/services/layout/menuBuilder/accountMenuBuilder'
  15. import type { MenuBuilder, MenuGroup } from '~/types/layout'
  16. import ParametersMenuBuilder from '~/services/layout/menuBuilder/parametersMenuBuilder'
  17. /**
  18. * Gestionnaire principal des menus de l'application
  19. */
  20. export default class MenuComposer {
  21. // Private constructor to prevent instantiation
  22. private constructor() {
  23. // This utility class is not meant to be instantiated
  24. }
  25. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  26. protected static readonly builders: Array<any> = [
  27. MainMenuBuilder,
  28. WebsiteListMenuBuilder,
  29. MyAccessesMenuBuilder,
  30. MyFamilyMenuBuilder,
  31. ConfigurationMenuBuilder,
  32. AccountMenuBuilder,
  33. ParametersMenuBuilder,
  34. ]
  35. /**
  36. * Construit l'ensemble des menus et les insère dans le store Layout
  37. *
  38. * @param runtimeConfig
  39. * @param ability
  40. * @param organizationProfile
  41. * @param accessProfile
  42. * @param router
  43. * @param layoutState
  44. */
  45. public static build(
  46. runtimeConfig: RuntimeConfig,
  47. ability: AnyAbility,
  48. organizationProfile: organizationState,
  49. accessProfile: AccessProfile,
  50. router: Router,
  51. layoutState: LayoutState,
  52. ) {
  53. for (const builderClass of MenuComposer.builders) {
  54. const builder: MenuBuilder = new builderClass(
  55. runtimeConfig,
  56. ability,
  57. organizationProfile,
  58. accessProfile,
  59. router,
  60. )
  61. const menuName = builder.getMenuName()
  62. const menu = builder.build()
  63. if (!menu) {
  64. continue
  65. }
  66. // Store a ref to the menu in the store
  67. layoutState.menus[menuName] = menu
  68. // On enregistre l'état du menu dans le store de la page
  69. if (((menu as MenuGroup).children ?? []).length > 0) {
  70. layoutState.menusOpened[menuName] = false
  71. }
  72. }
  73. }
  74. }