UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 29.3 kB
{"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","ElMenuCollapseTransition"],"mappings":"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"}