useMenuBuilder.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import {Ref, ref} from "@vue/reactivity";
  2. import {useAccessProfileStore} from "~/store/profile/access";
  3. import {useRuntimeConfig} from "#app";
  4. import {useAbility} from "@casl/vue";
  5. import {useOrganizationProfileStore} from "~/store/profile/organization";
  6. import AbstractMenuBuilder from "~/services/menuBuilder/abstractMenuBuilder";
  7. import MainMenuBuilder from "~/services/menuBuilder/mainMenuBuilder";
  8. import ConfigurationMenuBuilder from "~/services/menuBuilder/configurationMenuBuilder";
  9. import AccountMenuBuilder from "~/services/menuBuilder/accountMenuBuilder";
  10. import MyAccessesMenuBuilder from "~/services/menuBuilder/myAccessesMenuBuilder";
  11. import MyFamilyMenuBuilder from "~/services/menuBuilder/myFamilyMenuBuilder";
  12. import WebsiteListMenuBuilder from "~/services/menuBuilder/websiteListMenuBuilder";
  13. import ParametersMenuBuilder from "~/services/menuBuilder/parametersMenuBuilder";
  14. import {MenuGroup} from "~/types/layout";
  15. import {usePageStore} from "~/store/page";
  16. /**
  17. * Renvoie certaines méthodes pour interagir avec les menus
  18. *
  19. * La méthode `buildMenu` permet de construire un menu ou un sous-menu.
  20. * Elle prend en paramètre n'importe quelle subclass de AbstractMenuBuilder
  21. *
  22. * La methode `hasMenu` permet d'interroger le store pour savoir si un menu portant ce nom a été
  23. * construit pour l'utilisateur courant, et si ce menu n'est pas vide.
  24. *
  25. * Fournit aussi des méthodes pour créer directement les principaux types de menus :
  26. *
  27. * - buildMainMenu
  28. * - buildConfigurationMenu
  29. * - buildAccountMenu
  30. * - buildMyAccessesMenu
  31. * - buildMyFamilyMenu
  32. * - buildWebsiteListMenu
  33. * - buildParametersMenu
  34. *
  35. *
  36. * Exemple d'usage :
  37. *
  38. * const { buildMenu, hasMenu } = useMenuBuilder()
  39. * const menu = buildMenu(MainMenuBuilder)
  40. *
  41. * console.log(hasMenu('Main')) // true
  42. */
  43. export const useMenuBuilder = () => {
  44. const runtimeConfig = useRuntimeConfig()
  45. const ability = useAbility()
  46. const organizationProfile = useOrganizationProfileStore()
  47. const accessProfile = useAccessProfileStore()
  48. const pageState = usePageStore()
  49. /**
  50. * Construit un menu selon le builder passé en paramètre
  51. * Dans certains cas, met à jour le profil de l'utilisateur dans le store pour garder une trace de l'état du menu
  52. *
  53. * @param menuBuilder
  54. */
  55. const buildMenu = (menuBuilder: typeof AbstractMenuBuilder): Ref<MenuGroup> => {
  56. // @ts-ignore
  57. const builder = new menuBuilder(runtimeConfig, ability, organizationProfile, accessProfile)
  58. const menu = builder.build()
  59. // On enregistre l'état du menu dans le store de la page
  60. if (menu !== null && menu.children.length > 0) {
  61. pageState.menusOpened[builder.name()] = false
  62. console.log('Menu ' + builder.name() + ' built (' + menu.children.length+ ' entries)')
  63. }
  64. return ref(menu)
  65. }
  66. const hasMenu = (name: string): Ref<boolean> => {
  67. // TODO: revoir pour la réactivité
  68. return ref(name in pageState.menusOpened)
  69. }
  70. /**
  71. * Construit le menu principal
  72. */
  73. const buildMainMenu = () => buildMenu(MainMenuBuilder)
  74. /**
  75. * Construit le menu configuration
  76. */
  77. const buildConfigurationMenu = () => buildMenu(ConfigurationMenuBuilder)
  78. /**
  79. * Construit le menu Mon Compte
  80. */
  81. const buildAccountMenu = () => buildMenu(AccountMenuBuilder)
  82. /**
  83. * Construit le menu Mes structure
  84. */
  85. const buildMyAccessesMenu = () => buildMenu(MyAccessesMenuBuilder)
  86. /**
  87. * Construit le menu Ma famille (changement d'utilisateur)
  88. */
  89. const buildMyFamilyMenu = () => buildMenu(MyFamilyMenuBuilder)
  90. /**
  91. * Construit le menu de liste des sites internet
  92. */
  93. const buildWebsiteListMenu = () => buildMenu(WebsiteListMenuBuilder)
  94. /**
  95. * Construit le menu de liste des sites internet
  96. */
  97. const buildParametersMenu = () => buildMenu(ParametersMenuBuilder)
  98. return {
  99. buildMenu,
  100. hasMenu,
  101. buildMainMenu,
  102. buildConfigurationMenu,
  103. buildAccountMenu,
  104. buildMyAccessesMenu,
  105. buildMyFamilyMenu,
  106. buildWebsiteListMenu,
  107. buildParametersMenu,
  108. }
  109. }