abstractMenuBuilder.ts 3.1 KB

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