@c8y/ngx-components 1024.19.3 → 1024.19.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/c8y-ngx-components-ai-agents-html.mjs +0 -9
- package/fesm2022/c8y-ngx-components-ai-agents-html.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs +0 -4
- package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ai.mjs +10 -10
- package/fesm2022/c8y-ngx-components-ai.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +13 -9
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +2 -2
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +4 -3
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CG8k844T.mjs → c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs} +9 -5
- package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-1WsTSnO_.mjs.map +1 -0
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-CTXM7Dkc.mjs → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs} +2 -2
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-CTXM7Dkc.mjs.map → c8y-ngx-components-computed-asset-properties-fieldbus-item-status-config.component-C3KZGqlc.mjs.map} +1 -1
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-Da3QVvuf.mjs → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DOmwNU6m.mjs} +2 -2
- package/fesm2022/{c8y-ngx-components-computed-asset-properties-last-measurement-config.component-Da3QVvuf.mjs.map → c8y-ngx-components-computed-asset-properties-last-measurement-config.component-DOmwNU6m.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties.mjs +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +24 -5
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs +12 -5
- package/fesm2022/c8y-ngx-components-datapoint-library-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +41 -12
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +10 -6
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +39 -25
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +21 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +7 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +9 -5
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +6 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs +4 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-kpi.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +158 -23
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/types/c8y-ngx-components-ai-agents-html.d.ts.map +1 -1
- package/types/c8y-ngx-components-ai-agents-scada.d.ts.map +1 -1
- package/types/c8y-ngx-components-ai.d.ts +1 -1
- package/types/c8y-ngx-components-ai.d.ts.map +1 -1
- package/types/c8y-ngx-components-alarm-event-selector.d.ts.map +1 -1
- package/types/c8y-ngx-components-asset-properties.d.ts +0 -1
- package/types/c8y-ngx-components-asset-properties.d.ts.map +1 -1
- package/types/c8y-ngx-components-context-dashboard.d.ts +5 -0
- package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
- package/types/c8y-ngx-components-datapoint-library-list.d.ts.map +1 -1
- package/types/c8y-ngx-components-datapoint-selector.d.ts +13 -3
- package/types/c8y-ngx-components-datapoint-selector.d.ts.map +1 -1
- package/types/c8y-ngx-components-datapoints-export-selector.d.ts +2 -0
- package/types/c8y-ngx-components-datapoints-export-selector.d.ts.map +1 -1
- package/types/c8y-ngx-components-echart.d.ts +1 -0
- package/types/c8y-ngx-components-echart.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts +7 -0
- package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-datapoints-table.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-info-gauge.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-kpi.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-pie-chart.d.ts.map +1 -1
- package/types/c8y-ngx-components.d.ts +110 -4
- package/types/c8y-ngx-components.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-computed-asset-properties-c8y-ngx-components-computed-asset-properties-CG8k844T.mjs.map +0 -1
|
@@ -3,7 +3,7 @@ import { signal, inject, DestroyRef, Input, ChangeDetectionStrategy, Component,
|
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
4
|
import * as i1 from '@angular/forms';
|
|
5
5
|
import { Validators, NgForm, ControlContainer, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import { DashboardChildComponent, MeasurementRealtimeService, C8yTranslateDirective, IconDirective, LoadingComponent, EmptyStateComponent, DatePipe, C8yTranslatePipe, C8yValidators, FormGroupComponent, MessagesComponent, GuideDocsComponent, GuideHrefDirective } from '@c8y/ngx-components';
|
|
6
|
+
import { DashboardChildComponent, MeasurementRealtimeService, C8yTranslateDirective, IconDirective, LoadingComponent, EmptyStateComponent, DatapointUnitPipe, DatePipe, C8yTranslatePipe, C8yValidators, FormGroupComponent, MessagesComponent, GuideDocsComponent, GuideHrefDirective } from '@c8y/ngx-components';
|
|
7
7
|
import * as i2 from '@c8y/ngx-components/context-dashboard';
|
|
8
8
|
import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';
|
|
9
9
|
import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
|
|
@@ -230,12 +230,13 @@ class KpiWidgetViewComponent {
|
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: KpiWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
233
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: KpiWidgetViewComponent, isStandalone: true, selector: "c8y-kpi-widget-view", inputs: { config: "config" }, host: { classAttribute: "d-col fit-h" }, providers: [MeasurementRealtimeService], usesOnChanges: true, ngImport: i0, template: "@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && getDashboardChild()) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n@if (state$ | async; as lastState) {\n <div class=\"kpi-widget__container d-flex d-col flex-grow fit-w a-i-center j-c-center\">\n <div class=\"d-flex a-i-center j-c-center fit-w\">\n @if (config.icon && config.showIcon) {\n <div\n class=\"m-r-16 flex-no-shrink text-muted\"\n [ngClass]=\"lastState.colorClass\"\n >\n <i\n class=\"icon-32\"\n [c8yIcon]=\"config.icon\"\n ></i>\n </div>\n }\n <div class=\"text-truncate\">\n <span\n class=\"text-truncate text-medium\"\n [ngStyle]=\"{ 'font-size': (config.fontSize || '36') + 'px' }\"\n title=\"{{\n lastState.colorClass === 'text-danger'\n ? ('Within red range:' | translate)\n : lastState.colorClass === 'text-warning'\n ? ('Within yellow range:' | translate)\n : ''\n }} {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }} {{ lastState.unit
|
|
233
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: KpiWidgetViewComponent, isStandalone: true, selector: "c8y-kpi-widget-view", inputs: { config: "config" }, host: { classAttribute: "d-col fit-h" }, providers: [MeasurementRealtimeService], usesOnChanges: true, ngImport: i0, template: "@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && getDashboardChild()) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n@if (state$ | async; as lastState) {\n <div class=\"kpi-widget__container d-flex d-col flex-grow fit-w a-i-center j-c-center\">\n <div class=\"d-flex a-i-center j-c-center fit-w\">\n @if (config.icon && config.showIcon) {\n <div\n class=\"m-r-16 flex-no-shrink text-muted\"\n [ngClass]=\"lastState.colorClass\"\n >\n <i\n class=\"icon-32\"\n [c8yIcon]=\"config.icon\"\n ></i>\n </div>\n }\n <div class=\"text-truncate\">\n <span\n class=\"text-truncate text-medium\"\n [ngStyle]=\"{ 'font-size': (config.fontSize || '36') + 'px' }\"\n title=\"{{\n lastState.colorClass === 'text-danger'\n ? ('Within red range:' | translate)\n : lastState.colorClass === 'text-warning'\n ? ('Within yellow range:' | translate)\n : ''\n }} {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }} {{ lastState.unit | datapointUnit }}\"\n [ngClass]=\"lastState.colorClass\"\n >\n {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }}\n <small class=\"text-regular\">{{ lastState.unit | datapointUnit }}</small>\n </span>\n </div>\n @if (config?.showTrend && lastState.previousValue; as previousValue) {\n <div class=\"dot dot-info dot-30 m-l-16 flex-no-shrink\">\n <i\n class=\"icon-20\"\n c8yIcon=\"arrow-dotted-up\"\n [ngStyle]=\"{ transform: 'rotate(' + lastState.trend + ')' }\"\n [title]=\"\n ('Previous value' | translate) +\n ': ' +\n (previousValue.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')) +\n ' (' +\n (previousValue.date | c8yDate: 'medium') +\n ')'\n \"\n ></i>\n </div>\n }\n </div>\n <div class=\"d-flex d-col a-i-center\">\n @if (config?.showTimestamp) {\n <p class=\"icon-flex text-center text-muted small m-b-0\">\n <i c8yIcon=\"calendar\"></i>\n {{ lastState.latestMeasurement.date | c8yDate: 'medium' }}\n </p>\n }\n @if (isHistoryMode()) {\n <p class=\"text-center text-muted small m-b-0\">\n <span translate>Last measurement in selected time range</span>\n </p>\n }\n </div>\n </div>\n} @else {\n <div class=\"d-flex flex-grow fit-w j-c-center a-i-center\">\n @let noDataSubtitleLive = 'Waiting for measurements to be created.' | translate;\n @let noDataSubtitleHistory = 'No data available for the selected time period.' | translate;\n @if (noDataInitiallyInDB()) {\n <c8y-ui-empty-state\n [icon]=\"'line-chart'\"\n [title]=\"'No measurement to display.' | translate\"\n [subtitle]=\"isHistoryMode() ? noDataSubtitleHistory : noDataSubtitleLive\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n } @else {\n <c8y-loading></c8y-loading>\n }\n </div>\n}\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: GlobalContextConnectorComponent, selector: "c8y-global-context-connector", inputs: ["controls", "config", "isLoading", "dashboardChild", "linked", "propagateAutoRefresh", "emitRefresh"], outputs: ["configChange", "refresh", "linkedChange"] }, { kind: "component", type: LocalControlsComponent, selector: "c8y-local-controls", inputs: ["controls", "displayMode", "config", "isLoading", "disabled", "propagateAutoRefresh", "emitRefresh", "dashboardChild"], outputs: ["configChange", "refresh"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatapointUnitPipe, name: "datapointUnit" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
234
234
|
}
|
|
235
235
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: KpiWidgetViewComponent, decorators: [{
|
|
236
236
|
type: Component,
|
|
237
237
|
args: [{ selector: 'c8y-kpi-widget-view', standalone: true, imports: [
|
|
238
238
|
AsyncPipe,
|
|
239
|
+
DatapointUnitPipe,
|
|
239
240
|
DatePipe,
|
|
240
241
|
DecimalPipe,
|
|
241
242
|
NgClass,
|
|
@@ -247,7 +248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
|
|
|
247
248
|
EmptyStateComponent,
|
|
248
249
|
GlobalContextConnectorComponent,
|
|
249
250
|
LocalControlsComponent
|
|
250
|
-
], providers: [MeasurementRealtimeService], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'd-col fit-h' }, template: "@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && getDashboardChild()) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n@if (state$ | async; as lastState) {\n <div class=\"kpi-widget__container d-flex d-col flex-grow fit-w a-i-center j-c-center\">\n <div class=\"d-flex a-i-center j-c-center fit-w\">\n @if (config.icon && config.showIcon) {\n <div\n class=\"m-r-16 flex-no-shrink text-muted\"\n [ngClass]=\"lastState.colorClass\"\n >\n <i\n class=\"icon-32\"\n [c8yIcon]=\"config.icon\"\n ></i>\n </div>\n }\n <div class=\"text-truncate\">\n <span\n class=\"text-truncate text-medium\"\n [ngStyle]=\"{ 'font-size': (config.fontSize || '36') + 'px' }\"\n title=\"{{\n lastState.colorClass === 'text-danger'\n ? ('Within red range:' | translate)\n : lastState.colorClass === 'text-warning'\n ? ('Within yellow range:' | translate)\n : ''\n }} {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }} {{ lastState.unit
|
|
251
|
+
], providers: [MeasurementRealtimeService], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'd-col fit-h' }, template: "@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && getDashboardChild()) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n@if (state$ | async; as lastState) {\n <div class=\"kpi-widget__container d-flex d-col flex-grow fit-w a-i-center j-c-center\">\n <div class=\"d-flex a-i-center j-c-center fit-w\">\n @if (config.icon && config.showIcon) {\n <div\n class=\"m-r-16 flex-no-shrink text-muted\"\n [ngClass]=\"lastState.colorClass\"\n >\n <i\n class=\"icon-32\"\n [c8yIcon]=\"config.icon\"\n ></i>\n </div>\n }\n <div class=\"text-truncate\">\n <span\n class=\"text-truncate text-medium\"\n [ngStyle]=\"{ 'font-size': (config.fontSize || '36') + 'px' }\"\n title=\"{{\n lastState.colorClass === 'text-danger'\n ? ('Within red range:' | translate)\n : lastState.colorClass === 'text-warning'\n ? ('Within yellow range:' | translate)\n : ''\n }} {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }} {{ lastState.unit | datapointUnit }}\"\n [ngClass]=\"lastState.colorClass\"\n >\n {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }}\n <small class=\"text-regular\">{{ lastState.unit | datapointUnit }}</small>\n </span>\n </div>\n @if (config?.showTrend && lastState.previousValue; as previousValue) {\n <div class=\"dot dot-info dot-30 m-l-16 flex-no-shrink\">\n <i\n class=\"icon-20\"\n c8yIcon=\"arrow-dotted-up\"\n [ngStyle]=\"{ transform: 'rotate(' + lastState.trend + ')' }\"\n [title]=\"\n ('Previous value' | translate) +\n ': ' +\n (previousValue.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')) +\n ' (' +\n (previousValue.date | c8yDate: 'medium') +\n ')'\n \"\n ></i>\n </div>\n }\n </div>\n <div class=\"d-flex d-col a-i-center\">\n @if (config?.showTimestamp) {\n <p class=\"icon-flex text-center text-muted small m-b-0\">\n <i c8yIcon=\"calendar\"></i>\n {{ lastState.latestMeasurement.date | c8yDate: 'medium' }}\n </p>\n }\n @if (isHistoryMode()) {\n <p class=\"text-center text-muted small m-b-0\">\n <span translate>Last measurement in selected time range</span>\n </p>\n }\n </div>\n </div>\n} @else {\n <div class=\"d-flex flex-grow fit-w j-c-center a-i-center\">\n @let noDataSubtitleLive = 'Waiting for measurements to be created.' | translate;\n @let noDataSubtitleHistory = 'No data available for the selected time period.' | translate;\n @if (noDataInitiallyInDB()) {\n <c8y-ui-empty-state\n [icon]=\"'line-chart'\"\n [title]=\"'No measurement to display.' | translate\"\n [subtitle]=\"isHistoryMode() ? noDataSubtitleHistory : noDataSubtitleLive\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n } @else {\n <c8y-loading></c8y-loading>\n }\n </div>\n}\n" }]
|
|
251
252
|
}], propDecorators: { config: [{
|
|
252
253
|
type: Input
|
|
253
254
|
}] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-kpi.mjs","sources":["../../widgets/implementations/kpi/kpi-widget.model.ts","../../widgets/implementations/kpi/kpi-widget-view/kpi-widget-view.component.ts","../../widgets/implementations/kpi/kpi-widget-view/kpi-widget-view.component.html","../../widgets/implementations/kpi/kpi-widget-config/kpi-widget-config.component.ts","../../widgets/implementations/kpi/kpi-widget-config/kpi-widget-config.component.html","../../widgets/implementations/kpi/c8y-ngx-components-widgets-implementations-kpi.ts"],"sourcesContent":["import { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\nimport type { GlobalContextState } from '@c8y/ngx-components/global-context';\n\nexport interface KpiWidgetConfig extends Partial<GlobalContextState> {\n datapoints: KPIDetails[];\n icon?: SupportedIconsSuggestions | null;\n showTimestamp?: boolean | null;\n showTrend?: boolean | null;\n showIcon?: boolean | null;\n numberOfDecimalPlaces?: number | null;\n fontSize?: number | null;\n}\n\nexport interface MeasurementValue {\n unit?: string;\n value: number;\n date: string;\n}\n\nexport enum ColorClass {\n danger = 'text-danger',\n warning = 'text-warning',\n unknown = ''\n}\n\nexport type KpiState = {\n latestMeasurement: MeasurementValue;\n previousValue: MeasurementValue | undefined;\n trend: string;\n unit: string;\n colorClass: ColorClass;\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n OnChanges,\n OnInit,\n signal,\n SimpleChanges\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IMeasurement } from '@c8y/client';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n DashboardChildComponent,\n DatePipe,\n EmptyStateComponent,\n IconDirective,\n LoadingComponent,\n MeasurementRealtimeService\n} from '@c8y/ngx-components';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DisplayMode,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextConnectorComponent,\n GlobalContextState,\n LocalControlsComponent,\n PRESET_NAME,\n PresetName,\n REFRESH_OPTION,\n WidgetConfigMigrationService\n} from '@c8y/ngx-components/global-context';\nimport { isEqual, merge as mergeObj } from 'lodash-es';\nimport { BehaviorSubject, combineLatest, merge as merge$, NEVER, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n pairwise,\n share,\n startWith,\n switchMap,\n tap\n} from 'rxjs/operators';\nimport { ColorClass, KpiState, KpiWidgetConfig, MeasurementValue } from '../kpi-widget.model';\nimport { AsyncPipe, DecimalPipe, NgClass, NgStyle } from '@angular/common';\n\n@Component({\n selector: 'c8y-kpi-widget-view',\n templateUrl: './kpi-widget-view.component.html',\n standalone: true,\n imports: [\n AsyncPipe,\n DatePipe,\n DecimalPipe,\n NgClass,\n NgStyle,\n C8yTranslatePipe,\n C8yTranslateDirective,\n IconDirective,\n LoadingComponent,\n EmptyStateComponent,\n GlobalContextConnectorComponent,\n LocalControlsComponent\n ],\n providers: [MeasurementRealtimeService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'd-col fit-h' }\n})\nexport class KpiWidgetViewComponent implements OnChanges, OnInit {\n @Input() config: KpiWidgetConfig = { datapoints: [] };\n\n displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n contextConfig = signal<GlobalContextState>({});\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n widgetControls = signal<PresetName>(PRESET_NAME.KPI);\n isHistoryMode = signal(false);\n\n state$: Observable<KpiState | null> = NEVER;\n noDataInitiallyInDB = signal(false);\n\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n\n private dashboardChild = inject(DashboardChildComponent, { optional: true });\n private dashboard = inject(ContextDashboardComponent, { optional: true });\n private measurementRealtime = inject(MeasurementRealtimeService);\n private widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n private destroyRef = inject(DestroyRef);\n\n private context$ = new BehaviorSubject<GlobalContextState | null>(null);\n private refresh$ = new Subject<void>();\n private lastDatapoint: KPIDetails | null = null;\n\n ngOnInit(): void {\n this.config = mergeObj(\n this.config,\n this.widgetConfigMigrationService.migrateWidgetConfig(this.config)\n );\n\n this.syncDisplayState();\n this.buildStatePipeline();\n\n if (!this.isDashboardMode()) {\n this.emitContext(this.config);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const cfg = changes.config?.currentValue as KpiWidgetConfig;\n if (!cfg) {\n return;\n }\n this.config = cfg;\n this.syncDisplayState();\n\n if (this.isOnRealDashboard()) {\n return;\n }\n if (this.isDashboardPreviewWaitingForContext()) {\n return;\n }\n this.emitContext(this.config, this.hasDatapointChanged());\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n this.contextConfig.set(event.context);\n this.emitContext(event.context);\n }\n\n onRefresh(): void {\n this.refresh$.next();\n }\n\n getDashboardChild(): DashboardChildComponent {\n return this.dashboardChild;\n }\n\n setupObservable(datapoint: KPIDetails, context: GlobalContextState): Observable<KpiState> {\n const isHistory = context.refreshOption === REFRESH_OPTION.HISTORY;\n const isPaused = !isHistory && context.isAutoRefreshEnabled === false;\n this.isHistoryMode.set(isHistory);\n this.noDataInitiallyInDB.set(false);\n\n let source$: Observable<MeasurementValue>;\n if (isPaused) {\n source$ = this.getHistoryMeasurement$(datapoint, {});\n } else if (isHistory) {\n source$ = this.getHistoryMeasurement$(datapoint, context);\n } else {\n source$ = this.getLiveMeasurement$(datapoint);\n }\n\n const shared$ = source$.pipe(share());\n const lastTwo$ = shared$.pipe(pairwise());\n\n return combineLatest([\n shared$,\n lastTwo$.pipe(\n map(([prev]) => prev),\n startWith(undefined as MeasurementValue | undefined)\n ),\n this.getTrend$(lastTwo$),\n shared$.pipe(\n map(m => datapoint.unit || m.unit || ''),\n startWith(''),\n distinctUntilChanged()\n ),\n this.getColorClass$(shared$, datapoint)\n ]).pipe(\n map(([latestMeasurement, previousValue, trend, unit, colorClass]) => ({\n latestMeasurement,\n previousValue,\n trend,\n unit,\n colorClass\n }))\n );\n }\n\n private buildStatePipeline(): void {\n const readState = () => ({ ctx: this.context$.value, dp: this.findActiveDatapoint() });\n\n this.state$ = merge$(\n this.context$.pipe(map(readState), distinctUntilChanged(isEqual)),\n this.refresh$.pipe(map(readState))\n ).pipe(\n filter((s): s is { ctx: GlobalContextState; dp: KPIDetails } => !!s.ctx && !!s.dp),\n switchMap(({ ctx, dp }) => {\n this.assignContextFromContextDashboard(dp);\n return this.setupObservable(dp, ctx).pipe(startWith(null as KpiState | null));\n }),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n private syncDisplayState(): void {\n const newMode = this.resolveDisplayMode();\n if (this.displayMode() !== newMode) {\n this.displayMode.set(newMode);\n }\n\n const newCtx = this.extractContext(this.config);\n if (!isEqual(this.contextConfig(), newCtx)) {\n this.contextConfig.set(newCtx);\n }\n }\n\n private emitContext(source: Partial<GlobalContextState>, force = false): void {\n const ctx = this.extractContext(source);\n if (force || !isEqual(this.context$.value, ctx)) {\n this.context$.next(ctx);\n }\n }\n\n private isDashboardMode(): boolean {\n return this.resolveDisplayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n\n private isOnRealDashboard(): boolean {\n return this.isDashboardMode() && !!this.dashboardChild;\n }\n\n private isDashboardPreviewWaitingForContext(): boolean {\n return this.isDashboardMode() && !this.config.isGlobalContextReady;\n }\n\n private resolveDisplayMode(): DisplayMode {\n return (this.config?.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG) as DisplayMode;\n }\n\n private extractContext(source: Partial<GlobalContextState>): GlobalContextState {\n return {\n dateTimeContext: source.dateTimeContext,\n isAutoRefreshEnabled: source.isAutoRefreshEnabled,\n refreshInterval: source.refreshInterval,\n refreshOption: source.refreshOption\n };\n }\n\n private findActiveDatapoint(): KPIDetails | undefined {\n return this.config?.datapoints?.find(dp => dp?.__active);\n }\n\n private hasDatapointChanged(): boolean {\n const dp = this.findActiveDatapoint();\n if (!dp) {\n return false;\n }\n const prev = this.lastDatapoint;\n this.lastDatapoint = dp;\n return (\n !prev ||\n dp.fragment !== prev.fragment ||\n dp.series !== prev.series ||\n dp.__target?.id !== prev.__target?.id ||\n dp.unit !== prev.unit ||\n dp.redRangeMin !== prev.redRangeMin ||\n dp.redRangeMax !== prev.redRangeMax ||\n dp.yellowRangeMin !== prev.yellowRangeMin ||\n dp.yellowRangeMax !== prev.yellowRangeMax\n );\n }\n\n private getLiveMeasurement$(datapoint: KPIDetails): Observable<MeasurementValue> {\n return this.measurementRealtime\n .latestValueOfSpecificMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n this.config.showTrend ? 2 : 1,\n true\n )\n .pipe(\n tap(m => {\n if (!m) this.noDataInitiallyInDB.set(true);\n }),\n filter(m => !!m),\n map(m => this.toMeasurementValue(m, datapoint))\n );\n }\n\n private getHistoryMeasurement$(\n datapoint: KPIDetails,\n context: GlobalContextState\n ): Observable<MeasurementValue> {\n return this.measurementRealtime\n .lastMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n 1,\n true,\n context.dateTimeContext?.dateFrom,\n context.dateTimeContext?.dateTo\n )\n .pipe(\n tap(m => {\n if (!m) this.noDataInitiallyInDB.set(true);\n }),\n filter(m => !!m),\n map(m => this.toMeasurementValue(m, datapoint))\n );\n }\n\n private toMeasurementValue(m: IMeasurement, dp: KPIDetails): MeasurementValue {\n return {\n unit: m[dp.fragment][dp.series].unit,\n value: m[dp.fragment][dp.series].value,\n date: m.time as string\n };\n }\n\n private getColorClass$(\n measurement$: Observable<MeasurementValue>,\n datapoint: KPIDetails\n ): Observable<ColorClass> {\n return measurement$.pipe(\n map(m => {\n if (this.inRange(datapoint, m.value, 'redRangeMin', 'redRangeMax')) {\n return ColorClass.danger;\n }\n if (this.inRange(datapoint, m.value, 'yellowRangeMin', 'yellowRangeMax')) {\n return ColorClass.warning;\n }\n return ColorClass.unknown;\n }),\n startWith(ColorClass.unknown),\n distinctUntilChanged()\n );\n }\n\n private getTrend$(lastTwo$: Observable<MeasurementValue[]>): Observable<string> {\n return lastTwo$.pipe(\n map(([prev, curr]) => {\n if (prev.value < curr.value) return '45deg';\n if (prev.value > curr.value) return '135deg';\n return '90deg';\n }),\n startWith('90deg'),\n distinctUntilChanged()\n );\n }\n\n private inRange(dp: KPIDetails, value: number, minKey: string, maxKey: string): boolean {\n return (\n typeof dp[minKey] === 'number' &&\n typeof dp[maxKey] === 'number' &&\n value >= dp[minKey] &&\n value < dp[maxKey]\n );\n }\n\n private assignContextFromContextDashboard(datapoint: KPIDetails): void {\n if (!this.dashboard?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.dashboard?.context;\n if (context?.id) {\n datapoint.__target = { name: context.name, id: context.id };\n }\n }\n}\n","@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && getDashboardChild()) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n@if (state$ | async; as lastState) {\n <div class=\"kpi-widget__container d-flex d-col flex-grow fit-w a-i-center j-c-center\">\n <div class=\"d-flex a-i-center j-c-center fit-w\">\n @if (config.icon && config.showIcon) {\n <div\n class=\"m-r-16 flex-no-shrink text-muted\"\n [ngClass]=\"lastState.colorClass\"\n >\n <i\n class=\"icon-32\"\n [c8yIcon]=\"config.icon\"\n ></i>\n </div>\n }\n <div class=\"text-truncate\">\n <span\n class=\"text-truncate text-medium\"\n [ngStyle]=\"{ 'font-size': (config.fontSize || '36') + 'px' }\"\n title=\"{{\n lastState.colorClass === 'text-danger'\n ? ('Within red range:' | translate)\n : lastState.colorClass === 'text-warning'\n ? ('Within yellow range:' | translate)\n : ''\n }} {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }} {{ lastState.unit || '' }}\"\n [ngClass]=\"lastState.colorClass\"\n >\n {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }}\n <small class=\"text-regular\">{{ lastState.unit || '' }}</small>\n </span>\n </div>\n @if (config?.showTrend && lastState.previousValue; as previousValue) {\n <div class=\"dot dot-info dot-30 m-l-16 flex-no-shrink\">\n <i\n class=\"icon-20\"\n c8yIcon=\"arrow-dotted-up\"\n [ngStyle]=\"{ transform: 'rotate(' + lastState.trend + ')' }\"\n [title]=\"\n ('Previous value' | translate) +\n ': ' +\n (previousValue.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')) +\n ' (' +\n (previousValue.date | c8yDate: 'medium') +\n ')'\n \"\n ></i>\n </div>\n }\n </div>\n <div class=\"d-flex d-col a-i-center\">\n @if (config?.showTimestamp) {\n <p class=\"icon-flex text-center text-muted small m-b-0\">\n <i c8yIcon=\"calendar\"></i>\n {{ lastState.latestMeasurement.date | c8yDate: 'medium' }}\n </p>\n }\n @if (isHistoryMode()) {\n <p class=\"text-center text-muted small m-b-0\">\n <span translate>Last measurement in selected time range</span>\n </p>\n }\n </div>\n </div>\n} @else {\n <div class=\"d-flex flex-grow fit-w j-c-center a-i-center\">\n @let noDataSubtitleLive = 'Waiting for measurements to be created.' | translate;\n @let noDataSubtitleHistory = 'No data available for the selected time period.' | translate;\n @if (noDataInitiallyInDB()) {\n <c8y-ui-empty-state\n [icon]=\"'line-chart'\"\n [title]=\"'No measurement to display.' | translate\"\n [subtitle]=\"isHistoryMode() ? noDataSubtitleHistory : noDataSubtitleLive\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n } @else {\n <c8y-loading></c8y-loading>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n OnChanges,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n ControlContainer,\n FormBuilder,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n C8yValidators,\n EmptyStateComponent,\n FormGroupComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n MessagesComponent,\n OnBeforeSave\n} from '@c8y/ngx-components';\nimport { WidgetConfigComponent, WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n DatapointAttributesFormConfig,\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport { IconSelectorModule } from '@c8y/ngx-components/icon-selector';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { Observable } from 'rxjs';\nimport { debounceTime, filter } from 'rxjs/operators';\nimport { KpiWidgetViewComponent } from '../kpi-widget-view/kpi-widget-view.component';\nimport { KpiWidgetConfig } from '../kpi-widget.model';\n\nexport function exactlyASingleDatapointActive(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const datapoints: KPIDetails[] = control.value;\n if (!datapoints?.length) {\n return null;\n }\n return datapoints.filter(dp => dp.__active).length === 1\n ? null\n : { exactlyOneDatapointNeedsToBeActive: true };\n };\n}\n\n@Component({\n selector: 'c8y-kpi-widget-config',\n templateUrl: './kpi-widget-config.component.html',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n C8yTranslatePipe,\n C8yTranslateDirective,\n FormGroupComponent,\n MessagesComponent,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n DatapointSelectorModule,\n IconSelectorModule,\n PopoverModule,\n KpiWidgetViewComponent\n ],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class KpiWidgetConfigComponent implements OnChanges, OnInit, OnBeforeSave {\n @ViewChild('kpiPreview')\n set previewMapSet(template: TemplateRef<unknown>) {\n this.widgetConfigService.setPreview(template || null);\n }\n\n @Input() config: KpiWidgetConfig;\n\n previewActiveDatapoint: KPIDetails;\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n defaultFormOptions: Partial<DatapointAttributesFormConfig> = {\n showRedRange: true,\n showYellowRange: true\n };\n formGroup: ReturnType<KpiWidgetConfigComponent['createForm']>;\n previewConfig: KpiWidgetConfig;\n\n private destroyRef = inject(DestroyRef);\n private limits = {\n fontSizeMax: 72,\n fontSizeMin: 18,\n numberOfDecimalPlacesMax: 10,\n numberOfDecimalPlacesMin: 0\n } as const;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private widgetConfig: WidgetConfigComponent,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n onBeforeSave(config?: KpiWidgetConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (this.formGroup.valid) {\n Object.assign(config, this.formGroup.value);\n return true;\n }\n return false;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.formGroup && changes.config) {\n this.formGroup.controls.datapoints.patchValue(this.config.datapoints || []);\n }\n }\n\n ngOnInit(): void {\n if (this.widgetConfig.context?.id) {\n this.datapointSelectionConfig.contextAsset = this.widgetConfig.context;\n }\n\n this.previewConfig = { ...this.config };\n this.initForm();\n\n if (this.config?.datapoints) {\n this.formGroup.patchValue({ datapoints: this.config.datapoints });\n this.previewActiveDatapoint = this.config.datapoints.find(dp => dp.__active);\n }\n\n this.widgetConfigService.currentConfig$\n .pipe(\n filter(c => !!c),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(c => {\n this.previewConfig = { ...this.previewConfig, ...c, ...this.formGroup.value };\n });\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n\n this.formGroup.valueChanges\n .pipe(debounceTime(100), takeUntilDestroyed(this.destroyRef))\n .subscribe(formValue => {\n if (formValue.datapoints) {\n this.previewActiveDatapoint = formValue.datapoints.find(dp => dp.__active);\n }\n\n if (this.formGroup.valid) {\n this.previewConfig = { ...this.config, ...this.applyLimitsToPreview(formValue) };\n }\n\n Object.assign(this.config, formValue);\n });\n }\n\n private applyLimitsToPreview(formValue: Partial<KpiWidgetConfig>): Partial<KpiWidgetConfig> {\n const result = { ...formValue };\n\n if (result.numberOfDecimalPlaces !== undefined) {\n result.numberOfDecimalPlaces = this.clamp(\n result.numberOfDecimalPlaces,\n this.limits.numberOfDecimalPlacesMin,\n this.limits.numberOfDecimalPlacesMax\n );\n }\n\n if (result.fontSize !== undefined) {\n result.fontSize = this.clamp(\n result.fontSize,\n this.limits.fontSizeMin,\n this.limits.fontSizeMax\n );\n }\n\n return result;\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private createForm() {\n return this.formBuilder.group({\n numberOfDecimalPlaces: [\n 2,\n [\n Validators.required,\n Validators.min(this.limits.numberOfDecimalPlacesMin),\n Validators.max(this.limits.numberOfDecimalPlacesMax),\n C8yValidators.integerValidator()\n ]\n ],\n showTimestamp: [true, []],\n showTrend: [true, []],\n showIcon: [true, []],\n icon: ['water', [Validators.required, Validators.minLength(1)]],\n fontSize: [\n 36,\n [\n Validators.required,\n Validators.min(this.limits.fontSizeMin),\n Validators.max(this.limits.fontSizeMax)\n ]\n ],\n datapoints: this.formBuilder.control(new Array<KPIDetails>(), [\n Validators.required,\n Validators.minLength(1),\n exactlyASingleDatapointActive()\n ])\n });\n }\n}\n","<form [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Layout' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8\">\n <div class=\"form-group form-group-sm m-b-24\">\n <label translate>Icon</label>\n <c8y-icon-selector-wrapper\n [iconSize]=\"16\"\n name=\"icon\"\n formControlName=\"icon\"\n ></c8y-icon-selector-wrapper>\n </div>\n <c8y-form-group class=\"form-group-sm m-b-24 flex-grow\">\n <label\n [title]=\"'Font size of measurement value (px)' | translate\"\n translate\n >\n Font size of measurement value (px)\n </label>\n <input\n class=\"form-control\"\n name=\"fontSize\"\n type=\"number\"\n formControlName=\"fontSize\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 36 }\"\n />\n <c8y-messages [show]=\"formGroup.controls?.fontSize?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Display' | translate }}</legend>\n <div class=\"d-flex gap-16 flex-wrap p-t-4 p-b-8 m-b-4\">\n <c8y-form-group class=\"m-b-0\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show timestamp' | translate\"\n >\n <input\n name=\"showTimestamp\"\n type=\"checkbox\"\n formControlName=\"showTimestamp\"\n />\n <span></span>\n <span translate>Show timestamp</span>\n </label>\n </c8y-form-group>\n\n <c8y-form-group class=\"m-b-0\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon' | translate\"\n >\n <input\n name=\"showIcon\"\n type=\"checkbox\"\n formControlName=\"showIcon\"\n />\n <span></span>\n <span translate>Show icon</span>\n </label>\n </c8y-form-group>\n\n <c8y-form-group class=\"m-b-0\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show trend icon' | translate\"\n >\n <input\n name=\"showTrend\"\n type=\"checkbox\"\n formControlName=\"showTrend\"\n />\n <span></span>\n <span translate>Show trend icon</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Indicates the trend between the last two measurement values.' | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Number of decimal places</legend>\n <c8y-form-group class=\"form-group-sm p-t-4\">\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages [show]=\"formGroup.controls?.numberOfDecimalPlaces?.errors\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n</form>\n\n<ng-template #kpiPreview>\n @if (formGroup && formGroup.value) {\n @if (formGroup.value.datapoints?.length > 0 && previewActiveDatapoint) {\n <div style=\"height: 300px\">\n <c8y-kpi-widget-view [config]=\"previewConfig\"></c8y-kpi-widget-view>\n </div>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["mergeObj","merge$"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-kpi.mjs","sources":["../../widgets/implementations/kpi/kpi-widget.model.ts","../../widgets/implementations/kpi/kpi-widget-view/kpi-widget-view.component.ts","../../widgets/implementations/kpi/kpi-widget-view/kpi-widget-view.component.html","../../widgets/implementations/kpi/kpi-widget-config/kpi-widget-config.component.ts","../../widgets/implementations/kpi/kpi-widget-config/kpi-widget-config.component.html","../../widgets/implementations/kpi/c8y-ngx-components-widgets-implementations-kpi.ts"],"sourcesContent":["import { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { SupportedIconsSuggestions } from '@c8y/ngx-components/icon-selector/icons';\nimport type { GlobalContextState } from '@c8y/ngx-components/global-context';\n\nexport interface KpiWidgetConfig extends Partial<GlobalContextState> {\n datapoints: KPIDetails[];\n icon?: SupportedIconsSuggestions | null;\n showTimestamp?: boolean | null;\n showTrend?: boolean | null;\n showIcon?: boolean | null;\n numberOfDecimalPlaces?: number | null;\n fontSize?: number | null;\n}\n\nexport interface MeasurementValue {\n unit?: string;\n value: number;\n date: string;\n}\n\nexport enum ColorClass {\n danger = 'text-danger',\n warning = 'text-warning',\n unknown = ''\n}\n\nexport type KpiState = {\n latestMeasurement: MeasurementValue;\n previousValue: MeasurementValue | undefined;\n trend: string;\n unit: string;\n colorClass: ColorClass;\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n OnChanges,\n OnInit,\n signal,\n SimpleChanges\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IMeasurement } from '@c8y/client';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n DashboardChildComponent,\n DatapointUnitPipe,\n DatePipe,\n EmptyStateComponent,\n IconDirective,\n LoadingComponent,\n MeasurementRealtimeService\n} from '@c8y/ngx-components';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport {\n DisplayMode,\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextConnectorComponent,\n GlobalContextState,\n LocalControlsComponent,\n PRESET_NAME,\n PresetName,\n REFRESH_OPTION,\n WidgetConfigMigrationService\n} from '@c8y/ngx-components/global-context';\nimport { isEqual, merge as mergeObj } from 'lodash-es';\nimport { BehaviorSubject, combineLatest, merge as merge$, NEVER, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n pairwise,\n share,\n startWith,\n switchMap,\n tap\n} from 'rxjs/operators';\nimport { ColorClass, KpiState, KpiWidgetConfig, MeasurementValue } from '../kpi-widget.model';\nimport { AsyncPipe, DecimalPipe, NgClass, NgStyle } from '@angular/common';\n\n@Component({\n selector: 'c8y-kpi-widget-view',\n templateUrl: './kpi-widget-view.component.html',\n standalone: true,\n imports: [\n AsyncPipe,\n DatapointUnitPipe,\n DatePipe,\n DecimalPipe,\n NgClass,\n NgStyle,\n C8yTranslatePipe,\n C8yTranslateDirective,\n IconDirective,\n LoadingComponent,\n EmptyStateComponent,\n GlobalContextConnectorComponent,\n LocalControlsComponent\n ],\n providers: [MeasurementRealtimeService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'd-col fit-h' }\n})\nexport class KpiWidgetViewComponent implements OnChanges, OnInit {\n @Input() config: KpiWidgetConfig = { datapoints: [] };\n\n displayMode = signal<DisplayMode>(GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD);\n contextConfig = signal<GlobalContextState>({});\n isLinkedToGlobal = signal<boolean | undefined>(undefined);\n widgetControls = signal<PresetName>(PRESET_NAME.KPI);\n isHistoryMode = signal(false);\n\n state$: Observable<KpiState | null> = NEVER;\n noDataInitiallyInDB = signal(false);\n\n readonly GLOBAL_CONTEXT_DISPLAY_MODE = GLOBAL_CONTEXT_DISPLAY_MODE;\n\n private dashboardChild = inject(DashboardChildComponent, { optional: true });\n private dashboard = inject(ContextDashboardComponent, { optional: true });\n private measurementRealtime = inject(MeasurementRealtimeService);\n private widgetConfigMigrationService = inject(WidgetConfigMigrationService);\n private destroyRef = inject(DestroyRef);\n\n private context$ = new BehaviorSubject<GlobalContextState | null>(null);\n private refresh$ = new Subject<void>();\n private lastDatapoint: KPIDetails | null = null;\n\n ngOnInit(): void {\n this.config = mergeObj(\n this.config,\n this.widgetConfigMigrationService.migrateWidgetConfig(this.config)\n );\n\n this.syncDisplayState();\n this.buildStatePipeline();\n\n if (!this.isDashboardMode()) {\n this.emitContext(this.config);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const cfg = changes.config?.currentValue as KpiWidgetConfig;\n if (!cfg) {\n return;\n }\n this.config = cfg;\n this.syncDisplayState();\n\n if (this.isOnRealDashboard()) {\n return;\n }\n if (this.isDashboardPreviewWaitingForContext()) {\n return;\n }\n this.emitContext(this.config, this.hasDatapointChanged());\n }\n\n onContextChange(event: { context: GlobalContextState; diff: GlobalContextState }): void {\n this.contextConfig.set(event.context);\n this.emitContext(event.context);\n }\n\n onRefresh(): void {\n this.refresh$.next();\n }\n\n getDashboardChild(): DashboardChildComponent {\n return this.dashboardChild;\n }\n\n setupObservable(datapoint: KPIDetails, context: GlobalContextState): Observable<KpiState> {\n const isHistory = context.refreshOption === REFRESH_OPTION.HISTORY;\n const isPaused = !isHistory && context.isAutoRefreshEnabled === false;\n this.isHistoryMode.set(isHistory);\n this.noDataInitiallyInDB.set(false);\n\n let source$: Observable<MeasurementValue>;\n if (isPaused) {\n source$ = this.getHistoryMeasurement$(datapoint, {});\n } else if (isHistory) {\n source$ = this.getHistoryMeasurement$(datapoint, context);\n } else {\n source$ = this.getLiveMeasurement$(datapoint);\n }\n\n const shared$ = source$.pipe(share());\n const lastTwo$ = shared$.pipe(pairwise());\n\n return combineLatest([\n shared$,\n lastTwo$.pipe(\n map(([prev]) => prev),\n startWith(undefined as MeasurementValue | undefined)\n ),\n this.getTrend$(lastTwo$),\n shared$.pipe(\n map(m => datapoint.unit || m.unit || ''),\n startWith(''),\n distinctUntilChanged()\n ),\n this.getColorClass$(shared$, datapoint)\n ]).pipe(\n map(([latestMeasurement, previousValue, trend, unit, colorClass]) => ({\n latestMeasurement,\n previousValue,\n trend,\n unit,\n colorClass\n }))\n );\n }\n\n private buildStatePipeline(): void {\n const readState = () => ({ ctx: this.context$.value, dp: this.findActiveDatapoint() });\n\n this.state$ = merge$(\n this.context$.pipe(map(readState), distinctUntilChanged(isEqual)),\n this.refresh$.pipe(map(readState))\n ).pipe(\n filter((s): s is { ctx: GlobalContextState; dp: KPIDetails } => !!s.ctx && !!s.dp),\n switchMap(({ ctx, dp }) => {\n this.assignContextFromContextDashboard(dp);\n return this.setupObservable(dp, ctx).pipe(startWith(null as KpiState | null));\n }),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n private syncDisplayState(): void {\n const newMode = this.resolveDisplayMode();\n if (this.displayMode() !== newMode) {\n this.displayMode.set(newMode);\n }\n\n const newCtx = this.extractContext(this.config);\n if (!isEqual(this.contextConfig(), newCtx)) {\n this.contextConfig.set(newCtx);\n }\n }\n\n private emitContext(source: Partial<GlobalContextState>, force = false): void {\n const ctx = this.extractContext(source);\n if (force || !isEqual(this.context$.value, ctx)) {\n this.context$.next(ctx);\n }\n }\n\n private isDashboardMode(): boolean {\n return this.resolveDisplayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD;\n }\n\n private isOnRealDashboard(): boolean {\n return this.isDashboardMode() && !!this.dashboardChild;\n }\n\n private isDashboardPreviewWaitingForContext(): boolean {\n return this.isDashboardMode() && !this.config.isGlobalContextReady;\n }\n\n private resolveDisplayMode(): DisplayMode {\n return (this.config?.displayMode || GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG) as DisplayMode;\n }\n\n private extractContext(source: Partial<GlobalContextState>): GlobalContextState {\n return {\n dateTimeContext: source.dateTimeContext,\n isAutoRefreshEnabled: source.isAutoRefreshEnabled,\n refreshInterval: source.refreshInterval,\n refreshOption: source.refreshOption\n };\n }\n\n private findActiveDatapoint(): KPIDetails | undefined {\n return this.config?.datapoints?.find(dp => dp?.__active);\n }\n\n private hasDatapointChanged(): boolean {\n const dp = this.findActiveDatapoint();\n if (!dp) {\n return false;\n }\n const prev = this.lastDatapoint;\n this.lastDatapoint = dp;\n return (\n !prev ||\n dp.fragment !== prev.fragment ||\n dp.series !== prev.series ||\n dp.__target?.id !== prev.__target?.id ||\n dp.unit !== prev.unit ||\n dp.redRangeMin !== prev.redRangeMin ||\n dp.redRangeMax !== prev.redRangeMax ||\n dp.yellowRangeMin !== prev.yellowRangeMin ||\n dp.yellowRangeMax !== prev.yellowRangeMax\n );\n }\n\n private getLiveMeasurement$(datapoint: KPIDetails): Observable<MeasurementValue> {\n return this.measurementRealtime\n .latestValueOfSpecificMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n this.config.showTrend ? 2 : 1,\n true\n )\n .pipe(\n tap(m => {\n if (!m) this.noDataInitiallyInDB.set(true);\n }),\n filter(m => !!m),\n map(m => this.toMeasurementValue(m, datapoint))\n );\n }\n\n private getHistoryMeasurement$(\n datapoint: KPIDetails,\n context: GlobalContextState\n ): Observable<MeasurementValue> {\n return this.measurementRealtime\n .lastMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n 1,\n true,\n context.dateTimeContext?.dateFrom,\n context.dateTimeContext?.dateTo\n )\n .pipe(\n tap(m => {\n if (!m) this.noDataInitiallyInDB.set(true);\n }),\n filter(m => !!m),\n map(m => this.toMeasurementValue(m, datapoint))\n );\n }\n\n private toMeasurementValue(m: IMeasurement, dp: KPIDetails): MeasurementValue {\n return {\n unit: m[dp.fragment][dp.series].unit,\n value: m[dp.fragment][dp.series].value,\n date: m.time as string\n };\n }\n\n private getColorClass$(\n measurement$: Observable<MeasurementValue>,\n datapoint: KPIDetails\n ): Observable<ColorClass> {\n return measurement$.pipe(\n map(m => {\n if (this.inRange(datapoint, m.value, 'redRangeMin', 'redRangeMax')) {\n return ColorClass.danger;\n }\n if (this.inRange(datapoint, m.value, 'yellowRangeMin', 'yellowRangeMax')) {\n return ColorClass.warning;\n }\n return ColorClass.unknown;\n }),\n startWith(ColorClass.unknown),\n distinctUntilChanged()\n );\n }\n\n private getTrend$(lastTwo$: Observable<MeasurementValue[]>): Observable<string> {\n return lastTwo$.pipe(\n map(([prev, curr]) => {\n if (prev.value < curr.value) return '45deg';\n if (prev.value > curr.value) return '135deg';\n return '90deg';\n }),\n startWith('90deg'),\n distinctUntilChanged()\n );\n }\n\n private inRange(dp: KPIDetails, value: number, minKey: string, maxKey: string): boolean {\n return (\n typeof dp[minKey] === 'number' &&\n typeof dp[maxKey] === 'number' &&\n value >= dp[minKey] &&\n value < dp[maxKey]\n );\n }\n\n private assignContextFromContextDashboard(datapoint: KPIDetails): void {\n if (!this.dashboard?.isDeviceTypeDashboard) {\n return;\n }\n const context = this.dashboard?.context;\n if (context?.id) {\n datapoint.__target = { name: context.name, id: context.id };\n }\n }\n}\n","@if (displayMode() === GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD && getDashboardChild()) {\n <c8y-global-context-connector\n [controls]=\"widgetControls()\"\n [config]=\"contextConfig()\"\n [dashboardChild]=\"getDashboardChild()\"\n [linked]=\"isLinkedToGlobal()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-global-context-connector>\n} @else if (displayMode() !== GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD) {\n <c8y-local-controls\n [controls]=\"widgetControls()\"\n [displayMode]=\"displayMode()\"\n [config]=\"contextConfig()\"\n [propagateAutoRefresh]=\"false\"\n (configChange)=\"onContextChange($event)\"\n (refresh)=\"onRefresh()\"\n ></c8y-local-controls>\n}\n\n@if (state$ | async; as lastState) {\n <div class=\"kpi-widget__container d-flex d-col flex-grow fit-w a-i-center j-c-center\">\n <div class=\"d-flex a-i-center j-c-center fit-w\">\n @if (config.icon && config.showIcon) {\n <div\n class=\"m-r-16 flex-no-shrink text-muted\"\n [ngClass]=\"lastState.colorClass\"\n >\n <i\n class=\"icon-32\"\n [c8yIcon]=\"config.icon\"\n ></i>\n </div>\n }\n <div class=\"text-truncate\">\n <span\n class=\"text-truncate text-medium\"\n [ngStyle]=\"{ 'font-size': (config.fontSize || '36') + 'px' }\"\n title=\"{{\n lastState.colorClass === 'text-danger'\n ? ('Within red range:' | translate)\n : lastState.colorClass === 'text-warning'\n ? ('Within yellow range:' | translate)\n : ''\n }} {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }} {{ lastState.unit | datapointUnit }}\"\n [ngClass]=\"lastState.colorClass\"\n >\n {{\n lastState.latestMeasurement.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')\n }}\n <small class=\"text-regular\">{{ lastState.unit | datapointUnit }}</small>\n </span>\n </div>\n @if (config?.showTrend && lastState.previousValue; as previousValue) {\n <div class=\"dot dot-info dot-30 m-l-16 flex-no-shrink\">\n <i\n class=\"icon-20\"\n c8yIcon=\"arrow-dotted-up\"\n [ngStyle]=\"{ transform: 'rotate(' + lastState.trend + ')' }\"\n [title]=\"\n ('Previous value' | translate) +\n ': ' +\n (previousValue.value\n | number\n : '1.' +\n (config.numberOfDecimalPlaces || '0') +\n '-' +\n (config.numberOfDecimalPlaces || '0')) +\n ' (' +\n (previousValue.date | c8yDate: 'medium') +\n ')'\n \"\n ></i>\n </div>\n }\n </div>\n <div class=\"d-flex d-col a-i-center\">\n @if (config?.showTimestamp) {\n <p class=\"icon-flex text-center text-muted small m-b-0\">\n <i c8yIcon=\"calendar\"></i>\n {{ lastState.latestMeasurement.date | c8yDate: 'medium' }}\n </p>\n }\n @if (isHistoryMode()) {\n <p class=\"text-center text-muted small m-b-0\">\n <span translate>Last measurement in selected time range</span>\n </p>\n }\n </div>\n </div>\n} @else {\n <div class=\"d-flex flex-grow fit-w j-c-center a-i-center\">\n @let noDataSubtitleLive = 'Waiting for measurements to be created.' | translate;\n @let noDataSubtitleHistory = 'No data available for the selected time period.' | translate;\n @if (noDataInitiallyInDB()) {\n <c8y-ui-empty-state\n [icon]=\"'line-chart'\"\n [title]=\"'No measurement to display.' | translate\"\n [subtitle]=\"isHistoryMode() ? noDataSubtitleHistory : noDataSubtitleLive\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n } @else {\n <c8y-loading></c8y-loading>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Input,\n OnChanges,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n ControlContainer,\n FormBuilder,\n NgForm,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {\n C8yTranslateDirective,\n C8yTranslatePipe,\n C8yValidators,\n EmptyStateComponent,\n FormGroupComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n MessagesComponent,\n OnBeforeSave\n} from '@c8y/ngx-components';\nimport { WidgetConfigComponent, WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport {\n DatapointAttributesFormConfig,\n DatapointSelectorModalOptions,\n DatapointSelectorModule,\n KPIDetails\n} from '@c8y/ngx-components/datapoint-selector';\nimport { IconSelectorModule } from '@c8y/ngx-components/icon-selector';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { Observable } from 'rxjs';\nimport { debounceTime, filter } from 'rxjs/operators';\nimport { KpiWidgetViewComponent } from '../kpi-widget-view/kpi-widget-view.component';\nimport { KpiWidgetConfig } from '../kpi-widget.model';\n\nexport function exactlyASingleDatapointActive(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const datapoints: KPIDetails[] = control.value;\n if (!datapoints?.length) {\n return null;\n }\n return datapoints.filter(dp => dp.__active).length === 1\n ? null\n : { exactlyOneDatapointNeedsToBeActive: true };\n };\n}\n\n@Component({\n selector: 'c8y-kpi-widget-config',\n templateUrl: './kpi-widget-config.component.html',\n standalone: true,\n imports: [\n ReactiveFormsModule,\n C8yTranslatePipe,\n C8yTranslateDirective,\n FormGroupComponent,\n MessagesComponent,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n DatapointSelectorModule,\n IconSelectorModule,\n PopoverModule,\n KpiWidgetViewComponent\n ],\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class KpiWidgetConfigComponent implements OnChanges, OnInit, OnBeforeSave {\n @ViewChild('kpiPreview')\n set previewMapSet(template: TemplateRef<unknown>) {\n this.widgetConfigService.setPreview(template || null);\n }\n\n @Input() config: KpiWidgetConfig;\n\n previewActiveDatapoint: KPIDetails;\n datapointSelectionConfig: Partial<DatapointSelectorModalOptions> = {};\n defaultFormOptions: Partial<DatapointAttributesFormConfig> = {\n showRedRange: true,\n showYellowRange: true\n };\n formGroup: ReturnType<KpiWidgetConfigComponent['createForm']>;\n previewConfig: KpiWidgetConfig;\n\n private destroyRef = inject(DestroyRef);\n private limits = {\n fontSizeMax: 72,\n fontSizeMin: 18,\n numberOfDecimalPlacesMax: 10,\n numberOfDecimalPlacesMin: 0\n } as const;\n\n constructor(\n private formBuilder: FormBuilder,\n private form: NgForm,\n private widgetConfig: WidgetConfigComponent,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n onBeforeSave(config?: KpiWidgetConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (this.formGroup.valid) {\n Object.assign(config, this.formGroup.value);\n return true;\n }\n return false;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.formGroup && changes.config) {\n this.formGroup.controls.datapoints.patchValue(this.config.datapoints || []);\n }\n }\n\n ngOnInit(): void {\n if (this.widgetConfig.context?.id) {\n this.datapointSelectionConfig.contextAsset = this.widgetConfig.context;\n }\n\n this.previewConfig = { ...this.config };\n this.initForm();\n\n if (this.config?.datapoints) {\n this.formGroup.patchValue({ datapoints: this.config.datapoints });\n this.previewActiveDatapoint = this.config.datapoints.find(dp => dp.__active);\n }\n\n this.widgetConfigService.currentConfig$\n .pipe(\n filter(c => !!c),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(c => {\n this.previewConfig = { ...this.previewConfig, ...c, ...this.formGroup.value };\n });\n }\n\n private initForm(): void {\n this.formGroup = this.createForm();\n this.form.form.addControl('config', this.formGroup);\n this.formGroup.patchValue(this.config);\n\n this.formGroup.valueChanges\n .pipe(debounceTime(100), takeUntilDestroyed(this.destroyRef))\n .subscribe(formValue => {\n if (formValue.datapoints) {\n this.previewActiveDatapoint = formValue.datapoints.find(dp => dp.__active);\n }\n\n if (this.formGroup.valid) {\n this.previewConfig = { ...this.config, ...this.applyLimitsToPreview(formValue) };\n }\n\n Object.assign(this.config, formValue);\n });\n }\n\n private applyLimitsToPreview(formValue: Partial<KpiWidgetConfig>): Partial<KpiWidgetConfig> {\n const result = { ...formValue };\n\n if (result.numberOfDecimalPlaces !== undefined) {\n result.numberOfDecimalPlaces = this.clamp(\n result.numberOfDecimalPlaces,\n this.limits.numberOfDecimalPlacesMin,\n this.limits.numberOfDecimalPlacesMax\n );\n }\n\n if (result.fontSize !== undefined) {\n result.fontSize = this.clamp(\n result.fontSize,\n this.limits.fontSizeMin,\n this.limits.fontSizeMax\n );\n }\n\n return result;\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n }\n\n private createForm() {\n return this.formBuilder.group({\n numberOfDecimalPlaces: [\n 2,\n [\n Validators.required,\n Validators.min(this.limits.numberOfDecimalPlacesMin),\n Validators.max(this.limits.numberOfDecimalPlacesMax),\n C8yValidators.integerValidator()\n ]\n ],\n showTimestamp: [true, []],\n showTrend: [true, []],\n showIcon: [true, []],\n icon: ['water', [Validators.required, Validators.minLength(1)]],\n fontSize: [\n 36,\n [\n Validators.required,\n Validators.min(this.limits.fontSizeMin),\n Validators.max(this.limits.fontSizeMax)\n ]\n ],\n datapoints: this.formBuilder.control(new Array<KPIDetails>(), [\n Validators.required,\n Validators.minLength(1),\n exactlyASingleDatapointActive()\n ])\n });\n }\n}\n","<form [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Layout' | translate }}</legend>\n <div class=\"d-flex a-i-center gap-8\">\n <div class=\"form-group form-group-sm m-b-24\">\n <label translate>Icon</label>\n <c8y-icon-selector-wrapper\n [iconSize]=\"16\"\n name=\"icon\"\n formControlName=\"icon\"\n ></c8y-icon-selector-wrapper>\n </div>\n <c8y-form-group class=\"form-group-sm m-b-24 flex-grow\">\n <label\n [title]=\"'Font size of measurement value (px)' | translate\"\n translate\n >\n Font size of measurement value (px)\n </label>\n <input\n class=\"form-control\"\n name=\"fontSize\"\n type=\"number\"\n formControlName=\"fontSize\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 36 }\"\n />\n <c8y-messages [show]=\"formGroup.controls?.fontSize?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Display' | translate }}</legend>\n <div class=\"d-flex gap-16 flex-wrap p-t-4 p-b-8 m-b-4\">\n <c8y-form-group class=\"m-b-0\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show timestamp' | translate\"\n >\n <input\n name=\"showTimestamp\"\n type=\"checkbox\"\n formControlName=\"showTimestamp\"\n />\n <span></span>\n <span translate>Show timestamp</span>\n </label>\n </c8y-form-group>\n\n <c8y-form-group class=\"m-b-0\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show icon' | translate\"\n >\n <input\n name=\"showIcon\"\n type=\"checkbox\"\n formControlName=\"showIcon\"\n />\n <span></span>\n <span translate>Show icon</span>\n </label>\n </c8y-form-group>\n\n <c8y-form-group class=\"m-b-0\">\n <label\n class=\"c8y-checkbox\"\n [title]=\"'Show trend icon' | translate\"\n >\n <input\n name=\"showTrend\"\n type=\"checkbox\"\n formControlName=\"showTrend\"\n />\n <span></span>\n <span translate>Show trend icon</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Indicates the trend between the last two measurement values.' | translate\n }}\"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Number of decimal places</legend>\n <c8y-form-group class=\"form-group-sm p-t-4\">\n <input\n class=\"form-control\"\n name=\"numberOfDecimalPlaces\"\n type=\"number\"\n formControlName=\"numberOfDecimalPlaces\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 1 }\"\n />\n <c8y-messages [show]=\"formGroup.controls?.numberOfDecimalPlaces?.errors\"></c8y-messages>\n </c8y-form-group>\n </fieldset>\n</form>\n\n<ng-template #kpiPreview>\n @if (formGroup && formGroup.value) {\n @if (formGroup.value.datapoints?.length > 0 && previewActiveDatapoint) {\n <div style=\"height: 300px\">\n <c8y-kpi-widget-view [config]=\"previewConfig\"></c8y-kpi-widget-view>\n </div>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["mergeObj","merge$"],"mappings":";;;;;;;;;;;;;;;;;;;IAoBY;AAAZ,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,QAAA,CAAA,GAAA,aAAsB;AACtB,IAAA,UAAA,CAAA,SAAA,CAAA,GAAA,cAAwB;AACxB,IAAA,UAAA,CAAA,SAAA,CAAA,GAAA,EAAY;AACd,CAAC,EAJW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;;MCuDT,sBAAsB,CAAA;AAvBnC,IAAA,WAAA,GAAA;AAwBW,QAAA,IAAA,CAAA,MAAM,GAAoB,EAAE,UAAU,EAAE,EAAE,EAAE;AAErD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAc,2BAA2B,CAAC,SAAS,kFAAC;AACxE,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAqB,EAAE,oFAAC;AAC9C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAsB,SAAS,uFAAC;AACzD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAa,WAAW,CAAC,GAAG,qFAAC;AACpD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,oFAAC;QAE7B,IAAA,CAAA,MAAM,GAAgC,KAAK;AAC3C,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,KAAK,0FAAC;QAE1B,IAAA,CAAA,2BAA2B,GAAG,2BAA2B;QAE1D,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpE,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjE,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,CAAC;AACxD,QAAA,IAAA,CAAA,4BAA4B,GAAG,MAAM,CAAC,4BAA4B,CAAC;AACnE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAA4B,IAAI,CAAC;AAC/D,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAC9B,IAAA,CAAA,aAAa,GAAsB,IAAI;AA8QhD,IAAA;IA5QC,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,GAAGA,KAAQ,CACpB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,4BAA4B,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CACnE;QAED,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,kBAAkB,EAAE;AAEzB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B;IACF;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,YAA+B;QAC3D,IAAI,CAAC,GAAG,EAAE;YACR;QACF;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,GAAG;QACjB,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5B;QACF;AACA,QAAA,IAAI,IAAI,CAAC,mCAAmC,EAAE,EAAE;YAC9C;QACF;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3D;AAEA,IAAA,eAAe,CAAC,KAAgE,EAAA;QAC9E,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;IACjC;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;IAEA,iBAAiB,GAAA;QACf,OAAO,IAAI,CAAC,cAAc;IAC5B;IAEA,eAAe,CAAC,SAAqB,EAAE,OAA2B,EAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,KAAK,cAAc,CAAC,OAAO;QAClE,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,oBAAoB,KAAK,KAAK;AACrE,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AAEnC,QAAA,IAAI,OAAqC;QACzC,IAAI,QAAQ,EAAE;YACZ,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC;QACtD;aAAO,IAAI,SAAS,EAAE;YACpB,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC;QAC3D;aAAO;AACL,YAAA,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;QAC/C;QAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEzC,QAAA,OAAO,aAAa,CAAC;YACnB,OAAO;AACP,YAAA,QAAQ,CAAC,IAAI,CACX,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EACrB,SAAS,CAAC,SAAyC,CAAC,CACrD;AACD,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YACxB,OAAO,CAAC,IAAI,CACV,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EACxC,SAAS,CAAC,EAAE,CAAC,EACb,oBAAoB,EAAE,CACvB;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS;SACvC,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM;YACpE,iBAAiB;YACjB,aAAa;YACb,KAAK;YACL,IAAI;YACJ;SACD,CAAC,CAAC,CACJ;IACH;IAEQ,kBAAkB,GAAA;QACxB,MAAM,SAAS,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;AAEtF,QAAA,IAAI,CAAC,MAAM,GAAGC,OAAM,CAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,EACjE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CACnC,CAAC,IAAI,CACJ,MAAM,CAAC,CAAC,CAAC,KAAuD,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAClF,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAI;AACxB,YAAA,IAAI,CAAC,iCAAiC,CAAC,EAAE,CAAC;AAC1C,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAuB,CAAC,CAAC;QAC/E,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CACpC;IACH;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;AAClC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QAC/B;QAEA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QAChC;IACF;AAEQ,IAAA,WAAW,CAAC,MAAmC,EAAE,KAAK,GAAG,KAAK,EAAA;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AACvC,QAAA,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;AAC/C,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACzB;IACF;IAEQ,eAAe,GAAA;QACrB,OAAO,IAAI,CAAC,kBAAkB,EAAE,KAAK,2BAA2B,CAAC,SAAS;IAC5E;IAEQ,iBAAiB,GAAA;QACvB,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc;IACxD;IAEQ,mCAAmC,GAAA;QACzC,OAAO,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB;IACpE;IAEQ,kBAAkB,GAAA;QACxB,QAAQ,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,2BAA2B,CAAC,eAAe;IACjF;AAEQ,IAAA,cAAc,CAAC,MAAmC,EAAA;QACxD,OAAO;YACL,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,aAAa,EAAE,MAAM,CAAC;SACvB;IACH;IAEQ,mBAAmB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;IAC1D;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE;QACrC,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,KAAK;QACd;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa;AAC/B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACvB,QACE,CAAC,IAAI;AACL,YAAA,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;AAC7B,YAAA,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YACzB,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE;AACrC,YAAA,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AACrB,YAAA,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;AACnC,YAAA,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;AACnC,YAAA,EAAE,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;AACzC,YAAA,EAAE,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;IAE7C;AAEQ,IAAA,mBAAmB,CAAC,SAAqB,EAAA;QAC/C,OAAO,IAAI,CAAC;AACT,aAAA,iCAAiC,CAChC,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,QAAQ,EAClB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,EAC7B,IAAI;AAEL,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAG;AACN,YAAA,IAAI,CAAC,CAAC;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5C,QAAA,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAChD;IACL;IAEQ,sBAAsB,CAC5B,SAAqB,EACrB,OAA2B,EAAA;QAE3B,OAAO,IAAI,CAAC;AACT,aAAA,gBAAgB,CACf,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,QAAQ,EAClB,CAAC,EACD,IAAI,EACJ,OAAO,CAAC,eAAe,EAAE,QAAQ,EACjC,OAAO,CAAC,eAAe,EAAE,MAAM;AAEhC,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAG;AACN,YAAA,IAAI,CAAC,CAAC;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5C,QAAA,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAChB,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAChD;IACL;IAEQ,kBAAkB,CAAC,CAAe,EAAE,EAAc,EAAA;QACxD,OAAO;AACL,YAAA,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI;AACpC,YAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK;YACtC,IAAI,EAAE,CAAC,CAAC;SACT;IACH;IAEQ,cAAc,CACpB,YAA0C,EAC1C,SAAqB,EAAA;QAErB,OAAO,YAAY,CAAC,IAAI,CACtB,GAAG,CAAC,CAAC,IAAG;AACN,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,aAAa,CAAC,EAAE;gBAClE,OAAO,UAAU,CAAC,MAAM;YAC1B;AACA,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE;gBACxE,OAAO,UAAU,CAAC,OAAO;YAC3B;YACA,OAAO,UAAU,CAAC,OAAO;AAC3B,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAC7B,oBAAoB,EAAE,CACvB;IACH;AAEQ,IAAA,SAAS,CAAC,QAAwC,EAAA;AACxD,QAAA,OAAO,QAAQ,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAI;AACnB,YAAA,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,OAAO;AAC3C,YAAA,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,QAAQ;AAC5C,YAAA,OAAO,OAAO;QAChB,CAAC,CAAC,EACF,SAAS,CAAC,OAAO,CAAC,EAClB,oBAAoB,EAAE,CACvB;IACH;AAEQ,IAAA,OAAO,CAAC,EAAc,EAAE,KAAa,EAAE,MAAc,EAAE,MAAc,EAAA;AAC3E,QAAA,QACE,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,QAAQ;AAC9B,YAAA,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,QAAQ;AAC9B,YAAA,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;AACnB,YAAA,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC;IAEtB;AAEQ,IAAA,iCAAiC,CAAC,SAAqB,EAAA;AAC7D,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,EAAE;YAC1C;QACF;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACvC,QAAA,IAAI,OAAO,EAAE,EAAE,EAAE;AACf,YAAA,SAAS,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;QAC7D;IACF;+GAnSW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAJtB,CAAC,0BAA0B,CAAC,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvEzC,4yIAuHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1DI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEP,qBAAqB,wEACrB,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,+BAA+B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC/B,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAZtB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACjB,QAAQ,EAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACR,WAAW,0CAGX,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYP,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAvBlC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EAEnB,IAAI,EAAA,OAAA,EACP;wBACP,SAAS;wBACT,iBAAiB;wBACjB,QAAQ;wBACR,WAAW;wBACX,OAAO;wBACP,OAAO;wBACP,gBAAgB;wBAChB,qBAAqB;wBACrB,aAAa;wBACb,gBAAgB;wBAChB,mBAAmB;wBACnB,+BAA+B;wBAC/B;AACD,qBAAA,EAAA,SAAA,EACU,CAAC,0BAA0B,CAAC,EAAA,eAAA,EACtB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAA,QAAA,EAAA,4yIAAA,EAAA;;sBAG7B;;;SE5Ba,6BAA6B,GAAA;IAC3C,OAAO,CAAC,OAAwB,KAA6B;AAC3D,QAAA,MAAM,UAAU,GAAiB,OAAO,CAAC,KAAK;AAC9C,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;AACvB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK;AACrD,cAAE;AACF,cAAE,EAAE,kCAAkC,EAAE,IAAI,EAAE;AAClD,IAAA,CAAC;AACH;MAuBa,wBAAwB,CAAA;IACnC,IACI,aAAa,CAAC,QAA8B,EAAA;QAC9C,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvD;AAqBA,IAAA,WAAA,CACU,WAAwB,EACxB,IAAY,EACZ,YAAmC,EACnC,mBAAwC,EAAA;QAHxC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QApB7B,IAAA,CAAA,wBAAwB,GAA2C,EAAE;AACrE,QAAA,IAAA,CAAA,kBAAkB,GAA2C;AAC3D,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE;SAClB;AAIO,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG;AACf,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,wBAAwB,EAAE,EAAE;AAC5B,YAAA,wBAAwB,EAAE;SAClB;IAOP;AAEH,IAAA,YAAY,CAAC,MAAwB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YACxB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC3C,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE;AACpC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7E;IACF;IAEA,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE;YACjC,IAAI,CAAC,wBAAwB,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO;QACxE;QAEA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QACvC,IAAI,CAAC,QAAQ,EAAE;AAEf,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AACjE,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC;QAC9E;QAEA,IAAI,CAAC,mBAAmB,CAAC;AACtB,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAChB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AAC/E,QAAA,CAAC,CAAC;IACN;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAEtC,IAAI,CAAC,SAAS,CAAC;AACZ,aAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAC3D,SAAS,CAAC,SAAS,IAAG;AACrB,YAAA,IAAI,SAAS,CAAC,UAAU,EAAE;AACxB,gBAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC;YAC5E;AAEA,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACxB,gBAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE;YAClF;YAEA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AACvC,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,oBAAoB,CAAC,SAAmC,EAAA;AAC9D,QAAA,MAAM,MAAM,GAAG,EAAE,GAAG,SAAS,EAAE;AAE/B,QAAA,IAAI,MAAM,CAAC,qBAAqB,KAAK,SAAS,EAAE;YAC9C,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CACvC,MAAM,CAAC,qBAAqB,EAC5B,IAAI,CAAC,MAAM,CAAC,wBAAwB,EACpC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CACrC;QACH;AAEA,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE;YACjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,MAAM,CAAC,QAAQ,EACf,IAAI,CAAC,MAAM,CAAC,WAAW,EACvB,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB;QACH;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C;IAEQ,UAAU,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC5B,YAAA,qBAAqB,EAAE;gBACrB,CAAC;AACD,gBAAA;AACE,oBAAA,UAAU,CAAC,QAAQ;oBACnB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC;oBACpD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC;oBACpD,aAAa,CAAC,gBAAgB;AAC/B;AACF,aAAA;AACD,YAAA,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACzB,YAAA,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACrB,YAAA,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AACpB,YAAA,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,YAAA,QAAQ,EAAE;gBACR,EAAE;AACF,gBAAA;AACE,oBAAA,UAAU,CAAC,QAAQ;oBACnB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBACvC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;AACvC;AACF,aAAA;YACD,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,KAAK,EAAc,EAAE;AAC5D,gBAAA,UAAU,CAAC,QAAQ;AACnB,gBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACvB,gBAAA,6BAA6B;aAC9B;AACF,SAAA,CAAC;IACJ;+GAhJW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,iPCjFrC,i2IAwIA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvEI,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEnB,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,iBAAiB,4HACjB,mBAAmB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,uBAAuB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACvB,kBAAkB,iNAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,sBAAsB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAVtB,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,aAAA,EAYH,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAGxD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBArBpC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EAErB,IAAI,EAAA,OAAA,EACP;wBACP,mBAAmB;wBACnB,gBAAgB;wBAChB,qBAAqB;wBACrB,kBAAkB;wBAClB,iBAAiB;wBACjB,mBAAmB;wBACnB,kBAAkB;wBAClB,kBAAkB;wBAClB,uBAAuB;wBACvB,kBAAkB;wBAClB,aAAa;wBACb;AACD,qBAAA,EAAA,aAAA,EACc,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,eAAA,EAClD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,i2IAAA,EAAA;;sBAG9C,SAAS;uBAAC,YAAY;;sBAKtB;;;AEvFH;;AAEG;;;;"}
|
|
@@ -6,7 +6,7 @@ import * as i2 from '@angular/forms';
|
|
|
6
6
|
import { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
7
7
|
import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
|
|
8
8
|
import * as i1 from '@c8y/ngx-components';
|
|
9
|
-
import { DynamicComponentAlertAggregator, DynamicComponentAlert, MeasurementRealtimeService, CommonModule, CoreModule } from '@c8y/ngx-components';
|
|
9
|
+
import { DynamicComponentAlertAggregator, translateDatapointUnit, translateDatapointLabel, DynamicComponentAlert, MeasurementRealtimeService, CommonModule, CoreModule } from '@c8y/ngx-components';
|
|
10
10
|
import * as i1$1 from 'ngx-echarts';
|
|
11
11
|
import { NgxEchartsModule, NGX_ECHARTS_CONFIG } from 'ngx-echarts';
|
|
12
12
|
import { AsyncPipe } from '@angular/common';
|
|
@@ -98,10 +98,10 @@ class PieChartWidgetViewComponent {
|
|
|
98
98
|
mapToDatapointValue(datapoint, measurement) {
|
|
99
99
|
const rawValue = measurement.value;
|
|
100
100
|
return {
|
|
101
|
-
label: datapoint.label
|
|
101
|
+
label: translateDatapointLabel(datapoint.label, this.translateService),
|
|
102
102
|
value: rawValue < 0 || Number.isNaN(rawValue) ? 0 : rawValue,
|
|
103
103
|
rawValue,
|
|
104
|
-
unit: datapoint.unit || measurement.unit
|
|
104
|
+
unit: translateDatapointUnit(datapoint.unit || measurement.unit, this.translateService),
|
|
105
105
|
color: datapoint.color || ''
|
|
106
106
|
};
|
|
107
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-pie-chart.mjs","sources":["../../widgets/implementations/pie-chart/current-measurement.service.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.html","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.html","../../widgets/implementations/pie-chart/c8y-ngx-components-widgets-implementations-pie-chart.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { MeasurementRealtimeService } from '@c8y/ngx-components';\nimport { IMeasurementValue } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentMeasurementService {\n constructor(private realtime: MeasurementRealtimeService) {}\n\n /**\n * Fetches the latest measurement value for a given datapoint.\n * Combines initial historical value with realtime updates.\n *\n * @param datapoint - The KPI datapoint configuration\n * @returns Observable emitting measurement value, unit, date, and notFound flag\n */\n getLatest(datapoint: KPIDetails): Observable<{\n value: number;\n unit: string;\n date: string;\n notFound?: boolean;\n }> {\n return this.realtime\n .latestValueOfSpecificMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n 1,\n true\n )\n .pipe(\n map(m => {\n if (!m) {\n return {\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n };\n }\n\n const v: IMeasurementValue = m[datapoint.fragment][datapoint.series];\n return {\n value: v.value,\n unit: v.unit || datapoint.unit,\n date: m.time\n };\n }),\n catchError(() =>\n of({\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n })\n )\n );\n }\n}\n","import {\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ViewChild\n} from '@angular/core';\nimport {\n DatapointValue,\n MeasurementValue,\n PieChartConfig,\n PieChartOptions\n} from '../pie-chart.model';\nimport { ECharts } from 'echarts/core';\nimport { BehaviorSubject, combineLatest, map, Observable, switchMap, tap } from 'rxjs';\nimport { NGX_ECHARTS_CONFIG, NgxEchartsModule } from 'ngx-echarts';\nimport { AsyncPipe } from '@angular/common';\nimport { CurrentMeasurementService } from '../current-measurement.service';\nimport {\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n MeasurementRealtimeService\n} from '@c8y/ngx-components';\nimport { ChartAlertsComponent } from '@c8y/ngx-components/echart';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport * as echarts from 'echarts';\nimport type { EChartsOption, PieSeriesOption, DefaultLabelFormatterCallbackParams } from 'echarts';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\n\n/** Chart layout constants */\nconst CHART_LAYOUT = {\n PIE_CENTER: ['50%', '45%'] as [string, string],\n PIE_RADIUS: '80%',\n LEGEND_BOTTOM: '2%',\n EMPTY_STATE_FONT_SIZE: 30\n} as const;\n\n@Component({\n selector: 'c8y-pie-chart',\n templateUrl: './pie-chart-widget-view.component.html',\n providers: [\n MeasurementRealtimeService,\n CurrentMeasurementService,\n { provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }\n ],\n imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PieChartWidgetViewComponent implements OnChanges, DynamicComponent {\n @Input() config!: PieChartConfig;\n @ViewChild('chart', { static: false }) chart!: ElementRef;\n activeDatapoints: KPIDetails[] = [];\n\n chartOptions$!: Observable<EChartsOption>;\n alerts = new DynamicComponentAlertAggregator();\n echartsInstance!: ECharts;\n\n private readonly configChanged$ = new BehaviorSubject<void>(undefined);\n private readonly measurements = inject(CurrentMeasurementService);\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n this.chartOptions$ = this.configChanged$.pipe(\n switchMap(() => this.fetchMeasurements()),\n tap(entries => this.handleNegativeValues(entries)),\n map(entries => this.buildChartOptions(entries)),\n tap(options => this.updateChartInstance(options))\n );\n }\n\n ngOnChanges(_: SimpleChanges) {\n if (this.config?.datapoints?.length) {\n this.configChanged$.next();\n }\n }\n\n onChartInit(ec: ECharts) {\n this.echartsInstance = ec;\n }\n\n /**\n * Fetches latest measurements for all configured datapoints.\n */\n private fetchMeasurements(): Observable<DatapointValue[]> {\n this.activeDatapoints = this.config?.datapoints?.filter(dp => dp.__active);\n const streams = this.activeDatapoints.map(dp =>\n this.measurements.getLatest(dp).pipe(map(m => this.mapToDatapointValue(dp, m)))\n );\n return combineLatest(streams);\n }\n\n /**\n * Maps a datapoint and its measurement to a DatapointValue.\n */\n private mapToDatapointValue(\n datapoint: KPIDetails,\n measurement: MeasurementValue\n ): DatapointValue {\n const rawValue = measurement.value;\n return {\n label: datapoint.label || '',\n value: rawValue < 0 || Number.isNaN(rawValue) ? 0 : rawValue,\n rawValue,\n unit: datapoint.unit || measurement.unit || '',\n color: datapoint.color || ''\n };\n }\n\n /**\n * Handles negative value alerts - clears existing alerts and adds warning if needed.\n */\n private handleNegativeValues(entries: DatapointValue[]): void {\n this.alerts.clear();\n\n const negatives = entries.filter(e => e.rawValue < 0);\n if (negatives.length === 0) {\n return;\n }\n\n const negativeDpList = negatives\n .map(n => `${this.encodeHtml(n.label)}: ${n.rawValue} ${this.encodeHtml(n.unit)}`)\n .join('; ');\n\n const errorMessage = this.translateService.instant(\n gettext('Negative measurements received from data point(s): {{ datapoints }}'),\n { datapoints: negativeDpList }\n );\n\n this.alerts.addAlerts(new DynamicComponentAlert({ type: 'warning', text: errorMessage }));\n }\n\n /**\n * Builds the ECharts options based on datapoint values.\n */\n private buildChartOptions(datapoints: DatapointValue[]): EChartsOption {\n if (this.isEmptyState(datapoints)) {\n return this.buildEmptyStateOptions();\n }\n return this.buildPieChartOptions(datapoints);\n }\n\n /**\n * Checks if chart should display empty state (no positive data).\n */\n private isEmptyState(entries: DatapointValue[]): boolean {\n const hasPositiveData = entries.some(e => e.rawValue > 0);\n const hasNegativeData = entries.some(e => e.rawValue < 0);\n return !hasPositiveData && !hasNegativeData;\n }\n\n /**\n * Builds options for empty state display.\n */\n private buildEmptyStateOptions(): EChartsOption {\n return {\n title: {\n text: gettext('No data available.'),\n left: 'center',\n top: 'center',\n textStyle: { fontSize: CHART_LAYOUT.EMPTY_STATE_FONT_SIZE }\n },\n series: []\n };\n }\n\n /**\n * Builds the pie chart options with data.\n */\n private buildPieChartOptions(entries: DatapointValue[]): EChartsOption {\n const options = this.config.pieChartOptions;\n const total = this.calculateTotal(entries);\n\n return {\n tooltip: this.buildTooltipConfig(entries, options),\n legend: this.buildLegendConfig(options),\n series: [this.buildPieSeriesConfig(entries, total, options)]\n };\n }\n\n /**\n * Calculates total of all entry values.\n */\n private calculateTotal(entries: DatapointValue[]): number {\n return entries.reduce((sum, e) => sum + e.value, 0);\n }\n\n /**\n * Builds tooltip configuration.\n */\n private buildTooltipConfig(\n entries: DatapointValue[],\n options?: PieChartOptions\n ): EChartsOption['tooltip'] {\n return {\n show: options?.showTooltips ?? false,\n formatter: (params: DefaultLabelFormatterCallbackParams) => {\n const entry = entries.find(e => e.label === params.name);\n const unit = entry?.unit || '';\n const value = (params.value as number).toFixed(2);\n return `${this.encodeHtml(params.name as string)}: ${value} ${this.encodeHtml(unit)}`;\n }\n };\n }\n\n /**\n * Builds legend configuration.\n */\n private buildLegendConfig(options?: PieChartOptions): EChartsOption['legend'] {\n return {\n bottom: CHART_LAYOUT.LEGEND_BOTTOM,\n left: 'center',\n show: options?.showLegend ?? false,\n formatter: (name: string) => {\n const match = name.match(/^(.+)_\\d+$/);\n return match ? match[1] : name;\n }\n };\n }\n\n /**\n * Builds pie series configuration.\n */\n private buildPieSeriesConfig(\n entries: DatapointValue[],\n total: number,\n options?: PieChartOptions\n ): PieSeriesOption {\n const showLegend = options?.showLegend ?? false;\n return {\n center: showLegend ? CHART_LAYOUT.PIE_CENTER : ['50%', '50%'],\n type: 'pie',\n radius: CHART_LAYOUT.PIE_RADIUS,\n label: {\n show: options?.showLabels ?? false,\n position: 'inside',\n formatter: (params: DefaultLabelFormatterCallbackParams) =>\n this.formatPercentageLabel(params.value as number, total)\n },\n data: entries.map((e, index) => ({\n name: `${e.label}_${index}`,\n value: e.value,\n itemStyle: { color: e.color }\n }))\n };\n }\n\n /**\n * Formats percentage label for pie slice.\n */\n private formatPercentageLabel(value: number, total: number): string {\n const percentage = total > 0 ? Math.round((value / total) * 100) : 0;\n return percentage === 0 ? '' : `${percentage}%`;\n }\n\n /**\n * Updates the ECharts instance with new options.\n */\n private updateChartInstance(options: EChartsOption): void {\n if (this.echartsInstance) {\n this.echartsInstance.setOption(options, true);\n }\n }\n\n /**\n * Encodes HTML to prevent XSS attacks.\n */\n private encodeHtml(text: string): string {\n return echarts.format.encodeHTML(text);\n }\n}\n","<div class=\"p-relative fit-h overflow-hidden\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n","import { Component, inject, Input, OnDestroy, OnInit, TemplateRef, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { PieChartConfig } from '../pie-chart.model';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { Observable, Subject } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { PieChartWidgetViewComponent } from '../pie-chart-widget-view/pie-chart-widget-view.component';\n\n@Component({\n selector: 'app-pie-chart-config',\n templateUrl: './pie-chart-widget-config.component.html',\n imports: [\n CommonModule,\n CoreModule,\n DatapointSelectorModule,\n FormsModule,\n ReactiveFormsModule,\n PieChartWidgetViewComponent\n ],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class PieChartWidgetConfigComponent implements OnInit, OnDestroy {\n @Input() config: PieChartConfig;\n formGroup!: ReturnType<PieChartWidgetConfigComponent['initForm']>;\n private readonly destroy$ = new Subject<void>();\n\n @ViewChild('pieChartPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly formBuilder = inject(FormBuilder);\n\n ngOnInit() {\n this.formGroup = this.initForm();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: PieChartConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (!this.formGroup.valid || !config) return false;\n\n const formValue = this.formGroup.value;\n config.pieChartOptions = config.pieChartOptions || {\n showLabels: false,\n showLegend: false,\n showTooltips: false\n };\n config.pieChartOptions.showLabels = formValue.pieChartOptions.showLabels;\n config.pieChartOptions.showLegend = formValue.pieChartOptions.showLegend;\n config.pieChartOptions.showTooltips = formValue.pieChartOptions.showTooltips;\n\n this.widgetConfigService.updateConfig(config);\n\n return true;\n }\n\n private initForm() {\n const form = this.formBuilder.group({\n pieChartOptions: this.formBuilder.group({\n showLabels: [this.config.pieChartOptions?.showLabels ?? false],\n showLegend: [this.config.pieChartOptions?.showLegend ?? false],\n showTooltips: [this.config.pieChartOptions?.showTooltips ?? false]\n })\n });\n return form;\n }\n}\n","@if (formGroup) {\n <div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Pie chart options' | translate }}</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm p-b-8\"\n formGroupName=\"pieChartOptions\"\n >\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLabels\"\n />\n <span></span>\n <span>\n {{ 'Show labels' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLegend\"\n />\n <span></span>\n <span>\n {{ 'Show legend' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showTooltips\"\n />\n <span></span>\n <span>\n {{ 'Show tooltips' | translate }}\n </span>\n </label>\n </div>\n </fieldset>\n </div>\n\n <ng-template #pieChartPreview>\n @if (config.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: config.datapoints,\n pieChartOptions: {\n showLabels: formGroup.value.pieChartOptions.showLabels,\n showLegend: formGroup.value.pieChartOptions.showLegend,\n showTooltips: formGroup.value.pieChartOptions.showTooltips\n }\n }\"\n ></c8y-pie-chart>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["map","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-pie-chart.mjs","sources":["../../widgets/implementations/pie-chart/current-measurement.service.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-view/pie-chart-widget-view.component.html","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.ts","../../widgets/implementations/pie-chart/pie-chart-widget-config/pie-chart-widget-config.component.html","../../widgets/implementations/pie-chart/c8y-ngx-components-widgets-implementations-pie-chart.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { MeasurementRealtimeService } from '@c8y/ngx-components';\nimport { IMeasurementValue } from '@c8y/client';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { Observable, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class CurrentMeasurementService {\n constructor(private realtime: MeasurementRealtimeService) {}\n\n /**\n * Fetches the latest measurement value for a given datapoint.\n * Combines initial historical value with realtime updates.\n *\n * @param datapoint - The KPI datapoint configuration\n * @returns Observable emitting measurement value, unit, date, and notFound flag\n */\n getLatest(datapoint: KPIDetails): Observable<{\n value: number;\n unit: string;\n date: string;\n notFound?: boolean;\n }> {\n return this.realtime\n .latestValueOfSpecificMeasurement$(\n datapoint.fragment,\n datapoint.series,\n datapoint.__target,\n 1,\n true\n )\n .pipe(\n map(m => {\n if (!m) {\n return {\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n };\n }\n\n const v: IMeasurementValue = m[datapoint.fragment][datapoint.series];\n return {\n value: v.value,\n unit: v.unit || datapoint.unit,\n date: m.time\n };\n }),\n catchError(() =>\n of({\n value: Number.NaN,\n unit: datapoint.unit || '',\n date: '',\n notFound: true\n })\n )\n );\n }\n}\n","import {\n Component,\n ElementRef,\n inject,\n Input,\n OnChanges,\n SimpleChanges,\n ChangeDetectionStrategy,\n ViewChild\n} from '@angular/core';\nimport {\n DatapointValue,\n MeasurementValue,\n PieChartConfig,\n PieChartOptions\n} from '../pie-chart.model';\nimport { ECharts } from 'echarts/core';\nimport { BehaviorSubject, combineLatest, map, Observable, switchMap, tap } from 'rxjs';\nimport { NGX_ECHARTS_CONFIG, NgxEchartsModule } from 'ngx-echarts';\nimport { AsyncPipe } from '@angular/common';\nimport { CurrentMeasurementService } from '../current-measurement.service';\nimport {\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n MeasurementRealtimeService,\n translateDatapointLabel,\n translateDatapointUnit\n} from '@c8y/ngx-components';\nimport { ChartAlertsComponent } from '@c8y/ngx-components/echart';\nimport { TranslateService } from '@ngx-translate/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport * as echarts from 'echarts';\nimport type { EChartsOption, PieSeriesOption, DefaultLabelFormatterCallbackParams } from 'echarts';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\n\n/** Chart layout constants */\nconst CHART_LAYOUT = {\n PIE_CENTER: ['50%', '45%'] as [string, string],\n PIE_RADIUS: '80%',\n LEGEND_BOTTOM: '2%',\n EMPTY_STATE_FONT_SIZE: 30\n} as const;\n\n@Component({\n selector: 'c8y-pie-chart',\n templateUrl: './pie-chart-widget-view.component.html',\n providers: [\n MeasurementRealtimeService,\n CurrentMeasurementService,\n { provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }\n ],\n imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PieChartWidgetViewComponent implements OnChanges, DynamicComponent {\n @Input() config!: PieChartConfig;\n @ViewChild('chart', { static: false }) chart!: ElementRef;\n activeDatapoints: KPIDetails[] = [];\n\n chartOptions$!: Observable<EChartsOption>;\n alerts = new DynamicComponentAlertAggregator();\n echartsInstance!: ECharts;\n\n private readonly configChanged$ = new BehaviorSubject<void>(undefined);\n private readonly measurements = inject(CurrentMeasurementService);\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n this.chartOptions$ = this.configChanged$.pipe(\n switchMap(() => this.fetchMeasurements()),\n tap(entries => this.handleNegativeValues(entries)),\n map(entries => this.buildChartOptions(entries)),\n tap(options => this.updateChartInstance(options))\n );\n }\n\n ngOnChanges(_: SimpleChanges) {\n if (this.config?.datapoints?.length) {\n this.configChanged$.next();\n }\n }\n\n onChartInit(ec: ECharts) {\n this.echartsInstance = ec;\n }\n\n /**\n * Fetches latest measurements for all configured datapoints.\n */\n private fetchMeasurements(): Observable<DatapointValue[]> {\n this.activeDatapoints = this.config?.datapoints?.filter(dp => dp.__active);\n const streams = this.activeDatapoints.map(dp =>\n this.measurements.getLatest(dp).pipe(map(m => this.mapToDatapointValue(dp, m)))\n );\n return combineLatest(streams);\n }\n\n /**\n * Maps a datapoint and its measurement to a DatapointValue.\n */\n private mapToDatapointValue(\n datapoint: KPIDetails,\n measurement: MeasurementValue\n ): DatapointValue {\n const rawValue = measurement.value;\n return {\n label: translateDatapointLabel(datapoint.label, this.translateService),\n value: rawValue < 0 || Number.isNaN(rawValue) ? 0 : rawValue,\n rawValue,\n unit: translateDatapointUnit(datapoint.unit || measurement.unit, this.translateService),\n color: datapoint.color || ''\n };\n }\n\n /**\n * Handles negative value alerts - clears existing alerts and adds warning if needed.\n */\n private handleNegativeValues(entries: DatapointValue[]): void {\n this.alerts.clear();\n\n const negatives = entries.filter(e => e.rawValue < 0);\n if (negatives.length === 0) {\n return;\n }\n\n const negativeDpList = negatives\n .map(n => `${this.encodeHtml(n.label)}: ${n.rawValue} ${this.encodeHtml(n.unit)}`)\n .join('; ');\n\n const errorMessage = this.translateService.instant(\n gettext('Negative measurements received from data point(s): {{ datapoints }}'),\n { datapoints: negativeDpList }\n );\n\n this.alerts.addAlerts(new DynamicComponentAlert({ type: 'warning', text: errorMessage }));\n }\n\n /**\n * Builds the ECharts options based on datapoint values.\n */\n private buildChartOptions(datapoints: DatapointValue[]): EChartsOption {\n if (this.isEmptyState(datapoints)) {\n return this.buildEmptyStateOptions();\n }\n return this.buildPieChartOptions(datapoints);\n }\n\n /**\n * Checks if chart should display empty state (no positive data).\n */\n private isEmptyState(entries: DatapointValue[]): boolean {\n const hasPositiveData = entries.some(e => e.rawValue > 0);\n const hasNegativeData = entries.some(e => e.rawValue < 0);\n return !hasPositiveData && !hasNegativeData;\n }\n\n /**\n * Builds options for empty state display.\n */\n private buildEmptyStateOptions(): EChartsOption {\n return {\n title: {\n text: gettext('No data available.'),\n left: 'center',\n top: 'center',\n textStyle: { fontSize: CHART_LAYOUT.EMPTY_STATE_FONT_SIZE }\n },\n series: []\n };\n }\n\n /**\n * Builds the pie chart options with data.\n */\n private buildPieChartOptions(entries: DatapointValue[]): EChartsOption {\n const options = this.config.pieChartOptions;\n const total = this.calculateTotal(entries);\n\n return {\n tooltip: this.buildTooltipConfig(entries, options),\n legend: this.buildLegendConfig(options),\n series: [this.buildPieSeriesConfig(entries, total, options)]\n };\n }\n\n /**\n * Calculates total of all entry values.\n */\n private calculateTotal(entries: DatapointValue[]): number {\n return entries.reduce((sum, e) => sum + e.value, 0);\n }\n\n /**\n * Builds tooltip configuration.\n */\n private buildTooltipConfig(\n entries: DatapointValue[],\n options?: PieChartOptions\n ): EChartsOption['tooltip'] {\n return {\n show: options?.showTooltips ?? false,\n formatter: (params: DefaultLabelFormatterCallbackParams) => {\n const entry = entries.find(e => e.label === params.name);\n const unit = entry?.unit || '';\n const value = (params.value as number).toFixed(2);\n return `${this.encodeHtml(params.name as string)}: ${value} ${this.encodeHtml(unit)}`;\n }\n };\n }\n\n /**\n * Builds legend configuration.\n */\n private buildLegendConfig(options?: PieChartOptions): EChartsOption['legend'] {\n return {\n bottom: CHART_LAYOUT.LEGEND_BOTTOM,\n left: 'center',\n show: options?.showLegend ?? false,\n formatter: (name: string) => {\n const match = name.match(/^(.+)_\\d+$/);\n return match ? match[1] : name;\n }\n };\n }\n\n /**\n * Builds pie series configuration.\n */\n private buildPieSeriesConfig(\n entries: DatapointValue[],\n total: number,\n options?: PieChartOptions\n ): PieSeriesOption {\n const showLegend = options?.showLegend ?? false;\n return {\n center: showLegend ? CHART_LAYOUT.PIE_CENTER : ['50%', '50%'],\n type: 'pie',\n radius: CHART_LAYOUT.PIE_RADIUS,\n label: {\n show: options?.showLabels ?? false,\n position: 'inside',\n formatter: (params: DefaultLabelFormatterCallbackParams) =>\n this.formatPercentageLabel(params.value as number, total)\n },\n data: entries.map((e, index) => ({\n name: `${e.label}_${index}`,\n value: e.value,\n itemStyle: { color: e.color }\n }))\n };\n }\n\n /**\n * Formats percentage label for pie slice.\n */\n private formatPercentageLabel(value: number, total: number): string {\n const percentage = total > 0 ? Math.round((value / total) * 100) : 0;\n return percentage === 0 ? '' : `${percentage}%`;\n }\n\n /**\n * Updates the ECharts instance with new options.\n */\n private updateChartInstance(options: EChartsOption): void {\n if (this.echartsInstance) {\n this.echartsInstance.setOption(options, true);\n }\n }\n\n /**\n * Encodes HTML to prevent XSS attacks.\n */\n private encodeHtml(text: string): string {\n return echarts.format.encodeHTML(text);\n }\n}\n","<div class=\"p-relative fit-h overflow-hidden\">\n <div\n class=\"p-absolute fit-w fit-h\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n ></div>\n\n <c8y-chart-alerts [alerts]=\"alerts\"></c8y-chart-alerts>\n</div>\n","import { Component, inject, Input, OnDestroy, OnInit, TemplateRef, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { PieChartConfig } from '../pie-chart.model';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { Observable, Subject } from 'rxjs';\nimport { FormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';\nimport { CommonModule, CoreModule } from '@c8y/ngx-components';\nimport { PieChartWidgetViewComponent } from '../pie-chart-widget-view/pie-chart-widget-view.component';\n\n@Component({\n selector: 'app-pie-chart-config',\n templateUrl: './pie-chart-widget-config.component.html',\n imports: [\n CommonModule,\n CoreModule,\n DatapointSelectorModule,\n FormsModule,\n ReactiveFormsModule,\n PieChartWidgetViewComponent\n ],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class PieChartWidgetConfigComponent implements OnInit, OnDestroy {\n @Input() config: PieChartConfig;\n formGroup!: ReturnType<PieChartWidgetConfigComponent['initForm']>;\n private readonly destroy$ = new Subject<void>();\n\n @ViewChild('pieChartPreview')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly formBuilder = inject(FormBuilder);\n\n ngOnInit() {\n this.formGroup = this.initForm();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onBeforeSave(config?: PieChartConfig): boolean | Promise<boolean> | Observable<boolean> {\n if (!this.formGroup.valid || !config) return false;\n\n const formValue = this.formGroup.value;\n config.pieChartOptions = config.pieChartOptions || {\n showLabels: false,\n showLegend: false,\n showTooltips: false\n };\n config.pieChartOptions.showLabels = formValue.pieChartOptions.showLabels;\n config.pieChartOptions.showLegend = formValue.pieChartOptions.showLegend;\n config.pieChartOptions.showTooltips = formValue.pieChartOptions.showTooltips;\n\n this.widgetConfigService.updateConfig(config);\n\n return true;\n }\n\n private initForm() {\n const form = this.formBuilder.group({\n pieChartOptions: this.formBuilder.group({\n showLabels: [this.config.pieChartOptions?.showLabels ?? false],\n showLegend: [this.config.pieChartOptions?.showLegend ?? false],\n showTooltips: [this.config.pieChartOptions?.showTooltips ?? false]\n })\n });\n return form;\n }\n}\n","@if (formGroup) {\n <div [formGroup]=\"formGroup\">\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Pie chart options' | translate }}</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm p-b-8\"\n formGroupName=\"pieChartOptions\"\n >\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLabels\"\n />\n <span></span>\n <span>\n {{ 'Show labels' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showLegend\"\n />\n <span></span>\n <span>\n {{ 'Show legend' | translate }}\n </span>\n </label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n formControlName=\"showTooltips\"\n />\n <span></span>\n <span>\n {{ 'Show tooltips' | translate }}\n </span>\n </label>\n </div>\n </fieldset>\n </div>\n\n <ng-template #pieChartPreview>\n @if (config.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: config.datapoints,\n pieChartOptions: {\n showLabels: formGroup.value.pieChartOptions.showLabels,\n showLegend: formGroup.value.pieChartOptions.showLegend,\n showTooltips: formGroup.value.pieChartOptions.showTooltips\n }\n }\"\n ></c8y-pie-chart>\n } @else {\n <div class=\"col-md-6 d-col a-i-start j-c-center\">\n <c8y-ui-empty-state\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points selected' | translate\"\n [subtitle]=\"'Select data point to render content' | translate\"\n [horizontal]=\"false\"\n data-cy=\"kpi-widget--empty-state-no-data-point-selected\"\n >\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/widgets-collection/#kpi\">user documentation</a>.\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["map","i1"],"mappings":"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"}
|