| | |
| | | import './index.less'; |
| | | |
| | | import type { MenuState } from './types'; |
| | | import type { Menu as MenuType } from '/@/router/types'; |
| | | |
| | | import { computed, defineComponent, unref, reactive, watch, onMounted, ref, toRefs } from 'vue'; |
| | | import { |
| | | computed, |
| | | defineComponent, |
| | | unref, |
| | | reactive, |
| | | watch, |
| | | onMounted, |
| | | ref, |
| | | toRefs, |
| | | ComputedRef, |
| | | } from 'vue'; |
| | | import { Menu } from 'ant-design-vue'; |
| | | import SearchInput from './SearchInput.vue'; |
| | | import MenuContent from './MenuContent'; |
| | | // import { ScrollContainer } from '/@/components/Container'; |
| | | |
| | | import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum'; |
| | | import { ThemeEnum } from '/@/enums/appEnum'; |
| | | |
| | | import { menuStore } from '/@/store/modules/menu'; |
| | | import { appStore } from '/@/store/modules/app'; |
| | | |
| | | import { useSearchInput } from './useSearchInput'; |
| | | import { useOpenKeys } from './useOpenKeys'; |
| | | import { useSearchInput } from './hooks/useSearchInput'; |
| | | import { useOpenKeys } from './hooks/useOpenKeys'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { isFunction } from '/@/utils/is'; |
| | |
| | | import { getCurrentParentPath } from '/@/router/menus'; |
| | | |
| | | import { basicProps } from './props'; |
| | | import './index.less'; |
| | | import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; |
| | | import { REDIRECT_NAME } from '/@/router/constant'; |
| | | export default defineComponent({ |
| | | name: 'BasicMenu', |
| | | props: basicProps, |
| | |
| | | const menuState = reactive<MenuState>({ |
| | | defaultSelectedKeys: [], |
| | | mode: props.mode, |
| | | theme: computed(() => props.theme), |
| | | theme: computed(() => props.theme) as ComputedRef<ThemeEnum>, |
| | | openKeys: [], |
| | | searchValue: '', |
| | | selectedKeys: [], |
| | | collapsedOpenKeys: [], |
| | | }); |
| | | |
| | | const { getCollapsed } = useMenuSetting(); |
| | | const { currentRoute } = useRouter(); |
| | | |
| | | const { items, flatItems, isAppMenu, mode, accordion } = toRefs(props); |
| | |
| | | |
| | | const getOpenKeys = computed(() => { |
| | | if (props.isAppMenu) { |
| | | return menuStore.getCollapsedState ? menuState.collapsedOpenKeys : menuState.openKeys; |
| | | return unref(getCollapsed) ? menuState.collapsedOpenKeys : menuState.openKeys; |
| | | } |
| | | return menuState.openKeys; |
| | | }); |
| | |
| | | offset += 46; |
| | | } |
| | | return { |
| | | height: `calc(100% - ${offset - 12}px)`, |
| | | height: `calc(100% - ${offset}px)`, |
| | | position: 'relative', |
| | | overflowY: 'auto', |
| | | }; |
| | |
| | | cls.push('basic-menu__sidebar-hor'); |
| | | } |
| | | |
| | | if (!props.isTop && props.isAppMenu && appStore.getProjectConfig.menuSetting.split) { |
| | | if (!props.isHorizontal && props.isAppMenu && appStore.getProjectConfig.menuSetting.split) { |
| | | cls.push('basic-menu__second'); |
| | | } |
| | | return cls; |
| | | }); |
| | | |
| | | const showTitle = computed(() => props.collapsedShowTitle && menuStore.getCollapsedState); |
| | | const showTitle = computed(() => props.collapsedShowTitle && unref(getCollapsed)); |
| | | |
| | | watch( |
| | | () => currentRoute.value.name, |
| | | (name: string) => { |
| | | if (name === 'Redirect') return; |
| | | if (name === REDIRECT_NAME) return; |
| | | handleMenuChange(); |
| | | props.isTop && appStore.getProjectConfig.menuSetting.split && getParentPath(); |
| | | props.isHorizontal && appStore.getProjectConfig.menuSetting.split && getParentPath(); |
| | | } |
| | | ); |
| | | |
| | |
| | | <MenuContent |
| | | item={menu} |
| | | level={index} |
| | | isTop={props.isTop} |
| | | isHorizontal={props.isHorizontal} |
| | | showTitle={unref(showTitle)} |
| | | searchValue={menuState.searchValue} |
| | | />, |
| | |
| | | showTitle={unref(showTitle)} |
| | | item={menu} |
| | | level={index} |
| | | isTop={props.isTop} |
| | | isHorizontal={props.isHorizontal} |
| | | searchValue={menuState.searchValue} |
| | | />, |
| | | ], |
| | |
| | | const inlineCollapsedObj = isInline |
| | | ? props.isAppMenu |
| | | ? { |
| | | inlineCollapsed: menuStore.getCollapsedState, |
| | | inlineCollapsed: unref(getCollapsed), |
| | | } |
| | | : { inlineCollapsed: props.inlineCollapsed } |
| | | : {}; |
| | |
| | | }); |
| | | |
| | | return () => { |
| | | const { getCollapsedState } = menuStore; |
| | | const { mode } = props; |
| | | return mode === MenuModeEnum.HORIZONTAL ? ( |
| | | renderMenu() |
| | |
| | | theme={props.theme as ThemeEnum} |
| | | onChange={handleInputChange} |
| | | onClick={handleInputClick} |
| | | collapsed={getCollapsedState} |
| | | collapsed={unref(getCollapsed)} |
| | | /> |
| | | |
| | | {/* <section style={unref(getMenuWrapStyle)}> */} |
| | | <section style={unref(getMenuWrapStyle)} class="basic-menu__content"> |
| | | {/* <ScrollContainer>{() => renderMenu()}</ScrollContainer> */} |
| | | {renderMenu()} |
| | | </section> |
| | | </section> |