dropdown2.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var index = require('../../button/index.js');
  5. var index$2 = require('../../tooltip/index.js');
  6. var index$1 = require('../../scrollbar/index.js');
  7. var index$3 = require('../../icon/index.js');
  8. var rovingFocusGroup = require('../../roving-focus-group/src/roving-focus-group.js');
  9. var iconsVue = require('@element-plus/icons-vue');
  10. var dropdown = require('./dropdown.js');
  11. var tokens = require('./tokens.js');
  12. var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js');
  13. var onlyChild = require('../../slot/src/only-child.js');
  14. var index$4 = require('../../../hooks/use-namespace/index.js');
  15. var index$5 = require('../../../hooks/use-locale/index.js');
  16. var style = require('../../../utils/dom/style.js');
  17. var lodashUnified = require('lodash-unified');
  18. var index$6 = require('../../../hooks/use-id/index.js');
  19. var useFormCommonProps = require('../../form/src/hooks/use-form-common-props.js');
  20. const { ButtonGroup: ElButtonGroup } = index.ElButton;
  21. const _sfc_main = vue.defineComponent({
  22. name: "ElDropdown",
  23. components: {
  24. ElButton: index.ElButton,
  25. ElButtonGroup,
  26. ElScrollbar: index$1.ElScrollbar,
  27. ElDropdownCollection: dropdown.ElCollection,
  28. ElTooltip: index$2.ElTooltip,
  29. ElRovingFocusGroup: rovingFocusGroup["default"],
  30. ElOnlyChild: onlyChild.OnlyChild,
  31. ElIcon: index$3.ElIcon,
  32. ArrowDown: iconsVue.ArrowDown
  33. },
  34. props: dropdown.dropdownProps,
  35. emits: ["visible-change", "click", "command"],
  36. setup(props, { emit }) {
  37. const _instance = vue.getCurrentInstance();
  38. const ns = index$4.useNamespace("dropdown");
  39. const { t } = index$5.useLocale();
  40. const triggeringElementRef = vue.ref();
  41. const referenceElementRef = vue.ref();
  42. const popperRef = vue.ref();
  43. const contentRef = vue.ref();
  44. const scrollbar = vue.ref(null);
  45. const currentTabId = vue.ref(null);
  46. const isUsingKeyboard = vue.ref(false);
  47. const wrapStyle = vue.computed(() => ({
  48. maxHeight: style.addUnit(props.maxHeight)
  49. }));
  50. const dropdownTriggerKls = vue.computed(() => [ns.m(dropdownSize.value)]);
  51. const trigger = vue.computed(() => lodashUnified.castArray(props.trigger));
  52. const defaultTriggerId = index$6.useId().value;
  53. const triggerId = vue.computed(() => props.id || defaultTriggerId);
  54. vue.watch([triggeringElementRef, trigger], ([triggeringElement, trigger2], [prevTriggeringElement]) => {
  55. var _a, _b, _c;
  56. if ((_a = prevTriggeringElement == null ? void 0 : prevTriggeringElement.$el) == null ? void 0 : _a.removeEventListener) {
  57. prevTriggeringElement.$el.removeEventListener("pointerenter", onAutofocusTriggerEnter);
  58. }
  59. if ((_b = triggeringElement == null ? void 0 : triggeringElement.$el) == null ? void 0 : _b.removeEventListener) {
  60. triggeringElement.$el.removeEventListener("pointerenter", onAutofocusTriggerEnter);
  61. }
  62. if (((_c = triggeringElement == null ? void 0 : triggeringElement.$el) == null ? void 0 : _c.addEventListener) && trigger2.includes("hover")) {
  63. triggeringElement.$el.addEventListener("pointerenter", onAutofocusTriggerEnter);
  64. }
  65. }, { immediate: true });
  66. vue.onBeforeUnmount(() => {
  67. var _a, _b;
  68. if ((_b = (_a = triggeringElementRef.value) == null ? void 0 : _a.$el) == null ? void 0 : _b.removeEventListener) {
  69. triggeringElementRef.value.$el.removeEventListener("pointerenter", onAutofocusTriggerEnter);
  70. }
  71. });
  72. function handleClick() {
  73. handleClose();
  74. }
  75. function handleClose() {
  76. var _a;
  77. (_a = popperRef.value) == null ? void 0 : _a.onClose();
  78. }
  79. function handleOpen() {
  80. var _a;
  81. (_a = popperRef.value) == null ? void 0 : _a.onOpen();
  82. }
  83. const dropdownSize = useFormCommonProps.useFormSize();
  84. function commandHandler(...args) {
  85. emit("command", ...args);
  86. }
  87. function onAutofocusTriggerEnter() {
  88. var _a, _b;
  89. (_b = (_a = triggeringElementRef.value) == null ? void 0 : _a.$el) == null ? void 0 : _b.focus();
  90. }
  91. function onItemEnter() {
  92. }
  93. function onItemLeave() {
  94. const contentEl = vue.unref(contentRef);
  95. trigger.value.includes("hover") && (contentEl == null ? void 0 : contentEl.focus());
  96. currentTabId.value = null;
  97. }
  98. function handleCurrentTabIdChange(id) {
  99. currentTabId.value = id;
  100. }
  101. function handleEntryFocus(e) {
  102. if (!isUsingKeyboard.value) {
  103. e.preventDefault();
  104. e.stopImmediatePropagation();
  105. }
  106. }
  107. function handleBeforeShowTooltip() {
  108. emit("visible-change", true);
  109. }
  110. function handleShowTooltip(event) {
  111. var _a;
  112. if ((event == null ? void 0 : event.type) === "keydown") {
  113. (_a = contentRef.value) == null ? void 0 : _a.focus();
  114. }
  115. }
  116. function handleBeforeHideTooltip() {
  117. emit("visible-change", false);
  118. }
  119. vue.provide(tokens.DROPDOWN_INJECTION_KEY, {
  120. contentRef,
  121. role: vue.computed(() => props.role),
  122. triggerId,
  123. isUsingKeyboard,
  124. onItemEnter,
  125. onItemLeave
  126. });
  127. vue.provide("elDropdown", {
  128. instance: _instance,
  129. dropdownSize,
  130. handleClick,
  131. commandHandler,
  132. trigger: vue.toRef(props, "trigger"),
  133. hideOnClick: vue.toRef(props, "hideOnClick")
  134. });
  135. const onFocusAfterTrapped = (e) => {
  136. var _a, _b;
  137. e.preventDefault();
  138. (_b = (_a = contentRef.value) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a, {
  139. preventScroll: true
  140. });
  141. };
  142. const handlerMainButtonClick = (event) => {
  143. emit("click", event);
  144. };
  145. return {
  146. t,
  147. ns,
  148. scrollbar,
  149. wrapStyle,
  150. dropdownTriggerKls,
  151. dropdownSize,
  152. triggerId,
  153. currentTabId,
  154. handleCurrentTabIdChange,
  155. handlerMainButtonClick,
  156. handleEntryFocus,
  157. handleClose,
  158. handleOpen,
  159. handleBeforeShowTooltip,
  160. handleShowTooltip,
  161. handleBeforeHideTooltip,
  162. onFocusAfterTrapped,
  163. popperRef,
  164. contentRef,
  165. triggeringElementRef,
  166. referenceElementRef
  167. };
  168. }
  169. });
  170. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  171. var _a;
  172. const _component_el_dropdown_collection = vue.resolveComponent("el-dropdown-collection");
  173. const _component_el_roving_focus_group = vue.resolveComponent("el-roving-focus-group");
  174. const _component_el_scrollbar = vue.resolveComponent("el-scrollbar");
  175. const _component_el_only_child = vue.resolveComponent("el-only-child");
  176. const _component_el_tooltip = vue.resolveComponent("el-tooltip");
  177. const _component_el_button = vue.resolveComponent("el-button");
  178. const _component_arrow_down = vue.resolveComponent("arrow-down");
  179. const _component_el_icon = vue.resolveComponent("el-icon");
  180. const _component_el_button_group = vue.resolveComponent("el-button-group");
  181. return vue.openBlock(), vue.createElementBlock("div", {
  182. class: vue.normalizeClass([_ctx.ns.b(), _ctx.ns.is("disabled", _ctx.disabled)])
  183. }, [
  184. vue.createVNode(_component_el_tooltip, {
  185. ref: "popperRef",
  186. role: _ctx.role,
  187. effect: _ctx.effect,
  188. "fallback-placements": ["bottom", "top"],
  189. "popper-options": _ctx.popperOptions,
  190. "gpu-acceleration": false,
  191. "hide-after": _ctx.trigger === "hover" ? _ctx.hideTimeout : 0,
  192. "manual-mode": true,
  193. placement: _ctx.placement,
  194. "popper-class": [_ctx.ns.e("popper"), _ctx.popperClass],
  195. "reference-element": (_a = _ctx.referenceElementRef) == null ? void 0 : _a.$el,
  196. trigger: _ctx.trigger,
  197. "trigger-keys": _ctx.triggerKeys,
  198. "trigger-target-el": _ctx.contentRef,
  199. "show-after": _ctx.trigger === "hover" ? _ctx.showTimeout : 0,
  200. "stop-popper-mouse-event": false,
  201. "virtual-ref": _ctx.triggeringElementRef,
  202. "virtual-triggering": _ctx.splitButton,
  203. disabled: _ctx.disabled,
  204. transition: `${_ctx.ns.namespace.value}-zoom-in-top`,
  205. teleported: _ctx.teleported,
  206. pure: "",
  207. persistent: _ctx.persistent,
  208. onBeforeShow: _ctx.handleBeforeShowTooltip,
  209. onShow: _ctx.handleShowTooltip,
  210. onBeforeHide: _ctx.handleBeforeHideTooltip
  211. }, vue.createSlots({
  212. content: vue.withCtx(() => [
  213. vue.createVNode(_component_el_scrollbar, {
  214. ref: "scrollbar",
  215. "wrap-style": _ctx.wrapStyle,
  216. tag: "div",
  217. "view-class": _ctx.ns.e("list")
  218. }, {
  219. default: vue.withCtx(() => [
  220. vue.createVNode(_component_el_roving_focus_group, {
  221. loop: _ctx.loop,
  222. "current-tab-id": _ctx.currentTabId,
  223. orientation: "horizontal",
  224. onCurrentTabIdChange: _ctx.handleCurrentTabIdChange,
  225. onEntryFocus: _ctx.handleEntryFocus
  226. }, {
  227. default: vue.withCtx(() => [
  228. vue.createVNode(_component_el_dropdown_collection, null, {
  229. default: vue.withCtx(() => [
  230. vue.renderSlot(_ctx.$slots, "dropdown")
  231. ]),
  232. _: 3
  233. })
  234. ]),
  235. _: 3
  236. }, 8, ["loop", "current-tab-id", "onCurrentTabIdChange", "onEntryFocus"])
  237. ]),
  238. _: 3
  239. }, 8, ["wrap-style", "view-class"])
  240. ]),
  241. _: 2
  242. }, [
  243. !_ctx.splitButton ? {
  244. name: "default",
  245. fn: vue.withCtx(() => [
  246. vue.createVNode(_component_el_only_child, {
  247. id: _ctx.triggerId,
  248. ref: "triggeringElementRef",
  249. role: "button",
  250. tabindex: _ctx.tabindex
  251. }, {
  252. default: vue.withCtx(() => [
  253. vue.renderSlot(_ctx.$slots, "default")
  254. ]),
  255. _: 3
  256. }, 8, ["id", "tabindex"])
  257. ])
  258. } : void 0
  259. ]), 1032, ["role", "effect", "popper-options", "hide-after", "placement", "popper-class", "reference-element", "trigger", "trigger-keys", "trigger-target-el", "show-after", "virtual-ref", "virtual-triggering", "disabled", "transition", "teleported", "persistent", "onBeforeShow", "onShow", "onBeforeHide"]),
  260. _ctx.splitButton ? (vue.openBlock(), vue.createBlock(_component_el_button_group, { key: 0 }, {
  261. default: vue.withCtx(() => [
  262. vue.createVNode(_component_el_button, vue.mergeProps({ ref: "referenceElementRef" }, _ctx.buttonProps, {
  263. size: _ctx.dropdownSize,
  264. type: _ctx.type,
  265. disabled: _ctx.disabled,
  266. tabindex: _ctx.tabindex,
  267. onClick: _ctx.handlerMainButtonClick
  268. }), {
  269. default: vue.withCtx(() => [
  270. vue.renderSlot(_ctx.$slots, "default")
  271. ]),
  272. _: 3
  273. }, 16, ["size", "type", "disabled", "tabindex", "onClick"]),
  274. vue.createVNode(_component_el_button, vue.mergeProps({
  275. id: _ctx.triggerId,
  276. ref: "triggeringElementRef"
  277. }, _ctx.buttonProps, {
  278. role: "button",
  279. size: _ctx.dropdownSize,
  280. type: _ctx.type,
  281. class: _ctx.ns.e("caret-button"),
  282. disabled: _ctx.disabled,
  283. tabindex: _ctx.tabindex,
  284. "aria-label": _ctx.t("el.dropdown.toggleDropdown")
  285. }), {
  286. default: vue.withCtx(() => [
  287. vue.createVNode(_component_el_icon, {
  288. class: vue.normalizeClass(_ctx.ns.e("icon"))
  289. }, {
  290. default: vue.withCtx(() => [
  291. vue.createVNode(_component_arrow_down)
  292. ]),
  293. _: 1
  294. }, 8, ["class"])
  295. ]),
  296. _: 1
  297. }, 16, ["id", "size", "type", "class", "disabled", "tabindex", "aria-label"])
  298. ]),
  299. _: 3
  300. })) : vue.createCommentVNode("v-if", true)
  301. ], 2);
  302. }
  303. var Dropdown = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["render", _sfc_render], ["__file", "dropdown.vue"]]);
  304. exports["default"] = Dropdown;
  305. //# sourceMappingURL=dropdown2.js.map