dropdown2.js 11 KB

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