element-plus
Version:
A Component Library for Vue 3
1 lines • 5.46 kB
Source Map (JSON)
{"version":3,"file":"useDropdown.mjs","sources":["../../../../../../packages/components/dropdown/src/useDropdown.ts"],"sourcesContent":["import { inject, computed, ref } from 'vue'\nimport { generateId, useGlobalConfig } from '@element-plus/utils/util'\nimport { EVENT_CODE } from '@element-plus/utils/aria'\nimport { on, addClass } from '@element-plus/utils/dom'\n\nimport type { Nullable } from '@element-plus/utils/types'\nimport type { IElDropdownInstance } from './dropdown'\n\nexport const useDropdown = () => {\n const ELEMENT = useGlobalConfig()\n const elDropdown = inject<IElDropdownInstance>('elDropdown', {})\n const _elDropdownSize = computed(() => elDropdown?.dropdownSize)\n\n return {\n ELEMENT,\n elDropdown,\n _elDropdownSize,\n }\n}\n\nexport const initDropdownDomEvent = (\n dropdownChildren,\n triggerElm,\n _instance\n) => {\n const menuItems = ref<Nullable<HTMLButtonElement[]>>(null)\n const menuItemsArray = ref<Nullable<HTMLElement[]>>(null)\n const dropdownElm = ref<Nullable<HTMLElement>>(null)\n const listId = ref(`dropdown-menu-${generateId()}`)\n dropdownElm.value = dropdownChildren?.subTree.el\n\n function removeTabindex() {\n triggerElm.setAttribute('tabindex', '-1')\n menuItemsArray.value?.forEach((item) => {\n item.setAttribute('tabindex', '-1')\n })\n }\n\n function resetTabindex(ele) {\n removeTabindex()\n ele?.setAttribute('tabindex', '0')\n }\n\n function handleTriggerKeyDown(ev: KeyboardEvent) {\n const code = ev.code\n if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) {\n removeTabindex()\n resetTabindex(menuItems.value[0])\n menuItems.value[0].focus()\n ev.preventDefault()\n ev.stopPropagation()\n } else if (code === EVENT_CODE.enter) {\n _instance.handleClick()\n } else if ([EVENT_CODE.tab, EVENT_CODE.esc].includes(code)) {\n _instance.hide()\n }\n }\n\n function handleItemKeyDown(ev) {\n const code = ev.code\n const target = ev.target\n const currentIndex = menuItemsArray.value.indexOf(target)\n const max = menuItemsArray.value.length - 1\n let nextIndex\n if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) {\n if (code === EVENT_CODE.up) {\n nextIndex = currentIndex !== 0 ? currentIndex - 1 : 0\n } else {\n nextIndex = currentIndex < max ? currentIndex + 1 : max\n }\n removeTabindex()\n resetTabindex(menuItems.value[nextIndex])\n menuItems.value[nextIndex].focus()\n ev.preventDefault()\n ev.stopPropagation()\n } else if (code === EVENT_CODE.enter) {\n triggerElmFocus()\n target.click()\n if (_instance.props.hideOnClick) {\n _instance.hide()\n }\n } else if ([EVENT_CODE.tab, EVENT_CODE.esc].includes(code)) {\n _instance.hide()\n triggerElmFocus()\n }\n }\n\n function initAria() {\n dropdownElm.value.setAttribute('id', listId.value)\n triggerElm.setAttribute('aria-haspopup', 'list')\n triggerElm.setAttribute('aria-controls', listId.value)\n if (!_instance.props.splitButton) {\n triggerElm.setAttribute('role', 'button')\n triggerElm.setAttribute('tabindex', _instance.props.tabindex)\n addClass(triggerElm, 'el-dropdown-selfdefine')\n }\n }\n\n function initEvent() {\n on(triggerElm, 'keydown', handleTriggerKeyDown)\n on(dropdownElm.value, 'keydown', handleItemKeyDown, true)\n }\n\n function initDomOperation() {\n menuItems.value = dropdownElm.value.querySelectorAll(\n \"[tabindex='-1']\"\n ) as unknown as HTMLButtonElement[]\n menuItemsArray.value = [].slice.call(menuItems.value)\n\n initEvent()\n initAria()\n }\n\n function triggerElmFocus() {\n triggerElm.focus()\n }\n\n initDomOperation()\n}\n"],"names":[],"mappings":";;;;;MAQa,cAAc,MAAM;AAC/B,QAAM,UAAU;AAChB,QAAM,aAAa,OAA4B,cAAc;AAC7D,QAAM,kBAAkB,SAAS,MAAM,yCAAY;AAEnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA;AAAA;MAIS,uBAAuB,CAClC,kBACA,YACA,cACG;AACH,QAAM,YAAY,IAAmC;AACrD,QAAM,iBAAiB,IAA6B;AACpD,QAAM,cAAc,IAA2B;AAC/C,QAAM,SAAS,IAAI,iBAAiB;AACpC,cAAY,QAAQ,qDAAkB,QAAQ;AAE9C,4BAA0B;AA/B5B;AAgCI,eAAW,aAAa,YAAY;AACpC,yBAAe,UAAf,mBAAsB,QAAQ,CAAC,SAAS;AACtC,WAAK,aAAa,YAAY;AAAA;AAAA;AAIlC,yBAAuB,KAAK;AAC1B;AACA,+BAAK,aAAa,YAAY;AAAA;AAGhC,gCAA8B,IAAmB;AAC/C,UAAM,OAAO,GAAG;AAChB,QAAI,CAAC,WAAW,IAAI,WAAW,MAAM,SAAS,OAAO;AACnD;AACA,oBAAc,UAAU,MAAM;AAC9B,gBAAU,MAAM,GAAG;AACnB,SAAG;AACH,SAAG;AAAA,eACM,SAAS,WAAW,OAAO;AACpC,gBAAU;AAAA,eACD,CAAC,WAAW,KAAK,WAAW,KAAK,SAAS,OAAO;AAC1D,gBAAU;AAAA;AAAA;AAId,6BAA2B,IAAI;AAC7B,UAAM,OAAO,GAAG;AAChB,UAAM,SAAS,GAAG;AAClB,UAAM,eAAe,eAAe,MAAM,QAAQ;AAClD,UAAM,MAAM,eAAe,MAAM,SAAS;AAC1C,QAAI;AACJ,QAAI,CAAC,WAAW,IAAI,WAAW,MAAM,SAAS,OAAO;AACnD,UAAI,SAAS,WAAW,IAAI;AAC1B,oBAAY,iBAAiB,IAAI,eAAe,IAAI;AAAA,aAC/C;AACL,oBAAY,eAAe,MAAM,eAAe,IAAI;AAAA;AAEtD;AACA,oBAAc,UAAU,MAAM;AAC9B,gBAAU,MAAM,WAAW;AAC3B,SAAG;AACH,SAAG;AAAA,eACM,SAAS,WAAW,OAAO;AACpC;AACA,aAAO;AACP,UAAI,UAAU,MAAM,aAAa;AAC/B,kBAAU;AAAA;AAAA,eAEH,CAAC,WAAW,KAAK,WAAW,KAAK,SAAS,OAAO;AAC1D,gBAAU;AACV;AAAA;AAAA;AAIJ,sBAAoB;AAClB,gBAAY,MAAM,aAAa,MAAM,OAAO;AAC5C,eAAW,aAAa,iBAAiB;AACzC,eAAW,aAAa,iBAAiB,OAAO;AAChD,QAAI,CAAC,UAAU,MAAM,aAAa;AAChC,iBAAW,aAAa,QAAQ;AAChC,iBAAW,aAAa,YAAY,UAAU,MAAM;AACpD,eAAS,YAAY;AAAA;AAAA;AAIzB,uBAAqB;AACnB,OAAG,YAAY,WAAW;AAC1B,OAAG,YAAY,OAAO,WAAW,mBAAmB;AAAA;AAGtD,8BAA4B;AAC1B,cAAU,QAAQ,YAAY,MAAM,iBAClC;AAEF,mBAAe,QAAQ,GAAG,MAAM,KAAK,UAAU;AAE/C;AACA;AAAA;AAGF,6BAA2B;AACzB,eAAW;AAAA;AAGb;AAAA;;;;"}