abstractMenuBuilder.ts 2.9 KB

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