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 => { // 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, } }