UNPKG

ng2-events

Version:

Supercharge your Angular2+ event handling

868 lines (867 loc) 38.8 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); import * as i0 from '@angular/core'; import { Injectable, Inject, NgModule, Directive, Input, EventEmitter, Output, InjectionToken } from '@angular/core'; import { EVENT_MANAGER_PLUGINS } from '@angular/platform-browser'; import { DOCUMENT } from '@angular/common'; import { Subject } from 'rxjs'; import { auditTime } from 'rxjs/operators'; var MyEventManagerPlugin = /** @class */ (function () { function MyEventManagerPlugin(_doc) { this._doc = _doc; } MyEventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) { var target; if (element === 'document') target = this._doc; else if (element === 'window' && typeof (window) !== undefined) target = window; if (!target) { throw new Error("Unsupported event target " + target + " for event " + eventName); } return this.addEventListener(target, eventName, handler); }; ; return MyEventManagerPlugin; }()); /** * Listen to events that are fired outside of the current element and its children * * Usage: * <div (outside.click)="close()"></div> * */ var OutsideEventPlugin = /** @class */ (function (_super) { __extends(OutsideEventPlugin, _super); function OutsideEventPlugin(doc) { return _super.call(this, doc) || this; } OutsideEventPlugin.prototype.supports = function (eventName) { return eventName.indexOf('outside.') === 0; }; OutsideEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var realEventName = eventName.slice(8); return this.manager.addEventListener((element.ownerDocument || document), realEventName, function (e) { if (element !== e.target && !element.contains(e.target)) { handler(e); } }); }; return OutsideEventPlugin; }(MyEventManagerPlugin)); OutsideEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); OutsideEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); var OutsideEventModule = /** @class */ (function () { function OutsideEventModule() { } return OutsideEventModule; }()); OutsideEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); OutsideEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventModule }); OutsideEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: OutsideEventPlugin, multi: true } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OutsideEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: OutsideEventPlugin, multi: true } ] }] }] }); /** * Listen to events without triggering change detection * * Usage: * <button (undetected.click)="handleClick()"></button> * * ... * * export class ExampleComponent implements OnInit { * * constructor(private zone: NgZone) {} * * handleClick() { * if(someCondition) { * this.zone.run(() => { * ... * }); * } * } * } * */ var UndetectedEventPlugin = /** @class */ (function (_super) { __extends(UndetectedEventPlugin, _super); function UndetectedEventPlugin(doc) { return _super.call(this, doc) || this; } UndetectedEventPlugin.prototype.supports = function (eventName) { return eventName.indexOf('undetected.') === 0; }; UndetectedEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var _this = this; var realEventName = eventName.slice(11); return this.manager.getZone().runOutsideAngular(function () { return _this.manager.addEventListener(element, realEventName, handler); }); }; return UndetectedEventPlugin; }(MyEventManagerPlugin)); UndetectedEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); UndetectedEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); var UndetectedEventModule = /** @class */ (function () { function UndetectedEventModule() { } return UndetectedEventModule; }()); UndetectedEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); UndetectedEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventModule }); UndetectedEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: UndetectedEventPlugin, multi: true } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: UndetectedEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: UndetectedEventPlugin, multi: true } ] }] }] }); /** * Register multiple event listeners * * Usage: * <button (multi.focus,select)="foo($event)"></button> * */ var MultiEventPlugin = /** @class */ (function (_super) { __extends(MultiEventPlugin, _super); function MultiEventPlugin(doc) { return _super.call(this, doc) || this; } MultiEventPlugin.prototype.supports = function (eventName) { return eventName.indexOf('multi.') === 0; }; MultiEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var _this = this; var eventNames = eventName.slice(6).split(','); var eventListeners = eventNames.map(function (x) { return _this.manager.addEventListener(element, x, handler); }); return function () { eventListeners.forEach(function (x) { return x(); }); }; }; return MultiEventPlugin; }(MyEventManagerPlugin)); MultiEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); MultiEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); var MultiEventModule = /** @class */ (function () { function MultiEventModule() { } return MultiEventModule; }()); MultiEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); MultiEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventModule }); MultiEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: MultiEventPlugin, multi: true } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: MultiEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: MultiEventPlugin, multi: true } ] }] }] }); /** * Control event listeners with an observable operator without triggering change detection * every time the event fires * * Usage: * <button (observe.throttleTime-500.click)="foo()"></button> * * The method used must be present on the Observable object * e.g. through an explicit import: * import 'rxjs/add/operator/throttleTime'; * * * To get finer-grained control and the possibility to add multiple observable operators * use the ObserveEventDirective. */ var ObserveEventPlugin = /** @class */ (function (_super) { __extends(ObserveEventPlugin, _super); function ObserveEventPlugin(doc) { return _super.call(this, doc) || this; } ObserveEventPlugin.prototype.supports = function (eventName) { return eventName.indexOf('observe.') === 0; }; ObserveEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var _this = this; return this.manager.getZone().runOutsideAngular(function () { var eventRest = eventName.slice(8).split('.'); var fnParts = eventRest[0].split('-'); var fnName = fnParts[0]; var fnArg = (fnParts.length > 1) ? +fnParts[1] : undefined; var delegateEvent = eventRest.slice(1).join('.'); var subject = new Subject(); var observable = subject.asObservable(); if (observable[fnName]) { observable = (fnArg !== undefined) ? observable[fnName](fnArg) : observable[fnName](); } else { console.error('The function "' + fnName + '" does not exist on Observable!'); return function () { }; } observable.subscribe(function (x) { return _this.manager.getZone().run(function () { return handler(x); }); }); var listener = _this.manager.addEventListener(element, delegateEvent, function ($event) { subject.next($event); }); return function () { listener(); subject.complete(); }; }); }; return ObserveEventPlugin; }(MyEventManagerPlugin)); ObserveEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); ObserveEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); var ObserveEventModule = /** @class */ (function () { function ObserveEventModule() { } return ObserveEventModule; }()); ObserveEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ObserveEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventModule }); ObserveEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: ObserveEventPlugin, multi: true } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: ObserveEventPlugin, multi: true } ] }] }] }); /** * Pass events to a given observable subject without triggering change detection * * Usage: * <button [ev-observe]="subject" ev-events="click"></button> * * ... * * export class ExampleComponent implements OnInit { * public subject = new Subject(); * * constructor(private zone: NgZone) {} * * ngOnInit() { * this.subject * .throttleTime(300) * .filter(someCondition) * ... * .subscribe($event => this.zone.run(() => this.handleEvent($event))); * } * } * * Notes: * The [ev-events] property can be either a string or an array of strings to handle multiple events * */ var ObserveEventDirective = /** @class */ (function () { function ObserveEventDirective(elm, renderer, zone) { this.elm = elm; this.renderer = renderer; this.zone = zone; this.listeners = []; } Object.defineProperty(ObserveEventDirective.prototype, "events", { set: function (e) { var _this = this; this.unregisterAll(); var events = (typeof (e) === 'string') ? [e] : e; this.zone.runOutsideAngular(function () { _this.listeners = events.map(function (x) { return _this.addListener(x); }); }); }, enumerable: false, configurable: true }); ObserveEventDirective.prototype.ngOnDestroy = function () { this.unregisterAll(); }; ObserveEventDirective.prototype.unregisterAll = function () { this.listeners.forEach(function (x) { return x(); }); this.listeners = []; }; ObserveEventDirective.prototype.addListener = function (eventName) { var _this = this; var colon = eventName.indexOf(':'); var handler = function ($event) { return _this.fireEvent($event); }; if (colon === -1) { return this.renderer.listen(this.elm.nativeElement, eventName, handler); } else { var scope = eventName.slice(0, colon); var realEventName = eventName.slice(colon + 1); return this.renderer.listen(scope, realEventName, handler); } }; ObserveEventDirective.prototype.fireEvent = function ($event) { if (!this.observe) return; this.observe.next($event); }; return ObserveEventDirective; }()); ObserveEventDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); ObserveEventDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.2", type: ObserveEventDirective, selector: "[ev-observe]", inputs: { observe: ["ev-observe", "observe"], events: ["ev-events", "events"] }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventDirective, decorators: [{ type: Directive, args: [{ selector: '[ev-observe]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }]; }, propDecorators: { observe: [{ type: Input, args: ['ev-observe'] }], events: [{ type: Input, args: ['ev-events'] }] } }); var ObserveEventDirectiveModule = /** @class */ (function () { function ObserveEventDirectiveModule() { } return ObserveEventDirectiveModule; }()); ObserveEventDirectiveModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventDirectiveModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ObserveEventDirectiveModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventDirectiveModule, declarations: [ObserveEventDirective], exports: [ObserveEventDirective] }); ObserveEventDirectiveModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventDirectiveModule }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ObserveEventDirectiveModule, decorators: [{ type: NgModule, args: [{ declarations: [ ObserveEventDirective ], exports: [ ObserveEventDirective ] }] }] }); function getNativeEventNames(eventName) { var supportsPointerEvents = typeof (window) !== 'undefined' && 'PointerEvent' in window; switch (eventName) { case 'up': return supportsPointerEvents ? ['pointerup'] : ['mouseup', 'touchend']; case 'down': return supportsPointerEvents ? ['pointerdown'] : ['mousedown', 'touchstart']; case 'move': return supportsPointerEvents ? ['pointermove'] : ['mousemove', 'touchmove']; default: return []; } } /** * Quick-firing 'up' and 'down' events that work cross-browser for mouse and touch events * * Usage: * <button (down)="activate()" (up)="deactivate()"></button> * */ var TouchEventPlugin = /** @class */ (function (_super) { __extends(TouchEventPlugin, _super); function TouchEventPlugin(doc) { return _super.call(this, doc) || this; } TouchEventPlugin.prototype.supports = function (eventName) { return eventName === 'down' || eventName === 'up' || eventName === 'move'; }; TouchEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var _this = this; var eventListeners = getNativeEventNames(eventName).map(function (x) { return _this.manager.addEventListener(element, x, function (e) { // prevent default so only one of the event listeners is fired e.preventDefault(); handler(e); }); }); return function () { eventListeners.forEach(function (x) { return x(); }); }; }; return TouchEventPlugin; }(MyEventManagerPlugin)); TouchEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); TouchEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); var TouchEventModule = /** @class */ (function () { function TouchEventModule() { } return TouchEventModule; }()); TouchEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); TouchEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventModule }); TouchEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: TouchEventPlugin, multi: true } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: TouchEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: TouchEventPlugin, multi: true } ] }] }] }); /** * Automatically unregister an event listener after the event fired once * * Usage: * <button (once.click)="foo()">...</button> * */ var OnceEventPlugin = /** @class */ (function (_super) { __extends(OnceEventPlugin, _super); function OnceEventPlugin(doc) { return _super.call(this, doc) || this; } OnceEventPlugin.prototype.supports = function (eventName) { return eventName.indexOf('once.') === 0; }; OnceEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var realEventName = eventName.slice(5); var active = true; var eventListener = this.manager.addEventListener(element, realEventName, function ($event) { eventListener(); active = false; handler($event); }); return function () { if (active) eventListener(); }; }; return OnceEventPlugin; }(MyEventManagerPlugin)); OnceEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); OnceEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); var OnceEventModule = /** @class */ (function () { function OnceEventModule() { } return OnceEventModule; }()); OnceEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); OnceEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventModule }); OnceEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: OnceEventPlugin, multi: true } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: OnceEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: OnceEventPlugin, multi: true } ] }] }] }); /** * Conditionally apply event listeners to an element * * Usage: * <button [ev-condition]="isActive()" * ev-events="click" * (ev-fire)="handleClick($event)">...</button> * * Notes: * The [ev-events] property can be either a string or an array of strings to handle multiple events */ var ConditionEventDirective = /** @class */ (function () { function ConditionEventDirective(elm, renderer) { this.elm = elm; this.renderer = renderer; this.fire = new EventEmitter(); this.listeners = []; } ConditionEventDirective.prototype.ngOnChanges = function (changes) { var _this = this; this.unregisterAll(); if (!this.condition || !this.events) return; var events = (typeof (this.events) === 'string') ? [this.events] : this.events; this.listeners = events.map(function (x) { return _this.addListener(x); }); }; ConditionEventDirective.prototype.ngOnDestroy = function () { this.unregisterAll(); }; ConditionEventDirective.prototype.unregisterAll = function () { this.listeners.forEach(function (x) { return x(); }); this.listeners = []; }; ConditionEventDirective.prototype.addListener = function (eventName) { var _this = this; var colon = eventName.indexOf(':'); var handler = function ($event) { return _this.fire.next($event); }; if (colon === -1) { return this.renderer.listen(this.elm.nativeElement, eventName, handler); } else { var scope = eventName.slice(0, colon); var realEventName = eventName.slice(colon + 1); return this.renderer.listen(scope, realEventName, handler); } }; return ConditionEventDirective; }()); ConditionEventDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ConditionEventDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); ConditionEventDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.0.2", type: ConditionEventDirective, selector: "[ev-condition]", inputs: { condition: ["ev-condition", "condition"], events: ["ev-events", "events"] }, outputs: { fire: "ev-fire" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ConditionEventDirective, decorators: [{ type: Directive, args: [{ selector: '[ev-condition]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { condition: [{ type: Input, args: ['ev-condition'] }], events: [{ type: Input, args: ['ev-events'] }], fire: [{ type: Output, args: ['ev-fire'] }] } }); var ConditionEventDirectiveModule = /** @class */ (function () { function ConditionEventDirectiveModule() { } return ConditionEventDirectiveModule; }()); ConditionEventDirectiveModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ConditionEventDirectiveModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ConditionEventDirectiveModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ConditionEventDirectiveModule, declarations: [ConditionEventDirective], exports: [ConditionEventDirective] }); ConditionEventDirectiveModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ConditionEventDirectiveModule }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ConditionEventDirectiveModule, decorators: [{ type: NgModule, args: [{ declarations: [ ConditionEventDirective ], exports: [ ConditionEventDirective ] }] }] }); var SCROLL_EVENT_TIME = new InjectionToken('ScrollEventTime'); /** * Detects when an element is scrolled into or out of the viewport * * Usage: * <div (scroll-in)="activate()" (scroll-out)="deactivate()">...</div> * * The matching handler of the initial status is called upon attaching * to notify the element of its current status. $event is true for the * initial call, false otherwise * */ var ScrollEventPlugin = /** @class */ (function (_super) { __extends(ScrollEventPlugin, _super); function ScrollEventPlugin(doc, time) { var _this = _super.call(this, doc) || this; _this.listeners = []; _this.globalListener = undefined; _this.subject = new Subject(); _this.subject .pipe(auditTime(time)) .subscribe(function () { _this.listeners.forEach(function (x) { return x(); }); }); return _this; } ScrollEventPlugin.prototype.supports = function (eventName) { return eventName === 'scroll-in' || eventName === 'scroll-out'; }; ScrollEventPlugin.prototype.addEventListener = function (element, eventName, handler) { var _this = this; var isScrollIn = (eventName === 'scroll-in'); var status = undefined; setTimeout(function () { status = _this.getStatus(element); if ((isScrollIn && status) || (!isScrollIn && !status)) { handler(true); } }, 0); var listener = function () { var newStatus = _this.getStatus(element); if (status === newStatus) return; if ((isScrollIn && newStatus) || (!isScrollIn && !newStatus)) { _this.manager.getZone().run(function () { return handler(false); }); } status = newStatus; }; this.listeners.push(listener); this.updateGlobalListener(); return function () { var index = _this.listeners.indexOf(listener); if (index === -1) return; _this.listeners.splice(index, 1); _this.updateGlobalListener(); }; }; ScrollEventPlugin.prototype.updateGlobalListener = function () { var _this = this; if (this.listeners.length && this.globalListener === undefined) { this.manager.getZone().runOutsideAngular(function () { var handler = function () { _this.subject.next(); }; var listeners = ['scroll', 'resize', 'orientationchange'] .map(function (x) { return _this.manager.addEventListener(_this._doc.defaultView || window, x, handler); }); _this.globalListener = function () { listeners.forEach(function (x) { return x(); }); }; }); } else if (!this.listeners.length && this.globalListener !== undefined) { this.globalListener(); this.globalListener = undefined; } }; ScrollEventPlugin.prototype.getStatus = function (element) { var rect = element.getBoundingClientRect(); return (rect.bottom >= 0 && rect.top <= window.innerHeight); }; return ScrollEventPlugin; }(MyEventManagerPlugin)); ScrollEventPlugin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventPlugin, deps: [{ token: DOCUMENT }, { token: SCROLL_EVENT_TIME }], target: i0.ɵɵFactoryTarget.Injectable }); ScrollEventPlugin.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventPlugin }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventPlugin, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Inject, args: [SCROLL_EVENT_TIME] }] }]; } }); var ScrollEventModule = /** @class */ (function () { function ScrollEventModule() { } return ScrollEventModule; }()); ScrollEventModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); ScrollEventModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventModule }); ScrollEventModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventModule, providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: ScrollEventPlugin, multi: true }, { provide: SCROLL_EVENT_TIME, useValue: 200 } ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: ScrollEventModule, decorators: [{ type: NgModule, args: [{ providers: [ { provide: EVENT_MANAGER_PLUGINS, useClass: ScrollEventPlugin, multi: true }, { provide: SCROLL_EVENT_TIME, useValue: 200 } ] }] }] }); var Ng2EventsModule = /** @class */ (function () { function Ng2EventsModule() { } return Ng2EventsModule; }()); Ng2EventsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: Ng2EventsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); Ng2EventsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: Ng2EventsModule, imports: [OutsideEventModule, TouchEventModule, MultiEventModule, UndetectedEventModule, ObserveEventModule, ObserveEventDirectiveModule, OnceEventModule, ConditionEventDirectiveModule, ScrollEventModule], exports: [OutsideEventModule, TouchEventModule, MultiEventModule, UndetectedEventModule, ObserveEventModule, ObserveEventDirectiveModule, OnceEventModule, ConditionEventDirectiveModule, ScrollEventModule] }); Ng2EventsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: Ng2EventsModule, imports: [[ OutsideEventModule, TouchEventModule, MultiEventModule, UndetectedEventModule, ObserveEventModule, ObserveEventDirectiveModule, OnceEventModule, ConditionEventDirectiveModule, ScrollEventModule ], OutsideEventModule, TouchEventModule, MultiEventModule, UndetectedEventModule, ObserveEventModule, ObserveEventDirectiveModule, OnceEventModule, ConditionEventDirectiveModule, ScrollEventModule] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.2", ngImport: i0, type: Ng2EventsModule, decorators: [{ type: NgModule, args: [{ imports: [ OutsideEventModule, TouchEventModule, MultiEventModule, UndetectedEventModule, ObserveEventModule, ObserveEventDirectiveModule, OnceEventModule, ConditionEventDirectiveModule, ScrollEventModule ], exports: [ OutsideEventModule, TouchEventModule, MultiEventModule, UndetectedEventModule, ObserveEventModule, ObserveEventDirectiveModule, OnceEventModule, ConditionEventDirectiveModule, ScrollEventModule ] }] }] }); export default Ng2EventsModule; export { ConditionEventDirective, ConditionEventDirectiveModule, MultiEventModule, Ng2EventsModule, ObserveEventDirective, ObserveEventDirectiveModule, ObserveEventModule, OnceEventModule, OutsideEventModule, SCROLL_EVENT_TIME, ScrollEventModule, TouchEventModule, UndetectedEventModule };