@ngx-performance-ui/ui
Version:
Ngx Performance UI - UI
232 lines • 18.9 kB
JavaScript
/**
* @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