UNPKG

element-plus

Version:

A Component Library for Vue3.0

169 lines (159 loc) 6.16 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var directives = require('../directives'); var util = require('../utils/util'); var aria = require('../utils/aria'); var dom = require('../utils/dom'); const useDropdown = () => { const ELEMENT = util.useGlobalConfig(); const elDropdown = vue.inject('elDropdown', {}); const _elDropdownSize = vue.computed(() => elDropdown === null || elDropdown === void 0 ? void 0 : elDropdown.dropdownSize); return { ELEMENT, elDropdown, _elDropdownSize, }; }; const initDropdownDomEvent = (dropdownChildren, triggerElm, _instance) => { const menuItems = vue.ref(null); const menuItemsArray = vue.ref(null); const dropdownElm = vue.ref(null); const listId = vue.ref(`dropdown-menu-${util.generateId()}`); dropdownElm.value = dropdownChildren === null || dropdownChildren === void 0 ? void 0 : dropdownChildren.subTree.el; function removeTabindex() { var _a; triggerElm.setAttribute('tabindex', '-1'); (_a = menuItemsArray.value) === null || _a === void 0 ? void 0 : _a.forEach(item => { item.setAttribute('tabindex', '-1'); }); } function resetTabindex(ele) { removeTabindex(); ele === null || ele === void 0 ? void 0 : ele.setAttribute('tabindex', '0'); } function handleTriggerKeyDown(ev) { const code = ev.code; if ([aria.EVENT_CODE.up, aria.EVENT_CODE.down].includes(code)) { removeTabindex(); resetTabindex(menuItems.value[0]); menuItems.value[0].focus(); ev.preventDefault(); ev.stopPropagation(); } else if (code === aria.EVENT_CODE.enter) { _instance.handleClick(); } else if ([aria.EVENT_CODE.tab, aria.EVENT_CODE.esc].includes(code)) { _instance.hide(); } } function handleItemKeyDown(ev) { const code = ev.code; const target = ev.target; const currentIndex = menuItemsArray.value.indexOf(target); const max = menuItemsArray.value.length - 1; let nextIndex; if ([aria.EVENT_CODE.up, aria.EVENT_CODE.down].includes(code)) { if (code === aria.EVENT_CODE.up) { nextIndex = currentIndex !== 0 ? currentIndex - 1 : 0; } else { nextIndex = currentIndex < max ? currentIndex + 1 : max; } removeTabindex(); resetTabindex(menuItems.value[nextIndex]); menuItems.value[nextIndex].focus(); ev.preventDefault(); ev.stopPropagation(); } else if (code === aria.EVENT_CODE.enter) { triggerElmFocus(); target.click(); if (_instance.props.hideOnClick) { _instance.hide(); } } else if ([aria.EVENT_CODE.tab, aria.EVENT_CODE.esc].includes(code)) { _instance.hide(); triggerElmFocus(); } } function initAria() { dropdownElm.value.setAttribute('id', listId.value); triggerElm.setAttribute('aria-haspopup', 'list'); triggerElm.setAttribute('aria-controls', listId.value); if (!_instance.props.splitButton) { triggerElm.setAttribute('role', 'button'); triggerElm.setAttribute('tabindex', _instance.props.tabindex); dom.addClass(triggerElm, 'el-dropdown-selfdefine'); } } function initEvent() { dom.on(triggerElm, 'keydown', handleTriggerKeyDown); dom.on(dropdownElm.value, 'keydown', handleItemKeyDown, true); } function initDomOperation() { menuItems.value = dropdownElm.value.querySelectorAll("[tabindex='-1']"); menuItemsArray.value = [].slice.call(menuItems.value); initEvent(); initAria(); } function triggerElmFocus() { triggerElm.focus(); } initDomOperation(); }; var script = vue.defineComponent({ name: 'ElDropdownMenu', directives: { ClickOutside: directives.ClickOutside, }, setup() { const { _elDropdownSize, elDropdown } = useDropdown(); const size = _elDropdownSize.value; function show() { var _a; (_a = elDropdown.show) === null || _a === void 0 ? void 0 : _a.call(elDropdown); } function hide() { if (['click', 'contextmenu'].includes(elDropdown.trigger.value)) return; _hide(); } function _hide() { var _a; (_a = elDropdown.hide) === null || _a === void 0 ? void 0 : _a.call(elDropdown); } vue.onMounted(() => { const dropdownMenu = vue.getCurrentInstance(); initDropdownDomEvent(dropdownMenu, elDropdown.triggerElm.value, elDropdown.instance); }); return { size, show, hide, innerHide: _hide, triggerElm: elDropdown.triggerElm, }; }, }); function render(_ctx, _cache, $props, $setup, $data, $options) { const _directive_clickOutside = vue.resolveDirective("clickOutside"); return vue.withDirectives((vue.openBlock(), vue.createBlock("ul", { class: [[_ctx.size && `el-dropdown-menu--${_ctx.size}`], "el-dropdown-menu"], onMouseenter: _cache[1] || (_cache[1] = vue.withModifiers((...args) => (_ctx.show && _ctx.show(...args)), ["stop"])), onMouseleave: _cache[2] || (_cache[2] = vue.withModifiers((...args) => (_ctx.hide && _ctx.hide(...args)), ["stop"])) }, [ vue.renderSlot(_ctx.$slots, "default") ], 34 /* CLASS, HYDRATE_EVENTS */)), [ [_directive_clickOutside, _ctx.innerHide, _ctx.triggerElm] ]) } script.render = render; script.__file = "packages/dropdown/src/dropdown-menu.vue"; script.install = (app) => { app.component(script.name, script); }; const _DropdownMenu = script; exports.default = _DropdownMenu;