| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- import {Ref, ref} from "@vue/reactivity";
- import {useAccessProfileStore} from "~/store/profile/access";
- import {useRouter, useRuntimeConfig} from "#app";
- import {useAbility} from "@casl/vue";
- import {useOrganizationProfileStore} from "~/store/profile/organization";
- import AbstractMenuBuilder from "~/services/menuBuilder/abstractMenuBuilder";
- import MainMenuBuilder from "~/services/menuBuilder/mainMenuBuilder";
- import ConfigurationMenuBuilder from "~/services/menuBuilder/configurationMenuBuilder";
- import AccountMenuBuilder from "~/services/menuBuilder/accountMenuBuilder";
- import MyAccessesMenuBuilder from "~/services/menuBuilder/myAccessesMenuBuilder";
- import MyFamilyMenuBuilder from "~/services/menuBuilder/myFamilyMenuBuilder";
- import WebsiteListMenuBuilder from "~/services/menuBuilder/websiteListMenuBuilder";
- import ParametersMenuBuilder from "~/services/menuBuilder/parametersMenuBuilder";
- import {useEach} from "#imports";
- /**
- * Renvoie certaines méthodes pour interagir avec les menus
- *
- * La méthode `buildMenu` permet de construire un menu ou un sous-menu.
- * Elle prend en paramètre n'importe quelle subclass de AbstractMenuBuilder
- *
- * La methode `hasMenu` permet d'interroger le store pour savoir si un menu portant ce nom a été
- * construit pour l'utilisateur courant, et si ce menu n'est pas vide.
- *
- * Fournit aussi des méthodes pour créer directement les principaux types de menus :
- *
- * - buildMainMenu
- * - buildConfigurationMenu
- * - buildAccountMenu
- * - buildMyAccessesMenu
- * - buildMyFamilyMenu
- * - buildWebsiteListMenu
- * - buildParametersMenu
- *
- *
- * Exemple d'usage :
- *
- * const { buildMenu, hasMenu } = useMenuBuilder()
- * const menu = buildMenu(MainMenuBuilder)
- *
- * console.log(hasMenu('Main')) // true
- */
- export const useMenuBuilder = () => {
- const runtimeConfig = useRuntimeConfig()
- const ability = useAbility()
- const organizationProfile = useOrganizationProfileStore()
- const accessProfile = useAccessProfileStore()
- /**
- * Construit un menu selon le builder passé en paramètre
- * Dans certains cas, met à jour le profil de l'utilisateur dans le store pour garder une trace de l'état du menu
- *
- * @param menuBuilder
- */
- const buildMenu = (menuBuilder: typeof AbstractMenuBuilder) => {
- // @ts-ignore
- const builder = new menuBuilder(runtimeConfig, ability, organizationProfile, accessProfile)
- const menu = builder.build()
- // On enregistre l'état du menu dans le store
- accessProfile.hasMenu[builder.name()] = menu.children.length > 0
- console.log('Menu ' + builder.name() + ' built (' + menu.children.length + ' entries)')
- return ref(menu)
- }
- const hasMenu = (name: string): Ref<boolean> => {
- // TODO: revoir pour la réactivité
- return accessProfile.hasMenu[name] ?? ref(false)
- }
- /**
- * Construit le menu principal
- */
- const buildMainMenu = () => buildMenu(MainMenuBuilder)
- /**
- * Construit le menu configuration
- */
- const buildConfigurationMenu = () => buildMenu(ConfigurationMenuBuilder)
- /**
- * Construit le menu Mon Compte
- */
- const buildAccountMenu = () => buildMenu(AccountMenuBuilder)
- /**
- * Construit le menu Mes structure
- */
- const buildMyAccessesMenu = () => buildMenu(MyAccessesMenuBuilder)
- /**
- * Construit le menu Ma famille (changement d'utilisateur)
- */
- const buildMyFamilyMenu = () => buildMenu(MyFamilyMenuBuilder)
- /**
- * Construit le menu de liste des sites internet
- */
- const buildWebsiteListMenu = () => buildMenu(WebsiteListMenuBuilder)
- /**
- * Construit le menu de liste des sites internet
- */
- const buildParametersMenu = () => buildMenu(ParametersMenuBuilder)
- return {
- buildMenu,
- hasMenu,
- buildMainMenu,
- buildConfigurationMenu,
- buildAccountMenu,
- buildMyAccessesMenu,
- buildMyFamilyMenu,
- buildWebsiteListMenu,
- buildParametersMenu,
- }
- }
|