tav-ui
Version:
60 lines (57 loc) • 2.02 kB
JavaScript
import { on } from '../../utils/domUtils2.mjs';
import { isServer } from '../../utils/is2.mjs';
const nodeList = /* @__PURE__ */ new Map();
let startClick;
if (!isServer) {
on(document, "mousedown", (e) => startClick = e);
on(document, "mouseup", (e) => {
for (const { documentHandler } of nodeList.values()) {
documentHandler(e, startClick);
}
});
}
function createDocumentHandler(el, binding) {
let excludes = [];
if (Array.isArray(binding.arg)) {
excludes = binding.arg;
} else {
excludes.push(binding.arg);
}
return function(mouseup, mousedown) {
const popperRef = binding.instance.popperRef;
const mouseUpTarget = mouseup.target;
const mouseDownTarget = mousedown.target;
const isBound = !binding || !binding.instance;
const isTargetExists = !mouseUpTarget || !mouseDownTarget;
const isContainedByEl = el.contains(mouseUpTarget) || el.contains(mouseDownTarget);
const isSelf = el === mouseUpTarget;
const isTargetExcluded = excludes.length && excludes.some((item) => item?.contains(mouseUpTarget)) || excludes.length && excludes.includes(mouseDownTarget);
const isContainedByPopper = popperRef && (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget));
if (isBound || isTargetExists || isContainedByEl || isSelf || isTargetExcluded || isContainedByPopper) {
return;
}
binding.value();
};
}
const ClickOutsideDirective = {
beforeMount(el, binding) {
nodeList.set(el, {
documentHandler: createDocumentHandler(el, binding),
bindingFn: binding.value
});
},
updated(el, binding) {
nodeList.set(el, {
documentHandler: createDocumentHandler(el, binding),
bindingFn: binding.value
});
},
unmounted(el) {
nodeList.delete(el);
}
};
function setupClickOutsideDirective(app) {
app.directive("clickOutside", ClickOutsideDirective);
}
export { ClickOutsideDirective as default, setupClickOutsideDirective };
//# sourceMappingURL=clickOutside2.mjs.map