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

120 lines 16.1 kB
// © 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 { ChangeDetectorRef, Component, HostBinding, Input, } from "@angular/core"; import toNumber from "lodash/toNumber"; import toString from "lodash/toString"; import { SI_UNITS_PREFIXES, SI_UNITS_PREFIXES_NEGATIVE, } from "../../../../constants/si-units-prefixes"; import * as i0 from "@angular/core"; export class SiUnitsFormatterComponent { static { this.lateLoadKey = "SiUnitsFormatterComponent"; } // e.g. setting "shiftPoint" to "1" makes "1000k" to be displayed instead of "1M" static { this.SHIFT_POINT_DEFAULT = 0; } constructor(changeDetector) { this.changeDetector = changeDetector; this.value = "0"; } ngOnChanges(changes) { if (changes.data) { const { value } = changes.data.currentValue; if (value) { this.processSiUnitsValue(toString(value)); } } } processSiUnitsValue(value) { const prefix = this.getTransformPrefix(toNumber(value)); this.value = this.getTransformedValue(value, prefix); this.modifier = prefix?.prefix; } getTransformedValue(value, prefix) { if (!prefix) { return value; } const transformed = prefix.power !== 1 ? +value * Math.pow(10, -prefix.power) : +value; const rounded = Math.round(transformed * 10) / 10; // round to 1 decimal return rounded.toString(); } getTransformPrefix(origin) { const value = Math.abs(origin); if (Number.isNaN(value)) { return undefined; } const shiftPoint = this.data?.shiftPoint || SiUnitsFormatterComponent.SHIFT_POINT_DEFAULT; if (value >= 1) { const rounded = Math.round(value); const roundedStr = rounded.toString(); const roundedLength = roundedStr.length; // iterate over prefixes from higher to lower const prefix = [...SI_UNITS_PREFIXES] .reverse() .find((pref) => roundedLength >= pref.power + 1 + shiftPoint); return prefix; } else { const modifier = getValueNegativeModifier(value); const prefix = [...SI_UNITS_PREFIXES_NEGATIVE] .reverse() .find((pref) => modifier <= Math.abs(pref.power) + 1 + shiftPoint); return prefix; } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiUnitsFormatterComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SiUnitsFormatterComponent, selector: "nui-dashboards-si-units-formatter", inputs: { data: "data", elementClass: "elementClass" }, host: { properties: { "class": "this.elementClass" } }, usesOnChanges: true, ngImport: i0, template: ` <ng-container> <div class="d-flex flex-nowrap"> <span>{{ value }}</span> <span> {{ modifier }}</span> </div> </ng-container> `, isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiUnitsFormatterComponent, decorators: [{ type: Component, args: [{ selector: "nui-dashboards-si-units-formatter", template: ` <ng-container> <div class="d-flex flex-nowrap"> <span>{{ value }}</span> <span> {{ modifier }}</span> </div> </ng-container> `, }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { data: [{ type: Input }], elementClass: [{ type: Input }, { type: HostBinding, args: ["class"] }] } }); function getValueNegativeModifier(value, prevModifier = 1) { const val = Math.abs(value); if (val >= 1) { return 1; } const newModifier = prevModifier + 1; return val * Math.pow(10, newModifier) > 1 ? newModifier : getValueNegativeModifier(val, newModifier); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ktdW5pdHMtZm9ybWF0dGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29uZmlndXJhdG9yL2NvbXBvbmVudHMvZm9ybWF0dGVycy9zaS11bml0cy1mb3JtYXR0ZXIvc2ktdW5pdHMtZm9ybWF0dGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsV0FBVyxFQUNYLEtBQUssR0FHUixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQztBQUV2QyxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLDBCQUEwQixHQUM3QixNQUFNLHlDQUF5QyxDQUFDOztBQWNqRCxNQUFNLE9BQU8seUJBQXlCO2FBQzNCLGdCQUFXLEdBQUcsMkJBQTJCLEFBQTlCLENBQStCO0lBQ2pELGlGQUFpRjthQUMxRSx3QkFBbUIsR0FBRyxDQUFDLEFBQUosQ0FBSztJQVcvQixZQUFtQixjQUFpQztRQUFqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFIN0MsVUFBSyxHQUFXLEdBQUcsQ0FBQztJQUc0QixDQUFDO0lBRWpELFdBQVcsQ0FBQyxPQUFzQjtRQUNyQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7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O3NCQUZsQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLE9BQU87O0FBeUV4QixTQUFTLHdCQUF3QixDQUM3QixLQUFhLEVBQ2IsZUFBdUIsQ0FBQztJQUV4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVCLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxDQUFDO0tBQ1o7SUFFRCxNQUFNLFdBQVcsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFDdEMsQ0FBQyxDQUFDLFdBQVc7UUFDYixDQUFDLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgdG9OdW1iZXIgZnJvbSBcImxvZGFzaC90b051bWJlclwiO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gXCJsb2Rhc2gvdG9TdHJpbmdcIjtcblxuaW1wb3J0IHtcbiAgICBJU2lVbml0c1ByZWZpeCxcbiAgICBTSV9VTklUU19QUkVGSVhFUyxcbiAgICBTSV9VTklUU19QUkVGSVhFU19ORUdBVElWRSxcbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvbnN0YW50cy9zaS11bml0cy1wcmVmaXhlc1wiO1xuaW1wb3J0IHsgSUZvcm1hdHRlckRhdGEgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLWRhc2hib2FyZHMtc2ktdW5pdHMtZm9ybWF0dGVyXCIsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB2YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgbW9kaWZpZXIgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgU2lVbml0c0Zvcm1hdHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJTaVVuaXRzRm9ybWF0dGVyQ29tcG9uZW50XCI7XG4gICAgLy8gZS5nLiBzZXR0aW5nIFwic2hpZnRQb2ludFwiIHRvIFwiMVwiIG1ha2VzIFwiMTAwMGtcIiB0byBiZSBkaXNwbGF5ZWQgaW5zdGVhZCBvZiBcIjFNXCJcbiAgICBzdGF0aWMgU0hJRlRfUE9JTlRfREVGQVVMVCA9IDA7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YTogSUZvcm1hdHRlckRhdGE7XG5cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gICAgcHVibGljIGVsZW1lbnRDbGFzczogc3RyaW5nO1xuXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgPSBcIjBcIjtcbiAgICBwdWJsaWMgbW9kaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5kYXRhKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSBjaGFuZ2VzLmRhdGEuY3VycmVudFZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTaVVuaXRzVmFsdWUodG9TdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2lVbml0c1ZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRUcmFuc2Zvcm1QcmVmaXgodG9OdW1iZXIodmFsdWUpKTtcblxuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFZhbHVlKHZhbHVlLCBwcmVmaXgpO1xuICAgICAgICB0aGlzLm1vZGlmaWVyID0gcHJlZml4Py5wcmVmaXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFRyYW5zZm9ybWVkVmFsdWUoXG4gICAgICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByZWZpeDogSVNpVW5pdHNQcmVmaXggfCB1bmRlZmluZWRcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXByZWZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPVxuICAgICAgICAgICAgcHJlZml4LnBvd2VyICE9PSAxID8gK3ZhbHVlICogTWF0aC5wb3coMTAsIC1wcmVmaXgucG93ZXIpIDogK3ZhbHVlO1xuICAgICAgICBjb25zdCByb3VuZGVkID0gTWF0aC5yb3VuZCh0cmFuc2Zvcm1lZCAqIDEwKSAvIDEwOyAvLyByb3VuZCB0byAxIGRlY2ltYWxcblxuICAgICAgICByZXR1cm4gcm91bmRlZC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1QcmVmaXgob3JpZ2luOiBudW1iZXIpOiBJU2lVbml0c1ByZWZpeCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gTWF0aC5hYnMob3JpZ2luKTtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNoaWZ0UG9pbnQgPVxuICAgICAgICAgICAgdGhpcy5kYXRhPy5zaGlmdFBvaW50IHx8XG4gICAgICAgICAgICBTaVVuaXRzRm9ybWF0dGVyQ29tcG9uZW50LlNISUZUX1BPSU5UX0RFRkFVTFQ7XG5cbiAgICAgICAgaWYgKHZhbHVlID49IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdW5kZWQgPSBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHJvdW5kZWRTdHIgPSByb3VuZGVkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByb3VuZGVkTGVuZ3RoID0gcm91bmRlZFN0ci5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBwcmVmaXhlcyBmcm9tIGhpZ2hlciB0byBsb3dlclxuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gWy4uLlNJX1VOSVRTX1BSRUZJWEVTXVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAuZmluZCgocHJlZikgPT4gcm91bmRlZExlbmd0aCA+PSBwcmVmLnBvd2VyICsgMSArIHNoaWZ0UG9pbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVyID0gZ2V0VmFsdWVOZWdhdGl2ZU1vZGlmaWVyKHZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IFsuLi5TSV9VTklUU19QUkVGSVhFU19ORUdBVElWRV1cbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChwcmVmKSA9PiBtb2RpZmllciA8PSBNYXRoLmFicyhwcmVmLnBvd2VyKSArIDEgKyBzaGlmdFBvaW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlTmVnYXRpdmVNb2RpZmllcihcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHByZXZNb2RpZmllcjogbnVtYmVyID0gMVxuKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWwgPSBNYXRoLmFicyh2YWx1ZSk7XG5cbiAgICBpZiAodmFsID49IDEpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TW9kaWZpZXIgPSBwcmV2TW9kaWZpZXIgKyAxO1xuXG4gICAgcmV0dXJuIHZhbCAqIE1hdGgucG93KDEwLCBuZXdNb2RpZmllcikgPiAxXG4gICAgICAgID8gbmV3TW9kaWZpZXJcbiAgICAgICAgOiBnZXRWYWx1ZU5lZ2F0aXZlTW9kaWZpZXIodmFsLCBuZXdNb2RpZmllcik7XG59XG4iXX0=