andoncloud-prometheus-widget 1.3.8 → 1.3.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/dist/index.cjs ADDED
@@ -0,0 +1,628 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region \0rolldown/runtime.js
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ let andoncloud_sdk = require("andoncloud-sdk");
25
+ let react = require("react");
26
+ let andoncloud_dashboard_toolkit = require("andoncloud-dashboard-toolkit");
27
+ let andoncloud_widget_base = require("andoncloud-widget-base");
28
+ let react_i18next = require("react-i18next");
29
+ let _mui_icons_material = require("@mui/icons-material");
30
+ let _mui_lab = require("@mui/lab");
31
+ let _mui_material = require("@mui/material");
32
+ let formik = require("formik");
33
+ let react_jsx_runtime = require("react/jsx-runtime");
34
+ let react_chartjs_2 = require("react-chartjs-2");
35
+ let chart_js = require("chart.js");
36
+ chart_js = __toESM(chart_js);
37
+ let chartjs_plugin_datasource_prometheus = require("chartjs-plugin-datasource-prometheus");
38
+ chartjs_plugin_datasource_prometheus = __toESM(chartjs_plugin_datasource_prometheus);
39
+ let dayjs = require("dayjs");
40
+ dayjs = __toESM(dayjs);
41
+ let lodash_pick = require("lodash.pick");
42
+ lodash_pick = __toESM(lodash_pick);
43
+ let color = require("color");
44
+ color = __toESM(color);
45
+ let compare_versions = require("compare-versions");
46
+ let yup = require("yup");
47
+ yup = __toESM(yup);
48
+ let i18next = require("i18next");
49
+ i18next = __toESM(i18next);
50
+ //#region src/locales/en/translation.json
51
+ var translation_default$1 = { prometheusWidget: {
52
+ "addAnotherDisplayedQueryParameter": "Add another displayed query parameter",
53
+ "addAnotherQuery": "Add another query",
54
+ "advanced": "Advanced",
55
+ "currentShift": "Current shift",
56
+ "customTitle": "Custom title",
57
+ "displayedQueryParameter": "Displayed query parameter",
58
+ "endpointUrl": "Endpoint URL",
59
+ "name": "Name",
60
+ "period": "Period",
61
+ "previousShift": "Previous shift",
62
+ "query": "Query",
63
+ "settings": "Settings",
64
+ "thisFieldIsRequired": "This field is required",
65
+ "xAxisUnit": "X axis unit",
66
+ "displayName": "PromQL chart",
67
+ "titleQueries_one": "{{count}} query",
68
+ "titleQueries_other": "{{count}} queries",
69
+ "titleCurrentShift": "current shift",
70
+ "titlePreviousShift": "previous shift",
71
+ "yAxisUnit": "Y axis unit"
72
+ } };
73
+ //#endregion
74
+ //#region src/locales/pl/translation.json
75
+ var translation_default = { prometheusWidget: {
76
+ "addAnotherDisplayedQueryParameter": "Dodaj kolejny wyświetlany parametr zapytania",
77
+ "addAnotherQuery": "Dodaj kolejne zapytanie",
78
+ "advanced": "Zaawansowane",
79
+ "currentShift": "Obecna zmiana",
80
+ "customTitle": "Własny tytuł",
81
+ "displayedQueryParameter": "Wyświetlany parametr zapytania",
82
+ "endpointUrl": "Adres URL",
83
+ "name": "Nazwa",
84
+ "period": "Okres",
85
+ "previousShift": "Poprzednia zmiana",
86
+ "query": "Zapytanie",
87
+ "settings": "Ustawienia",
88
+ "thisFieldIsRequired": "To pole jest wymagane",
89
+ "xAxisUnit": "Jednostka osi X",
90
+ "displayName": "Wykres PromQL",
91
+ "titleQueries_one": "{{count}} zapytanie",
92
+ "titleQueries_few": "{{count}} zapytania",
93
+ "titleQueries_many": "{{count}} zapytań",
94
+ "titleCurrentShift": "obecna zmiana",
95
+ "titlePreviousShift": "poprzednia zmiana",
96
+ "yAxisUnit": "Jednostka osi Y"
97
+ } };
98
+ //#endregion
99
+ //#region src/locales/index.ts
100
+ const resources = {
101
+ en: { translation: translation_default$1 },
102
+ pl: { translation: translation_default }
103
+ };
104
+ //#endregion
105
+ //#region src/version.ts
106
+ const LIBRARY_VERSION = "1.3.9";
107
+ //#endregion
108
+ //#region src/types.ts
109
+ let QueriesPeriod = /* @__PURE__ */ function(QueriesPeriod) {
110
+ QueriesPeriod["CURRENT_SHIFT"] = "CURRENT_SHIFT";
111
+ QueriesPeriod["PREVIOUS_SHIFT"] = "PREVIOUS_SHIFT";
112
+ return QueriesPeriod;
113
+ }({});
114
+ //#endregion
115
+ //#region src/components/SettingsFormContent/index.tsx
116
+ const SettingsFormContent = ({ formProps }) => {
117
+ const [selectedTab, setSelectedTab] = (0, react.useState)("settings");
118
+ const emptyQueryItem = {
119
+ query: "",
120
+ displayName: ""
121
+ };
122
+ const formControlStyles = { mt: 2 };
123
+ const { t } = (0, react_i18next.useTranslation)();
124
+ const setPrometheusQuery = (i, item) => {
125
+ const queries = [...formProps.values.prometheusQueries || [emptyQueryItem]];
126
+ queries[i] = {
127
+ ...queries[i],
128
+ ...item
129
+ };
130
+ formProps.setFieldValue("prometheusQueries", queries);
131
+ };
132
+ const addQueryField = () => {
133
+ const queries = [...formProps.values.prometheusQueries || [emptyQueryItem]];
134
+ formProps.setFieldValue("prometheusQueries", [...queries, emptyQueryItem]);
135
+ };
136
+ const removeQueryField = (i) => {
137
+ const queries = [...formProps.values.prometheusQueries || [emptyQueryItem]];
138
+ queries.splice(i, 1);
139
+ formProps.setFieldValue("prometheusQueries", queries);
140
+ };
141
+ const setDisplayedQueryParam = (i, value) => {
142
+ const params = [...formProps.values.displayedQueryParams || [""]];
143
+ params[i] = value;
144
+ formProps.setFieldValue("displayedQueryParams", params);
145
+ };
146
+ const addDisplayedQueryParam = () => {
147
+ const params = [...formProps.values.displayedQueryParams || [""]];
148
+ formProps.setFieldValue("displayedQueryParams", [...params, ""]);
149
+ };
150
+ const removeDisplayedQueryParam = (i) => {
151
+ const params = [...formProps.values.displayedQueryParams || [""]];
152
+ params.splice(i, 1);
153
+ formProps.setFieldValue("displayedQueryParams", params);
154
+ };
155
+ const mapPeriodToLabel = (period) => {
156
+ switch (period) {
157
+ case QueriesPeriod.PREVIOUS_SHIFT: return t("prometheusWidget.previousShift");
158
+ default: return t("prometheusWidget.currentShift");
159
+ }
160
+ };
161
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_lab.TabContext, {
162
+ value: selectedTab,
163
+ children: [
164
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_lab.TabList, {
165
+ onChange: (_, value) => setSelectedTab(value),
166
+ centered: true,
167
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Tab, {
168
+ label: t("prometheusWidget.settings"),
169
+ value: "settings"
170
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Tab, {
171
+ label: t("prometheusWidget.advanced"),
172
+ value: "advanced"
173
+ })]
174
+ }),
175
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_lab.TabPanel, {
176
+ value: "settings",
177
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Box, {
178
+ mb: 2,
179
+ children: [
180
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.FormControl, {
181
+ sx: formControlStyles,
182
+ fullWidth: true,
183
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
184
+ name: "endpointUrl",
185
+ label: t("prometheusWidget.endpointUrl"),
186
+ value: formProps.values.endpointUrl,
187
+ onChange: formProps.handleChange,
188
+ onBlur: formProps.handleBlur,
189
+ error: formProps.touched.endpointUrl && Boolean(formProps.errors.endpointUrl),
190
+ helperText: formProps.touched.endpointUrl && formProps.errors.endpointUrl,
191
+ "data-testid": "prometheus.settings.endpoint-url",
192
+ fullWidth: true
193
+ })
194
+ }),
195
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.FormControl, {
196
+ sx: formControlStyles,
197
+ fullWidth: true,
198
+ children: [
199
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.InputLabel, {
200
+ id: "queries-period-label",
201
+ children: t("prometheusWidget.period")
202
+ }),
203
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Select, {
204
+ variant: "outlined",
205
+ name: "queriesPeriod",
206
+ labelId: "queries-period-label",
207
+ value: formProps.values.queriesPeriod || QueriesPeriod.CURRENT_SHIFT,
208
+ onChange: formProps.handleChange,
209
+ onBlur: formProps.handleBlur,
210
+ error: formProps.touched.queriesPeriod && Boolean(formProps.errors.queriesPeriod),
211
+ "data-testid": "prometheus.settings.period-select",
212
+ fullWidth: true,
213
+ children: Object.keys(QueriesPeriod).map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.MenuItem, {
214
+ value: QueriesPeriod[key],
215
+ children: mapPeriodToLabel(QueriesPeriod[key])
216
+ }, key))
217
+ }),
218
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.FormHelperText, {
219
+ error: true,
220
+ children: formProps.touched.queriesPeriod && formProps.errors.queriesPeriod
221
+ })
222
+ ]
223
+ }),
224
+ (formProps.values.prometheusQueries || [emptyQueryItem]).map(({ query, displayName }, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.FormControl, {
225
+ sx: formControlStyles,
226
+ fullWidth: true,
227
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Stack, {
228
+ direction: "row",
229
+ width: "100%",
230
+ gap: 1,
231
+ children: [
232
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
233
+ label: t("prometheusWidget.query"),
234
+ value: query,
235
+ onChange: (e) => setPrometheusQuery(i, { query: e.target.value }),
236
+ onBlur: formProps.handleBlur,
237
+ error: formProps.touched.prometheusQueries?.[i]?.query && Boolean((0, formik.getIn)(formProps.errors, `prometheusQueries.[${i}].query`)),
238
+ helperText: formProps.touched.prometheusQueries?.[i]?.query && (0, formik.getIn)(formProps.errors, `prometheusQueries.[${i}].query`),
239
+ "data-testid": `prometheus.settings.query-input-${i}`,
240
+ fullWidth: true
241
+ }),
242
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
243
+ label: t("prometheusWidget.name"),
244
+ value: displayName,
245
+ onChange: (e) => setPrometheusQuery(i, {
246
+ query,
247
+ displayName: e.target.value
248
+ }),
249
+ onBlur: formProps.handleBlur,
250
+ error: formProps.touched.prometheusQueries?.[i]?.displayName && Boolean((0, formik.getIn)(formProps.errors, `prometheusQueries.[${i}].displayName`)),
251
+ helperText: formProps.touched.prometheusQueries?.[i]?.displayName && (0, formik.getIn)(formProps.errors, `prometheusQueries.[${i}].displayName`),
252
+ "data-testid": `prometheus.settings.query-name-${i}`,
253
+ fullWidth: true
254
+ }),
255
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.IconButton, {
256
+ color: "error",
257
+ onClick: () => removeQueryField(i),
258
+ "data-testid": `prometheus.settings.remove-query-${i}`,
259
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_icons_material.Clear, {})
260
+ })
261
+ ]
262
+ })
263
+ }, i)),
264
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
265
+ color: "secondary",
266
+ onClick: addQueryField,
267
+ sx: { mt: (theme) => theme.spacing(2) },
268
+ "data-testid": "prometheus.settings.add-query",
269
+ fullWidth: true,
270
+ children: t("prometheusWidget.addAnotherQuery")
271
+ }),
272
+ (formProps.values.displayedQueryParams || [""]).map((param, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.FormControl, {
273
+ sx: formControlStyles,
274
+ fullWidth: true,
275
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mui_material.Stack, {
276
+ direction: "row",
277
+ width: "100%",
278
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
279
+ label: t("prometheusWidget.displayedQueryParameter"),
280
+ value: param,
281
+ onChange: (e) => setDisplayedQueryParam(i, e.target.value),
282
+ error: formProps.touched.displayedQueryParams?.[i] && Boolean((0, formik.getIn)(formProps.errors, `displayedQueryParams.[${i}]`)),
283
+ helperText: formProps.touched.displayedQueryParams?.[i] && (0, formik.getIn)(formProps.errors, `displayedQueryParams.[${i}]`),
284
+ "data-testid": `prometheus.settings.param-input-${i}`,
285
+ fullWidth: true
286
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.IconButton, {
287
+ color: "error",
288
+ onClick: () => removeDisplayedQueryParam(i),
289
+ "data-testid": `prometheus.settings.remove-param-${i}`,
290
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_icons_material.Clear, {})
291
+ })]
292
+ })
293
+ }, i)),
294
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Button, {
295
+ color: "secondary",
296
+ onClick: addDisplayedQueryParam,
297
+ sx: { mt: (theme) => theme.spacing(2) },
298
+ "data-testid": "prometheus.settings.add-param",
299
+ fullWidth: true,
300
+ children: t("prometheusWidget.addAnotherDisplayedQueryParameter")
301
+ }),
302
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.FormControl, {
303
+ sx: formControlStyles,
304
+ fullWidth: true,
305
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
306
+ name: "xAxisUnit",
307
+ label: t("prometheusWidget.xAxisUnit"),
308
+ value: formProps.values.xAxisUnit || "",
309
+ onChange: formProps.handleChange,
310
+ onBlur: formProps.handleBlur,
311
+ error: formProps.touched.xAxisUnit && Boolean(formProps.errors.xAxisUnit),
312
+ helperText: formProps.touched.xAxisUnit && formProps.errors.xAxisUnit,
313
+ "data-testid": "prometheus.settings.x-axis-unit",
314
+ fullWidth: true
315
+ })
316
+ }),
317
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.FormControl, {
318
+ sx: formControlStyles,
319
+ fullWidth: true,
320
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
321
+ name: "yAxisUnit",
322
+ label: t("prometheusWidget.yAxisUnit"),
323
+ value: formProps.values.yAxisUnit || "",
324
+ onChange: formProps.handleChange,
325
+ onBlur: formProps.handleBlur,
326
+ error: formProps.touched.yAxisUnit && Boolean(formProps.errors.yAxisUnit),
327
+ helperText: formProps.touched.yAxisUnit && formProps.errors.yAxisUnit,
328
+ "data-testid": "prometheus.settings.y-axis-unit",
329
+ fullWidth: true
330
+ })
331
+ })
332
+ ]
333
+ })
334
+ }),
335
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_lab.TabPanel, {
336
+ value: "advanced",
337
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.TextField, {
338
+ name: "customTitle",
339
+ label: t("prometheusWidget.customTitle"),
340
+ value: formProps.values.customTitle,
341
+ onChange: formProps.handleChange,
342
+ "data-testid": "prometheus.settings.custom-title",
343
+ fullWidth: true
344
+ })
345
+ })
346
+ ]
347
+ });
348
+ };
349
+ //#endregion
350
+ //#region src/helpers.ts
351
+ const getQueriesTimeRange = (period, data) => {
352
+ const currentDate = (0, dayjs.default)();
353
+ const normalizedShifts = (0, andoncloud_dashboard_toolkit.normalizeShifts)(data?.shifts, currentDate);
354
+ const currentShift = (0, andoncloud_dashboard_toolkit.getCurrentShift)(currentDate, normalizedShifts);
355
+ const recentShift = (0, andoncloud_dashboard_toolkit.getRecentShift)(currentDate, normalizedShifts);
356
+ switch (period) {
357
+ case QueriesPeriod.CURRENT_SHIFT:
358
+ if (currentShift) return {
359
+ startedAt: currentShift.startedAt.toDate(),
360
+ finishedAt: currentShift.finishedAt.toDate()
361
+ };
362
+ if (recentShift) return {
363
+ startedAt: recentShift.startedAt.toDate(),
364
+ finishedAt: recentShift.finishedAt.toDate()
365
+ };
366
+ return null;
367
+ case QueriesPeriod.PREVIOUS_SHIFT:
368
+ if (recentShift) return {
369
+ startedAt: recentShift.startedAt.toDate(),
370
+ finishedAt: recentShift.finishedAt.toDate()
371
+ };
372
+ return null;
373
+ default: return null;
374
+ }
375
+ };
376
+ //#endregion
377
+ //#region src/components/PrometheusChart/GradientPlugin.ts
378
+ const createGradient = (ctx, area) => {
379
+ return ctx.createLinearGradient(0, area.bottom, 0, area.top);
380
+ };
381
+ const getScale = (chart, datasetId) => {
382
+ const meta = chart.getDatasetMeta(datasetId);
383
+ return meta.controller._yScale || meta.controller.chart.scales[meta.yAxisID];
384
+ };
385
+ const GradientPlugin = {
386
+ id: "gradient",
387
+ beforeDatasetsUpdate(chart) {
388
+ const ctx = chart.ctx;
389
+ const datasets = chart.data.datasets;
390
+ if (ctx && datasets) for (let i = 0; i < datasets.length; i++) {
391
+ const dataset = datasets[i];
392
+ const scale = getScale(chart, i);
393
+ if (scale) {
394
+ const gradient = createGradient(ctx, scale);
395
+ const borderColor = (0, color.default)(dataset.borderColor);
396
+ gradient.addColorStop(0, borderColor.alpha(.1).hexa());
397
+ gradient.addColorStop(1, borderColor.alpha(.5).hexa());
398
+ dataset.backgroundColor = gradient;
399
+ }
400
+ }
401
+ }
402
+ };
403
+ //#endregion
404
+ //#region src/components/PrometheusChart/index.tsx
405
+ chart_js.default.defaults.global.defaultFontSize = 12;
406
+ chart_js.default.defaults.global.defaultFontColor = "rgba(255, 255, 255, 0.75)";
407
+ const PrometheusChart = ({ data, settings }) => {
408
+ const chart = (0, react.useRef)(null);
409
+ const [chartData] = (0, react.useState)({
410
+ labels: [],
411
+ datasets: []
412
+ });
413
+ const [queriesTimeRange, setQueriesTimeRange] = (0, react.useState)(null);
414
+ const [timeLabels, setTimeLabels] = (0, react.useState)([]);
415
+ (0, react.useEffect)(() => {
416
+ if (chart.current) chart.current.update();
417
+ if (queriesTimeRange) setTimeLabels((0, andoncloud_dashboard_toolkit.generateTimeRange)((0, dayjs.default)(queriesTimeRange.startedAt), (0, dayjs.default)(queriesTimeRange.finishedAt), "minutes", 15));
418
+ }, [queriesTimeRange]);
419
+ (0, react.useEffect)(() => {
420
+ setQueriesTimeRange(getQueriesTimeRange(settings.queriesPeriod, data));
421
+ if (settings?.queriesPeriod === QueriesPeriod.CURRENT_SHIFT) {
422
+ const intervalId = setInterval(() => {
423
+ if (chart.current && chart.current.options.plugins) {
424
+ const nextTimeRange = getQueriesTimeRange(settings.queriesPeriod, data);
425
+ setQueriesTimeRange(nextTimeRange);
426
+ chart.current.options.plugins["datasource-prometheus"].timeRange = {
427
+ ...chart.current.options.plugins["datasource-prometheus"].timeRange,
428
+ start: nextTimeRange?.startedAt,
429
+ end: nextTimeRange?.finishedAt
430
+ };
431
+ chart.current.update();
432
+ }
433
+ }, 3e4);
434
+ return () => {
435
+ clearInterval(intervalId);
436
+ };
437
+ }
438
+ return () => {};
439
+ }, [data, settings]);
440
+ return queriesTimeRange && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_chartjs_2.Chart, {
441
+ ref: chart,
442
+ type: "line",
443
+ data: chartData,
444
+ plugins: [chartjs_plugin_datasource_prometheus.default, GradientPlugin],
445
+ options: {
446
+ scales: {
447
+ xAxes: [{
448
+ type: "time",
449
+ labels: timeLabels,
450
+ time: { displayFormats: {
451
+ millisecond: "HH:mm:ss.SSS",
452
+ second: "HH:mm:ss",
453
+ minute: "HH:mm",
454
+ hour: "HH"
455
+ } },
456
+ ticks: { source: "labels" },
457
+ gridLines: { color: "rgba(255, 255, 255, 0.1)" },
458
+ ...settings.xAxisUnit && { scaleLabel: {
459
+ display: true,
460
+ labelString: settings.xAxisUnit
461
+ } }
462
+ }],
463
+ yAxes: [{
464
+ gridLines: { color: "rgba(255, 255, 255, 0.1)" },
465
+ ...settings.xAxisUnit && { scaleLabel: {
466
+ display: true,
467
+ labelString: settings.yAxisUnit
468
+ } }
469
+ }]
470
+ },
471
+ elements: { point: { radius: 0 } },
472
+ maintainAspectRatio: false,
473
+ animation: { duration: 0 },
474
+ plugins: { "datasource-prometheus": {
475
+ prometheus: { endpoint: settings.endpointUrl },
476
+ query: settings.prometheusQueries.map(({ query }) => query),
477
+ timeRange: {
478
+ type: "absolute",
479
+ start: queriesTimeRange.startedAt,
480
+ end: queriesTimeRange.finishedAt,
481
+ step: 30
482
+ },
483
+ fillGaps: true,
484
+ fill: true
485
+ } },
486
+ legend: { labels: { filter: (item) => {
487
+ const regex = /{(?:[^{}]*)*}/;
488
+ const paramsMatch = item.text.match(regex);
489
+ const queryDisplayName = settings?.prometheusQueries[item.datasetIndex]?.displayName;
490
+ if (queryDisplayName) {
491
+ if (paramsMatch && paramsMatch.index !== 0) {
492
+ const queryParams = eval("(" + paramsMatch[0].replaceAll("=", ":") + ")");
493
+ const queryParamsValues = Object.values((0, lodash_pick.default)(queryParams, settings.displayedQueryParams)).join(" - ");
494
+ if (queryParamsValues) item.text = `${queryDisplayName} - ${queryParamsValues}`;
495
+ else item.text = queryDisplayName;
496
+ }
497
+ } else {
498
+ const replaceAfter = (text, index, replacement) => {
499
+ return text.substring(0, index) + replacement;
500
+ };
501
+ if (paramsMatch && paramsMatch.index !== 0) {
502
+ const matchIndex = paramsMatch.index || 0;
503
+ const queryParams = eval("(" + paramsMatch[0].replaceAll("=", ":") + ")");
504
+ item.text = replaceAfter(item.text, matchIndex, JSON.stringify((0, lodash_pick.default)(queryParams, settings.displayedQueryParams)));
505
+ } else item.text = settings?.prometheusQueries[item.datasetIndex].query;
506
+ }
507
+ return item;
508
+ } } }
509
+ }
510
+ });
511
+ };
512
+ //#endregion
513
+ //#region src/components/WidgetView/index.tsx
514
+ const WidgetView = ({ data, settings }) => {
515
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Box, {
516
+ display: "flex",
517
+ width: "100%",
518
+ minWidth: "500px",
519
+ height: "100%",
520
+ minHeight: "250px",
521
+ p: 2,
522
+ children: settings && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PrometheusChart, {
523
+ data,
524
+ settings
525
+ })
526
+ });
527
+ };
528
+ //#endregion
529
+ //#region src/components/Widget/utils.ts
530
+ const getSettingsFormProps = (t) => {
531
+ yup.setLocale({ mixed: { required: t("prometheusWidget.thisFieldIsRequired") } });
532
+ return {
533
+ initialValues: {
534
+ customTitle: "",
535
+ endpointUrl: "",
536
+ queriesPeriod: QueriesPeriod.CURRENT_SHIFT,
537
+ prometheusQueries: [],
538
+ displayedQueryParams: [],
539
+ xAxisUnit: "",
540
+ yAxisUnit: ""
541
+ },
542
+ validationSchema: yup.object({
543
+ endpointUrl: yup.string().required(),
544
+ queriesPeriod: yup.string().required(),
545
+ prometheusQueries: yup.array().of(yup.object().shape({
546
+ query: yup.string().required(),
547
+ displayName: yup.string().required()
548
+ })),
549
+ displayedQueryParams: yup.array().of(yup.string().required()),
550
+ xAxisUnit: yup.string().required(),
551
+ yAxisUnit: yup.string().required()
552
+ })
553
+ };
554
+ };
555
+ const migrateSettings = (settings) => {
556
+ if (!(0, compare_versions.satisfies)(settings.version || "1.0.0", ">=1.2.5")) return {
557
+ ...settings,
558
+ prometheusQueries: settings.prometheusQueries.map((query) => ({
559
+ query,
560
+ displayName: ""
561
+ }))
562
+ };
563
+ return settings;
564
+ };
565
+ //#endregion
566
+ //#region src/components/Widget/index.tsx
567
+ const Widget = ({ url, wsUrl, lang, data, ...widgetProps }) => {
568
+ const { graphqlSdk, gqlWsClient } = (0, andoncloud_dashboard_toolkit.useGqlClients)({
569
+ url,
570
+ wsUrl,
571
+ lang
572
+ });
573
+ const [widgetData, setWidgetData] = (0, react.useState)(data);
574
+ (0, react.useEffect)(() => {
575
+ if (!data && graphqlSdk) graphqlSdk.listShifts().then(({ shifts }) => setWidgetData((current) => ({
576
+ ...current || {},
577
+ shifts
578
+ }))).catch(() => {});
579
+ }, [data, graphqlSdk]);
580
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(andoncloud_widget_base.BaseWidget, {
581
+ ...widgetProps,
582
+ url,
583
+ lang,
584
+ locales: resources,
585
+ data: widgetData,
586
+ gqlClients: {
587
+ graphqlSdk,
588
+ gqlWsClient
589
+ },
590
+ WidgetView,
591
+ getSettingsFormProps,
592
+ SettingsFormContent,
593
+ migrateSettings,
594
+ version: LIBRARY_VERSION,
595
+ "data-testid": "prometheus-widget"
596
+ });
597
+ };
598
+ //#endregion
599
+ //#region src/core/title.ts
600
+ const ns = "prometheusWidget";
601
+ const t = (key, lng, options) => i18next.default.t(`${ns}.${key}`, {
602
+ lng,
603
+ ...options
604
+ });
605
+ const getDisplayName = (lang) => t("displayName", lang);
606
+ const getTitle = (_data, settings, _filters, lang) => {
607
+ const name = getDisplayName(lang);
608
+ if (!settings?.prometheusQueries?.length) return name;
609
+ const queryCount = settings.prometheusQueries.length;
610
+ const period = settings.queriesPeriod === "CURRENT_SHIFT" ? t("titleCurrentShift", lang) : t("titlePreviousShift", lang);
611
+ return `${name} — ${t("titleQueries", lang, { count: queryCount })}, ${period}`;
612
+ };
613
+ //#endregion
614
+ //#region src/index.tsx
615
+ (0, andoncloud_sdk.registerTranslations)(resources);
616
+ const thumbnail = void 0;
617
+ const requiredFeatures = ["feature.prometheus-widget"];
618
+ const extraPermissions = [];
619
+ //#endregion
620
+ exports.Widget = Widget;
621
+ exports.extraPermissions = extraPermissions;
622
+ exports.getDisplayName = getDisplayName;
623
+ exports.getTitle = getTitle;
624
+ exports.requiredFeatures = requiredFeatures;
625
+ exports.thumbnail = thumbnail;
626
+ exports.version = LIBRARY_VERSION;
627
+
628
+ //# sourceMappingURL=index.cjs.map