abstractMenuBuilder.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import type { RuntimeConfig } from '@nuxt/schema'
  2. import type { AnyAbility } from '@casl/ability'
  3. import type {
  4. IconItem,
  5. MenuBuilder,
  6. MenuGroup,
  7. MenuItem,
  8. MenuItems,
  9. } from '~/types/layout'
  10. import { MENU_LINK_TYPE } from '~/types/enum/layout'
  11. import UrlUtils from '~/services/utils/urlUtils'
  12. import type { AccessProfile, organizationState } from '~/types/interfaces'
  13. /**
  14. * Classe de base des menus et sous-menus.
  15. *
  16. * La méthode principale est la méthode build
  17. */
  18. abstract class AbstractMenuBuilder implements MenuBuilder {
  19. protected runtimeConfig: RuntimeConfig
  20. protected ability: AnyAbility
  21. protected organizationProfile: organizationState
  22. protected accessProfile: AccessProfile
  23. /**
  24. * Nom court désignant le menu que construit ce builder
  25. */
  26. static readonly menuName: string
  27. constructor(
  28. runtimeConfig: RuntimeConfig,
  29. ability: AnyAbility,
  30. organizationProfile: organizationState,
  31. accessProfile: AccessProfile,
  32. ) {
  33. this.runtimeConfig = runtimeConfig
  34. this.ability = ability
  35. this.organizationProfile = organizationProfile
  36. this.accessProfile = accessProfile
  37. }
  38. /**
  39. * Permet un accès non statique à la variable menuName
  40. */
  41. public getMenuName(): string {
  42. return Object.getPrototypeOf(this).constructor.menuName
  43. }
  44. /**
  45. * Construit et retourne un menu ou sous-menu selon le profil de l'utilisateur, le profil de son organisation
  46. * et les droits de l'utilisateur.
  47. *
  48. * Si le menu comporte plusieurs éléments, retourne une instance de MenuGroup
  49. * Si le menu ne comporte qu'un seul élément, retourne une instance de MenuItem
  50. * Si le menu ne comporte aucun élément, retourne null.
  51. */
  52. abstract build(): MenuItem | MenuGroup | null
  53. /**
  54. * Construit et retourne un MenuGroup
  55. *
  56. * @param label
  57. * @param icon
  58. * @param {Array<MenuItem>} children Tableau d'ItemMenu représentant les sous menu du menu principal
  59. * @param actions
  60. */
  61. protected createGroup(
  62. label: string,
  63. icon?: IconItem,
  64. children: MenuItems = [],
  65. actions: Array<MenuItem> = [],
  66. ): MenuGroup {
  67. return { label, icon, children, actions }
  68. }
  69. /**
  70. * Construit et retourne un MenuItem
  71. *
  72. * @param {IconItem} icon
  73. * @param {string} label Titre qui sera traduit
  74. * @param to
  75. * @param type
  76. * @return {MenuItem}
  77. */
  78. protected createItem(
  79. label: string,
  80. icon?: IconItem,
  81. to: string = '',
  82. type: MENU_LINK_TYPE = MENU_LINK_TYPE.INTERNAL,
  83. ): MenuItem {
  84. let url: string
  85. switch (type) {
  86. case MENU_LINK_TYPE.V1:
  87. // eslint-disable-next-line no-case-declarations
  88. const v1BaseURL =
  89. this.runtimeConfig.baseUrlAdminLegacy ||
  90. this.runtimeConfig.public.baseUrlAdminLegacy
  91. url = UrlUtils.join(v1BaseURL, '#', to)
  92. break
  93. case MENU_LINK_TYPE.EXTERNAL:
  94. url = UrlUtils.prependHttps(to)
  95. break
  96. default:
  97. url = to
  98. }
  99. return { icon, label, to: url, type, active: false }
  100. }
  101. protected buildSubmenu(menuBuilder: typeof AbstractMenuBuilder) {
  102. // @ts-expect-error this method has to be called from non-abstract subclasses
  103. // eslint-disable-next-line new-cap
  104. const builder = new menuBuilder(
  105. this.runtimeConfig,
  106. this.ability,
  107. this.organizationProfile,
  108. this.accessProfile,
  109. )
  110. return builder.build()
  111. }
  112. }
  113. export default AbstractMenuBuilder