ngx-modialog-10
Version:
Modal / Dialog for Angular
145 lines • 12.6 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0c2lkZS1ldmVudC1wbHVnaW4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbW9kaWFsb2ctMTAvIiwic291cmNlcyI6WyJsaWIvcHJvdmlkZXJzL291dHNpZGUtZXZlbnQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztJQUlwQyxLQUFLLEdBQVksQ0FBQyxDQUFDLE9BQU8sUUFBUSxLQUFLLFdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7SUFFaEUsUUFBUSxHQUFHO0lBQ2IsWUFBWSxFQUFFLE9BQU87SUFDckIsZ0JBQWdCLEVBQUUsV0FBVztJQUM3QixjQUFjLEVBQUUsU0FBUztJQUN6QixnQkFBZ0IsRUFBRSxXQUFXO0NBQ2hDOzs7Ozs7OztBQVFELFNBQVMsK0JBQStCLENBQUMsT0FBb0IsRUFBRSxPQUF3QjtJQUNuRjs7OztJQUFPLFVBQUMsS0FBSzs7WUFDTCxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU07UUFDMUIsR0FBRztZQUNDLElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRTtnQkFDckIsT0FBTzthQUNWO1NBQ0osUUFBUSxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUUsRUFBRTtRQUVqRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxFQUFDO0FBQ04sQ0FBQztBQUVEO0lBSUk7UUFDQSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sUUFBUSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsRUFBRTtZQUMzRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsbUJBQUEsSUFBSSxFQUFPLENBQUM7U0FDdkM7SUFDRCxDQUFDOzs7OztJQUVELHdDQUFROzs7O0lBQVIsVUFBUyxTQUFpQjtRQUN0QixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7Ozs7OztJQUVELGdEQUFnQjs7Ozs7O0lBQWhCLFVBQWlCLE9BQW9CLEVBQUUsU0FBaUIsRUFBRSxPQUFpQjs7WUFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFOzs7Ozs7O1lBTzdCLGFBQWE7OztRQUFHOztnQkFDWixRQUFRLEdBQ1osK0JBQStCLENBQUMsT0FBTzs7OztZQUFFLFVBQUEsR0FBRyxJQUFJLE9BQUEsSUFBSSxDQUFDLFVBQVU7OztZQUFDLGNBQU0sT0FBQSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQVosQ0FBWSxFQUFDLEVBQW5DLENBQW1DLEVBQUM7WUFFdEYsc0NBQXNDO1lBQ3RDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hFOzs7WUFBTyxjQUFNLE9BQUEsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQWxFLENBQWtFLEVBQUM7UUFDcEYsQ0FBQyxDQUFBO1FBRUQsMEZBQTBGO1FBQzFGLDJCQUEyQjtRQUMzQix3RkFBd0Y7UUFDeEYsd0ZBQXdGO1FBQ3hGLHdGQUF3RjtRQUN4RixxQ0FBcUM7UUFDckMsd0ZBQXdGO1FBQ3hGLGlGQUFpRjtRQUNqRixxRkFBcUY7UUFDckYsbUNBQW1DO1FBQ25DLEVBQUU7UUFDRixPQUFPLElBQUksQ0FBQyxpQkFBaUI7OztRQUFDOztnQkFDdEIsRUFBWTtZQUNoQixVQUFVOzs7WUFBQyxjQUFNLE9BQUEsRUFBRSxHQUFHLGFBQWEsRUFBRSxFQUFwQixDQUFvQixHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDOzs7WUFBTztnQkFDSCxJQUFJLEVBQUUsRUFBRTtvQkFBRSxFQUFFLEVBQUUsQ0FBQztpQkFBRTtZQUNyQixDQUFDLEVBQUM7UUFDTixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7O2dCQWpESixVQUFVOzs7O0lBbURYLDRCQUFDO0NBQUEsQUFuREQsSUFtREM7U0FsRFkscUJBQXFCOzs7SUFDOUIsd0NBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaGVhdmlseSBpbnNwaXJlZCBieTpcbi8vIGh0dHA6Ly93d3cuYmVubmFkZWwuY29tL2Jsb2cvMzAyNS1jcmVhdGluZy1jdXN0b20tZG9tLWFuZC1ob3N0LWV2ZW50LWJpbmRpbmdzLWluLWFuZ3VsYXItMi1iZXRhLTYuaHRtXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2ZyYW1ld29yay91dGlscyc7XG5cbi8vIFRPRE86IHVzZSBESSBmYWN0b3J5IGZvciB0aGlzLlxuLy8gVE9ETzogY29uc29saWRhdGUgZHVwIGNvZGVcbmNvbnN0IGlzRG9jOiBib29sZWFuID0gISh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICFkb2N1bWVudCk7XG5cbmNvbnN0IGV2ZW50TWFwID0ge1xuICAgIGNsaWNrT3V0c2lkZTogJ2NsaWNrJyxcbiAgICBtb3VzZWRvd25PdXRzaWRlOiAnbW91c2Vkb3duJyxcbiAgICBtb3VzZXVwT3V0c2lkZTogJ21vdXNldXAnLFxuICAgIG1vdXNlbW92ZU91dHNpZGU6ICdtb3VzZW1vdmUnXG59O1xuXG4vKipcbiAqIEFuIGV2ZW50IGhhbmRsZXIgZmFjdG9yeSBmb3IgZXZlbnQgaGFuZGxlcnMgdGhhdCBidWJibGUgdGhlIGV2ZW50IHRvIGEgZ2l2ZW4gaGFuZGxlclxuICogaWYgdGhlIGV2ZW50IHRhcmdldCBpcyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gKiBAcGFyYW0gZWxlbWVudFxuICogQHBhcmFtIGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gYnViYmxlTm9uQW5jZXN0b3JIYW5kbGVyRmFjdG9yeShlbGVtZW50OiBIVE1MRWxlbWVudCwgaGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgICAgICBsZXQgY3VycmVudCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnQucGFyZW50Tm9kZSAmJiAoIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudE5vZGUgKSk7XG5cbiAgICAgICAgaGFuZGxlcihldmVudCk7XG4gICAgfTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERPTU91dHNpZGVFdmVudFBsdWdpbiB7IC8vIGV4dGVuZHMgRXZlbnRNYW5hZ2VyUGx1Z2luXG4gICAgbWFuYWdlcjogRXZlbnRNYW5hZ2VyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCFpc0RvYyB8fCB0eXBlb2YgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSBub29wIGFzIGFueTtcbiAgICB9XG4gICAgfVxuXG4gICAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50TWFwLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSk7XG4gICAgfVxuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTtcblxuICAgICAgICAvLyBBIEZhY3RvcnkgdGhhdCByZWdpc3RlcnMgdGhlIGV2ZW50IG9uIHRoZSBkb2N1bWVudCwgaW5zdGVhZCBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgLy8gdGhlIGhhbmRsZXIgaXMgY3JlYXRlZCBhdCBydW50aW1lLCBhbmQgaXQgYWN0cyBhcyBhIHByb3BhZ2F0aW9uL2J1YmJsZSBwcmVkaWNhdGUsIGl0IHdpbGxcbiAgICAgICAgLy8gYnViYmxlIHVwIHRoZSBldmVudCAoaS5lOiBleGVjdXRlIG91ciBvcmlnaW5hbCBldmVudCBoYW5kbGVyKSBvbmx5IGlmIHRoZSBldmVudCB0YXJnZXJcbiAgICAgICAgLy8gaXMgYW4gYW5jZXN0b3Igb2Ygb3VyIGVsZW1lbnQuXG4gICAgICAgIC8vIFRoZSBldmVudCBpcyBmaXJlZCBpbnNpZGUgdGhlIGFuZ3VsYXIgem9uZSBzbyBjaGFuZ2UgZGV0ZWN0aW9uIGNhbiBraWNrIGludG8gYWN0aW9uLlxuICAgICAgICBjb25zdCBvbmNlT25PdXRzaWRlID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPVxuICAgICAgICAgICAgICBidWJibGVOb25BbmNlc3RvckhhbmRsZXJGYWN0b3J5KGVsZW1lbnQsIGV2dCA9PiB6b25lLnJ1bkd1YXJkZWQoKCkgPT4gaGFuZGxlcihldnQpKSk7XG5cbiAgICAgICAgICAgIC8vIG1pbWljIEJyb3dzZXJEb21BZGFwdGVyLm9uQW5kQ2FuY2VsXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TWFwW2V2ZW50TmFtZV0sIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE1hcFtldmVudE5hbWVdLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHdlIHJ1biB0aGUgZXZlbnQgcmVnaXN0cmF0aW9uIGZvciB0aGUgZG9jdW1lbnQgaW4gYSBkaWZmZXJlbnQgem9uZSwgdGhpcyB3aWxsIG1ha2Ugc3VyZVxuICAgICAgICAvLyBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG9mZi5cbiAgICAgICAgLy8gSXQgdHVybnMgb3V0IHRoYXQgaWYgYSBjb21wb25lbnQgdGhhdCB1c2UgRE9NT3V0c2lkZUV2ZW50UGx1Z2luIGlzIGJ1aWx0IGZyb20gYSBjbGlja1xuICAgICAgICAvLyBldmVudCwgd2UgbWlnaHQgZ2V0IGhlcmUgYmVmb3JlIHRoZSBldmVudCByZWFjaGVkIHRoZSBkb2N1bWVudCwgY2F1c2luZyBhIHF1aWNrIGZhbHNlXG4gICAgICAgIC8vIHBvc2l0aXZlIGhhbmRsaW5nICh3aGVuIHN0b3BQcm9wYWdhdGlvbigpIHdhcydudCBpbnZva2VkKS4gVG8gd29ya2Fyb3VuZCB0aGlzIHdlIHdhaXRcbiAgICAgICAgLy8gZm9yIHRoZSBuZXh0IHZtIHR1cm4gYW5kIHJlZ2lzdGVyLlxuICAgICAgICAvLyBFdmVudCByZWdpc3RyYXRpb24gcmV0dXJucyBhIGRpc3Bvc2UgZnVuY3Rpb24gZm9yIHRoYXQgZXZlbnQsIGFuZ3VsYXIgdXNlIGl0IHRvIGNsZWFuXG4gICAgICAgIC8vIHVwIGFmdGVyIGNvbXBvbmVudCBnZXQncyBkZXN0cm95ZWQuIFNpbmNlIHdlIG5lZWQgdG8gcmV0dXJuIGEgZGlzcG9zZSBmdW5jdGlvblxuICAgICAgICAvLyBzeW5jaHJvbm91c2x5IHdlIGhhdmUgdG8gcHV0IGEgd3JhcHBlciBmb3IgaXQgc2luY2Ugd2Ugd2lsbCBnZXQgaXQgYXN5bmNocm9ub3VzbHksXG4gICAgICAgIC8vIGkuZTogYWZ0ZXIgd2UgbmVlZCB0byByZXR1cm4gaXQuXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBmbjogRnVuY3Rpb247XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGZuID0gb25jZU9uT3V0c2lkZSgpLCAwKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZuKSB7IGZuKCk7IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIl19