element-plus
Version:
A Component Library for Vue 3
1 lines • 4.14 kB
Source Map (JSON)
{"version":3,"file":"dropdown-item.vue.mjs","sources":["../../../../../../packages/components/dropdown/src/dropdown-item.vue"],"sourcesContent":["<template>\n <el-roving-focus-item :focusable=\"!disabled\">\n <el-dropdown-item-impl\n v-bind=\"propsAndAttrs\"\n @pointerleave=\"handlePointerLeave\"\n @pointermove=\"handlePointerMove\"\n @clickimpl=\"handleClick\"\n >\n <template v-if=\"$slots.icon\" #icon>\n <slot name=\"icon\" />\n </template>\n\n <slot />\n </el-dropdown-item-impl>\n </el-roving-focus-item>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, getCurrentInstance, inject } from 'vue'\nimport { ElRovingFocusItem } from '@element-plus/components/roving-focus-group'\nimport { composeEventHandlers, whenMouse } from '@element-plus/utils'\nimport ElDropdownItemImpl from './dropdown-item-impl.vue'\nimport { useDropdown } from './useDropdown'\nimport { dropdownItemProps } from './dropdown'\nimport { DROPDOWN_INJECTION_KEY } from './tokens'\n\nexport default defineComponent({\n name: 'ElDropdownItem',\n components: {\n ElRovingFocusItem,\n ElDropdownItemImpl,\n },\n inheritAttrs: false,\n props: dropdownItemProps,\n emits: ['pointermove', 'pointerleave', 'click'],\n setup(props, { emit, attrs }) {\n const { elDropdown } = useDropdown()\n const _instance = getCurrentInstance()\n const { onItemEnter, onItemLeave } = inject(\n DROPDOWN_INJECTION_KEY,\n undefined\n )!\n\n const handlePointerMove = composeEventHandlers(\n (e: PointerEvent) => {\n emit('pointermove', e)\n return e.defaultPrevented\n },\n whenMouse((e) => {\n if (props.disabled) {\n onItemLeave(e)\n return\n }\n\n const target = e.currentTarget as HTMLElement\n /**\n * This handles the following scenario:\n * when the item contains a form element such as input element\n * when the mouse is moving over the element itself which is contained by\n * the item, the default focusing logic should be prevented so that\n * it won't cause weird action.\n */\n if (\n target === document.activeElement ||\n target.contains(document.activeElement)\n ) {\n return\n }\n\n onItemEnter(e)\n if (!e.defaultPrevented) {\n target?.focus({\n preventScroll: true,\n })\n }\n })\n )\n\n const handlePointerLeave = composeEventHandlers((e: PointerEvent) => {\n emit('pointerleave', e)\n return e.defaultPrevented\n }, whenMouse(onItemLeave))\n\n const handleClick = composeEventHandlers(\n (e: PointerEvent) => {\n if (props.disabled) {\n return\n }\n emit('click', e)\n return e.type !== 'keydown' && e.defaultPrevented\n },\n (e) => {\n if (props.disabled) {\n e.stopImmediatePropagation()\n return\n }\n if (elDropdown?.hideOnClick?.value) {\n elDropdown.handleClick?.()\n }\n elDropdown.commandHandler?.(props.command, _instance, e)\n }\n )\n\n // direct usage of v-bind={ ...$props, ...$attrs } causes type errors\n const propsAndAttrs = computed(() => ({ ...props, ...attrs }))\n\n return {\n handleClick,\n handlePointerMove,\n handlePointerLeave,\n propsAndAttrs,\n }\n },\n})\n</script>\n"],"names":["_createBlock","_createVNode","_mergeProps","_createSlots","_renderSlot","_withCtx"],"mappings":";;;;;;;sBACEA,WAAA,CAauB,+BAAA,EAAA;AAAA,IAbA,SAAA,EAAS,CAAG,IAAA,CAAA;AAAA,GAAA,EAAA;AAAA,qBACjC,MAWwB;AAAA,MAXxBC,WAAA,CAWwB,gCAAA,EAXxBC,UAAA,CAWwB,IAAA,CAVd,aAAA,EAAa;AAAA,QACpB,gBAAc,IAAA,CAAA,kBAAA;AAAA,QACd,eAAa,IAAA,CAAA,iBAAA;AAAA,QACb,aAAW,IAAA,CAAA;AAAA,OAAA,GAAAC,WAAA,CAAA;AAAA,yBAMZ,MAAQ;AAAA,UAARC,UAAA,CAAQ,IAAA,CAAA,MAAA,EAAA,SAAA;AAAA,SAAA,CAAA;AAAA;;;QAJQ,IAAA,CAAA,OAAO,IAAA,GAAA;AAAA,UAAO,IAAA,EAAA,MAAA;AAAA,UAAA,EAAA,EAAAC,QAC5B,MAAoB;AAAA,YAApBD,UAAA,CAAoB,IAAA,CAAA,MAAA,EAAA,MAAA;AAAA,WAAA,CAAA;AAAA;;;;;;;;;;;;"}