| | |
| | | import { MenuModeEnum } from '/@/enums/menuEnum'; |
| | | import type { Menu as MenuType } from '/@/router/types'; |
| | | import type { MenuState } from './types'; |
| | | import type { Ref } from 'vue'; |
| | | |
| | | import { computed, Ref, toRaw } from 'vue'; |
| | | |
| | | import { unref } from 'vue'; |
| | | import { menuStore } from '/@/store/modules/menu'; |
| | | import { getAllParentPath } from '/@/utils/helper/menuHelper'; |
| | | import { uniq } from 'lodash-es'; |
| | | import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; |
| | | import { getAllParentPath } from '/@/router/helper/menuHelper'; |
| | | import { useTimeoutFn } from '/@/hooks/core/useTimeout'; |
| | | |
| | | export function useOpenKeys( |
| | | menuState: MenuState, |
| | | menus: Ref<MenuType[]>, |
| | | flatMenusRef: Ref<MenuType[]>, |
| | | isAppMenu: Ref<boolean> |
| | | mode: Ref<MenuModeEnum>, |
| | | accordion: Ref<boolean>, |
| | | ) { |
| | | /** |
| | | * @description:设置展开 |
| | | */ |
| | | function setOpenKeys(menu: MenuType) { |
| | | const flatMenus = unref(flatMenusRef); |
| | | menuState.openKeys = getAllParentPath(flatMenus, menu.path); |
| | | const { getCollapsed, getIsMixSidebar } = useMenuSetting(); |
| | | |
| | | async function setOpenKeys(path: string) { |
| | | if (mode.value === MenuModeEnum.HORIZONTAL) { |
| | | return; |
| | | } |
| | | const native = unref(getIsMixSidebar); |
| | | useTimeoutFn( |
| | | () => { |
| | | const menuList = toRaw(menus.value); |
| | | if (menuList?.length === 0) { |
| | | menuState.openKeys = []; |
| | | return; |
| | | } |
| | | if (!unref(accordion)) { |
| | | menuState.openKeys = uniq([...menuState.openKeys, ...getAllParentPath(menuList, path)]); |
| | | } else { |
| | | menuState.openKeys = getAllParentPath(menuList, path); |
| | | } |
| | | }, |
| | | 16, |
| | | !native, |
| | | ); |
| | | } |
| | | |
| | | const getOpenKeys = computed(() => { |
| | | const collapse = unref(getIsMixSidebar) ? false : unref(getCollapsed); |
| | | |
| | | return collapse ? menuState.collapsedOpenKeys : menuState.openKeys; |
| | | }); |
| | | |
| | | /** |
| | | * @description: 重置值 |
| | | */ |
| | |
| | | } |
| | | |
| | | function handleOpenChange(openKeys: string[]) { |
| | | const rootSubMenuKeys: string[] = []; |
| | | for (const menu of unref(menus)) { |
| | | const { children, path } = menu; |
| | | if (children && children.length > 0) { |
| | | rootSubMenuKeys.push(path); |
| | | } |
| | | } |
| | | |
| | | if (!menuStore.getCollapsedState || !unref(isAppMenu)) { |
| | | const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1); |
| | | |
| | | if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) { |
| | | menuState.openKeys = openKeys; |
| | | } else { |
| | | menuState.openKeys = latestOpenKey ? [latestOpenKey] : []; |
| | | } |
| | | if (unref(mode) === MenuModeEnum.HORIZONTAL || !unref(accordion) || unref(getIsMixSidebar)) { |
| | | menuState.openKeys = openKeys; |
| | | } else { |
| | | menuState.collapsedOpenKeys = openKeys; |
| | | // const menuList = toRaw(menus.value); |
| | | // getAllParentPath(menuList, path); |
| | | const rootSubMenuKeys: string[] = []; |
| | | for (const { children, path } of unref(menus)) { |
| | | if (children && children.length > 0) { |
| | | rootSubMenuKeys.push(path); |
| | | } |
| | | } |
| | | if (!unref(getCollapsed)) { |
| | | const latestOpenKey = openKeys.find((key) => menuState.openKeys.indexOf(key) === -1); |
| | | if (rootSubMenuKeys.indexOf(latestOpenKey as string) === -1) { |
| | | menuState.openKeys = openKeys; |
| | | } else { |
| | | menuState.openKeys = latestOpenKey ? [latestOpenKey] : []; |
| | | } |
| | | } else { |
| | | menuState.collapsedOpenKeys = openKeys; |
| | | } |
| | | } |
| | | } |
| | | return { setOpenKeys, resetKeys, handleOpenChange }; |
| | | return { setOpenKeys, resetKeys, getOpenKeys, handleOpenChange }; |
| | | } |