ngx-modialog-7
Version:
Modal / Dialog for Angular
145 lines • 12.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/providers/outside-event-plugin.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// heavily inspired by:
// http://www.bennadel.com/blog/3025-creating-custom-dom-and-host-event-bindings-in-angular-2-beta-6.htm
import { Injectable } from '@angular/core';
import { noop } from '../framework/utils';
// TODO: use DI factory for this.
// TODO: consolidate dup code
/** @type {?} */
var isDoc = !(typeof document === 'undefined' || !document);
/** @type {?} */
var eventMap = {
clickOutside: 'click',
mousedownOutside: 'mousedown',
mouseupOutside: 'mouseup',
mousemoveOutside: 'mousemove'
};
/**
* An event handler factory for event handlers that bubble the event to a given handler
* if the event target is not an ancestor of the given element.
* @param {?} element
* @param {?} handler
* @return {?}
*/
function bubbleNonAncestorHandlerFactory(element, handler) {
return (/**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var current = event.target;
do {
if (current === element) {
return;
}
} while (current.parentNode && (current = current.parentNode));
handler(event);
});
}
var DOMOutsideEventPlugin = /** @class */ (function () {
function DOMOutsideEventPlugin() {
if (!isDoc || typeof document.addEventListener !== 'function') {
this.addEventListener = (/** @type {?} */ (noop));
}
}
/**
* @param {?} eventName
* @return {?}
*/
DOMOutsideEventPlugin.prototype.supports = /**
* @param {?} eventName
* @return {?}
*/
function (eventName) {
return eventMap.hasOwnProperty(eventName);
};
/**
* @param {?} element
* @param {?} eventName
* @param {?} handler
* @return {?}
*/
DOMOutsideEventPlugin.prototype.addEventListener = /**
* @param {?} element
* @param {?} eventName
* @param {?} handler
* @return {?}
*/
function (element, eventName, handler) {
/** @type {?} */
var zone = this.manager.getZone();
// A Factory that registers the event on the document, instead of the element.
// the handler is created at runtime, and it acts as a propagation/bubble predicate, it will
// bubble up the event (i.e: execute our original event handler) only if the event targer
// is an ancestor of our element.
// The event is fired inside the angular zone so change detection can kick into action.
/** @type {?} */
var onceOnOutside = (/**
* @return {?}
*/
function () {
/** @type {?} */
var listener = bubbleNonAncestorHandlerFactory(element, (/**
* @param {?} evt
* @return {?}
*/
function (evt) { return zone.runGuarded((/**
* @return {?}
*/
function () { return handler(evt); })); }));
// mimic BrowserDomAdapter.onAndCancel
document.addEventListener(eventMap[eventName], listener, false);
return (/**
* @return {?}
*/
function () { return document.removeEventListener(eventMap[eventName], listener, false); });
});
// we run the event registration for the document in a different zone, this will make sure
// change detection is off.
// It turns out that if a component that use DOMOutsideEventPlugin is built from a click
// event, we might get here before the event reached the document, causing a quick false
// positive handling (when stopPropagation() was'nt invoked). To workaround this we wait
// for the next vm turn and register.
// Event registration returns a dispose function for that event, angular use it to clean
// up after component get's destroyed. Since we need to return a dispose function
// synchronously we have to put a wrapper for it since we will get it asynchronously,
// i.e: after we need to return it.
//
return zone.runOutsideAngular((/**
* @return {?}
*/
function () {
/** @type {?} */
var fn;
setTimeout((/**
* @return {?}
*/
function () { return fn = onceOnOutside(); }), 0);
return (/**
* @return {?}
*/
function () {
if (fn) {
fn();
}
});
}));
};
DOMOutsideEventPlugin.decorators = [
{ type: Injectable }
];
/** @nocollapse */
DOMOutsideEventPlugin.ctorParameters = function () { return []; };
return DOMOutsideEventPlugin;
}());
export { DOMOutsideEventPlugin };
if (false) {
/** @type {?} */
DOMOutsideEventPlugin.prototype.manager;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0c2lkZS1ldmVudC1wbHVnaW4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbW9kaWFsb2ctNy8iLCJzb3VyY2VzIjpbImxpYi9wcm92aWRlcnMvb3V0c2lkZS1ldmVudC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUdBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7O0lBSXBDLEtBQUssR0FBWSxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDOztJQUVoRSxRQUFRLEdBQUc7SUFDYixZQUFZLEVBQUUsT0FBTztJQUNyQixnQkFBZ0IsRUFBRSxXQUFXO0lBQzdCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGdCQUFnQixFQUFFLFdBQVc7Q0FDaEM7Ozs7Ozs7O0FBUUQsU0FBUywrQkFBK0IsQ0FBQyxPQUFvQixFQUFFLE9BQXdCO0lBQ25GOzs7O0lBQU8sVUFBQyxLQUFLOztZQUNMLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTTtRQUMxQixHQUFHO1lBQ0MsSUFBSSxPQUFPLEtBQUssT0FBTyxFQUFFO2dCQUNyQixPQUFPO2FBQ1Y7U0FDSixRQUFRLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBRSxFQUFFO1FBRWpFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDLEVBQUM7QUFDTixDQUFDO0FBRUQ7SUFJSTtRQUNBLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxRQUFRLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxFQUFFO1lBQzNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxtQkFBQSxJQUFJLEVBQU8sQ0FBQztTQUN2QztJQUNELENBQUM7Ozs7O0lBRUQsd0NBQVE7Ozs7SUFBUixVQUFTLFNBQWlCO1FBQ3RCLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7Ozs7O0lBRUQsZ0RBQWdCOzs7Ozs7SUFBaEIsVUFBaUIsT0FBb0IsRUFBRSxTQUFpQixFQUFFLE9BQWlCOztZQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Ozs7Ozs7WUFPN0IsYUFBYTs7O1FBQUc7O2dCQUNaLFFBQVEsR0FDWiwrQkFBK0IsQ0FBQyxPQUFPOzs7O1lBQUUsVUFBQSxHQUFHLElBQUksT0FBQSxJQUFJLENBQUMsVUFBVTs7O1lBQUMsY0FBTSxPQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBWixDQUFZLEVBQUMsRUFBbkMsQ0FBbUMsRUFBQztZQUV0RixzQ0FBc0M7WUFDdEMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEU7OztZQUFPLGNBQU0sT0FBQSxRQUFRLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBbEUsQ0FBa0UsRUFBQztRQUNwRixDQUFDLENBQUE7UUFFRCwwRkFBMEY7UUFDMUYsMkJBQTJCO1FBQzNCLHdGQUF3RjtRQUN4Rix3RkFBd0Y7UUFDeEYsd0ZBQXdGO1FBQ3hGLHFDQUFxQztRQUNyQyx3RkFBd0Y7UUFDeEYsaUZBQWlGO1FBQ2pGLHFGQUFxRjtRQUNyRixtQ0FBbUM7UUFDbkMsRUFBRTtRQUNGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjs7O1FBQUM7O2dCQUN0QixFQUFZO1lBQ2hCLFVBQVU7OztZQUFDLGNBQU0sT0FBQSxFQUFFLEdBQUcsYUFBYSxFQUFFLEVBQXBCLENBQW9CLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUM7OztZQUFPO2dCQUNILElBQUksRUFBRSxFQUFFO29CQUFFLEVBQUUsRUFBRSxDQUFDO2lCQUFFO1lBQ3JCLENBQUMsRUFBQztRQUNOLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7Z0JBakRKLFVBQVU7Ozs7SUFtRFgsNEJBQUM7Q0FBQSxBQW5ERCxJQW1EQztTQWxEWSxxQkFBcUI7OztJQUM5Qix3Q0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBoZWF2aWx5IGluc3BpcmVkIGJ5OlxuLy8gaHR0cDovL3d3dy5iZW5uYWRlbC5jb20vYmxvZy8zMDI1LWNyZWF0aW5nLWN1c3RvbS1kb20tYW5kLWhvc3QtZXZlbnQtYmluZGluZ3MtaW4tYW5ndWxhci0yLWJldGEtNi5odG1cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnJhbWV3b3JrL3V0aWxzJztcblxuLy8gVE9ETzogdXNlIERJIGZhY3RvcnkgZm9yIHRoaXMuXG4vLyBUT0RPOiBjb25zb2xpZGF0ZSBkdXAgY29kZVxuY29uc3QgaXNEb2M6IGJvb2xlYW4gPSAhKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWRvY3VtZW50KTtcblxuY29uc3QgZXZlbnRNYXAgPSB7XG4gICAgY2xpY2tPdXRzaWRlOiAnY2xpY2snLFxuICAgIG1vdXNlZG93bk91dHNpZGU6ICdtb3VzZWRvd24nLFxuICAgIG1vdXNldXBPdXRzaWRlOiAnbW91c2V1cCcsXG4gICAgbW91c2Vtb3ZlT3V0c2lkZTogJ21vdXNlbW92ZSdcbn07XG5cbi8qKlxuICogQW4gZXZlbnQgaGFuZGxlciBmYWN0b3J5IGZvciBldmVudCBoYW5kbGVycyB0aGF0IGJ1YmJsZSB0aGUgZXZlbnQgdG8gYSBnaXZlbiBoYW5kbGVyXG4gKiBpZiB0aGUgZXZlbnQgdGFyZ2V0IGlzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqIEBwYXJhbSBlbGVtZW50XG4gKiBAcGFyYW0gaGFuZGxlclxuICovXG5mdW5jdGlvbiBidWJibGVOb25BbmNlc3RvckhhbmRsZXJGYWN0b3J5KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBoYW5kbGVyOiAoZXZlbnQpID0+IHZvaWQpIHtcbiAgICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY3VycmVudC5wYXJlbnROb2RlICYmICggY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZSApKTtcblxuICAgICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICB9O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRE9NT3V0c2lkZUV2ZW50UGx1Z2luIHsgLy8gZXh0ZW5kcyBFdmVudE1hbmFnZXJQbHVnaW5cbiAgICBtYW5hZ2VyOiBFdmVudE1hbmFnZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIWlzRG9jIHx8IHR5cGVvZiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9IG5vb3AgYXMgYW55O1xuICAgIH1cbiAgICB9XG5cbiAgICBzdXBwb3J0cyhldmVudE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnRNYXAuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKTtcbiAgICB9XG5cbiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IHpvbmUgPSB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpO1xuXG4gICAgICAgIC8vIEEgRmFjdG9yeSB0aGF0IHJlZ2lzdGVycyB0aGUgZXZlbnQgb24gdGhlIGRvY3VtZW50LCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAvLyB0aGUgaGFuZGxlciBpcyBjcmVhdGVkIGF0IHJ1bnRpbWUsIGFuZCBpdCBhY3RzIGFzIGEgcHJvcGFnYXRpb24vYnViYmxlIHByZWRpY2F0ZSwgaXQgd2lsbFxuICAgICAgICAvLyBidWJibGUgdXAgdGhlIGV2ZW50IChpLmU6IGV4ZWN1dGUgb3VyIG9yaWdpbmFsIGV2ZW50IGhhbmRsZXIpIG9ubHkgaWYgdGhlIGV2ZW50IHRhcmdlclxuICAgICAgICAvLyBpcyBhbiBhbmNlc3RvciBvZiBvdXIgZWxlbWVudC5cbiAgICAgICAgLy8gVGhlIGV2ZW50IGlzIGZpcmVkIGluc2lkZSB0aGUgYW5ndWxhciB6b25lIHNvIGNoYW5nZSBkZXRlY3Rpb24gY2FuIGtpY2sgaW50byBhY3Rpb24uXG4gICAgICAgIGNvbnN0IG9uY2VPbk91dHNpZGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9XG4gICAgICAgICAgICAgIGJ1YmJsZU5vbkFuY2VzdG9ySGFuZGxlckZhY3RvcnkoZWxlbWVudCwgZXZ0ID0+IHpvbmUucnVuR3VhcmRlZCgoKSA9PiBoYW5kbGVyKGV2dCkpKTtcblxuICAgICAgICAgICAgLy8gbWltaWMgQnJvd3NlckRvbUFkYXB0ZXIub25BbmRDYW5jZWxcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRNYXBbZXZlbnROYW1lXSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TWFwW2V2ZW50TmFtZV0sIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gd2UgcnVuIHRoZSBldmVudCByZWdpc3RyYXRpb24gZm9yIHRoZSBkb2N1bWVudCBpbiBhIGRpZmZlcmVudCB6b25lLCB0aGlzIHdpbGwgbWFrZSBzdXJlXG4gICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24gaXMgb2ZmLlxuICAgICAgICAvLyBJdCB0dXJucyBvdXQgdGhhdCBpZiBhIGNvbXBvbmVudCB0aGF0IHVzZSBET01PdXRzaWRlRXZlbnRQbHVnaW4gaXMgYnVpbHQgZnJvbSBhIGNsaWNrXG4gICAgICAgIC8vIGV2ZW50LCB3ZSBtaWdodCBnZXQgaGVyZSBiZWZvcmUgdGhlIGV2ZW50IHJlYWNoZWQgdGhlIGRvY3VtZW50LCBjYXVzaW5nIGEgcXVpY2sgZmFsc2VcbiAgICAgICAgLy8gcG9zaXRpdmUgaGFuZGxpbmcgKHdoZW4gc3RvcFByb3BhZ2F0aW9uKCkgd2FzJ250IGludm9rZWQpLiBUbyB3b3JrYXJvdW5kIHRoaXMgd2Ugd2FpdFxuICAgICAgICAvLyBmb3IgdGhlIG5leHQgdm0gdHVybiBhbmQgcmVnaXN0ZXIuXG4gICAgICAgIC8vIEV2ZW50IHJlZ2lzdHJhdGlvbiByZXR1cm5zIGEgZGlzcG9zZSBmdW5jdGlvbiBmb3IgdGhhdCBldmVudCwgYW5ndWxhciB1c2UgaXQgdG8gY2xlYW5cbiAgICAgICAgLy8gdXAgYWZ0ZXIgY29tcG9uZW50IGdldCdzIGRlc3Ryb3llZC4gU2luY2Ugd2UgbmVlZCB0byByZXR1cm4gYSBkaXNwb3NlIGZ1bmN0aW9uXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHkgd2UgaGF2ZSB0byBwdXQgYSB3cmFwcGVyIGZvciBpdCBzaW5jZSB3ZSB3aWxsIGdldCBpdCBhc3luY2hyb25vdXNseSxcbiAgICAgICAgLy8gaS5lOiBhZnRlciB3ZSBuZWVkIHRvIHJldHVybiBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZuOiBGdW5jdGlvbjtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZm4gPSBvbmNlT25PdXRzaWRlKCksIDApO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZm4pIHsgZm4oKTsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iXX0=