@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
JavaScript
"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