element-plus
Version:
A Component Library for Vue 3
162 lines (159 loc) • 5.52 kB
JavaScript
import { defineComponent, inject, computed, onMounted, watch, onBeforeUnmount, openBlock, createBlock, unref, mergeProps, withCtx, renderSlot, createCommentVNode } from 'vue';
import { isNil } from 'lodash-unified';
import { unrefElement } from '@vueuse/core';
import { POPPER_INJECTION_KEY } from './constants.mjs';
import { popperTriggerProps } from './trigger.mjs';
import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';
import { useForwardRef } from '../../../hooks/use-forward-ref/index.mjs';
import { OnlyChild } from '../../slot/src/only-child.mjs';
import { isElement } from '../../../utils/types.mjs';
import { isFocusable } from '../../../utils/dom/aria.mjs';
const _sfc_main = defineComponent({
...{
name: "ElPopperTrigger",
inheritAttrs: false
},
__name: "trigger",
props: popperTriggerProps,
setup(__props, { expose: __expose }) {
const props = __props;
const { role, triggerRef } = inject(POPPER_INJECTION_KEY, void 0);
useForwardRef(triggerRef);
const ariaControls = computed(() => {
return ariaHaspopup.value ? props.id : void 0;
});
const ariaDescribedby = computed(() => {
if (role && role.value === "tooltip") {
return props.open && props.id ? props.id : void 0;
}
return void 0;
});
const ariaHaspopup = computed(() => {
if (role && role.value !== "tooltip") {
return role.value;
}
return void 0;
});
const ariaExpanded = computed(() => {
return ariaHaspopup.value ? `${props.open}` : void 0;
});
let virtualTriggerAriaStopWatch = void 0;
const TRIGGER_ELE_EVENTS = [
"onMouseenter",
"onMouseleave",
"onClick",
"onKeydown",
"onFocus",
"onBlur",
"onContextmenu"
];
onMounted(() => {
watch(
() => props.virtualRef,
(virtualEl) => {
if (virtualEl) {
triggerRef.value = unrefElement(virtualEl);
}
},
{
immediate: true
}
);
watch(
triggerRef,
(el, prevEl) => {
virtualTriggerAriaStopWatch == null ? void 0 : virtualTriggerAriaStopWatch();
virtualTriggerAriaStopWatch = void 0;
if (isElement(prevEl)) {
TRIGGER_ELE_EVENTS.forEach((eventName) => {
const handler = props[eventName];
if (handler) {
prevEl.removeEventListener(
eventName.slice(2).toLowerCase(),
handler,
["onFocus", "onBlur"].includes(eventName)
);
}
});
}
if (isElement(el)) {
TRIGGER_ELE_EVENTS.forEach((eventName) => {
const handler = props[eventName];
if (handler) {
el.addEventListener(
eventName.slice(2).toLowerCase(),
handler,
["onFocus", "onBlur"].includes(eventName)
);
}
});
if (isFocusable(el)) {
virtualTriggerAriaStopWatch = watch(
[ariaControls, ariaDescribedby, ariaHaspopup, ariaExpanded],
(watches) => {
[
"aria-controls",
"aria-describedby",
"aria-haspopup",
"aria-expanded"
].forEach((key, idx) => {
isNil(watches[idx]) ? el.removeAttribute(key) : el.setAttribute(key, watches[idx]);
});
},
{ immediate: true }
);
}
}
if (isElement(prevEl) && isFocusable(prevEl)) {
[
"aria-controls",
"aria-describedby",
"aria-haspopup",
"aria-expanded"
].forEach((key) => prevEl.removeAttribute(key));
}
},
{
immediate: true
}
);
});
onBeforeUnmount(() => {
virtualTriggerAriaStopWatch == null ? void 0 : virtualTriggerAriaStopWatch();
virtualTriggerAriaStopWatch = void 0;
if (triggerRef.value && isElement(triggerRef.value)) {
const el = triggerRef.value;
TRIGGER_ELE_EVENTS.forEach((eventName) => {
const handler = props[eventName];
if (handler) {
el.removeEventListener(
eventName.slice(2).toLowerCase(),
handler,
["onFocus", "onBlur"].includes(eventName)
);
}
});
triggerRef.value = void 0;
}
});
__expose({
triggerRef
});
return (_ctx, _cache) => {
return !_ctx.virtualTriggering ? (openBlock(), createBlock(unref(OnlyChild), mergeProps({ key: 0 }, _ctx.$attrs, {
"aria-controls": ariaControls.value,
"aria-describedby": ariaDescribedby.value,
"aria-expanded": ariaExpanded.value,
"aria-haspopup": ariaHaspopup.value
}), {
default: withCtx(() => [
renderSlot(_ctx.$slots, "default")
]),
_: 3
}, 16, ["aria-controls", "aria-describedby", "aria-expanded", "aria-haspopup"])) : createCommentVNode("v-if", true);
};
}
});
var ElPopperTrigger = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "/home/runner/work/element-plus/element-plus/packages/components/popper/src/trigger.vue"]]);
export { ElPopperTrigger as default };
//# sourceMappingURL=trigger2.mjs.map