element-plus
Version:
A Component Library for Vue 3
1 lines • 29.7 kB
Source Map (JSON)
{"version":3,"file":"menu.mjs","sources":["../../../../../../packages/components/menu/src/menu.ts"],"sourcesContent":["import {\n computed,\n defineComponent,\n getCurrentInstance,\n h,\n nextTick,\n onMounted,\n provide,\n reactive,\n ref,\n watch,\n watchEffect,\n withDirectives,\n} from 'vue'\nimport { unrefElement, useResizeObserver } from '@vueuse/core'\nimport { isNil } from 'lodash-unified'\nimport ElIcon from '@element-plus/components/icon'\nimport { More } from '@element-plus/icons-vue'\nimport {\n buildProps,\n definePropType,\n flattedChildren,\n iconPropType,\n isArray,\n isObject,\n isString,\n isUndefined,\n mutable,\n} from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { ClickOutside as vClickoutside } from '@element-plus/directives'\nimport Menubar from './utils/menu-bar'\nimport ElMenuCollapseTransition from './menu-collapse-transition.vue'\nimport ElSubMenu from './sub-menu'\nimport { useMenuCssVar } from './use-menu-css-var'\nimport { MENU_INJECTION_KEY, SUB_MENU_INJECTION_KEY } from './tokens'\n\nimport type { PopperEffect } from '@element-plus/components/popper'\nimport type { MenuItemClicked, MenuProvider, SubMenuProvider } from './types'\nimport type { NavigationFailure, Router } from 'vue-router'\nimport type {\n CSSProperties,\n Component,\n DirectiveArguments,\n ExtractPropTypes,\n ExtractPublicPropTypes,\n VNode,\n VNodeArrayChildren,\n} from 'vue'\nimport type { UseResizeObserverReturn } from '@vueuse/core'\n\nexport const menuProps = buildProps({\n /**\n * @description menu display mode\n */\n mode: {\n type: String,\n values: ['horizontal', 'vertical'],\n default: 'vertical',\n },\n /**\n * @description index of active menu on page load\n */\n defaultActive: {\n type: String,\n default: '',\n },\n /**\n * @description array that contains indexes of currently active sub-menus\n */\n defaultOpeneds: {\n type: definePropType<string[]>(Array),\n default: () => mutable([] as const),\n },\n /**\n * @description whether only one sub-menu can be active\n */\n uniqueOpened: Boolean,\n /**\n * @description whether `vue-router` mode is activated. If true, index will be used as 'path' to activate the route action. Use with `default-active` to set the active item on load.\n */\n router: Boolean,\n /**\n * @description how sub-menus are triggered, only works when `mode` is 'horizontal'\n */\n menuTrigger: {\n type: String,\n values: ['hover', 'click'],\n default: 'hover',\n },\n /**\n * @description whether the menu is collapsed (available only in vertical mode)\n */\n collapse: Boolean,\n /**\n * @description background color of Menu (hex format) (deprecated, use `--bg-color` instead)\n * @deprecated use `--bg-color` instead\n */\n backgroundColor: String,\n /**\n * @description text color of Menu (hex format) (deprecated, use `--text-color` instead)\n * @deprecated use `--text-color` instead\n */\n textColor: String,\n /**\n * @description text color of currently active menu item (hex format) (deprecated, use `--active-color` instead)\n * @deprecated use `--active-color` instead\n */\n activeTextColor: String,\n /**\n * @description optional, whether menu is collapsed when clicking outside\n */\n closeOnClickOutside: Boolean,\n /**\n * @description whether to enable the collapse transition\n */\n collapseTransition: {\n type: Boolean,\n default: true,\n },\n /**\n * @description whether the menu is ellipsis (available only in horizontal mode)\n */\n ellipsis: {\n type: Boolean,\n default: true,\n },\n /**\n * @description offset of the popper (effective for all submenus)\n */\n popperOffset: {\n type: Number,\n default: 6,\n },\n /**\n * @description custom ellipsis icon (available only in horizontal mode and ellipsis is true)\n */\n ellipsisIcon: {\n type: iconPropType,\n default: () => More,\n },\n /**\n * @description Tooltip theme, built-in theme: `dark` / `light` when menu is collapsed\n */\n popperEffect: {\n type: definePropType<PopperEffect>(String),\n default: 'dark',\n },\n /**\n * @description custom class name for all popup menus\n */\n popperClass: String,\n /**\n * @description custom style for all popup menus\n */\n popperStyle: {\n type: definePropType<string | CSSProperties>([String, Object]),\n },\n /**\n * @description control timeout for all menus before showing\n */\n showTimeout: {\n type: Number,\n default: 300,\n },\n /**\n * @description control timeout for all menus before hiding\n */\n hideTimeout: {\n type: Number,\n default: 300,\n },\n /**\n * @description when menu inactive and `persistent` is `false` , dropdown menu will be destroyed\n */\n persistent: {\n type: Boolean,\n default: true,\n },\n} as const)\nexport type MenuProps = ExtractPropTypes<typeof menuProps>\nexport type MenuPropsPublic = ExtractPublicPropTypes<typeof menuProps>\n\nconst checkIndexPath = (indexPath: unknown): indexPath is string[] =>\n isArray(indexPath) && indexPath.every((path) => isString(path))\n\nexport const menuEmits = {\n close: (index: string, indexPath: string[]) =>\n isString(index) && checkIndexPath(indexPath),\n\n open: (index: string, indexPath: string[]) =>\n isString(index) && checkIndexPath(indexPath),\n\n select: (\n index: string,\n indexPath: string[],\n item: MenuItemClicked,\n routerResult?: Promise<void | NavigationFailure>\n ) =>\n isString(index) &&\n checkIndexPath(indexPath) &&\n isObject(item) &&\n (isUndefined(routerResult) || routerResult instanceof Promise),\n}\nexport type MenuEmits = typeof menuEmits\n\nconst DEFAULT_MORE_ITEM_WIDTH = 64\n\nexport default defineComponent({\n name: 'ElMenu',\n\n props: menuProps,\n emits: menuEmits,\n\n setup(props, { emit, slots, expose }) {\n const instance = getCurrentInstance()!\n const router = instance.appContext.config.globalProperties.$router as Router\n const menu = ref<HTMLUListElement>()\n const subMenu = ref<HTMLElement>()\n const nsMenu = useNamespace('menu')\n const nsSubMenu = useNamespace('sub-menu')\n let moreItemWidth = DEFAULT_MORE_ITEM_WIDTH\n\n // data\n const sliceIndex = ref(-1)\n\n const openedMenus = ref<MenuProvider['openedMenus']>(\n props.defaultOpeneds && !props.collapse\n ? props.defaultOpeneds.slice(0)\n : []\n )\n const activeIndex = ref<MenuProvider['activeIndex']>(props.defaultActive)\n const items = ref<MenuProvider['items']>({})\n const subMenus = ref<MenuProvider['subMenus']>({})\n\n // computed\n const isMenuPopup = computed<MenuProvider['isMenuPopup']>(\n () =>\n props.mode === 'horizontal' ||\n (props.mode === 'vertical' && props.collapse)\n )\n\n // methods\n const initMenu = () => {\n const activeItem = activeIndex.value && items.value[activeIndex.value]\n if (!activeItem || props.mode === 'horizontal' || props.collapse) return\n\n const indexPath = activeItem.indexPath\n\n // 展开该菜单项的路径上所有子菜单\n // expand all subMenus of the menu item\n indexPath.forEach((index) => {\n const subMenu = subMenus.value[index]\n subMenu && openMenu(index, subMenu.indexPath)\n })\n }\n\n const openMenu: MenuProvider['openMenu'] = (index, indexPath) => {\n if (openedMenus.value.includes(index)) return\n // 将不在该菜单路径下的其余菜单收起\n // collapse all menu that are not under current menu item\n if (props.uniqueOpened) {\n openedMenus.value = openedMenus.value.filter((index: string) =>\n indexPath.includes(index)\n )\n }\n openedMenus.value.push(index)\n emit('open', index, indexPath)\n }\n\n const close = (index: string) => {\n const i = openedMenus.value.indexOf(index)\n if (i !== -1) {\n openedMenus.value.splice(i, 1)\n }\n }\n\n const closeMenu: MenuProvider['closeMenu'] = (index, indexPath) => {\n close(index)\n emit('close', index, indexPath)\n }\n\n const handleSubMenuClick: MenuProvider['handleSubMenuClick'] = ({\n index,\n indexPath,\n }) => {\n const isOpened = openedMenus.value.includes(index)\n\n isOpened ? closeMenu(index, indexPath) : openMenu(index, indexPath)\n }\n\n const handleMenuItemClick: MenuProvider['handleMenuItemClick'] = (\n menuItem\n ) => {\n if (props.mode === 'horizontal' || props.collapse) {\n openedMenus.value = []\n }\n const { index, indexPath } = menuItem\n if (isNil(index) || isNil(indexPath)) return\n\n if (props.router && router) {\n const route = menuItem.route || index\n const routerResult = router.push(route).then((res) => {\n if (!res) activeIndex.value = index\n return res\n })\n emit(\n 'select',\n index,\n indexPath,\n { index, indexPath, route },\n routerResult\n )\n } else {\n activeIndex.value = index\n emit('select', index, indexPath, { index, indexPath })\n }\n }\n\n const updateActiveIndex = (val: string) => {\n const itemsInData = items.value\n const item =\n itemsInData[val] ||\n (activeIndex.value && itemsInData[activeIndex.value]) ||\n itemsInData[props.defaultActive]\n\n activeIndex.value = item?.index ?? val\n }\n\n const calcMenuItemWidth = (menuItem: HTMLElement) => {\n const computedStyle = getComputedStyle(menuItem)\n const marginLeft = Number.parseInt(computedStyle.marginLeft, 10)\n const marginRight = Number.parseInt(computedStyle.marginRight, 10)\n return menuItem.offsetWidth + marginLeft + marginRight || 0\n }\n\n const calcSliceIndex = () => {\n if (!menu.value) return -1\n\n const items = Array.from(menu.value.childNodes).filter(\n (item) =>\n item.nodeName !== '#comment' &&\n (item.nodeName !== '#text' || item.nodeValue)\n ) as HTMLElement[]\n\n const computedMenuStyle = getComputedStyle(menu.value)\n const paddingLeft = Number.parseInt(computedMenuStyle.paddingLeft, 10)\n const paddingRight = Number.parseInt(computedMenuStyle.paddingRight, 10)\n const menuWidth = menu.value.clientWidth - paddingLeft - paddingRight\n\n let calcWidth = 0\n let sliceIndex = 0\n items.forEach((item, index) => {\n calcWidth += calcMenuItemWidth(item)\n if (calcWidth <= menuWidth - moreItemWidth) {\n sliceIndex = index + 1\n }\n })\n return sliceIndex === items.length ? -1 : sliceIndex\n }\n\n const getIndexPath = (index: string) => subMenus.value[index].indexPath\n\n // Common computer monitor FPS is 60Hz, which means 60 redraws per second. Calculation formula: 1000ms/60 ≈ 16.67ms, In order to avoid a certain chance of repeated triggering when `resize`, set wait to 16.67 * 2 = 33.34\n const debounce = (fn: () => void, wait = 33.34) => {\n let timer: ReturnType<typeof setTimeout> | null\n return () => {\n timer && clearTimeout(timer)\n timer = setTimeout(() => {\n fn()\n }, wait)\n }\n }\n\n let isFirstTimeRender = true\n const handleResize = () => {\n const el = unrefElement(subMenu)\n if (el) moreItemWidth = calcMenuItemWidth(el) || DEFAULT_MORE_ITEM_WIDTH\n if (sliceIndex.value === calcSliceIndex()) return\n const callback = () => {\n sliceIndex.value = -1\n nextTick(() => {\n sliceIndex.value = calcSliceIndex()\n })\n }\n // execute callback directly when first time resize to avoid shaking\n isFirstTimeRender ? callback() : debounce(callback)()\n isFirstTimeRender = false\n }\n\n watch(\n () => props.defaultActive,\n (currentActive) => {\n if (!items.value[currentActive]) {\n activeIndex.value = ''\n }\n updateActiveIndex(currentActive)\n }\n )\n\n watch(\n () => props.collapse,\n (value) => {\n if (value) openedMenus.value = []\n }\n )\n\n watch(items.value, initMenu)\n\n let resizeStopper: UseResizeObserverReturn['stop']\n watchEffect(() => {\n if (props.mode === 'horizontal' && props.ellipsis)\n resizeStopper = useResizeObserver(menu, handleResize).stop\n else resizeStopper?.()\n })\n\n const mouseInChild = ref(false)\n\n // provide\n {\n const addSubMenu: MenuProvider['addSubMenu'] = (item) => {\n subMenus.value[item.index] = item\n }\n\n const removeSubMenu: MenuProvider['removeSubMenu'] = (item) => {\n delete subMenus.value[item.index]\n }\n\n const addMenuItem: MenuProvider['addMenuItem'] = (item) => {\n items.value[item.index] = item\n }\n\n const removeMenuItem: MenuProvider['removeMenuItem'] = (item) => {\n delete items.value[item.index]\n }\n\n provide<MenuProvider>(\n MENU_INJECTION_KEY,\n reactive({\n props,\n openedMenus,\n items,\n subMenus,\n activeIndex,\n isMenuPopup,\n\n addMenuItem,\n removeMenuItem,\n addSubMenu,\n removeSubMenu,\n openMenu,\n closeMenu,\n handleMenuItemClick,\n handleSubMenuClick,\n })\n )\n\n provide<SubMenuProvider>(`${SUB_MENU_INJECTION_KEY}${instance.uid}`, {\n addSubMenu,\n removeSubMenu,\n mouseInChild,\n level: 0,\n })\n }\n\n // lifecycle\n onMounted(() => {\n if (props.mode === 'horizontal') {\n new Menubar(instance.vnode.el!, nsMenu.namespace.value)\n }\n })\n\n {\n const open = (index: string) => {\n const { indexPath } = subMenus.value[index]\n indexPath.forEach((i) => openMenu(i, indexPath))\n }\n\n expose({\n open,\n close,\n updateActiveIndex,\n handleResize,\n })\n }\n\n const ulStyle = useMenuCssVar(props, 0)\n\n return () => {\n let slot: VNodeArrayChildren = slots.default?.() ?? []\n const vShowMore: VNode[] = []\n\n if (props.mode === 'horizontal' && menu.value) {\n const originalSlot = (\n flattedChildren(slot) as VNodeArrayChildren\n ).filter((vnode) => {\n // Filter text and comment nodes (https://github.com/vuejs/core/blob/c875019d49b4c36a88d929ccadc31ad414747c7b/packages/shared/src/shapeFlags.ts#L5)\n return (vnode as VNode)?.shapeFlag !== 8\n })\n const slotDefault =\n sliceIndex.value === -1\n ? originalSlot\n : originalSlot.slice(0, sliceIndex.value)\n\n const slotMore =\n sliceIndex.value === -1 ? [] : originalSlot.slice(sliceIndex.value)\n\n if (slotMore?.length && props.ellipsis) {\n slot = slotDefault\n vShowMore.push(\n h(\n ElSubMenu,\n {\n ref: subMenu,\n index: 'sub-menu-more',\n class: nsSubMenu.e('hide-arrow'),\n popperOffset: props.popperOffset,\n },\n {\n title: () =>\n h(\n ElIcon,\n {\n class: nsSubMenu.e('icon-more'),\n },\n {\n default: () => h(props.ellipsisIcon as Component),\n }\n ),\n default: () => slotMore,\n }\n )\n )\n }\n }\n\n const directives: DirectiveArguments = props.closeOnClickOutside\n ? [\n [\n vClickoutside,\n () => {\n if (!openedMenus.value.length) return\n\n if (!mouseInChild.value) {\n openedMenus.value.forEach((openedMenu) =>\n emit('close', openedMenu, getIndexPath(openedMenu))\n )\n\n openedMenus.value = []\n }\n },\n ],\n ]\n : []\n\n const vMenu = withDirectives(\n h(\n 'ul',\n {\n key: String(props.collapse),\n role: 'menubar',\n ref: menu,\n style: ulStyle.value,\n class: {\n [nsMenu.b()]: true,\n [nsMenu.m(props.mode)]: true,\n [nsMenu.m('collapse')]: props.collapse,\n },\n },\n [...slot, ...vShowMore]\n ),\n directives\n )\n\n if (props.collapseTransition && props.mode === 'vertical') {\n return h(ElMenuCollapseTransition, () => vMenu)\n }\n\n return vMenu\n }\n },\n})\n"],"names":["subMenu","index","items","sliceIndex","Menubar","ElSubMenu","vClickoutside"],"mappings":"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"}