UNPKG

element-plus

Version:

A Component Library for Vue 3

242 lines (237 loc) 6.1 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var core = require('@popperjs/core'); var util = require('../../../../utils/util.js'); var popupManager = require('../../../../utils/popup-manager.js'); var popperOptions = require('./popper-options.js'); var defaults = require('./defaults.js'); var shared = require('@vue/shared'); const DEFAULT_TRIGGER = ["hover"]; const UPDATE_VISIBLE_EVENT = "update:visible"; function usePopper(props, { emit }) { const arrowRef = vue.ref(null); const triggerRef = vue.ref(null); const popperRef = vue.ref(null); const popperId = `el-popper-${util.generateId()}`; let popperInstance = null; let showTimer = null; let hideTimer = null; let triggerFocused = false; const isManualMode = () => props.manualMode || props.trigger === "manual"; const popperStyle = vue.ref({ zIndex: popupManager["default"].nextZIndex() }); const popperOptions$1 = popperOptions["default"](props, { arrow: arrowRef }); const state = vue.reactive({ visible: !!props.visible }); const visibility = vue.computed({ get() { if (props.disabled) { return false; } else { return util.isBool(props.visible) ? props.visible : state.visible; } }, set(val) { if (isManualMode()) return; util.isBool(props.visible) ? emit(UPDATE_VISIBLE_EVENT, val) : state.visible = val; } }); function _show() { if (props.autoClose > 0) { hideTimer = window.setTimeout(() => { _hide(); }, props.autoClose); } visibility.value = true; } function _hide() { visibility.value = false; } function clearTimers() { clearTimeout(showTimer); clearTimeout(hideTimer); } const show = () => { if (isManualMode() || props.disabled) return; clearTimers(); if (props.showAfter === 0) { _show(); } else { showTimer = window.setTimeout(() => { _show(); }, props.showAfter); } }; const hide = () => { if (isManualMode()) return; clearTimers(); if (props.hideAfter > 0) { hideTimer = window.setTimeout(() => { close(); }, props.hideAfter); } else { close(); } }; const close = () => { _hide(); if (props.disabled) { doDestroy(true); } }; function onPopperMouseEnter() { if (props.enterable && props.trigger !== "click") { clearTimeout(hideTimer); } } function onPopperMouseLeave() { const { trigger } = props; const shouldPrevent = shared.isString(trigger) && (trigger === "click" || trigger === "focus") || trigger.length === 1 && (trigger[0] === "click" || trigger[0] === "focus"); if (shouldPrevent) return; hide(); } function initializePopper() { if (!vue.unref(visibility)) { return; } const unwrappedTrigger = vue.unref(triggerRef); const _trigger = util.isHTMLElement(unwrappedTrigger) ? unwrappedTrigger : unwrappedTrigger.$el; popperInstance = core.createPopper(_trigger, vue.unref(popperRef), vue.unref(popperOptions$1)); popperInstance.update(); } function doDestroy(forceDestroy) { if (!popperInstance || vue.unref(visibility) && !forceDestroy) return; detachPopper(); } function detachPopper() { var _a; (_a = popperInstance == null ? void 0 : popperInstance.destroy) == null ? void 0 : _a.call(popperInstance); popperInstance = null; } const events = {}; function update() { if (!vue.unref(visibility)) { return; } if (popperInstance) { popperInstance.update(); } else { initializePopper(); } } function onVisibilityChange(toState) { if (toState) { popperStyle.value.zIndex = popupManager["default"].nextZIndex(); initializePopper(); } } if (!isManualMode()) { const toggleState = () => { if (vue.unref(visibility)) { hide(); } else { show(); } }; const popperEventsHandler = (e) => { e.stopPropagation(); switch (e.type) { case "click": { if (triggerFocused) { triggerFocused = false; } else { toggleState(); } break; } case "mouseenter": { show(); break; } case "mouseleave": { hide(); break; } case "focus": { triggerFocused = true; show(); break; } case "blur": { triggerFocused = false; hide(); break; } } }; const triggerEventsMap = { click: ["onClick"], hover: ["onMouseenter", "onMouseleave"], focus: ["onFocus", "onBlur"] }; const mapEvents = (t) => { triggerEventsMap[t].forEach((event) => { events[event] = popperEventsHandler; }); }; if (shared.isArray(props.trigger)) { Object.values(props.trigger).forEach(mapEvents); } else { mapEvents(props.trigger); } } vue.watch(popperOptions$1, (val) => { if (!popperInstance) return; popperInstance.setOptions(val); popperInstance.update(); }); vue.watch(visibility, onVisibilityChange); return { update, doDestroy, show, hide, onPopperMouseEnter, onPopperMouseLeave, onAfterEnter: () => { emit("after-enter"); }, onAfterLeave: () => { detachPopper(); emit("after-leave"); }, onBeforeEnter: () => { emit("before-enter"); }, onBeforeLeave: () => { emit("before-leave"); }, initializePopper, isManualMode, arrowRef, events, popperId, popperInstance, popperRef, popperStyle, triggerRef, visibility }; } Object.defineProperty(exports, 'Effect', { enumerable: true, get: function () { return defaults.Effect; } }); exports.DEFAULT_TRIGGER = DEFAULT_TRIGGER; exports.UPDATE_VISIBLE_EVENT = UPDATE_VISIBLE_EVENT; exports["default"] = usePopper; //# sourceMappingURL=index.js.map