@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
141 lines • 6.48 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.DataSourceAdapter = void 0;
const tslib_1 = require("tslib");
const core_1 = require("@angular/core");
const isUndefined_1 = tslib_1.__importDefault(require("lodash/isUndefined"));
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const bits_1 = require("@nova-ui/bits");
const types_1 = require("../../configurator/types");
const pizzagna_service_1 = require("../../pizzagna/services/pizzagna.service");
const types_2 = require("../../services/types");
const types_3 = require("../../types");
let DataSourceAdapter = class DataSourceAdapter {
constructor(eventBus, dataSource, pizzagnaService) {
this.eventBus = eventBus;
this.dataSource = dataSource;
this.pizzagnaService = pizzagnaService;
this.destroy$ = new rxjs_1.Subject();
if (!this.dataSource) {
return;
}
this.setupRefreshListener();
this.dataSource.outputsSubject
.pipe((0, operators_1.takeUntil)(this.destroy$))
.subscribe((event) => this.handleDataSourceUpdate(event));
if (this.dataSource.busy) {
this.dataSource.busy
.pipe((0, operators_1.takeUntil)(this.destroy$))
.subscribe((busy) => {
this.eventBus.getStream(types_2.DATA_SOURCE_BUSY).next({
payload: {
componentId: this.componentId,
busy,
},
});
});
}
}
setupRefreshListener() {
this.eventBus
.getStream(types_2.REFRESH)
.pipe((0, operators_1.takeUntil)(this.destroy$))
.subscribe(() => this.handleRefresh());
}
handleRefresh() {
this.eventBus.getStream(types_2.DATA_SOURCE_INVOKED).next({});
this.dataSource.applyFilters();
}
handleDataSourceUpdate(value) {
this.lastValue = (0, isUndefined_1.default)(value?.result) ? value : value?.result;
this.updateOutput(this.lastValue);
this.eventBus
.getStream(types_1.DATA_SOURCE_OUTPUT)
.next({ payload: { componentId: this.componentId, ...value } });
}
ngOnDestroy() {
this.updateOutput(undefined);
const destroyedEvent = {
payload: { componentId: this.componentId },
};
this.eventBus.getStream(types_1.DATA_SOURCE_DESTROYED).next(destroyedEvent);
const busyEvent = {
payload: { componentId: this.componentId, busy: false },
};
this.eventBus.getStream(types_2.DATA_SOURCE_BUSY).next(busyEvent);
this.destroy$.next();
this.destroy$.complete();
}
updateConfiguration(properties) {
if (properties.componentId) {
this.componentId = properties.componentId;
}
this.updateAdapterProperties(properties);
this.updateDataSourceProperties(properties);
if (typeof this.lastValue !== "undefined") {
this.updateOutput(this.lastValue);
}
}
updateAdapterProperties(properties) {
this.propertyPath = properties.propertyPath;
}
updateDataSourceProperties(properties) {
const dataSourceConfiguration = properties?.dataSource?.properties;
if (this.dataSourceConfiguration !== dataSourceConfiguration) {
this.dataSourceConfiguration = dataSourceConfiguration;
const configurableDataSource = this
.dataSource;
if (configurableDataSource?.updateConfiguration) {
configurableDataSource.updateConfiguration(properties.dataSource?.properties);
}
this.eventBus.getStream(types_2.REFRESH).next({});
}
// check if this is the first call of updateConfiguration and there is no dataSource configuration present in the incoming properties
// This results in two initial invocations of the data source, and we should eventually remove it. But, currently,
// widgets sometimes rely on it in order to display their initial data.
if (typeof this.dataSourceConfiguration === "undefined" &&
typeof dataSourceConfiguration === "undefined") {
// using a setTimeout here to give configurable data sources time to receive their configurations before they're invoked
setTimeout(() => this.eventBus.getStream(types_2.REFRESH).next({}));
}
}
updateOutput(value) {
this.pizzagnaService.setProperty({
pizzagnaKey: types_3.PizzagnaLayer.Data,
componentId: this.componentId,
propertyPath: [this.propertyPath],
}, this.processOutput(value));
}
processOutput(value) {
return value;
}
};
exports.DataSourceAdapter = DataSourceAdapter;
exports.DataSourceAdapter = DataSourceAdapter = tslib_1.__decorate([
(0, core_1.Injectable)(),
tslib_1.__param(0, (0, core_1.Inject)(types_3.PIZZAGNA_EVENT_BUS)),
tslib_1.__param(1, (0, core_1.Optional)()),
tslib_1.__param(1, (0, core_1.Inject)(types_3.DATA_SOURCE)),
tslib_1.__metadata("design:paramtypes", [bits_1.EventBus, Object, pizzagna_service_1.PizzagnaService])
], DataSourceAdapter);
//# sourceMappingURL=data-source-adapter.js.map