UNPKG

@nepwork/dashboards

Version:

Dashboards for emergencies and monitoring

212 lines 10.6 kB
import { __decorate, __extends, __metadata, __param } from "tslib"; import { Inject, Injectable } from '@angular/core'; import { EMPTY, fromEvent as observableFromEvent, merge as observableMerge, Subject } from 'rxjs'; import { debounceTime, delay, filter, map, repeat, share, switchMap, takeUntil, takeWhile } from 'rxjs/operators'; import { NB_DOCUMENT } from '../../../theme.options'; export var NbTrigger; (function (NbTrigger) { NbTrigger["NOOP"] = "noop"; NbTrigger["CLICK"] = "click"; NbTrigger["HOVER"] = "hover"; NbTrigger["HINT"] = "hint"; NbTrigger["FOCUS"] = "focus"; })(NbTrigger || (NbTrigger = {})); /** * TODO maybe we have to use renderer.listen instead of observableFromEvent? * Renderer provides capability use it in service worker, ssr and so on. * */ var NbTriggerStrategyBase = /** @class */ (function () { function NbTriggerStrategyBase(document, host, container) { this.document = document; this.host = host; this.container = container; this.destroyed$ = new Subject(); } NbTriggerStrategyBase.prototype.destroy = function () { this.destroyed$.next(); }; NbTriggerStrategyBase.prototype.isNotOnHostOrContainer = function (event) { return !this.isOnHost(event) && !this.isOnContainer(event); }; NbTriggerStrategyBase.prototype.isOnHostOrContainer = function (event) { return this.isOnHost(event) || this.isOnContainer(event); }; NbTriggerStrategyBase.prototype.isOnHost = function (_a) { var target = _a.target; return this.host.contains(target); }; NbTriggerStrategyBase.prototype.isOnContainer = function (_a) { var target = _a.target; return this.container() && this.container().location.nativeElement.contains(target); }; return NbTriggerStrategyBase; }()); export { NbTriggerStrategyBase }; /** * Creates show and hide event streams. * Fires toggle event when the click was performed on the host element. * Fires close event when the click was performed on the document but * not on the host or container. * */ var NbClickTriggerStrategy = /** @class */ (function (_super) { __extends(NbClickTriggerStrategy, _super); function NbClickTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; // since we should track click for both SHOW and HIDE event we firstly need to track the click and the state // of the container and then later on decide should we hide it or show // if we track the click & state separately this will case a behavior when the container is getting shown // and then hidden right away _this.click$ = observableFromEvent(_this.document, 'click') .pipe(map(function (event) { return [!_this.container() && _this.isOnHost(event), event]; }), share(), takeUntil(_this.destroyed$)); _this.show$ = _this.click$ .pipe(filter(function (_a) { var shouldShow = _a[0]; return shouldShow; }), map(function (_a) { var event = _a[1]; return event; }), takeUntil(_this.destroyed$)); _this.hide$ = _this.click$ .pipe(filter(function (_a) { var shouldShow = _a[0], event = _a[1]; return !shouldShow && !_this.isOnContainer(event); }), map(function (_a) { var event = _a[1]; return event; }), takeUntil(_this.destroyed$)); return _this; } return NbClickTriggerStrategy; }(NbTriggerStrategyBase)); export { NbClickTriggerStrategy }; /** * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element and stops out of the host and popover container. * */ var NbHoverTriggerStrategy = /** @class */ (function (_super) { __extends(NbHoverTriggerStrategy, _super); function NbHoverTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.show$ = observableFromEvent(_this.host, 'mouseenter') .pipe(filter(function () { return !_this.container(); }), // this `delay & takeUntil & repeat` operators combination is a synonym for `conditional debounce` // meaning that if one event occurs in some time after the initial one we won't react to it delay(100), // tslint:disable-next-line:rxjs-no-unsafe-takeuntil takeUntil(observableFromEvent(_this.host, 'mouseleave')), repeat(), takeUntil(_this.destroyed$)); _this.hide$ = observableFromEvent(_this.host, 'mouseleave') .pipe(switchMap(function () { return observableFromEvent(_this.document, 'mousemove') .pipe(debounceTime(100), takeWhile(function () { return !!_this.container(); }), filter(function (event) { return _this.isNotOnHostOrContainer(event); })); }), takeUntil(_this.destroyed$)); return _this; } return NbHoverTriggerStrategy; }(NbTriggerStrategyBase)); export { NbHoverTriggerStrategy }; /** * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element. * */ var NbHintTriggerStrategy = /** @class */ (function (_super) { __extends(NbHintTriggerStrategy, _super); function NbHintTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.show$ = observableFromEvent(_this.host, 'mouseenter') .pipe( // this `delay & takeUntil & repeat` operators combination is a synonym for `conditional debounce` // meaning that if one event occurs in some time after the initial one we won't react to it delay(100), // tslint:disable-next-line:rxjs-no-unsafe-takeuntil takeUntil(observableFromEvent(_this.host, 'mouseleave')), repeat(), takeUntil(_this.destroyed$)); _this.hide$ = observableFromEvent(_this.host, 'mouseleave') .pipe(takeUntil(_this.destroyed$)); return _this; } return NbHintTriggerStrategy; }(NbTriggerStrategyBase)); export { NbHintTriggerStrategy }; /** * Creates show and hide event streams. * Fires open event when a focus is on the host element and stay over at least 100 milliseconds. * Fires close event when the focus leaves the host element. * */ var NbFocusTriggerStrategy = /** @class */ (function (_super) { __extends(NbFocusTriggerStrategy, _super); function NbFocusTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.focusOut$ = observableFromEvent(_this.host, 'focusout') .pipe(switchMap(function () { return observableFromEvent(_this.document, 'focusin') .pipe(takeWhile(function () { return !!_this.container(); }), filter(function (event) { return _this.isNotOnHostOrContainer(event); })); }), takeUntil(_this.destroyed$)); _this.clickIn$ = observableFromEvent(_this.host, 'click') .pipe(filter(function () { return !_this.container(); }), takeUntil(_this.destroyed$)); _this.clickOut$ = observableFromEvent(_this.document, 'click') .pipe(filter(function () { return !!_this.container(); }), filter(function (event) { return _this.isNotOnHostOrContainer(event); }), takeUntil(_this.destroyed$)); _this.tabKeyPress$ = observableFromEvent(_this.document, 'keydown') .pipe(filter(function (event) { return event.keyCode === 9; }), filter(function () { return !!_this.container(); }), takeUntil(_this.destroyed$)); _this.show$ = observableMerge(observableFromEvent(_this.host, 'focusin'), _this.clickIn$) .pipe(filter(function () { return !_this.container(); }), debounceTime(100), // tslint:disable-next-line:rxjs-no-unsafe-takeuntil takeUntil(observableFromEvent(_this.host, 'focusout')), repeat(), takeUntil(_this.destroyed$)); _this.hide$ = observableMerge(_this.focusOut$, _this.tabKeyPress$, _this.clickOut$) .pipe(takeUntil(_this.destroyed$)); return _this; } return NbFocusTriggerStrategy; }(NbTriggerStrategyBase)); export { NbFocusTriggerStrategy }; /** * Creates empty show and hide event streams. * */ var NbNoopTriggerStrategy = /** @class */ (function (_super) { __extends(NbNoopTriggerStrategy, _super); function NbNoopTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.show$ = EMPTY; _this.hide$ = EMPTY; return _this; } return NbNoopTriggerStrategy; }(NbTriggerStrategyBase)); export { NbNoopTriggerStrategy }; var NbTriggerStrategyBuilderService = /** @class */ (function () { function NbTriggerStrategyBuilderService(_document) { this._document = _document; } NbTriggerStrategyBuilderService.prototype.trigger = function (trigger) { this._trigger = trigger; return this; }; NbTriggerStrategyBuilderService.prototype.host = function (host) { this._host = host; return this; }; NbTriggerStrategyBuilderService.prototype.container = function (container) { this._container = container; return this; }; NbTriggerStrategyBuilderService.prototype.build = function () { switch (this._trigger) { case NbTrigger.CLICK: return new NbClickTriggerStrategy(this._document, this._host, this._container); case NbTrigger.HINT: return new NbHintTriggerStrategy(this._document, this._host, this._container); case NbTrigger.HOVER: return new NbHoverTriggerStrategy(this._document, this._host, this._container); case NbTrigger.FOCUS: return new NbFocusTriggerStrategy(this._document, this._host, this._container); case NbTrigger.NOOP: return new NbNoopTriggerStrategy(this._document, this._host, this._container); default: throw new Error('Trigger have to be provided'); } }; NbTriggerStrategyBuilderService = __decorate([ Injectable(), __param(0, Inject(NB_DOCUMENT)), __metadata("design:paramtypes", [Object]) ], NbTriggerStrategyBuilderService); return NbTriggerStrategyBuilderService; }()); export { NbTriggerStrategyBuilderService }; //# sourceMappingURL=overlay-trigger.js.map