78 lines
2.8 KiB
JavaScript
78 lines
2.8 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = exports.ClickOutside = void 0;
|
||
|
|
||
|
function closeConditional() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
function directive(e, el, binding) {
|
||
|
// Args may not always be supplied
|
||
|
binding.args = binding.args || {}; // If no closeConditional was supplied assign a default
|
||
|
|
||
|
var isActive = binding.args.closeConditional || closeConditional; // The include element callbacks below can be expensive
|
||
|
// so we should avoid calling them when we're not active.
|
||
|
// Explicitly check for false to allow fallback compatibility
|
||
|
// with non-toggleable components
|
||
|
|
||
|
if (!e || isActive(e) === false) return; // If click was triggered programmaticaly (domEl.click()) then
|
||
|
// it shouldn't be treated as click-outside
|
||
|
// Chrome/Firefox support isTrusted property
|
||
|
// IE/Edge support pointerType property (empty if not triggered
|
||
|
// by pointing device)
|
||
|
|
||
|
if ('isTrusted' in e && !e.isTrusted || 'pointerType' in e && !e.pointerType) return; // Check if additional elements were passed to be included in check
|
||
|
// (click must be outside all included elements, if any)
|
||
|
|
||
|
var elements = (binding.args.include || function () {
|
||
|
return [];
|
||
|
})(); // Add the root element for the component this directive was defined on
|
||
|
|
||
|
|
||
|
elements.push(el); // Check if it's a click outside our elements, and then if our callback returns true.
|
||
|
// Non-toggleable components should take action in their callback and return falsy.
|
||
|
// Toggleable can return true if it wants to deactivate.
|
||
|
// Note that, because we're in the capture phase, this callback will occur before
|
||
|
// the bubbling click event on any outside elements.
|
||
|
|
||
|
!elements.some(function (el) {
|
||
|
return el.contains(e.target);
|
||
|
}) && setTimeout(function () {
|
||
|
isActive(e) && binding.value && binding.value(e);
|
||
|
}, 0);
|
||
|
}
|
||
|
|
||
|
var ClickOutside = {
|
||
|
// [data-app] may not be found
|
||
|
// if using bind, inserted makes
|
||
|
// sure that the root element is
|
||
|
// available, iOS does not support
|
||
|
// clicks on body
|
||
|
inserted: function inserted(el, binding) {
|
||
|
var onClick = function onClick(e) {
|
||
|
return directive(e, el, binding);
|
||
|
}; // iOS does not recognize click events on document
|
||
|
// or body, this is the entire purpose of the v-app
|
||
|
// component and [data-app], stop removing this
|
||
|
|
||
|
|
||
|
var app = document.querySelector('[data-app]') || document.body; // This is only for unit tests
|
||
|
|
||
|
app.addEventListener('click', onClick, true);
|
||
|
el._clickOutside = onClick;
|
||
|
},
|
||
|
unbind: function unbind(el) {
|
||
|
if (!el._clickOutside) return;
|
||
|
var app = document.querySelector('[data-app]') || document.body; // This is only for unit tests
|
||
|
|
||
|
app && app.removeEventListener('click', el._clickOutside, true);
|
||
|
delete el._clickOutside;
|
||
|
}
|
||
|
};
|
||
|
exports.ClickOutside = ClickOutside;
|
||
|
var _default = ClickOutside;
|
||
|
exports.default = _default;
|
||
|
//# sourceMappingURL=index.js.map
|