useMenu.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import {useAccessProfileStore} from "~/stores/accessProfile";
  2. import {useAbility} from "@casl/vue";
  3. import {useOrganizationProfileStore} from "~/stores/organizationProfile";
  4. import type {MenuGroup, MenuItem} from "~/types/layout";
  5. import {MENU_LINK_TYPE} from "~/types/enum/layout";
  6. import type {AccessProfile} from "~/types/interfaces";
  7. import {useLayoutStore} from "~/stores/layout";
  8. import MenuComposer from "~/services/layout/menuComposer";
  9. /**
  10. * Renvoie des méthodes pour interagir avec les menus
  11. *
  12. * Exemple d'usage :
  13. *
  14. * const { buildMenu, hasMenu } = useMenuBuilder()
  15. * const menu = buildMenu('Main')
  16. *
  17. * console.log(hasMenu('Main')) // true
  18. */
  19. export const useMenu = () => {
  20. const runtimeConfig = useRuntimeConfig()
  21. const ability = useAbility()
  22. const organizationProfile = useOrganizationProfileStore()
  23. const accessProfile = useAccessProfileStore()
  24. const layoutState = useLayoutStore()
  25. /**
  26. * Construct all Menus
  27. * TODO: ce serait mieux de conserver les ids des menus même non possédés, de façon à pouvoir différencier un menu
  28. * non possédé et un id incorrect dans getMenu par exemple. J'ai eu du mal capter pourquoi hasMenu('Family') renvoyait
  29. * false, jusqu'à ce que je tilte que le menu s'appelait MyFamily, et pas Family
  30. */
  31. const buildAllMenu = () => {
  32. MenuComposer.build(runtimeConfig, ability, organizationProfile, accessProfile as AccessProfile, layoutState)
  33. }
  34. /**
  35. * Retourne le menu depuis le store ou retourne null
  36. * si le menu n'a pas été construit pour l'utilisateur courant
  37. *
  38. * @param name
  39. */
  40. const getMenu = (name: string): MenuGroup | MenuItem | null => {
  41. return layoutState.menus[name] || null
  42. }
  43. /**
  44. * L'utilisateur en cours a-t-il accès au menu portant ce nom ?
  45. *
  46. * @param name
  47. */
  48. const hasMenu = (name: string): boolean => {
  49. return getMenu(name) !== null
  50. }
  51. /**
  52. * Soulève une erreur si aucun menu portant ce nom n'est enregistré dans le store
  53. *
  54. * @param name
  55. */
  56. const assertExists = (name: string) => {
  57. if (getMenu(name) === null) {
  58. throw new Error('Unknown menu : ' + name)
  59. }
  60. }
  61. /**
  62. * Retourne vrai si le menu est actuellement ouvert / déplié
  63. *
  64. * @param name
  65. */
  66. const isMenuOpened = (name: string): boolean => {
  67. assertExists(name)
  68. return layoutState.menusOpened[name]
  69. }
  70. /**
  71. * Met à jour l'état du menu portant ce nom
  72. *
  73. * @param name
  74. * @param state
  75. */
  76. const setMenuState = (name: string, state: boolean) => {
  77. assertExists(name)
  78. layoutState.menusOpened[name] = state
  79. }
  80. /**
  81. * Ouvre / déplie le menu portant ce nom
  82. *
  83. * @param name
  84. */
  85. const openMenu = (name: string) => {
  86. setMenuState(name, true)
  87. }
  88. /**
  89. * Ferme / replie le menu portant ce nom
  90. *
  91. * @param name
  92. */
  93. const closeMenu = (name: string) => {
  94. setMenuState(name, false)
  95. }
  96. /**
  97. * Bascule l'état du menu entre ouvert et fermé
  98. *
  99. * @param name
  100. */
  101. const toggleMenu = (name: string) => {
  102. setMenuState(name, !layoutState.menusOpened[name])
  103. }
  104. /**
  105. * Le lien menuItem est-il un lien interne à l'application
  106. *
  107. * @param menuItem
  108. */
  109. const isInternalLink = (menuItem: MenuItem | MenuGroup): boolean => {
  110. return 'type' in menuItem && menuItem.type === MENU_LINK_TYPE.INTERNAL
  111. }
  112. return {
  113. buildAllMenu,
  114. getMenu,
  115. hasMenu,
  116. setMenuState,
  117. openMenu,
  118. closeMenu,
  119. toggleMenu,
  120. isMenuOpened,
  121. isInternalLink,
  122. }
  123. }