useMenuBuilder.ts 3.8 KB

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