@c8y/ngx-components 1023.30.0 → 1023.42.1
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/alarms/cockpit/index.d.ts.map +1 -1
- package/alarms/devicemanagement/index.d.ts.map +1 -1
- package/alarms/index.d.ts +25 -2
- package/alarms/index.d.ts.map +1 -1
- package/asset-properties/index.d.ts +20 -2
- package/asset-properties/index.d.ts.map +1 -1
- package/bookmarks/index.d.ts +15 -7
- package/bookmarks/index.d.ts.map +1 -1
- package/context-dashboard/index.d.ts.map +1 -1
- package/datapoint-explorer/view/index.d.ts +2 -0
- package/datapoint-explorer/view/index.d.ts.map +1 -1
- package/device-grid/index.d.ts.map +1 -1
- package/echart/index.d.ts +19 -3
- package/echart/index.d.ts.map +1 -1
- package/feature-toggles/index.d.ts +6 -0
- package/feature-toggles/index.d.ts.map +1 -0
- package/feature-toggles/list/index.d.ts +63 -0
- package/feature-toggles/list/index.d.ts.map +1 -0
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs +6 -11
- package/fesm2022/c8y-ngx-components-alarms-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs +37 -11
- package/fesm2022/c8y-ngx-components-alarms-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +58 -10
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +36 -12
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-B04ixTyA.mjs → c8y-ngx-components-asset-property-grid.component-BoVrIpap.mjs} +5 -12
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-BoVrIpap.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +86 -39
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +2 -2
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +3 -2
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +21 -36
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +5 -2
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +101 -42
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs +3 -3
- package/fesm2022/c8y-ngx-components-ecosystem-plugin-setup-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-feature-toggles-list.mjs +242 -0
- package/fesm2022/c8y-ngx-components-feature-toggles-list.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-feature-toggles.mjs +36 -0
- package/fesm2022/c8y-ngx-components-feature-toggles.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-global-context.mjs +60 -17
- package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +127 -33
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +2 -2
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +7 -3
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade-not-found.component-CuCuYAkK.mjs +19 -0
- package/fesm2022/c8y-ngx-components-upgrade-not-found.component-CuCuYAkK.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-upgrade.mjs +46 -4
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-pie-chart.mjs +30 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-pie-chart.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
- package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +5 -5
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +4 -4
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs +4 -3
- package/fesm2022/c8y-ngx-components-widgets-implementations-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +18 -11
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +156 -67
- package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs +366 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-pie-chart.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-widget-providers.mjs +5 -2
- package/fesm2022/c8y-ngx-components-widgets-widget-providers.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +44 -15
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/global-context/index.d.ts +23 -4
- package/global-context/index.d.ts.map +1 -1
- package/index.d.ts +11 -1
- package/index.d.ts.map +1 -1
- package/locales/de.po +261 -143
- package/locales/es.po +155 -53
- package/locales/fr.po +299 -193
- package/locales/ja_JP.po +346 -252
- package/locales/ko.po +154 -54
- package/locales/locales.pot +142 -41
- package/locales/nl.po +156 -54
- package/locales/pl.po +155 -53
- package/locales/pt_BR.po +154 -54
- package/locales/zh_CN.po +155 -53
- package/locales/zh_TW.po +156 -54
- package/map/index.d.ts +41 -10
- package/map/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/trusted-certificates/index.d.ts +2 -0
- package/trusted-certificates/index.d.ts.map +1 -1
- package/upgrade/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/definitions/pie-chart/index.d.ts +25 -0
- package/widgets/definitions/pie-chart/index.d.ts.map +1 -0
- package/widgets/device-management-exports/index.d.ts +6 -0
- package/widgets/device-management-exports/index.d.ts.map +1 -1
- package/widgets/exports/index.d.ts +8 -1
- package/widgets/exports/index.d.ts.map +1 -1
- package/widgets/implementations/html-widget/index.d.ts +2 -2
- package/widgets/implementations/html-widget/index.d.ts.map +1 -1
- package/widgets/implementations/map/index.d.ts +1 -0
- package/widgets/implementations/map/index.d.ts.map +1 -1
- package/widgets/implementations/markdown/index.d.ts +52 -18
- package/widgets/implementations/markdown/index.d.ts.map +1 -1
- package/widgets/implementations/pie-chart/index.d.ts +129 -0
- package/widgets/implementations/pie-chart/index.d.ts.map +1 -0
- package/widgets/widget-providers/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-B04ixTyA.mjs.map +0 -1
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, inject, ViewChild, Input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';
|
|
4
|
+
import { of, BehaviorSubject, switchMap, tap, map as map$1, combineLatest, Subject } from 'rxjs';
|
|
5
|
+
import { map, catchError, takeUntil } from 'rxjs/operators';
|
|
6
|
+
import * as i2 from '@angular/forms';
|
|
7
|
+
import { FormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
8
|
+
import * as i3 from '@c8y/ngx-components/datapoint-selector';
|
|
9
|
+
import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
|
|
10
|
+
import * as i1 from '@c8y/ngx-components';
|
|
11
|
+
import { DynamicComponentAlertAggregator, DynamicComponentAlert, MeasurementRealtimeService, CommonModule, CoreModule } from '@c8y/ngx-components';
|
|
12
|
+
import * as i1$1 from 'ngx-echarts';
|
|
13
|
+
import { NgxEchartsModule, NGX_ECHARTS_CONFIG } from 'ngx-echarts';
|
|
14
|
+
import { AsyncPipe } from '@angular/common';
|
|
15
|
+
import { ChartAlertsComponent } from '@c8y/ngx-components/echart';
|
|
16
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
17
|
+
import { gettext } from '@c8y/ngx-components/gettext';
|
|
18
|
+
import * as echarts from 'echarts';
|
|
19
|
+
|
|
20
|
+
class CurrentMeasurementService {
|
|
21
|
+
constructor(realtime) {
|
|
22
|
+
this.realtime = realtime;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetches the latest measurement value for a given datapoint.
|
|
26
|
+
* Combines initial historical value with realtime updates.
|
|
27
|
+
*
|
|
28
|
+
* @param datapoint - The KPI datapoint configuration
|
|
29
|
+
* @returns Observable emitting measurement value, unit, date, and notFound flag
|
|
30
|
+
*/
|
|
31
|
+
getLatest(datapoint) {
|
|
32
|
+
return this.realtime
|
|
33
|
+
.latestValueOfSpecificMeasurement$(datapoint.fragment, datapoint.series, datapoint.__target, 1, true)
|
|
34
|
+
.pipe(map(m => {
|
|
35
|
+
if (!m) {
|
|
36
|
+
return {
|
|
37
|
+
value: Number.NaN,
|
|
38
|
+
unit: datapoint.unit || '',
|
|
39
|
+
date: '',
|
|
40
|
+
notFound: true
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const v = m[datapoint.fragment][datapoint.series];
|
|
44
|
+
return {
|
|
45
|
+
value: v.value,
|
|
46
|
+
unit: v.unit || datapoint.unit,
|
|
47
|
+
date: m.time
|
|
48
|
+
};
|
|
49
|
+
}), catchError(() => of({
|
|
50
|
+
value: Number.NaN,
|
|
51
|
+
unit: datapoint.unit || '',
|
|
52
|
+
date: '',
|
|
53
|
+
notFound: true
|
|
54
|
+
})));
|
|
55
|
+
}
|
|
56
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CurrentMeasurementService, deps: [{ token: i1.MeasurementRealtimeService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
57
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CurrentMeasurementService, providedIn: 'root' }); }
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: CurrentMeasurementService, decorators: [{
|
|
60
|
+
type: Injectable,
|
|
61
|
+
args: [{ providedIn: 'root' }]
|
|
62
|
+
}], ctorParameters: () => [{ type: i1.MeasurementRealtimeService }] });
|
|
63
|
+
|
|
64
|
+
/** Chart layout constants */
|
|
65
|
+
const CHART_LAYOUT = {
|
|
66
|
+
LEGEND_TOP: '5%',
|
|
67
|
+
SERIES_TOP: '5%',
|
|
68
|
+
PIE_RADIUS: '80%',
|
|
69
|
+
EMPTY_STATE_FONT_SIZE: 30
|
|
70
|
+
};
|
|
71
|
+
class PieChartWidgetViewComponent {
|
|
72
|
+
constructor() {
|
|
73
|
+
this.activeDatapoints = [];
|
|
74
|
+
this.alerts = new DynamicComponentAlertAggregator();
|
|
75
|
+
this.configChanged$ = new BehaviorSubject(undefined);
|
|
76
|
+
this.measurements = inject(CurrentMeasurementService);
|
|
77
|
+
this.translateService = inject(TranslateService);
|
|
78
|
+
this.chartOptions$ = this.configChanged$.pipe(switchMap(() => this.fetchMeasurements()), tap(entries => this.handleNegativeValues(entries)), map$1(entries => this.buildChartOptions(entries)), tap(options => this.updateChartInstance(options)));
|
|
79
|
+
}
|
|
80
|
+
ngOnChanges(_) {
|
|
81
|
+
if (this.config?.datapoints?.length) {
|
|
82
|
+
this.configChanged$.next();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
onChartInit(ec) {
|
|
86
|
+
this.echartsInstance = ec;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fetches latest measurements for all configured datapoints.
|
|
90
|
+
*/
|
|
91
|
+
fetchMeasurements() {
|
|
92
|
+
this.activeDatapoints = this.config?.datapoints?.filter(dp => dp.__active);
|
|
93
|
+
const streams = this.activeDatapoints.map(dp => this.measurements.getLatest(dp).pipe(map$1(m => this.mapToDatapointValue(dp, m))));
|
|
94
|
+
return combineLatest(streams);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Maps a datapoint and its measurement to a DatapointValue.
|
|
98
|
+
*/
|
|
99
|
+
mapToDatapointValue(datapoint, measurement) {
|
|
100
|
+
const rawValue = measurement.value;
|
|
101
|
+
return {
|
|
102
|
+
label: datapoint.label || '',
|
|
103
|
+
value: rawValue < 0 || Number.isNaN(rawValue) ? 0 : rawValue,
|
|
104
|
+
rawValue,
|
|
105
|
+
unit: datapoint.unit || measurement.unit || '',
|
|
106
|
+
color: datapoint.color || ''
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Handles negative value alerts - clears existing alerts and adds warning if needed.
|
|
111
|
+
*/
|
|
112
|
+
handleNegativeValues(entries) {
|
|
113
|
+
this.alerts.clear();
|
|
114
|
+
const negatives = entries.filter(e => e.rawValue < 0);
|
|
115
|
+
if (negatives.length === 0) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const negativeDpList = negatives
|
|
119
|
+
.map(n => `${this.encodeHtml(n.label)}: ${n.rawValue} ${this.encodeHtml(n.unit)}`)
|
|
120
|
+
.join('; ');
|
|
121
|
+
const errorMessage = this.translateService.instant(gettext('Negative measurements received from data point(s): {{ datapoints }}'), { datapoints: negativeDpList });
|
|
122
|
+
this.alerts.addAlerts(new DynamicComponentAlert({ type: 'warning', text: errorMessage }));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Builds the ECharts options based on datapoint values.
|
|
126
|
+
*/
|
|
127
|
+
buildChartOptions(datapoints) {
|
|
128
|
+
if (this.isEmptyState(datapoints)) {
|
|
129
|
+
return this.buildEmptyStateOptions();
|
|
130
|
+
}
|
|
131
|
+
return this.buildPieChartOptions(datapoints);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Checks if chart should display empty state (no positive data).
|
|
135
|
+
*/
|
|
136
|
+
isEmptyState(entries) {
|
|
137
|
+
const hasPositiveData = entries.some(e => e.rawValue > 0);
|
|
138
|
+
const hasNegativeData = entries.some(e => e.rawValue < 0);
|
|
139
|
+
return !hasPositiveData && !hasNegativeData;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Builds options for empty state display.
|
|
143
|
+
*/
|
|
144
|
+
buildEmptyStateOptions() {
|
|
145
|
+
return {
|
|
146
|
+
title: {
|
|
147
|
+
text: gettext('No data available.'),
|
|
148
|
+
left: 'center',
|
|
149
|
+
top: 'center',
|
|
150
|
+
textStyle: { fontSize: CHART_LAYOUT.EMPTY_STATE_FONT_SIZE }
|
|
151
|
+
},
|
|
152
|
+
series: []
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Builds the pie chart options with data.
|
|
157
|
+
*/
|
|
158
|
+
buildPieChartOptions(entries) {
|
|
159
|
+
const options = this.config.pieChartOptions;
|
|
160
|
+
const total = this.calculateTotal(entries);
|
|
161
|
+
return {
|
|
162
|
+
tooltip: this.buildTooltipConfig(entries, options),
|
|
163
|
+
legend: this.buildLegendConfig(options),
|
|
164
|
+
series: [this.buildPieSeriesConfig(entries, total, options)]
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Calculates total of all entry values.
|
|
169
|
+
*/
|
|
170
|
+
calculateTotal(entries) {
|
|
171
|
+
return entries.reduce((sum, e) => sum + e.value, 0);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Builds tooltip configuration.
|
|
175
|
+
*/
|
|
176
|
+
buildTooltipConfig(entries, options) {
|
|
177
|
+
return {
|
|
178
|
+
show: options?.showTooltips ?? false,
|
|
179
|
+
formatter: (params) => {
|
|
180
|
+
const entry = entries.find(e => e.label === params.name);
|
|
181
|
+
const unit = entry?.unit || '';
|
|
182
|
+
const value = params.value.toFixed(2);
|
|
183
|
+
return `${this.encodeHtml(params.name)}: ${value} ${this.encodeHtml(unit)}`;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Builds legend configuration.
|
|
189
|
+
*/
|
|
190
|
+
buildLegendConfig(options) {
|
|
191
|
+
return {
|
|
192
|
+
top: CHART_LAYOUT.LEGEND_TOP,
|
|
193
|
+
left: 'right',
|
|
194
|
+
show: options?.showLegend ?? false,
|
|
195
|
+
formatter: (name) => {
|
|
196
|
+
const match = name.match(/^(.+)_\d+$/);
|
|
197
|
+
return match ? match[1] : name;
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Builds pie series configuration.
|
|
203
|
+
*/
|
|
204
|
+
buildPieSeriesConfig(entries, total, options) {
|
|
205
|
+
return {
|
|
206
|
+
top: CHART_LAYOUT.SERIES_TOP,
|
|
207
|
+
type: 'pie',
|
|
208
|
+
radius: CHART_LAYOUT.PIE_RADIUS,
|
|
209
|
+
label: {
|
|
210
|
+
show: options?.showLabels ?? false,
|
|
211
|
+
position: 'inside',
|
|
212
|
+
formatter: (params) => this.formatPercentageLabel(params.value, total)
|
|
213
|
+
},
|
|
214
|
+
data: entries.map((e, index) => ({
|
|
215
|
+
name: `${e.label}_${index}`,
|
|
216
|
+
value: e.value,
|
|
217
|
+
itemStyle: { color: e.color }
|
|
218
|
+
}))
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Formats percentage label for pie slice.
|
|
223
|
+
*/
|
|
224
|
+
formatPercentageLabel(value, total) {
|
|
225
|
+
const percentage = total > 0 ? Math.round((value / total) * 100) : 0;
|
|
226
|
+
return percentage === 0 ? '' : `${percentage}%`;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Updates the ECharts instance with new options.
|
|
230
|
+
*/
|
|
231
|
+
updateChartInstance(options) {
|
|
232
|
+
if (this.echartsInstance) {
|
|
233
|
+
this.echartsInstance.setOption(options, true);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Encodes HTML to prevent XSS attacks.
|
|
238
|
+
*/
|
|
239
|
+
encodeHtml(text) {
|
|
240
|
+
return echarts.format.encodeHTML(text);
|
|
241
|
+
}
|
|
242
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PieChartWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
243
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: PieChartWidgetViewComponent, isStandalone: true, selector: "c8y-pie-chart", inputs: { config: "config" }, providers: [
|
|
244
|
+
MeasurementRealtimeService,
|
|
245
|
+
CurrentMeasurementService,
|
|
246
|
+
{ provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }
|
|
247
|
+
], viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"p-relative fit-h\">\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", dependencies: [{ kind: "ngmodule", type: NgxEchartsModule }, { kind: "directive", type: i1$1.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }, { kind: "component", type: ChartAlertsComponent, selector: "c8y-chart-alerts", inputs: ["alerts"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
248
|
+
}
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PieChartWidgetViewComponent, decorators: [{
|
|
250
|
+
type: Component,
|
|
251
|
+
args: [{ selector: 'c8y-pie-chart', providers: [
|
|
252
|
+
MeasurementRealtimeService,
|
|
253
|
+
CurrentMeasurementService,
|
|
254
|
+
{ provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) }
|
|
255
|
+
], imports: [NgxEchartsModule, AsyncPipe, ChartAlertsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"p-relative fit-h\">\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" }]
|
|
256
|
+
}], ctorParameters: () => [], propDecorators: { config: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}], chart: [{
|
|
259
|
+
type: ViewChild,
|
|
260
|
+
args: ['chart', { static: false }]
|
|
261
|
+
}] } });
|
|
262
|
+
|
|
263
|
+
class PieChartWidgetConfigComponent {
|
|
264
|
+
constructor() {
|
|
265
|
+
this.differentUnits = false;
|
|
266
|
+
this.destroy$ = new Subject();
|
|
267
|
+
this.widgetConfigService = inject(WidgetConfigService);
|
|
268
|
+
this.formBuilder = inject(FormBuilder);
|
|
269
|
+
}
|
|
270
|
+
set previewMapSet(template) {
|
|
271
|
+
if (template) {
|
|
272
|
+
this.widgetConfigService.setPreview(template);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
this.widgetConfigService.setPreview(null);
|
|
276
|
+
}
|
|
277
|
+
ngOnInit() {
|
|
278
|
+
this.formGroup = this.initForm();
|
|
279
|
+
this.subscribeToDatapointsChanges();
|
|
280
|
+
}
|
|
281
|
+
ngOnDestroy() {
|
|
282
|
+
this.destroy$.next();
|
|
283
|
+
this.destroy$.complete();
|
|
284
|
+
}
|
|
285
|
+
onBeforeSave(config) {
|
|
286
|
+
if (!this.formGroup.valid || !config)
|
|
287
|
+
return false;
|
|
288
|
+
const formValue = this.formGroup.value;
|
|
289
|
+
config.datapoints = formValue.datapoints;
|
|
290
|
+
config.pieChartOptions = config.pieChartOptions || {
|
|
291
|
+
showLabels: false,
|
|
292
|
+
showLegend: false,
|
|
293
|
+
showTooltips: false
|
|
294
|
+
};
|
|
295
|
+
config.pieChartOptions.showLabels = formValue.pieChartOptions.showLabels;
|
|
296
|
+
config.pieChartOptions.showLegend = formValue.pieChartOptions.showLegend;
|
|
297
|
+
config.pieChartOptions.showTooltips = formValue.pieChartOptions.showTooltips;
|
|
298
|
+
this.widgetConfigService.updateConfig(config);
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
initForm() {
|
|
302
|
+
const form = this.formBuilder.group({
|
|
303
|
+
datapoints: [this.config.datapoints, [Validators.required, Validators.minLength(1)]],
|
|
304
|
+
pieChartOptions: this.formBuilder.group({
|
|
305
|
+
showLabels: [this.config.pieChartOptions?.showLabels ?? false],
|
|
306
|
+
showLegend: [this.config.pieChartOptions?.showLegend ?? false],
|
|
307
|
+
showTooltips: [this.config.pieChartOptions?.showTooltips ?? false]
|
|
308
|
+
})
|
|
309
|
+
});
|
|
310
|
+
return form;
|
|
311
|
+
}
|
|
312
|
+
subscribeToDatapointsChanges() {
|
|
313
|
+
this.formGroup
|
|
314
|
+
.get('datapoints')
|
|
315
|
+
?.valueChanges.pipe(takeUntil(this.destroy$))
|
|
316
|
+
.subscribe(datapoints => {
|
|
317
|
+
this.checkUnitsMatch(datapoints);
|
|
318
|
+
});
|
|
319
|
+
// Initial check
|
|
320
|
+
this.checkUnitsMatch(this.formGroup.get('datapoints')?.value);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Checks if selected datapoints have different units and sets warning flag.
|
|
324
|
+
* Different units in a pie chart can be misleading to users.
|
|
325
|
+
*
|
|
326
|
+
* @param datapoints - Array of selected datapoints to check
|
|
327
|
+
*/
|
|
328
|
+
checkUnitsMatch(datapoints) {
|
|
329
|
+
if (!datapoints || datapoints.length <= 1) {
|
|
330
|
+
this.differentUnits = false;
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const units = datapoints.filter(dp => dp && dp.unit).map(dp => dp.unit);
|
|
334
|
+
if (units.length <= 1) {
|
|
335
|
+
this.differentUnits = false;
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const firstUnit = units[0];
|
|
339
|
+
this.differentUnits = units.some(unit => unit !== firstUnit);
|
|
340
|
+
}
|
|
341
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PieChartWidgetConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
342
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: PieChartWidgetConfigComponent, isStandalone: true, selector: "app-pie-chart-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMapSet", first: true, predicate: ["pieChartPreview"], descendants: true }], ngImport: i0, template: "@if (formGroup) {\n <form\n class=\"p-4\"\n [formGroup]=\"formGroup\"\n >\n <c8y-datapoint-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n >\n @if (differentUnits) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n <i class=\"c8y-icon c8y-icon-warning text-warning\"></i>\n {{ 'Selected data points have different units.' | translate }}\n </div>\n }\n </c8y-datapoint-selection-list>\n\n <fieldset class=\"c8y-fieldset m-t-16 p-b-8\">\n <legend>Pie chart options</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm\"\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 </form>\n\n <ng-template #pieChartPreview>\n @if (formGroup.value.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: formGroup.value.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 .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: i1.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: CoreModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i1.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: DatapointSelectorModule }, { kind: "component", type: i3.DatapointSelectionListComponent, selector: "c8y-datapoint-selection-list", inputs: ["actions", "allowDragAndDrop", "config", "defaultFormOptions", "maxActiveCount", "minActiveCount", "resolveContext", "listTitle"], outputs: ["isValid", "change"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: PieChartWidgetViewComponent, selector: "c8y-pie-chart", inputs: ["config"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); }
|
|
343
|
+
}
|
|
344
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: PieChartWidgetConfigComponent, decorators: [{
|
|
345
|
+
type: Component,
|
|
346
|
+
args: [{ selector: 'app-pie-chart-config', imports: [
|
|
347
|
+
CommonModule,
|
|
348
|
+
CoreModule,
|
|
349
|
+
DatapointSelectorModule,
|
|
350
|
+
FormsModule,
|
|
351
|
+
ReactiveFormsModule,
|
|
352
|
+
PieChartWidgetViewComponent
|
|
353
|
+
], template: "@if (formGroup) {\n <form\n class=\"p-4\"\n [formGroup]=\"formGroup\"\n >\n <c8y-datapoint-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n >\n @if (differentUnits) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n <i class=\"c8y-icon c8y-icon-warning text-warning\"></i>\n {{ 'Selected data points have different units.' | translate }}\n </div>\n }\n </c8y-datapoint-selection-list>\n\n <fieldset class=\"c8y-fieldset m-t-16 p-b-8\">\n <legend>Pie chart options</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm\"\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 </form>\n\n <ng-template #pieChartPreview>\n @if (formGroup.value.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: formGroup.value.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 .\n </small>\n </p>\n </c8y-ui-empty-state>\n </div>\n }\n </ng-template>\n}\n" }]
|
|
354
|
+
}], propDecorators: { config: [{
|
|
355
|
+
type: Input
|
|
356
|
+
}], previewMapSet: [{
|
|
357
|
+
type: ViewChild,
|
|
358
|
+
args: ['pieChartPreview']
|
|
359
|
+
}] } });
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Generated bundle index. Do not edit.
|
|
363
|
+
*/
|
|
364
|
+
|
|
365
|
+
export { PieChartWidgetConfigComponent, PieChartWidgetViewComponent };
|
|
366
|
+
//# sourceMappingURL=c8y-ngx-components-widgets-implementations-pie-chart.mjs.map
|
|
@@ -0,0 +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 } from 'echarts';\nimport { KPIDetails } from '@c8y/ngx-components/datapoint-selector';\nimport { CallbackDataParams } from 'echarts/types/dist/shared';\n\n/** Chart layout constants */\nconst CHART_LAYOUT = {\n LEGEND_TOP: '5%',\n SERIES_TOP: '5%',\n PIE_RADIUS: '80%',\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: CallbackDataParams) => {\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 top: CHART_LAYOUT.LEGEND_TOP,\n left: 'right',\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 return {\n top: CHART_LAYOUT.SERIES_TOP,\n type: 'pie',\n radius: CHART_LAYOUT.PIE_RADIUS,\n label: {\n show: options?.showLabels ?? false,\n position: 'inside',\n formatter: (params: CallbackDataParams) =>\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\">\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 } from '@angular/core';\nimport { PieChartConfig } from '../pie-chart.model';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { DatapointSelectorModule, KPIDetails } 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})\nexport class PieChartWidgetConfigComponent implements OnInit, OnDestroy {\n @Input() config: PieChartConfig;\n formGroup!: ReturnType<PieChartWidgetConfigComponent['initForm']>;\n differentUnits = false;\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 this.subscribeToDatapointsChanges();\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.datapoints = formValue.datapoints;\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 datapoints: [this.config.datapoints, [Validators.required, Validators.minLength(1)]],\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 private subscribeToDatapointsChanges() {\n this.formGroup\n .get('datapoints')\n ?.valueChanges.pipe(takeUntil(this.destroy$))\n .subscribe(datapoints => {\n this.checkUnitsMatch(datapoints);\n });\n\n // Initial check\n this.checkUnitsMatch(this.formGroup.get('datapoints')?.value);\n }\n\n /**\n * Checks if selected datapoints have different units and sets warning flag.\n * Different units in a pie chart can be misleading to users.\n *\n * @param datapoints - Array of selected datapoints to check\n */\n private checkUnitsMatch(datapoints: KPIDetails[]) {\n if (!datapoints || datapoints.length <= 1) {\n this.differentUnits = false;\n return;\n }\n\n const units = datapoints.filter(dp => dp && dp.unit).map(dp => dp.unit);\n\n if (units.length <= 1) {\n this.differentUnits = false;\n return;\n }\n\n const firstUnit = units[0];\n this.differentUnits = units.some(unit => unit !== firstUnit);\n }\n}\n","@if (formGroup) {\n <form\n class=\"p-4\"\n [formGroup]=\"formGroup\"\n >\n <c8y-datapoint-selection-list\n class=\"bg-component separator-bottom d-block\"\n name=\"datapoints\"\n [minActiveCount]=\"1\"\n formControlName=\"datapoints\"\n >\n @if (differentUnits) {\n <div\n class=\"alert alert-warning m-t-8\"\n role=\"alert\"\n >\n <i class=\"c8y-icon c8y-icon-warning text-warning\"></i>\n {{ 'Selected data points have different units.' | translate }}\n </div>\n }\n </c8y-datapoint-selection-list>\n\n <fieldset class=\"c8y-fieldset m-t-16 p-b-8\">\n <legend>Pie chart options</legend>\n <div\n class=\"d-flex flex-column gap-8 form-group-sm\"\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 </form>\n\n <ng-template #pieChartPreview>\n @if (formGroup.value.datapoints?.length > 0) {\n <c8y-pie-chart\n class=\"w-100 h-100\"\n [config]=\"{\n datapoints: formGroup.value.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 .\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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"}
|
|
@@ -23,6 +23,7 @@ import { legacyCockpitWelcomeWidgetProviders } from '@c8y/ngx-components/widgets
|
|
|
23
23
|
import { deviceManagementWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/device-management-welcome';
|
|
24
24
|
import { assetNotesWidgetProviders } from '@c8y/ngx-components/widgets/definitions/asset-notes';
|
|
25
25
|
import { eventListWidgetProviders } from '@c8y/ngx-components/widgets/definitions/event-list';
|
|
26
|
+
import { pieChartWidgetProviders } from '@c8y/ngx-components/widgets/definitions/pie-chart';
|
|
26
27
|
|
|
27
28
|
/**
|
|
28
29
|
* Map of widget IDs to their respective providers
|
|
@@ -53,7 +54,8 @@ const WIDGET_PROVIDERS_MAP = {
|
|
|
53
54
|
[defaultWidgetIds.LEGACY_COCKPIT_WELCOME]: legacyCockpitWelcomeWidgetProviders,
|
|
54
55
|
[defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME]: deviceManagementWelcomeWidgetProviders,
|
|
55
56
|
[defaultWidgetIds.ASSET_NOTES]: assetNotesWidgetProviders,
|
|
56
|
-
[defaultWidgetIds.EVENT_LIST]: eventListWidgetProviders
|
|
57
|
+
[defaultWidgetIds.EVENT_LIST]: eventListWidgetProviders,
|
|
58
|
+
[defaultWidgetIds.PIE_CHART]: pieChartWidgetProviders
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
61
|
* Default widgets that are typically useful
|
|
@@ -84,7 +86,8 @@ const DEFAULT_WIDGETS = [
|
|
|
84
86
|
defaultWidgetIds.LEGACY_COCKPIT_WELCOME,
|
|
85
87
|
defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME,
|
|
86
88
|
defaultWidgetIds.ASSET_NOTES,
|
|
87
|
-
defaultWidgetIds.EVENT_LIST
|
|
89
|
+
defaultWidgetIds.EVENT_LIST,
|
|
90
|
+
defaultWidgetIds.PIE_CHART
|
|
88
91
|
];
|
|
89
92
|
/**
|
|
90
93
|
* Configures and returns widget providers.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-widget-providers.mjs","sources":["../../widgets/widget-providers/index.ts","../../widgets/widget-providers/c8y-ngx-components-widgets-widget-providers.ts"],"sourcesContent":["import { Provider } from '@angular/core';\nimport { defaultWidgetIds, DefaultWidgetIdValues } from '@c8y/ngx-components/widgets/definitions';\nimport { alarmListWidgetProviders } from '@c8y/ngx-components/widgets/definitions/alarms/alarm-list';\nimport { criticalAlarmsWidgetProviders } from '@c8y/ngx-components/widgets/definitions/alarms/all-critical-alarms';\nimport { recentAlarmsWidgetProviders } from '@c8y/ngx-components/widgets/definitions/alarms/recent-alarms';\nimport { dataPointsTableWidgetProviders } from '@c8y/ngx-components/widgets/definitions/datapoints-table';\nimport { datapointGraphWidgetproviders } from '@c8y/ngx-components/widgets/definitions/datapoints-graph';\nimport { infoGaugeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/info-gauge';\nimport { kpiWidgetProviders } from '@c8y/ngx-components/widgets/definitions/kpi';\nimport { linearGaugeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/linear-gauge';\nimport { mapWidgetProviders } from '@c8y/ngx-components/widgets/definitions/map';\nimport { radialGaugeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/radial-gauge';\nimport { deviceControlMessageWidgetProviders } from '@c8y/ngx-components/widgets/definitions/device-control-message';\nimport { imageWidgetProviders } from '@c8y/ngx-components/widgets/definitions/image';\nimport { markdownWidgetProviders } from '@c8y/ngx-components/widgets/definitions/markdown';\nimport { htmlWidgetProviders } from '@c8y/ngx-components/widgets/definitions/html-widget';\nimport { helpAndServiceWidgetProviders } from '@c8y/ngx-components/widgets/definitions/help-and-service';\nimport { threeDRotationWidgetProviders } from '@c8y/ngx-components/widgets/definitions/three-d-rotation';\nimport { siloWidgetProviders } from '@c8y/ngx-components/widgets/definitions/silo';\nimport { applicationsWidgetProviders } from '@c8y/ngx-components/widgets/definitions/applications';\nimport { quickLinksWidgetProviders } from '@c8y/ngx-components/widgets/definitions/quick-links';\nimport { cockpitWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/cockpit-welcome';\nimport { legacyCockpitWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/cockpit-legacy-welcome';\nimport { deviceManagementWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/device-management-welcome';\nimport { assetNotesWidgetProviders } from '@c8y/ngx-components/widgets/definitions/asset-notes';\nimport { eventListWidgetProviders } from '@c8y/ngx-components/widgets/definitions/event-list';\n\n/**\n * Type representing all available widget IDs that can be configured\n * This ensures type safety when specifying widget IDs\n */\nexport type WidgetId = DefaultWidgetIdValues;\n\n/**\n * Configuration interface for widget providers\n */\nexport interface WidgetProvidersConfig {\n /**\n * List of widget IDs to exclude from the providers\n * Use defaultWidgetIds constants for type safety and autocomplete\n * @example { exclude: [defaultWidgetIds.HTML, defaultWidgetIds.MARKDOWN] }\n */\n exclude?: WidgetId[];\n}\n\n/**\n * Map of widget IDs to their respective providers\n * This includes both widget definitions and configuration hooks\n */\nconst WIDGET_PROVIDERS_MAP: Partial<Record<WidgetId, Provider[]>> = {\n [defaultWidgetIds.ALARM_LIST]: alarmListWidgetProviders,\n [defaultWidgetIds.ALL_CRITICAL_ALARMS]: criticalAlarmsWidgetProviders,\n [defaultWidgetIds.RECENT_ALARMS]: recentAlarmsWidgetProviders,\n [defaultWidgetIds.DATA_POINTS_TABLE]: dataPointsTableWidgetProviders,\n [defaultWidgetIds.DATAPOINTS_GRAPH]: datapointGraphWidgetproviders,\n [defaultWidgetIds.DATAPOINTS_GRAPH_NEW]: datapointGraphWidgetproviders,\n [defaultWidgetIds.KPI]: kpiWidgetProviders,\n [defaultWidgetIds.INFO_GAUGE]: infoGaugeWidgetProviders,\n [defaultWidgetIds.LINEAR_GAUGE]: linearGaugeWidgetProviders,\n [defaultWidgetIds.RADIAL_GAUGE]: radialGaugeWidgetProviders,\n [defaultWidgetIds.MAP]: mapWidgetProviders,\n [defaultWidgetIds.DEVICE_CONTROL_MESSAGE_WIDGET]: deviceControlMessageWidgetProviders,\n [defaultWidgetIds.THREE_D_ROTATION]: threeDRotationWidgetProviders,\n [defaultWidgetIds.SILO]: siloWidgetProviders,\n [defaultWidgetIds.APPLICATIONS]: applicationsWidgetProviders,\n [defaultWidgetIds.QUICK_LINKS]: quickLinksWidgetProviders,\n [defaultWidgetIds.HELP_AND_SERVICE]: helpAndServiceWidgetProviders,\n [defaultWidgetIds.IMAGE]: imageWidgetProviders,\n [defaultWidgetIds.MARKDOWN]: markdownWidgetProviders,\n [defaultWidgetIds.HTML]: htmlWidgetProviders,\n [defaultWidgetIds.COCKPIT_WELCOME]: cockpitWelcomeWidgetProviders,\n [defaultWidgetIds.LEGACY_COCKPIT_WELCOME]: legacyCockpitWelcomeWidgetProviders,\n [defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME]: deviceManagementWelcomeWidgetProviders,\n [defaultWidgetIds.ASSET_NOTES]: assetNotesWidgetProviders,\n [defaultWidgetIds.EVENT_LIST]: eventListWidgetProviders\n};\n\n/**\n * Default widgets that are typically useful\n * These are the widgets that will be loaded unless explicitly excluded\n */\nexport const DEFAULT_WIDGETS: WidgetId[] = [\n defaultWidgetIds.ALARM_LIST,\n defaultWidgetIds.ALL_CRITICAL_ALARMS,\n defaultWidgetIds.RECENT_ALARMS,\n defaultWidgetIds.DATA_POINTS_TABLE,\n defaultWidgetIds.DATAPOINTS_GRAPH,\n defaultWidgetIds.DATAPOINTS_GRAPH_NEW,\n defaultWidgetIds.KPI,\n defaultWidgetIds.INFO_GAUGE,\n defaultWidgetIds.LINEAR_GAUGE,\n defaultWidgetIds.RADIAL_GAUGE,\n defaultWidgetIds.MAP,\n defaultWidgetIds.DEVICE_CONTROL_MESSAGE_WIDGET,\n defaultWidgetIds.THREE_D_ROTATION,\n defaultWidgetIds.SILO,\n defaultWidgetIds.APPLICATIONS,\n defaultWidgetIds.QUICK_LINKS,\n defaultWidgetIds.HELP_AND_SERVICE,\n defaultWidgetIds.IMAGE,\n defaultWidgetIds.MARKDOWN,\n defaultWidgetIds.HTML,\n defaultWidgetIds.COCKPIT_WELCOME,\n defaultWidgetIds.LEGACY_COCKPIT_WELCOME,\n defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME,\n defaultWidgetIds.ASSET_NOTES,\n defaultWidgetIds.EVENT_LIST\n];\n\n/**\n * Configures and returns widget providers.\n *\n * This function allows selective loading of widget providers with their configuration hooks.\n * Unlike `cockpitWidgets()` which only provides widget definitions, this includes\n * the full providers with `hookWidgetConfig` registrations for features like widget preview.\n *\n * @param config Configuration options for widget providers\n * @returns Array of providers to be included in app.module.ts\n *\n * @example\n * ```typescript\n * // In app.module.ts\n * providers: [\n * ...configureWidgetProviders({\n * exclude: [defaultWidgetIds.HTML, defaultWidgetIds.MARKDOWN]\n * }),\n * // other providers\n * ]\n * ```\n *\n * @example\n * ```typescript\n * // Load all default widgets\n * providers: [\n * ...configureWidgetProviders(),\n * // other providers\n * ]\n * ```\n */\nexport function configureWidgetProviders(config: WidgetProvidersConfig = {}): Provider[] {\n const { exclude = [] } = config;\n const excludeSet = new Set(exclude);\n\n return DEFAULT_WIDGETS.filter(widgetId => !excludeSet.has(widgetId)).flatMap(widgetId => {\n const providers = WIDGET_PROVIDERS_MAP[widgetId];\n if (!providers) {\n console.warn(`Widget providers not found for widget ID: ${widgetId}`);\n return [];\n }\n return providers;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-widget-providers.mjs","sources":["../../widgets/widget-providers/index.ts","../../widgets/widget-providers/c8y-ngx-components-widgets-widget-providers.ts"],"sourcesContent":["import { Provider } from '@angular/core';\nimport { defaultWidgetIds, DefaultWidgetIdValues } from '@c8y/ngx-components/widgets/definitions';\nimport { alarmListWidgetProviders } from '@c8y/ngx-components/widgets/definitions/alarms/alarm-list';\nimport { criticalAlarmsWidgetProviders } from '@c8y/ngx-components/widgets/definitions/alarms/all-critical-alarms';\nimport { recentAlarmsWidgetProviders } from '@c8y/ngx-components/widgets/definitions/alarms/recent-alarms';\nimport { dataPointsTableWidgetProviders } from '@c8y/ngx-components/widgets/definitions/datapoints-table';\nimport { datapointGraphWidgetproviders } from '@c8y/ngx-components/widgets/definitions/datapoints-graph';\nimport { infoGaugeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/info-gauge';\nimport { kpiWidgetProviders } from '@c8y/ngx-components/widgets/definitions/kpi';\nimport { linearGaugeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/linear-gauge';\nimport { mapWidgetProviders } from '@c8y/ngx-components/widgets/definitions/map';\nimport { radialGaugeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/radial-gauge';\nimport { deviceControlMessageWidgetProviders } from '@c8y/ngx-components/widgets/definitions/device-control-message';\nimport { imageWidgetProviders } from '@c8y/ngx-components/widgets/definitions/image';\nimport { markdownWidgetProviders } from '@c8y/ngx-components/widgets/definitions/markdown';\nimport { htmlWidgetProviders } from '@c8y/ngx-components/widgets/definitions/html-widget';\nimport { helpAndServiceWidgetProviders } from '@c8y/ngx-components/widgets/definitions/help-and-service';\nimport { threeDRotationWidgetProviders } from '@c8y/ngx-components/widgets/definitions/three-d-rotation';\nimport { siloWidgetProviders } from '@c8y/ngx-components/widgets/definitions/silo';\nimport { applicationsWidgetProviders } from '@c8y/ngx-components/widgets/definitions/applications';\nimport { quickLinksWidgetProviders } from '@c8y/ngx-components/widgets/definitions/quick-links';\nimport { cockpitWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/cockpit-welcome';\nimport { legacyCockpitWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/cockpit-legacy-welcome';\nimport { deviceManagementWelcomeWidgetProviders } from '@c8y/ngx-components/widgets/definitions/device-management-welcome';\nimport { assetNotesWidgetProviders } from '@c8y/ngx-components/widgets/definitions/asset-notes';\nimport { eventListWidgetProviders } from '@c8y/ngx-components/widgets/definitions/event-list';\nimport { pieChartWidgetProviders } from '@c8y/ngx-components/widgets/definitions/pie-chart';\n\n/**\n * Type representing all available widget IDs that can be configured\n * This ensures type safety when specifying widget IDs\n */\nexport type WidgetId = DefaultWidgetIdValues;\n\n/**\n * Configuration interface for widget providers\n */\nexport interface WidgetProvidersConfig {\n /**\n * List of widget IDs to exclude from the providers\n * Use defaultWidgetIds constants for type safety and autocomplete\n * @example { exclude: [defaultWidgetIds.HTML, defaultWidgetIds.MARKDOWN] }\n */\n exclude?: WidgetId[];\n}\n\n/**\n * Map of widget IDs to their respective providers\n * This includes both widget definitions and configuration hooks\n */\nconst WIDGET_PROVIDERS_MAP: Partial<Record<WidgetId, Provider[]>> = {\n [defaultWidgetIds.ALARM_LIST]: alarmListWidgetProviders,\n [defaultWidgetIds.ALL_CRITICAL_ALARMS]: criticalAlarmsWidgetProviders,\n [defaultWidgetIds.RECENT_ALARMS]: recentAlarmsWidgetProviders,\n [defaultWidgetIds.DATA_POINTS_TABLE]: dataPointsTableWidgetProviders,\n [defaultWidgetIds.DATAPOINTS_GRAPH]: datapointGraphWidgetproviders,\n [defaultWidgetIds.DATAPOINTS_GRAPH_NEW]: datapointGraphWidgetproviders,\n [defaultWidgetIds.KPI]: kpiWidgetProviders,\n [defaultWidgetIds.INFO_GAUGE]: infoGaugeWidgetProviders,\n [defaultWidgetIds.LINEAR_GAUGE]: linearGaugeWidgetProviders,\n [defaultWidgetIds.RADIAL_GAUGE]: radialGaugeWidgetProviders,\n [defaultWidgetIds.MAP]: mapWidgetProviders,\n [defaultWidgetIds.DEVICE_CONTROL_MESSAGE_WIDGET]: deviceControlMessageWidgetProviders,\n [defaultWidgetIds.THREE_D_ROTATION]: threeDRotationWidgetProviders,\n [defaultWidgetIds.SILO]: siloWidgetProviders,\n [defaultWidgetIds.APPLICATIONS]: applicationsWidgetProviders,\n [defaultWidgetIds.QUICK_LINKS]: quickLinksWidgetProviders,\n [defaultWidgetIds.HELP_AND_SERVICE]: helpAndServiceWidgetProviders,\n [defaultWidgetIds.IMAGE]: imageWidgetProviders,\n [defaultWidgetIds.MARKDOWN]: markdownWidgetProviders,\n [defaultWidgetIds.HTML]: htmlWidgetProviders,\n [defaultWidgetIds.COCKPIT_WELCOME]: cockpitWelcomeWidgetProviders,\n [defaultWidgetIds.LEGACY_COCKPIT_WELCOME]: legacyCockpitWelcomeWidgetProviders,\n [defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME]: deviceManagementWelcomeWidgetProviders,\n [defaultWidgetIds.ASSET_NOTES]: assetNotesWidgetProviders,\n [defaultWidgetIds.EVENT_LIST]: eventListWidgetProviders,\n [defaultWidgetIds.PIE_CHART]: pieChartWidgetProviders\n};\n\n/**\n * Default widgets that are typically useful\n * These are the widgets that will be loaded unless explicitly excluded\n */\nexport const DEFAULT_WIDGETS: WidgetId[] = [\n defaultWidgetIds.ALARM_LIST,\n defaultWidgetIds.ALL_CRITICAL_ALARMS,\n defaultWidgetIds.RECENT_ALARMS,\n defaultWidgetIds.DATA_POINTS_TABLE,\n defaultWidgetIds.DATAPOINTS_GRAPH,\n defaultWidgetIds.DATAPOINTS_GRAPH_NEW,\n defaultWidgetIds.KPI,\n defaultWidgetIds.INFO_GAUGE,\n defaultWidgetIds.LINEAR_GAUGE,\n defaultWidgetIds.RADIAL_GAUGE,\n defaultWidgetIds.MAP,\n defaultWidgetIds.DEVICE_CONTROL_MESSAGE_WIDGET,\n defaultWidgetIds.THREE_D_ROTATION,\n defaultWidgetIds.SILO,\n defaultWidgetIds.APPLICATIONS,\n defaultWidgetIds.QUICK_LINKS,\n defaultWidgetIds.HELP_AND_SERVICE,\n defaultWidgetIds.IMAGE,\n defaultWidgetIds.MARKDOWN,\n defaultWidgetIds.HTML,\n defaultWidgetIds.COCKPIT_WELCOME,\n defaultWidgetIds.LEGACY_COCKPIT_WELCOME,\n defaultWidgetIds.DEVICE_MANAGEMENT_WELCOME,\n defaultWidgetIds.ASSET_NOTES,\n defaultWidgetIds.EVENT_LIST,\n defaultWidgetIds.PIE_CHART\n];\n\n/**\n * Configures and returns widget providers.\n *\n * This function allows selective loading of widget providers with their configuration hooks.\n * Unlike `cockpitWidgets()` which only provides widget definitions, this includes\n * the full providers with `hookWidgetConfig` registrations for features like widget preview.\n *\n * @param config Configuration options for widget providers\n * @returns Array of providers to be included in app.module.ts\n *\n * @example\n * ```typescript\n * // In app.module.ts\n * providers: [\n * ...configureWidgetProviders({\n * exclude: [defaultWidgetIds.HTML, defaultWidgetIds.MARKDOWN]\n * }),\n * // other providers\n * ]\n * ```\n *\n * @example\n * ```typescript\n * // Load all default widgets\n * providers: [\n * ...configureWidgetProviders(),\n * // other providers\n * ]\n * ```\n */\nexport function configureWidgetProviders(config: WidgetProvidersConfig = {}): Provider[] {\n const { exclude = [] } = config;\n const excludeSet = new Set(exclude);\n\n return DEFAULT_WIDGETS.filter(widgetId => !excludeSet.has(widgetId)).flatMap(widgetId => {\n const providers = WIDGET_PROVIDERS_MAP[widgetId];\n if (!providers) {\n console.warn(`Widget providers not found for widget ID: ${widgetId}`);\n return [];\n }\n return providers;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|