import { defineComponent, getCurrentInstance, ref, computed, watch, toRef, onBeforeUnmount, unref, provide, resolveComponent, openBlock, createElementBlock, normalizeClass, createVNode, createSlots, withCtx, renderSlot, createBlock, mergeProps, createCommentVNode } from 'vue';
|
import { ElButton } from '../../button/index.mjs';
|
import { ElTooltip } from '../../tooltip/index.mjs';
|
import { ElScrollbar } from '../../scrollbar/index.mjs';
|
import { ElIcon } from '../../icon/index.mjs';
|
import '../../roving-focus-group/index.mjs';
|
import '../../slot/index.mjs';
|
import '../../form/index.mjs';
|
import '../../../utils/index.mjs';
|
import { ArrowDown } from '@element-plus/icons-vue';
|
import '../../../constants/index.mjs';
|
import '../../../hooks/index.mjs';
|
import { ElCollection, dropdownProps } from './dropdown.mjs';
|
import { DROPDOWN_INJECTION_KEY } from './tokens.mjs';
|
import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
|
import ElRovingFocusGroup from '../../roving-focus-group/src/roving-focus-group2.mjs';
|
import { OnlyChild } from '../../slot/src/only-child.mjs';
|
import { useNamespace } from '../../../hooks/use-namespace/index.mjs';
|
import { useLocale } from '../../../hooks/use-locale/index.mjs';
|
import { EVENT_CODE } from '../../../constants/aria.mjs';
|
import { addUnit } from '../../../utils/dom/style.mjs';
|
import { useId } from '../../../hooks/use-id/index.mjs';
|
import { isArray } from '@vue/shared';
|
import { useFormSize } from '../../form/src/hooks/use-form-common-props.mjs';
|
|
const { ButtonGroup: ElButtonGroup } = ElButton;
|
const _sfc_main = defineComponent({
|
name: "ElDropdown",
|
components: {
|
ElButton,
|
ElButtonGroup,
|
ElScrollbar,
|
ElDropdownCollection: ElCollection,
|
ElTooltip,
|
ElRovingFocusGroup,
|
ElOnlyChild: OnlyChild,
|
ElIcon,
|
ArrowDown
|
},
|
props: dropdownProps,
|
emits: ["visible-change", "click", "command"],
|
setup(props, { emit }) {
|
const _instance = getCurrentInstance();
|
const ns = useNamespace("dropdown");
|
const { t } = useLocale();
|
const triggeringElementRef = ref();
|
const referenceElementRef = ref();
|
const popperRef = ref(null);
|
const contentRef = ref(null);
|
const scrollbar = ref(null);
|
const currentTabId = ref(null);
|
const isUsingKeyboard = ref(false);
|
const triggerKeys = [EVENT_CODE.enter, EVENT_CODE.space, EVENT_CODE.down];
|
const wrapStyle = computed(() => ({
|
maxHeight: addUnit(props.maxHeight)
|
}));
|
const dropdownTriggerKls = computed(() => [ns.m(dropdownSize.value)]);
|
const defaultTriggerId = useId().value;
|
const triggerId = computed(() => {
|
return props.id || defaultTriggerId;
|
});
|
watch([triggeringElementRef, toRef(props, "trigger")], ([triggeringElement, trigger], [prevTriggeringElement]) => {
|
var _a, _b, _c;
|
const triggerArray = isArray(trigger) ? trigger : [trigger];
|
if ((_a = prevTriggeringElement == null ? void 0 : prevTriggeringElement.$el) == null ? void 0 : _a.removeEventListener) {
|
prevTriggeringElement.$el.removeEventListener("pointerenter", onAutofocusTriggerEnter);
|
}
|
if ((_b = triggeringElement == null ? void 0 : triggeringElement.$el) == null ? void 0 : _b.removeEventListener) {
|
triggeringElement.$el.removeEventListener("pointerenter", onAutofocusTriggerEnter);
|
}
|
if (((_c = triggeringElement == null ? void 0 : triggeringElement.$el) == null ? void 0 : _c.addEventListener) && triggerArray.includes("hover")) {
|
triggeringElement.$el.addEventListener("pointerenter", onAutofocusTriggerEnter);
|
}
|
}, { immediate: true });
|
onBeforeUnmount(() => {
|
var _a, _b;
|
if ((_b = (_a = triggeringElementRef.value) == null ? void 0 : _a.$el) == null ? void 0 : _b.removeEventListener) {
|
triggeringElementRef.value.$el.removeEventListener("pointerenter", onAutofocusTriggerEnter);
|
}
|
});
|
function handleClick() {
|
handleClose();
|
}
|
function handleClose() {
|
var _a;
|
(_a = popperRef.value) == null ? void 0 : _a.onClose();
|
}
|
function handleOpen() {
|
var _a;
|
(_a = popperRef.value) == null ? void 0 : _a.onOpen();
|
}
|
const dropdownSize = useFormSize();
|
function commandHandler(...args) {
|
emit("command", ...args);
|
}
|
function onAutofocusTriggerEnter() {
|
var _a, _b;
|
(_b = (_a = triggeringElementRef.value) == null ? void 0 : _a.$el) == null ? void 0 : _b.focus();
|
}
|
function onItemEnter() {
|
}
|
function onItemLeave() {
|
const contentEl = unref(contentRef);
|
contentEl == null ? void 0 : contentEl.focus();
|
currentTabId.value = null;
|
}
|
function handleCurrentTabIdChange(id) {
|
currentTabId.value = id;
|
}
|
function handleEntryFocus(e) {
|
if (!isUsingKeyboard.value) {
|
e.preventDefault();
|
e.stopImmediatePropagation();
|
}
|
}
|
function handleBeforeShowTooltip() {
|
emit("visible-change", true);
|
}
|
function handleShowTooltip(event) {
|
if ((event == null ? void 0 : event.type) === "keydown") {
|
contentRef.value.focus();
|
}
|
}
|
function handleBeforeHideTooltip() {
|
emit("visible-change", false);
|
}
|
provide(DROPDOWN_INJECTION_KEY, {
|
contentRef,
|
role: computed(() => props.role),
|
triggerId,
|
isUsingKeyboard,
|
onItemEnter,
|
onItemLeave
|
});
|
provide("elDropdown", {
|
instance: _instance,
|
dropdownSize,
|
handleClick,
|
commandHandler,
|
trigger: toRef(props, "trigger"),
|
hideOnClick: toRef(props, "hideOnClick")
|
});
|
const onFocusAfterTrapped = (e) => {
|
var _a, _b;
|
e.preventDefault();
|
(_b = (_a = contentRef.value) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a, {
|
preventScroll: true
|
});
|
};
|
const handlerMainButtonClick = (event) => {
|
emit("click", event);
|
};
|
return {
|
t,
|
ns,
|
scrollbar,
|
wrapStyle,
|
dropdownTriggerKls,
|
dropdownSize,
|
triggerId,
|
triggerKeys,
|
currentTabId,
|
handleCurrentTabIdChange,
|
handlerMainButtonClick,
|
handleEntryFocus,
|
handleClose,
|
handleOpen,
|
handleBeforeShowTooltip,
|
handleShowTooltip,
|
handleBeforeHideTooltip,
|
onFocusAfterTrapped,
|
popperRef,
|
contentRef,
|
triggeringElementRef,
|
referenceElementRef
|
};
|
}
|
});
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
var _a;
|
const _component_el_dropdown_collection = resolveComponent("el-dropdown-collection");
|
const _component_el_roving_focus_group = resolveComponent("el-roving-focus-group");
|
const _component_el_scrollbar = resolveComponent("el-scrollbar");
|
const _component_el_only_child = resolveComponent("el-only-child");
|
const _component_el_tooltip = resolveComponent("el-tooltip");
|
const _component_el_button = resolveComponent("el-button");
|
const _component_arrow_down = resolveComponent("arrow-down");
|
const _component_el_icon = resolveComponent("el-icon");
|
const _component_el_button_group = resolveComponent("el-button-group");
|
return openBlock(), createElementBlock("div", {
|
class: normalizeClass([_ctx.ns.b(), _ctx.ns.is("disabled", _ctx.disabled)])
|
}, [
|
createVNode(_component_el_tooltip, {
|
ref: "popperRef",
|
role: _ctx.role,
|
effect: _ctx.effect,
|
"fallback-placements": ["bottom", "top"],
|
"popper-options": _ctx.popperOptions,
|
"gpu-acceleration": false,
|
"hide-after": _ctx.trigger === "hover" ? _ctx.hideTimeout : 0,
|
"manual-mode": true,
|
placement: _ctx.placement,
|
"popper-class": [_ctx.ns.e("popper"), _ctx.popperClass],
|
"reference-element": (_a = _ctx.referenceElementRef) == null ? void 0 : _a.$el,
|
trigger: _ctx.trigger,
|
"trigger-keys": _ctx.triggerKeys,
|
"trigger-target-el": _ctx.contentRef,
|
"show-after": _ctx.trigger === "hover" ? _ctx.showTimeout : 0,
|
"stop-popper-mouse-event": false,
|
"virtual-ref": _ctx.triggeringElementRef,
|
"virtual-triggering": _ctx.splitButton,
|
disabled: _ctx.disabled,
|
transition: `${_ctx.ns.namespace.value}-zoom-in-top`,
|
teleported: _ctx.teleported,
|
pure: "",
|
persistent: "",
|
onBeforeShow: _ctx.handleBeforeShowTooltip,
|
onShow: _ctx.handleShowTooltip,
|
onBeforeHide: _ctx.handleBeforeHideTooltip
|
}, createSlots({
|
content: withCtx(() => [
|
createVNode(_component_el_scrollbar, {
|
ref: "scrollbar",
|
"wrap-style": _ctx.wrapStyle,
|
tag: "div",
|
"view-class": _ctx.ns.e("list")
|
}, {
|
default: withCtx(() => [
|
createVNode(_component_el_roving_focus_group, {
|
loop: _ctx.loop,
|
"current-tab-id": _ctx.currentTabId,
|
orientation: "horizontal",
|
onCurrentTabIdChange: _ctx.handleCurrentTabIdChange,
|
onEntryFocus: _ctx.handleEntryFocus
|
}, {
|
default: withCtx(() => [
|
createVNode(_component_el_dropdown_collection, null, {
|
default: withCtx(() => [
|
renderSlot(_ctx.$slots, "dropdown")
|
]),
|
_: 3
|
})
|
]),
|
_: 3
|
}, 8, ["loop", "current-tab-id", "onCurrentTabIdChange", "onEntryFocus"])
|
]),
|
_: 3
|
}, 8, ["wrap-style", "view-class"])
|
]),
|
_: 2
|
}, [
|
!_ctx.splitButton ? {
|
name: "default",
|
fn: withCtx(() => [
|
createVNode(_component_el_only_child, {
|
id: _ctx.triggerId,
|
ref: "triggeringElementRef",
|
role: "button",
|
tabindex: _ctx.tabindex
|
}, {
|
default: withCtx(() => [
|
renderSlot(_ctx.$slots, "default")
|
]),
|
_: 3
|
}, 8, ["id", "tabindex"])
|
])
|
} : void 0
|
]), 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"]),
|
_ctx.splitButton ? (openBlock(), createBlock(_component_el_button_group, { key: 0 }, {
|
default: withCtx(() => [
|
createVNode(_component_el_button, mergeProps({ ref: "referenceElementRef" }, _ctx.buttonProps, {
|
size: _ctx.dropdownSize,
|
type: _ctx.type,
|
disabled: _ctx.disabled,
|
tabindex: _ctx.tabindex,
|
onClick: _ctx.handlerMainButtonClick
|
}), {
|
default: withCtx(() => [
|
renderSlot(_ctx.$slots, "default")
|
]),
|
_: 3
|
}, 16, ["size", "type", "disabled", "tabindex", "onClick"]),
|
createVNode(_component_el_button, mergeProps({
|
id: _ctx.triggerId,
|
ref: "triggeringElementRef"
|
}, _ctx.buttonProps, {
|
role: "button",
|
size: _ctx.dropdownSize,
|
type: _ctx.type,
|
class: _ctx.ns.e("caret-button"),
|
disabled: _ctx.disabled,
|
tabindex: _ctx.tabindex,
|
"aria-label": _ctx.t("el.dropdown.toggleDropdown")
|
}), {
|
default: withCtx(() => [
|
createVNode(_component_el_icon, {
|
class: normalizeClass(_ctx.ns.e("icon"))
|
}, {
|
default: withCtx(() => [
|
createVNode(_component_arrow_down)
|
]),
|
_: 1
|
}, 8, ["class"])
|
]),
|
_: 1
|
}, 16, ["id", "size", "type", "class", "disabled", "tabindex", "aria-label"])
|
]),
|
_: 3
|
})) : createCommentVNode("v-if", true)
|
], 2);
|
}
|
var Dropdown = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/home/runner/work/element-plus/element-plus/packages/components/dropdown/src/dropdown.vue"]]);
|
|
export { Dropdown as default };
|
//# sourceMappingURL=dropdown2.mjs.map
|