@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
105 lines • 14.6 kB
JavaScript
// © 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.
import { Inject, Injectable, NgZone } from "@angular/core";
import { Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import { EventBus } from "@nova-ui/bits";
import { RefresherSettingsService } from "./refresher-settings.service";
import { DEFAULT_REFRESH_INTERVAL } from "./types";
import { REFRESH } from "../../services/types";
import { PIZZAGNA_EVENT_BUS } from "../../types";
import * as i0 from "@angular/core";
import * as i1 from "./refresher-settings.service";
import * as i2 from "@nova-ui/bits";
/**
* This provider emits the REFRESH event every X milliseconds
*/
export class Refresher {
constructor(eventBus, ngZone, refresherSettings) {
this.eventBus = eventBus;
this.ngZone = ngZone;
this.refresherSettings = refresherSettings;
this.enabled = true;
this.overrideDefaultSettings = true;
this.interval = DEFAULT_REFRESH_INTERVAL;
this.eventDef = REFRESH;
this.destroy$ = new Subject();
this.refresherSettings.refreshRateSeconds$
.pipe(takeUntil(this.destroy$))
.subscribe((systemRefreshRate) => {
if (!this.overrideDefaultSettings) {
this.initializeInterval();
}
});
}
updateConfiguration(properties) {
this.interval = properties.interval ?? DEFAULT_REFRESH_INTERVAL;
this.enabled = properties.enabled ?? true;
this.overrideDefaultSettings =
properties.overrideDefaultSettings ?? true;
this.eventDef = properties.event ?? REFRESH;
this.initializeInterval();
}
ngOnDestroy() {
this.clearInterval();
this.destroy$.next();
this.destroy$.complete();
}
initializeInterval() {
this.clearInterval();
if (typeof this.interval === "undefined" ||
this.getInterval() <= 0 ||
this.enabled === false) {
return;
}
this.ngZone.runOutsideAngular(() => {
// running timeout outside of angular zone to prevent visual tests from timing out
this.intervalRef = setInterval(() => {
this.ngZone.run(() => {
// callback function should be executed in zone to preserve the angular change detection
this.performAction();
});
}, this.getInterval() * 1000);
});
}
performAction() {
this.eventBus.getStream(this.eventDef).next({});
}
getInterval() {
return this.overrideDefaultSettings
? this.interval
: this.refresherSettings.refreshRateSeconds;
}
clearInterval() {
if (typeof this.intervalRef !== "undefined") {
clearInterval(this.intervalRef);
this.intervalRef = undefined;
}
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Refresher, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: i0.NgZone }, { token: i1.RefresherSettingsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Refresher }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Refresher, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i2.EventBus, decorators: [{
type: Inject,
args: [PIZZAGNA_EVENT_BUS]
}] }, { type: i0.NgZone }, { type: i1.RefresherSettingsService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3ZpZGVycy9yZWZyZXNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGVBQWUsQ0FBQztBQUUxRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9DLE9BQU8sRUFBOEIsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7QUFVN0U7O0dBRUc7QUFFSCxNQUFNLE9BQU8sU0FBUztJQVVsQixZQUMwQyxRQUFnQyxFQUM1RCxNQUFjLEVBQ2QsaUJBQTJDO1FBRmYsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7UUFDNUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FB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b3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmltcG9ydCB7IEV2ZW50QnVzLCBFdmVudERlZmluaXRpb24gfSBmcm9tIFwiQG5vdmEtdWkvYml0c1wiO1xuXG5pbXBvcnQgeyBSZWZyZXNoZXJTZXR0aW5nc1NlcnZpY2UgfSBmcm9tIFwiLi9yZWZyZXNoZXItc2V0dGluZ3Muc2VydmljZVwiO1xuaW1wb3J0IHsgREVGQVVMVF9SRUZSRVNIX0lOVEVSVkFMIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFRlJFU0ggfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdHlwZXNcIjtcbmltcG9ydCB7IElXaWRnZXRFdmVudCB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy93aWRnZXQtdG8tZGFzaGJvYXJkLWV2ZW50LXByb3h5LnNlcnZpY2VcIjtcbmltcG9ydCB7IElDb25maWd1cmFibGUsIElQcm9wZXJ0aWVzLCBQSVpaQUdOQV9FVkVOVF9CVVMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaGVyUHJvcGVydGllcyBleHRlbmRzIElQcm9wZXJ0aWVzIHtcbiAgICAvLyByZWZyZXNoIGludGVydmFsIGluIHNlY29uZHNcbiAgICBpbnRlcnZhbD86IG51bWJlcjtcbiAgICBlbmFibGVkPzogYm9vbGVhbjtcbiAgICBvdmVycmlkZURlZmF1bHRTZXR0aW5ncz86IGJvb2xlYW47XG4gICAgZXZlbnREZWY/OiBFdmVudERlZmluaXRpb248YW55Pjtcbn1cblxuLyoqXG4gKiBUaGlzIHByb3ZpZGVyIGVtaXRzIHRoZSBSRUZSRVNIIGV2ZW50IGV2ZXJ5IFggbWlsbGlzZWNvbmRzXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZWZyZXNoZXIgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIElDb25maWd1cmFibGUge1xuICAgIHByaXZhdGUgaW50ZXJ2YWxSZWY/OiBudW1iZXI7XG5cbiAgICBwcm90ZWN0ZWQgZW5hYmxlZCA9IHRydWU7XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlRGVmYXVsdFNldHRpbmdzID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgaW50ZXJ2YWwgPSBERUZBVUxUX1JFRlJFU0hfSU5URVJWQUw7XG4gICAgcHJvdGVjdGVkIGV2ZW50RGVmID0gUkVGUkVTSDtcblxuICAgIHB1YmxpYyByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChQSVpaQUdOQV9FVkVOVF9CVVMpIHByb3RlY3RlZCBldmVudEJ1czogRXZlbnRCdXM8SVdpZGdldEV2ZW50PixcbiAgICAgICAgcHJvdGVjdGVkIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcm90ZWN0ZWQgcmVmcmVzaGVyU2V0dGluZ3M6IFJlZnJlc2hlclNldHRpbmdzU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnJlZnJlc2hlclNldHRpbmdzLnJlZnJlc2hSYXRlU2Vjb25kcyRcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHN5c3RlbVJlZnJlc2hSYXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm92ZXJyaWRlRGVmYXVsdFNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUNvbmZpZ3VyYXRpb24ocHJvcGVydGllczogSVJlZnJlc2hlclByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHByb3BlcnRpZXMuaW50ZXJ2YWwgPz8gREVGQVVMVF9SRUZSRVNIX0lOVEVSVkFMO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBwcm9wZXJ0aWVzLmVuYWJsZWQgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5vdmVycmlkZURlZmF1bHRTZXR0aW5ncyA9XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLm92ZXJyaWRlRGVmYXVsdFNldHRpbmdzID8/IHRydWU7XG4gICAgICAgIHRoaXMuZXZlbnREZWYgPSBwcm9wZXJ0aWVzLmV2ZW50ID8/IFJFRlJFU0g7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplSW50ZXJ2YWwoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUludGVydmFsKCkge1xuICAgICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5pbnRlcnZhbCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgdGhpcy5nZXRJbnRlcnZhbCgpIDw9IDAgfHxcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAvLyBydW5uaW5nIHRpbWVvdXQgb3V0c2lkZSBvZiBhbmd1bGFyIHpvbmUgdG8gcHJldmVudCB2aXN1YWwgdGVzdHMgZnJvbSB0aW1pbmcgb3V0XG4gICAgICAgICAgICB0aGlzLmludGVydmFsUmVmID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBpbiB6b25lIHRvIHByZXNlcnZlIHRoZSBhbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCB0aGlzLmdldEludGVydmFsKCkgKiAxMDAwKSBhcyBhbnk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwZXJmb3JtQWN0aW9uKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmdldFN0cmVhbSh0aGlzLmV2ZW50RGVmKS5uZXh0KHt9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEludGVydmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVycmlkZURlZmF1bHRTZXR0aW5nc1xuICAgICAgICAgICAgPyB0aGlzLmludGVydmFsXG4gICAgICAgICAgICA6IHRoaXMucmVmcmVzaGVyU2V0dGluZ3MucmVmcmVzaFJhdGVTZWNvbmRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJJbnRlcnZhbCgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmludGVydmFsUmVmICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxSZWYpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbFJlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==