UNPKG

@ngx-performance-ui/ui

Version:
232 lines 18.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ApplicationRef, ComponentFactoryResolver, Directive, ElementRef, Input, ReflectiveInjector, Renderer2, ViewContainerRef, } from '@angular/core'; import { Actions, ofActionDispatched, Select, Store } from '@ngxs/store'; import { Observable, Subject } from 'rxjs'; import { filter } from 'rxjs/operators'; import { PopoverComponent } from '../components'; import { createProjectableNode } from '../utils'; import { EventListenerState, takeUntilDestroy, takeUntilNotNull, EventListenerRemove, EventListenerAdd, EventListenerScrollVertical, } from '@ngx-performance-ui/core'; export class PopoverDirective { /** * @param {?} actions * @param {?} appRef * @param {?} elRef * @param {?} renderer * @param {?} resolver * @param {?} store * @param {?} vcRef */ constructor(actions, appRef, elRef, renderer, resolver, store, vcRef) { this.actions = actions; this.appRef = appRef; this.elRef = elRef; this.renderer = renderer; this.resolver = resolver; this.store = store; this.vcRef = vcRef; this.context = {}; this.placement = 'top'; this.trigger = 'click'; this.destroy$ = new Subject(); } /** * @return {?} */ get containerRect() { return ((/** @type {?} */ (((/** @type {?} */ (this.popover.location.nativeElement))).childNodes[0]))).getBoundingClientRect(); } /** * @return {?} */ ngOnInit() { (this.trigger === 'mousemove' ? this.mousemove$ : this.click$) .pipe(takeUntilDestroy(this), filter((/** * @param {?} event * @return {?} */ event => !!event))) .subscribe((/** * @param {?} event * @return {?} */ event => { /** @type {?} */ let onMouseContainerOver = false; if (this.popover) { this.popover.hostView.detectChanges(); const { top, bottom, left, right } = this.containerRect; const { x, y } = event; onMouseContainerOver = top < y && bottom > y && left < x && right > x; } if (!this.popover && this.elRef.nativeElement.contains(event.target)) { this.show(); } else if (this.popover && !this.elRef.nativeElement.contains(event.target) && !onMouseContainerOver) { this.hide(); } })); } /** * @return {?} */ ngOnDestroy() { this.hide(); } /** * @return {?} */ show() { /** @type {?} */ const element = (/** @type {?} */ (this.elRef.nativeElement)); /** @type {?} */ const injector = ReflectiveInjector.resolveAndCreate([ { provide: 'POPOVER_PROVIDER', useValue: (/** @type {?} */ ({ element, placement: this.placement })) }, ]); /** @type {?} */ const hedaerNode = createProjectableNode.call(this, this.header); /** @type {?} */ const contentNode = createProjectableNode.call(this, this.content); this.popover = this.resolver.resolveComponentFactory(PopoverComponent).create(injector, [hedaerNode, contentNode]); this.appRef.attachView(this.popover.hostView); this.renderer.appendChild(this.renderer.selectRootElement('p-root', true), ((/** @type {?} */ (this.popover.hostView))).rootNodes[0]); this.subscribeTo(); } /** * @return {?} */ hide() { if (this.popover) { this.popover.destroy(); this.popover = null; } this.destroy$.next(); this.store.dispatch(new EventListenerRemove('resize')); } /** * @return {?} */ subscribeTo() { this.store.dispatch(new EventListenerAdd('resize')); this.resize$ .pipe(filter((/** * @param {?} event * @return {?} */ event => !!event)), takeUntilNotNull(this.destroy$)) .subscribe((/** * @param {?} _ * @return {?} */ _ => this.hide())); this.actions .pipe(ofActionDispatched(EventListenerScrollVertical), takeUntilNotNull(this.destroy$)) .subscribe((/** * @param {?} _ * @return {?} */ _ => this.hide())); } } PopoverDirective.decorators = [ { type: Directive, args: [{ selector: '[pPopover]', exportAs: 'pPopover', },] } ]; /** @nocollapse */ PopoverDirective.ctorParameters = () => [ { type: Actions }, { type: ApplicationRef }, { type: ElementRef }, { type: Renderer2 }, { type: ComponentFactoryResolver }, { type: Store }, { type: ViewContainerRef } ]; PopoverDirective.propDecorators = { content: [{ type: Input, args: ['pPopover',] }], context: [{ type: Input, args: ['pPopoverContext',] }], header: [{ type: Input, args: ['pPopoverHeader',] }], placement: [{ type: Input, args: ['pPopoverPlacement',] }], trigger: [{ type: Input, args: ['pPopoverTrigger',] }] }; tslib_1.__decorate([ Select(EventListenerState.getOne('mousemove')), tslib_1.__metadata("design:type", Observable) ], PopoverDirective.prototype, "mousemove$", void 0); tslib_1.__decorate([ Select(EventListenerState.getOne('click')), tslib_1.__metadata("design:type", Observable) ], PopoverDirective.prototype, "click$", void 0); tslib_1.__decorate([ Select(EventListenerState.getOne('resize')), tslib_1.__metadata("design:type", Observable) ], PopoverDirective.prototype, "resize$", void 0); if (false) { /** @type {?} */ PopoverDirective.prototype.content; /** @type {?} */ PopoverDirective.prototype.context; /** @type {?} */ PopoverDirective.prototype.header; /** @type {?} */ PopoverDirective.prototype.placement; /** @type {?} */ PopoverDirective.prototype.trigger; /** @type {?} */ PopoverDirective.prototype.mousemove$; /** @type {?} */ PopoverDirective.prototype.click$; /** @type {?} */ PopoverDirective.prototype.resize$; /** * @type {?} * @private */ PopoverDirective.prototype.popover; /** * @type {?} * @private */ PopoverDirective.prototype.destroy$; /** * @type {?} * @private */ PopoverDirective.prototype.actions; /** * @type {?} * @private */ PopoverDirective.prototype.appRef; /** * @type {?} * @private */ PopoverDirective.prototype.elRef; /** * @type {?} * @private */ PopoverDirective.prototype.renderer; /** * @type {?} * @private */ PopoverDirective.prototype.resolver; /** * @type {?} * @private */ PopoverDirective.prototype.store; /** * @type {?} * @private */ PopoverDirective.prototype.vcRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LXBlcmZvcm1hbmNlLXVpL3VpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsVUFBVSxFQUdWLEtBQUssRUFHTCxrQkFBa0IsRUFDbEIsU0FBUyxFQUdULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsMkJBQTJCLEdBQzVCLE1BQU0sMEJBQTBCLENBQUM7QUFNbEMsTUFBTSxPQUFPLGdCQUFnQjs7Ozs7Ozs7OztJQWlDM0IsWUFDVSxPQUFnQixFQUNoQixNQUFzQixFQUN0QixLQUFpQixFQUNqQixRQUFtQixFQUNuQixRQUFrQyxFQUNsQyxLQUFZLEVBQ1osS0FBdUI7UUFOdkIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7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ZixcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBDb21wb25lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZWZsZWN0aXZlSW5qZWN0b3IsXG4gIFJlbmRlcmVyMixcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9ucywgb2ZBY3Rpb25EaXNwYXRjaGVkLCBTZWxlY3QsIFN0b3JlIH0gZnJvbSAnQG5neHMvc3RvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBjcmVhdGVQcm9qZWN0YWJsZU5vZGUgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBFdmVudExpc3RlbmVyU3RhdGUsXG4gIHRha2VVbnRpbERlc3Ryb3ksXG4gIHRha2VVbnRpbE5vdE51bGwsXG4gIEV2ZW50TGlzdGVuZXJSZW1vdmUsXG4gIEV2ZW50TGlzdGVuZXJBZGQsXG4gIEV2ZW50TGlzdGVuZXJTY3JvbGxWZXJ0aWNhbCxcbn0gZnJvbSAnQG5neC1wZXJmb3JtYW5jZS11aS9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3BQb3BvdmVyXScsXG4gIGV4cG9ydEFzOiAncFBvcG92ZXInLFxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoJ3BQb3BvdmVyJylcbiAgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB8IFR5cGU8YW55PjtcblxuICBASW5wdXQoJ3BQb3BvdmVyQ29udGV4dCcpXG4gIGNvbnRleHQ6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgncFBvcG92ZXJIZWFkZXInKVxuICBoZWFkZXI6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4gfCBUeXBlPGFueT47XG5cbiAgQElucHV0KCdwUG9wb3ZlclBsYWNlbWVudCcpXG4gIHBsYWNlbWVudDogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgPSAndG9wJztcblxuICBASW5wdXQoJ3BQb3BvdmVyVHJpZ2dlcicpXG4gIHRyaWdnZXI6ICdtb3VzZW1vdmUnIHwgJ2NsaWNrJyA9ICdjbGljayc7XG5cbiAgQFNlbGVjdChFdmVudExpc3RlbmVyU3RhdGUuZ2V0T25lKCdtb3VzZW1vdmUnKSlcbiAgbW91c2Vtb3ZlJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcblxuICBAU2VsZWN0KEV2ZW50TGlzdGVuZXJTdGF0ZS5nZXRPbmUoJ2NsaWNrJykpXG4gIGNsaWNrJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50PjtcblxuICBAU2VsZWN0KEV2ZW50TGlzdGVuZXJTdGF0ZS5nZXRPbmUoJ3Jlc2l6ZScpKVxuICByZXNpemUkOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+O1xuXG4gIHByaXZhdGUgcG9wb3ZlcjogQ29tcG9uZW50UmVmPFBvcG92ZXJDb21wb25lbnQ+O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCBjb250YWluZXJSZWN0KCk6IENsaWVudFJlY3Qge1xuICAgIHJldHVybiAoKHRoaXMucG9wb3Zlci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aW9uczogQWN0aW9ucyxcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxuICAgIHByaXZhdGUgdmNSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAodGhpcy50cmlnZ2VyID09PSAnbW91c2Vtb3ZlJyA/IHRoaXMubW91c2Vtb3ZlJCA6IHRoaXMuY2xpY2skKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3kodGhpcyksXG4gICAgICAgIGZpbHRlcihldmVudCA9PiAhIWV2ZW50KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBsZXQgb25Nb3VzZUNvbnRhaW5lck92ZXIgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucG9wb3Zlcikge1xuICAgICAgICAgIHRoaXMucG9wb3Zlci5ob3N0Vmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IHRoaXMuY29udGFpbmVyUmVjdDtcbiAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGV2ZW50O1xuICAgICAgICAgIG9uTW91c2VDb250YWluZXJPdmVyID0gdG9wIDwgeSAmJiBib3R0b20gPiB5ICYmIGxlZnQgPCB4ICYmIHJpZ2h0ID4geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5wb3BvdmVyICYmIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3BvdmVyICYmICF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiAhb25Nb3VzZUNvbnRhaW5lck92ZXIpIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICAgIHsgcHJvdmlkZTogJ1BPUE9WRVJfUFJPVklERVInLCB1c2VWYWx1ZTogeyBlbGVtZW50LCBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50IH0gYXMgVG9vbHRpcC5Db25maWcgfSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGhlZGFlck5vZGUgPSBjcmVhdGVQcm9qZWN0YWJsZU5vZGUuY2FsbCh0aGlzLCB0aGlzLmhlYWRlcik7XG4gICAgY29uc3QgY29udGVudE5vZGUgPSBjcmVhdGVQcm9qZWN0YWJsZU5vZGUuY2FsbCh0aGlzLCB0aGlzLmNvbnRlbnQpO1xuXG4gICAgdGhpcy5wb3BvdmVyID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQb3BvdmVyQ29tcG9uZW50KS5jcmVhdGUoaW5qZWN0b3IsIFtoZWRhZXJOb2RlLCBjb250ZW50Tm9kZV0pO1xuXG4gICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyh0aGlzLnBvcG92ZXIuaG9zdFZpZXcpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICB0aGlzLnJlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KCdwLXJvb3QnLCB0cnVlKSxcbiAgICAgICh0aGlzLnBvcG92ZXIuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSxcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpYmVUbygpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnBvcG92ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5wb3BvdmVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgRXZlbnRMaXN0ZW5lclJlbW92ZSgncmVzaXplJykpO1xuICB9XG5cbiAgc3Vic2NyaWJlVG8oKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgRXZlbnRMaXN0ZW5lckFkZCgncmVzaXplJykpO1xuXG4gICAgdGhpcy5yZXNpemUkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+ICEhZXZlbnQpLFxuICAgICAgICB0YWtlVW50aWxOb3ROdWxsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShfID0+IHRoaXMuaGlkZSgpKTtcblxuICAgIHRoaXMuYWN0aW9uc1xuICAgICAgLnBpcGUoXG4gICAgICAgIG9mQWN0aW9uRGlzcGF0Y2hlZChFdmVudExpc3RlbmVyU2Nyb2xsVmVydGljYWwpLFxuICAgICAgICB0YWtlVW50aWxOb3ROdWxsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShfID0+IHRoaXMuaGlkZSgpKTtcbiAgfVxufVxuIl19