UNPKG

@nova-ui/dashboards

Version:

Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and

154 lines 7.46 kB
"use strict"; // © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. Object.defineProperty(exports, "__esModule", { value: true }); exports.ConfiguratorService = void 0; const tslib_1 = require("tslib"); const core_1 = require("@angular/core"); const router_1 = require("@angular/router"); const cloneDeep_1 = tslib_1.__importDefault(require("lodash/cloneDeep")); const isFunction_1 = tslib_1.__importDefault(require("lodash/isFunction")); const rxjs_1 = require("rxjs"); const operators_1 = require("rxjs/operators"); const bits_1 = require("@nova-ui/bits"); const widget_types_service_1 = require("../../services/widget-types.service"); const configurator_component_1 = require("../components/configurator/configurator.component"); let ConfiguratorService = class ConfiguratorService { constructor(componentFactoryResolver, widgetTypesService, injector, appRef, logger, rendererFactory, router) { this.componentFactoryResolver = componentFactoryResolver; this.widgetTypesService = widgetTypesService; this.injector = injector; this.appRef = appRef; this.logger = logger; this.router = router; this.close$ = new rxjs_1.Subject(); this.handleSubmit = (confSource, trySubmit) => (source) => source.pipe(this.trySubmit(trySubmit, confSource), this.updateDashboard(confSource.dashboardComponent)); this.trySubmit = (trySubmit, confSource) => (source) => source.pipe( // eslint-disable-next-line import/no-deprecated (0, operators_1.switchMap)((widget) => { if (widget && (0, isFunction_1.default)(trySubmit)) { return trySubmit(widget, confSource).pipe((0, operators_1.catchError)((err) => { this.logger.error(err); this.componentRef.instance.handleSubmitError(); return rxjs_1.EMPTY; })); } else { return (0, rxjs_1.of)(widget); } })); this.updateDashboard = (dashboardComponent) => (source) => new rxjs_1.Observable((observer) => source.subscribe((widget) => { if (widget) { widget.id = widget.id || (0, bits_1.uuid)(); let widgetToSet; const dashboardWidget = dashboardComponent.dashboard.widgets[widget.id]; if (dashboardWidget) { widgetToSet = { ...widget, pizzagna: { ...this.widgetTypesService.getWidgetType(widget.type, widget.version).widget, configuration: widget.pizzagna.configuration, }, }; } else { widgetToSet = widget; } // first we remove the widget so that we can recreate it from scratch dashboardComponent.removeWidget(widgetToSet.id, false /* this is set to preserve the widget location */); // then we wait for the removal to take effect and we create the widget again setTimeout(() => { dashboardComponent.updateWidget(widgetToSet); }); } this.close(); observer.next(); })); this.renderer = rendererFactory.createRenderer(null, null); } open(configurator) { const source = { dashboardComponent: configurator.dashboardComponent, previewPizzagnaComponent: configurator.previewPizzagnaComponent, widget: (0, cloneDeep_1.default)(configurator.widget), }; this.componentRef = this.appendComponentToBody(); const component = this.componentRef.instance; // TODO: Handle the case when portalBundle is undefined // @ts-ignore component.formPortal = configurator.portalBundle.portal; // TODO: Handle the case when widget is undefined // @ts-ignore component.previewWidget = (0, cloneDeep_1.default)(configurator.widget); if (configurator.portalBundle?.attached) { component.formPortalAttached .pipe((0, operators_1.takeUntil)(this.close$)) .subscribe((e) => { if (configurator?.portalBundle?.attached) { configurator?.portalBundle?.attached(e); } }); } component.changeDetector.detectChanges(); return (component.result .asObservable() // TODO: Handle the case when trySubmit is undefined // @ts-ignore .pipe(this.handleSubmit(source, configurator.trySubmit))); } close() { if (!this.renderer) { return; } this.close$.next(); this.renderer.removeChild(document.body, this.componentRef.hostView .rootNodes[0]); this.appRef.detachView(this.componentRef.hostView); this.componentRef.destroy(); this.renderer.removeStyle(document.body, "overflow"); } appendComponentToBody() { const factory = this.componentFactoryResolver.resolveComponentFactory(configurator_component_1.ConfiguratorComponent); const componentRef = factory.create(this.injector); this.appRef.attachView(componentRef.hostView); this.renderer.appendChild(document.body, componentRef.hostView .rootNodes[0]); this.renderer.setStyle(document.body, "overflow", "hidden"); if (this.router) { this.router.events .pipe((0, operators_1.filter)((event) => event instanceof router_1.NavigationEnd), (0, operators_1.takeUntil)(this.close$)) .subscribe(() => this.close()); } return componentRef; } }; exports.ConfiguratorService = ConfiguratorService; exports.ConfiguratorService = ConfiguratorService = tslib_1.__decorate([ (0, core_1.Injectable)(), tslib_1.__param(6, (0, core_1.Optional)()), tslib_1.__metadata("design:paramtypes", [core_1.ComponentFactoryResolver, widget_types_service_1.WidgetTypesService, core_1.Injector, core_1.ApplicationRef, bits_1.LoggerService, core_1.RendererFactory2, router_1.Router]) ], ConfiguratorService); //# sourceMappingURL=configurator.service.js.map