andoncloud-prometheus-widget 1.3.16 → 1.3.18
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/assets/thumbnail.svg +42 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +61 -83
- package/dist/index.js.map +1 -1
- package/dist/thumbnail-B_DBfYD0.js +6 -0
- package/dist/thumbnail-B_DBfYD0.js.map +1 -0
- package/package.json +14 -14
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180" fill="none">
|
|
2
|
+
<!-- Grid lines (rgba 255,255,255,0.1) -->
|
|
3
|
+
<line x1="40" y1="20" x2="304" y2="20" stroke="#ffffff1a" stroke-width="1"/>
|
|
4
|
+
<line x1="40" y1="50" x2="304" y2="50" stroke="#ffffff1a" stroke-width="1"/>
|
|
5
|
+
<line x1="40" y1="80" x2="304" y2="80" stroke="#ffffff1a" stroke-width="1"/>
|
|
6
|
+
<line x1="40" y1="110" x2="304" y2="110" stroke="#ffffff1a" stroke-width="1"/>
|
|
7
|
+
<line x1="40" y1="140" x2="304" y2="140" stroke="#ffffff1a" stroke-width="1"/>
|
|
8
|
+
|
|
9
|
+
<!-- Area fills -->
|
|
10
|
+
<defs>
|
|
11
|
+
<linearGradient id="g1" x1="0" y1="0" x2="0" y2="1">
|
|
12
|
+
<stop offset="0%" stop-color="#36A2EB" stop-opacity="0.3"/>
|
|
13
|
+
<stop offset="100%" stop-color="#36A2EB" stop-opacity="0"/>
|
|
14
|
+
</linearGradient>
|
|
15
|
+
<linearGradient id="g2" x1="0" y1="0" x2="0" y2="1">
|
|
16
|
+
<stop offset="0%" stop-color="#FF6384" stop-opacity="0.3"/>
|
|
17
|
+
<stop offset="100%" stop-color="#FF6384" stop-opacity="0"/>
|
|
18
|
+
</linearGradient>
|
|
19
|
+
</defs>
|
|
20
|
+
|
|
21
|
+
<!-- Line 1: Uptime (higher values) -->
|
|
22
|
+
<path d="M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36 L304,140 L40,140 Z" fill="url(#g1)"/>
|
|
23
|
+
<path d="M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36" stroke="#36A2EB" stroke-width="3" fill="none"/>
|
|
24
|
+
|
|
25
|
+
<!-- Line 2: Downtime (lower values, inverse) -->
|
|
26
|
+
<path d="M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70 L304,140 L40,140 Z" fill="url(#g2)"/>
|
|
27
|
+
<path d="M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70" stroke="#FF6384" stroke-width="3" fill="none"/>
|
|
28
|
+
|
|
29
|
+
<!-- Line 3: removed -->
|
|
30
|
+
|
|
31
|
+
<!-- X-axis time labels -->
|
|
32
|
+
<text x="60" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">06:00</text>
|
|
33
|
+
<text x="126" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">08:00</text>
|
|
34
|
+
<text x="192" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">10:00</text>
|
|
35
|
+
<text x="258" y="155" text-anchor="middle" font-size="8" font-family="Inter, system-ui" fill="#A7ADB6">12:00</text>
|
|
36
|
+
|
|
37
|
+
<!-- Legend -->
|
|
38
|
+
<line x1="44" y1="10" x2="58" y2="10" stroke="#36A2EB" stroke-width="2"/>
|
|
39
|
+
<text x="62" y="13" font-size="9" font-family="Inter, system-ui" fill="#A7ADB6">Uptime</text>
|
|
40
|
+
<line x1="120" y1="10" x2="134" y2="10" stroke="#FF6384" stroke-width="2"/>
|
|
41
|
+
<text x="138" y="13" font-size="9" font-family="Inter, system-ui" fill="#A7ADB6">Downtime</text>
|
|
42
|
+
</svg>
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as thumbnail_default } from "./thumbnail-B_DBfYD0.js";
|
|
1
2
|
import { BaseWidgetData, BaseWidgetSettings, FilterValues, ListShifts_Shift, WidgetProps } from "andoncloud-dashboard-toolkit";
|
|
2
3
|
//#region src/types.d.ts
|
|
3
4
|
interface WidgetSettingsData {
|
|
@@ -30,12 +31,11 @@ declare const getDisplayName: (lang: string) => string;
|
|
|
30
31
|
declare const getTitle: (_data: WidgetData | undefined, settings: WidgetSettings | undefined, _filters: FilterValues | undefined, lang: string) => string;
|
|
31
32
|
//#endregion
|
|
32
33
|
//#region src/version.d.ts
|
|
33
|
-
declare const LIBRARY_VERSION = "1.3.
|
|
34
|
+
declare const LIBRARY_VERSION = "1.3.18";
|
|
34
35
|
//#endregion
|
|
35
36
|
//#region src/index.d.ts
|
|
36
|
-
declare const thumbnail: string | undefined;
|
|
37
37
|
declare const requiredFeatures: string[];
|
|
38
38
|
declare const extraPermissions: string[];
|
|
39
39
|
//#endregion
|
|
40
|
-
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
|
|
40
|
+
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
|
|
41
41
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as thumbnail_default } from "./thumbnail-B_DBfYD0.js";
|
|
1
2
|
import { registerTranslations } from "andoncloud-sdk";
|
|
2
3
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
4
|
import { generateTimeRange, getCurrentShift, getRecentShift, normalizeShifts, useGqlClients } from "andoncloud-dashboard-toolkit";
|
|
@@ -8,73 +9,68 @@ import { TabContext, TabList, TabPanel } from "@mui/lab";
|
|
|
8
9
|
import { Box, Button, FormControl, FormHelperText, IconButton, InputLabel, MenuItem, Select, Stack, Tab, TextField } from "@mui/material";
|
|
9
10
|
import { getIn } from "formik";
|
|
10
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
import "chartjs-adapter-dayjs-4";
|
|
11
13
|
import { Line } from "react-chartjs-2";
|
|
12
14
|
import { CategoryScale, Chart, Filler, Legend, LineElement, LinearScale, PointElement, TimeScale, Tooltip } from "chart.js";
|
|
13
|
-
import "chartjs-adapter-dayjs-4";
|
|
14
|
-
import { PrometheusDriver } from "prometheus-query";
|
|
15
15
|
import dayjs from "dayjs";
|
|
16
16
|
import pick from "lodash.pick";
|
|
17
|
+
import { PrometheusDriver } from "prometheus-query";
|
|
17
18
|
import Color from "color";
|
|
18
19
|
import { satisfies } from "compare-versions";
|
|
19
20
|
import * as yup from "yup";
|
|
20
21
|
import i18n from "i18next";
|
|
21
|
-
//#region src/locales/en/translation.json
|
|
22
|
-
var translation_default$1 = { prometheusWidget: {
|
|
23
|
-
"addAnotherDisplayedQueryParameter": "Add another displayed query parameter",
|
|
24
|
-
"addAnotherQuery": "Add another query",
|
|
25
|
-
"advanced": "Advanced",
|
|
26
|
-
"currentShift": "Current shift",
|
|
27
|
-
"customTitle": "Custom title",
|
|
28
|
-
"displayedQueryParameter": "Displayed query parameter",
|
|
29
|
-
"endpointUrl": "Endpoint URL",
|
|
30
|
-
"name": "Name",
|
|
31
|
-
"period": "Period",
|
|
32
|
-
"previousShift": "Previous shift",
|
|
33
|
-
"query": "Query",
|
|
34
|
-
"settings": "Settings",
|
|
35
|
-
"thisFieldIsRequired": "This field is required",
|
|
36
|
-
"xAxisUnit": "X axis unit",
|
|
37
|
-
"displayName": "PromQL chart",
|
|
38
|
-
"titleQueries_one": "{{count}} query",
|
|
39
|
-
"titleQueries_other": "{{count}} queries",
|
|
40
|
-
"titleCurrentShift": "current shift",
|
|
41
|
-
"titlePreviousShift": "previous shift",
|
|
42
|
-
"yAxisUnit": "Y axis unit"
|
|
43
|
-
} };
|
|
44
|
-
//#endregion
|
|
45
|
-
//#region src/locales/pl/translation.json
|
|
46
|
-
var translation_default = { prometheusWidget: {
|
|
47
|
-
"addAnotherDisplayedQueryParameter": "Dodaj kolejny wyświetlany parametr zapytania",
|
|
48
|
-
"addAnotherQuery": "Dodaj kolejne zapytanie",
|
|
49
|
-
"advanced": "Zaawansowane",
|
|
50
|
-
"currentShift": "Obecna zmiana",
|
|
51
|
-
"customTitle": "Własny tytuł",
|
|
52
|
-
"displayedQueryParameter": "Wyświetlany parametr zapytania",
|
|
53
|
-
"endpointUrl": "Adres URL",
|
|
54
|
-
"name": "Nazwa",
|
|
55
|
-
"period": "Okres",
|
|
56
|
-
"previousShift": "Poprzednia zmiana",
|
|
57
|
-
"query": "Zapytanie",
|
|
58
|
-
"settings": "Ustawienia",
|
|
59
|
-
"thisFieldIsRequired": "To pole jest wymagane",
|
|
60
|
-
"xAxisUnit": "Jednostka osi X",
|
|
61
|
-
"displayName": "Wykres PromQL",
|
|
62
|
-
"titleQueries_one": "{{count}} zapytanie",
|
|
63
|
-
"titleQueries_few": "{{count}} zapytania",
|
|
64
|
-
"titleQueries_many": "{{count}} zapytań",
|
|
65
|
-
"titleCurrentShift": "obecna zmiana",
|
|
66
|
-
"titlePreviousShift": "poprzednia zmiana",
|
|
67
|
-
"yAxisUnit": "Jednostka osi Y"
|
|
68
|
-
} };
|
|
69
22
|
//#endregion
|
|
70
23
|
//#region src/locales/index.ts
|
|
71
24
|
const resources = {
|
|
72
|
-
en: { translation:
|
|
73
|
-
|
|
25
|
+
en: { translation: { prometheusWidget: {
|
|
26
|
+
"addAnotherDisplayedQueryParameter": "Add another displayed query parameter",
|
|
27
|
+
"addAnotherQuery": "Add another query",
|
|
28
|
+
"advanced": "Advanced",
|
|
29
|
+
"currentShift": "Current shift",
|
|
30
|
+
"customTitle": "Custom title",
|
|
31
|
+
"displayedQueryParameter": "Displayed query parameter",
|
|
32
|
+
"endpointUrl": "Endpoint URL",
|
|
33
|
+
"name": "Name",
|
|
34
|
+
"period": "Period",
|
|
35
|
+
"previousShift": "Previous shift",
|
|
36
|
+
"query": "Query",
|
|
37
|
+
"settings": "Settings",
|
|
38
|
+
"thisFieldIsRequired": "This field is required",
|
|
39
|
+
"xAxisUnit": "X axis unit",
|
|
40
|
+
"displayName": "PromQL chart",
|
|
41
|
+
"titleQueries_one": "{{count}} query",
|
|
42
|
+
"titleQueries_other": "{{count}} queries",
|
|
43
|
+
"titleCurrentShift": "current shift",
|
|
44
|
+
"titlePreviousShift": "previous shift",
|
|
45
|
+
"yAxisUnit": "Y axis unit"
|
|
46
|
+
} } },
|
|
47
|
+
pl: { translation: { prometheusWidget: {
|
|
48
|
+
"addAnotherDisplayedQueryParameter": "Dodaj kolejny wyświetlany parametr zapytania",
|
|
49
|
+
"addAnotherQuery": "Dodaj kolejne zapytanie",
|
|
50
|
+
"advanced": "Zaawansowane",
|
|
51
|
+
"currentShift": "Obecna zmiana",
|
|
52
|
+
"customTitle": "Własny tytuł",
|
|
53
|
+
"displayedQueryParameter": "Wyświetlany parametr zapytania",
|
|
54
|
+
"endpointUrl": "Adres URL",
|
|
55
|
+
"name": "Nazwa",
|
|
56
|
+
"period": "Okres",
|
|
57
|
+
"previousShift": "Poprzednia zmiana",
|
|
58
|
+
"query": "Zapytanie",
|
|
59
|
+
"settings": "Ustawienia",
|
|
60
|
+
"thisFieldIsRequired": "To pole jest wymagane",
|
|
61
|
+
"xAxisUnit": "Jednostka osi X",
|
|
62
|
+
"displayName": "Wykres PromQL",
|
|
63
|
+
"titleQueries_one": "{{count}} zapytanie",
|
|
64
|
+
"titleQueries_few": "{{count}} zapytania",
|
|
65
|
+
"titleQueries_many": "{{count}} zapytań",
|
|
66
|
+
"titleCurrentShift": "obecna zmiana",
|
|
67
|
+
"titlePreviousShift": "poprzednia zmiana",
|
|
68
|
+
"yAxisUnit": "Jednostka osi Y"
|
|
69
|
+
} } }
|
|
74
70
|
};
|
|
75
71
|
//#endregion
|
|
76
72
|
//#region src/version.ts
|
|
77
|
-
const LIBRARY_VERSION = "1.3.
|
|
73
|
+
const LIBRARY_VERSION = "1.3.18";
|
|
78
74
|
//#endregion
|
|
79
75
|
//#region src/types.ts
|
|
80
76
|
let QueriesPeriod = /* @__PURE__ */ function(QueriesPeriod) {
|
|
@@ -409,11 +405,17 @@ const PrometheusChart = ({ data, settings }) => {
|
|
|
409
405
|
let seriesIndex = 0;
|
|
410
406
|
setChartData({
|
|
411
407
|
labels: [],
|
|
412
|
-
datasets: results.flatMap((result) => result.result.map((serie) => {
|
|
408
|
+
datasets: results.flatMap((result, queryIndex) => result.result.map((serie) => {
|
|
413
409
|
const idx = seriesIndex++;
|
|
414
|
-
const
|
|
415
|
-
const
|
|
416
|
-
const
|
|
410
|
+
const queryConfig = settings.prometheusQueries[queryIndex];
|
|
411
|
+
const metricLabels = serie.metric.labels || {};
|
|
412
|
+
const filteredValues = Object.values(pick(metricLabels, settings.displayedQueryParams)).join(" - ");
|
|
413
|
+
let label;
|
|
414
|
+
if (queryConfig?.displayName) label = filteredValues ? `${queryConfig.displayName} - ${filteredValues}` : queryConfig.displayName;
|
|
415
|
+
else {
|
|
416
|
+
const metricName = serie.metric.name || queryConfig?.query || "";
|
|
417
|
+
label = filteredValues ? `${metricName} ${JSON.stringify(pick(metricLabels, settings.displayedQueryParams))}` : metricName;
|
|
418
|
+
}
|
|
417
419
|
return {
|
|
418
420
|
label,
|
|
419
421
|
data: serie.values.map((v) => ({
|
|
@@ -482,30 +484,7 @@ const PrometheusChart = ({ data, settings }) => {
|
|
|
482
484
|
elements: { point: { radius: 0 } },
|
|
483
485
|
maintainAspectRatio: false,
|
|
484
486
|
animation: { duration: 0 },
|
|
485
|
-
plugins: { legend: {
|
|
486
|
-
const regex = /{(?:[^{}]*)*}/;
|
|
487
|
-
const paramsMatch = item.text.match(regex);
|
|
488
|
-
const datasetIndex = item.datasetIndex ?? 0;
|
|
489
|
-
const queryDisplayName = settings?.prometheusQueries[datasetIndex]?.displayName;
|
|
490
|
-
if (queryDisplayName) {
|
|
491
|
-
if (paramsMatch && paramsMatch.index !== 0) {
|
|
492
|
-
const queryParams = eval("(" + paramsMatch[0].replaceAll("=", ":") + ")");
|
|
493
|
-
const queryParamsValues = Object.values(pick(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(pick(queryParams, settings.displayedQueryParams)));
|
|
505
|
-
} else item.text = settings?.prometheusQueries[datasetIndex].query;
|
|
506
|
-
}
|
|
507
|
-
return true;
|
|
508
|
-
} } } }
|
|
487
|
+
plugins: { legend: {} }
|
|
509
488
|
}
|
|
510
489
|
});
|
|
511
490
|
};
|
|
@@ -613,10 +592,9 @@ const getTitle = (_data, settings, _filters, lang) => {
|
|
|
613
592
|
//#endregion
|
|
614
593
|
//#region src/index.tsx
|
|
615
594
|
registerTranslations(resources);
|
|
616
|
-
const thumbnail = void 0;
|
|
617
595
|
const requiredFeatures = ["feature.prometheus-widget"];
|
|
618
596
|
const extraPermissions = [];
|
|
619
597
|
//#endregion
|
|
620
|
-
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
|
|
598
|
+
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
|
|
621
599
|
|
|
622
600
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["en","pl","ChartJS","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/types.ts","../src/components/SettingsFormContent/index.tsx","../src/helpers.ts","../src/components/PrometheusChart/GradientPlugin.ts","../src/components/PrometheusChart/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.3.16';\n","import type { BaseWidgetData, BaseWidgetSettings, ListShifts_Shift } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidgetViewProps } from 'andoncloud-widget-base';\n\ninterface WidgetSettingsData {\n shifts: ListShifts_Shift[];\n}\n\nexport interface WidgetData extends BaseWidgetData, WidgetSettingsData {}\n\nexport interface PrometheusQuery {\n query: string;\n displayName?: string;\n}\n\nexport interface WidgetSettings extends BaseWidgetSettings {\n customTitle: string;\n endpointUrl: string;\n queriesPeriod: QueriesPeriod;\n prometheusQueries: PrometheusQuery[];\n displayedQueryParams: string[];\n xAxisUnit: string;\n yAxisUnit: string;\n}\n\nexport interface WidgetViewProps extends BaseWidgetViewProps<WidgetData, WidgetSettings> {}\n\nexport enum QueriesPeriod {\n CURRENT_SHIFT = 'CURRENT_SHIFT',\n PREVIOUS_SHIFT = 'PREVIOUS_SHIFT',\n}\n\nexport interface QueriesTimeRange {\n startedAt: Date | number;\n finishedAt?: Date;\n}\n\nexport interface PrometheusChartProps {\n data: WidgetData;\n settings: WidgetSettings;\n}\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Clear } from '@mui/icons-material';\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport {\n Box,\n Button,\n FormControl,\n FormHelperText,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tab,\n TextField,\n} from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\nimport { getIn } from 'formik';\n\nimport { PrometheusQuery, QueriesPeriod, WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('settings');\n const emptyQueryItem = { query: '', displayName: '' };\n const formControlStyles = { mt: 2 };\n\n // -- Translation --\n const { t } = useTranslation();\n\n const setPrometheusQuery = (i: number, item: PrometheusQuery) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries[i] = { ...queries[i], ...item };\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const addQueryField = () => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n formProps.setFieldValue('prometheusQueries', [...queries, emptyQueryItem]);\n };\n\n const removeQueryField = (i: number) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries.splice(i, 1);\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const setDisplayedQueryParam = (i: number, value: string) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params[i] = value;\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const addDisplayedQueryParam = () => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n formProps.setFieldValue('displayedQueryParams', [...params, '']);\n };\n\n const removeDisplayedQueryParam = (i: number) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params.splice(i, 1);\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const mapPeriodToLabel = (period: QueriesPeriod) => {\n switch (period) {\n case QueriesPeriod.PREVIOUS_SHIFT:\n return t('prometheusWidget.previousShift');\n default:\n return t('prometheusWidget.currentShift');\n }\n };\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('prometheusWidget.settings')} value=\"settings\" />\n <Tab label={t('prometheusWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"settings\">\n <Box mb={2}>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"endpointUrl\"\n label={t('prometheusWidget.endpointUrl')}\n value={formProps.values.endpointUrl}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.endpointUrl && Boolean(formProps.errors.endpointUrl)}\n helperText={formProps.touched.endpointUrl && formProps.errors.endpointUrl}\n data-testid=\"prometheus.settings.endpoint-url\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <InputLabel id=\"queries-period-label\">{t('prometheusWidget.period')}</InputLabel>\n <Select\n variant=\"outlined\"\n name=\"queriesPeriod\"\n labelId=\"queries-period-label\"\n value={formProps.values.queriesPeriod || QueriesPeriod.CURRENT_SHIFT}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.queriesPeriod && Boolean(formProps.errors.queriesPeriod)}\n data-testid=\"prometheus.settings.period-select\"\n fullWidth\n >\n {Object.keys(QueriesPeriod).map((key) => (\n // @ts-expect-error no typings\n <MenuItem key={key} value={QueriesPeriod[key]}>\n {/* @ts-expect-error no typings */}\n {mapPeriodToLabel(QueriesPeriod[key])}\n </MenuItem>\n ))}\n </Select>\n <FormHelperText error>{formProps.touched.queriesPeriod && formProps.errors.queriesPeriod}</FormHelperText>\n </FormControl>\n {(formProps.values.prometheusQueries || [emptyQueryItem]).map(({ query, displayName }, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\" gap={1}>\n <TextField\n label={t('prometheusWidget.query')}\n value={query}\n onChange={(e) => setPrometheusQuery(i, { query: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.query &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].query`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.query &&\n getIn(formProps.errors, `prometheusQueries.[${i}].query`)\n }\n data-testid={`prometheus.settings.query-input-${i}`}\n fullWidth\n />\n <TextField\n label={t('prometheusWidget.name')}\n value={displayName}\n onChange={(e) => setPrometheusQuery(i, { query, displayName: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].displayName`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n getIn(formProps.errors, `prometheusQueries.[${i}].displayName`)\n }\n data-testid={`prometheus.settings.query-name-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeQueryField(i)}\n data-testid={`prometheus.settings.remove-query-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addQueryField}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-query\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherQuery')}\n </Button>\n {(formProps.values.displayedQueryParams || ['']).map((param, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\">\n <TextField\n label={t('prometheusWidget.displayedQueryParameter')}\n value={param}\n onChange={(e) => setDisplayedQueryParam(i, e.target.value)}\n error={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n Boolean(getIn(formProps.errors, `displayedQueryParams.[${i}]`))\n }\n helperText={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n getIn(formProps.errors, `displayedQueryParams.[${i}]`)\n }\n data-testid={`prometheus.settings.param-input-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeDisplayedQueryParam(i)}\n data-testid={`prometheus.settings.remove-param-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addDisplayedQueryParam}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-param\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherDisplayedQueryParameter')}\n </Button>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"xAxisUnit\"\n label={t('prometheusWidget.xAxisUnit')}\n value={formProps.values.xAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.xAxisUnit && Boolean(formProps.errors.xAxisUnit)}\n helperText={formProps.touched.xAxisUnit && formProps.errors.xAxisUnit}\n data-testid=\"prometheus.settings.x-axis-unit\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"yAxisUnit\"\n label={t('prometheusWidget.yAxisUnit')}\n value={formProps.values.yAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.yAxisUnit && Boolean(formProps.errors.yAxisUnit)}\n helperText={formProps.touched.yAxisUnit && formProps.errors.yAxisUnit}\n data-testid=\"prometheus.settings.y-axis-unit\"\n fullWidth\n />\n </FormControl>\n </Box>\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('prometheusWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n data-testid=\"prometheus.settings.custom-title\"\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { generateTimeRange, getCurrentShift, getRecentShift, normalizeShifts } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nimport { QueriesPeriod, QueriesTimeRange, WidgetData } from './types';\n\nexport { generateTimeRange };\n\nexport const getQueriesTimeRange = (period: QueriesPeriod, data: WidgetData): QueriesTimeRange | null => {\n const currentDate = dayjs();\n const normalizedShifts = normalizeShifts(data?.shifts, currentDate);\n const currentShift = getCurrentShift(currentDate, normalizedShifts);\n const recentShift = getRecentShift(currentDate, normalizedShifts);\n\n switch (period) {\n case QueriesPeriod.CURRENT_SHIFT:\n if (currentShift) {\n return {\n startedAt: currentShift.startedAt.toDate(),\n finishedAt: currentShift.finishedAt.toDate(),\n };\n }\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n case QueriesPeriod.PREVIOUS_SHIFT:\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n default:\n return null;\n }\n};\n","import { Chart, ChartArea, Plugin } from 'chart.js';\nimport Color from 'color';\n\nconst createGradient = (ctx: CanvasRenderingContext2D, area: ChartArea) => {\n return ctx.createLinearGradient(0, area.bottom, 0, area.top);\n};\n\nconst GradientPlugin: Plugin = {\n id: 'gradient',\n beforeDatasetsUpdate(chart: Chart) {\n const ctx = chart.ctx;\n const datasets = chart.data.datasets;\n\n if (ctx && datasets) {\n for (let i = 0; i < datasets.length; i++) {\n const dataset = datasets[i];\n const meta = chart.getDatasetMeta(i);\n const scale = chart.scales[meta.yAxisID as string];\n\n if (scale) {\n const gradient = createGradient(ctx, scale);\n const borderColor = Color(dataset.borderColor as string);\n\n gradient.addColorStop(0, borderColor.alpha(0.1).hexa());\n gradient.addColorStop(1, borderColor.alpha(0.5).hexa());\n\n dataset.backgroundColor = gradient;\n }\n }\n }\n },\n};\n\nexport default GradientPlugin;\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Line } from 'react-chartjs-2';\n\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n TimeScale,\n PointElement,\n LineElement,\n Filler,\n Legend,\n Tooltip,\n ChartData,\n LegendItem,\n} from 'chart.js';\nimport 'chartjs-adapter-dayjs-4';\nimport { PrometheusDriver } from 'prometheus-query';\nimport dayjs, { Dayjs } from 'dayjs';\nimport pick from 'lodash.pick';\n\nimport { generateTimeRange, getQueriesTimeRange } from '@/helpers';\nimport { PrometheusChartProps, QueriesPeriod, QueriesTimeRange } from '@/types';\n\nimport GradientPlugin from './GradientPlugin';\n\nChartJS.register(CategoryScale, LinearScale, TimeScale, PointElement, LineElement, Filler, Legend, Tooltip);\n\nChartJS.defaults.font.size = 12;\nChartJS.defaults.color = 'rgba(255, 255, 255, 0.75)';\n\nconst COLORS = [\n '#36A2EB', '#FF6384', '#4BC0C0', '#FF9F40', '#9966FF',\n '#FFCD56', '#C9CBCF', '#7BC8A4', '#E7E9ED', '#FF6B6B',\n];\n\nconst PrometheusChart: React.FC<PrometheusChartProps> = ({ data, settings }) => {\n const chart = useRef<ChartJS<'line'>>(null);\n const [chartData, setChartData] = useState<ChartData<'line'>>({ labels: [], datasets: [] });\n const [queriesTimeRange, setQueriesTimeRange] = useState<QueriesTimeRange | null>(null);\n const [timeLabels, setTimeLabels] = useState<Date[]>([]);\n const hiddenSeriesRef = useRef<Record<string, boolean>>({});\n\n const fetchData = useCallback(async (timeRange: QueriesTimeRange) => {\n if (!settings.endpointUrl || !settings.prometheusQueries?.length) return;\n\n const driver = new PrometheusDriver({ endpoint: settings.endpointUrl });\n const start = new Date(timeRange.startedAt);\n const end = timeRange.finishedAt ? new Date(timeRange.finishedAt) : new Date();\n const step = 30;\n\n // Save hidden state before updating\n if (chart.current) {\n for (let i = 0; i < chart.current.data.datasets.length; i++) {\n const ds = chart.current.data.datasets[i];\n if (ds.label) {\n hiddenSeriesRef.current[ds.label] = !chart.current.isDatasetVisible(i);\n }\n }\n }\n\n const queries = settings.prometheusQueries.map(({ query }) => query);\n const results = await Promise.all(\n queries.map((query) => driver.rangeQuery(query, start, end, step)),\n );\n\n let seriesIndex = 0;\n const datasets = results.flatMap((result) =>\n result.result.map((serie) => {\n const idx = seriesIndex++;\n const metricName = serie.metric.name || '';\n const labelsStr = Object.entries(serie.metric.labels || {})\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(', ');\n const label = labelsStr ? `${metricName}{${labelsStr}}` : metricName;\n return {\n label,\n data: serie.values.map((v: { time: Date; value: number }) => ({\n x: v.time,\n y: v.value,\n })),\n fill: true,\n tension: 0.4,\n borderColor: COLORS[idx % COLORS.length],\n backgroundColor: COLORS[idx % COLORS.length],\n borderWidth: 3,\n pointRadius: 0,\n hidden: hiddenSeriesRef.current[label] || false,\n };\n }),\n );\n\n setChartData({ labels: [], datasets });\n }, [settings.endpointUrl, settings.prometheusQueries]);\n\n useEffect(() => {\n if (queriesTimeRange) {\n const startedAt = dayjs(queriesTimeRange.startedAt);\n const finishedAt = dayjs(queriesTimeRange.finishedAt);\n setTimeLabels(generateTimeRange(startedAt, finishedAt, 'minutes', 15).map((d) => d.toDate()));\n fetchData(queriesTimeRange);\n }\n }, [queriesTimeRange, fetchData]);\n\n useEffect(() => {\n setQueriesTimeRange(getQueriesTimeRange(settings.queriesPeriod, data));\n\n if (settings?.queriesPeriod === QueriesPeriod.CURRENT_SHIFT) {\n const intervalId = setInterval(() => {\n const nextTimeRange = getQueriesTimeRange(settings.queriesPeriod, data);\n setQueriesTimeRange(nextTimeRange);\n }, 30_000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n return () => {};\n }, [data, settings]);\n\n return (\n queriesTimeRange && (\n <Line\n ref={chart}\n data={chartData}\n plugins={[GradientPlugin]}\n options={{\n scales: {\n x: {\n type: 'time',\n labels: timeLabels as unknown as string[],\n time: {\n displayFormats: {\n millisecond: 'HH:mm:ss.SSS',\n second: 'HH:mm:ss',\n minute: 'HH:mm',\n hour: 'HH',\n },\n },\n ticks: {\n source: 'labels',\n },\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.xAxisUnit && {\n title: {\n display: true,\n text: settings.xAxisUnit,\n },\n }),\n },\n y: {\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.yAxisUnit && {\n title: {\n display: true,\n text: settings.yAxisUnit,\n },\n }),\n },\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n maintainAspectRatio: false,\n animation: {\n duration: 0,\n },\n plugins: {\n legend: {\n labels: {\n filter: (item: LegendItem) => {\n const regex = /{(?:[^{}]*)*}/;\n const paramsMatch = item.text.match(regex);\n const datasetIndex = item.datasetIndex ?? 0;\n const queryDisplayName = settings?.prometheusQueries[datasetIndex]?.displayName;\n\n if (queryDisplayName) {\n if (paramsMatch && paramsMatch.index !== 0) {\n // eslint-disable-next-line no-eval\n const queryParams = eval('(' + paramsMatch[0].replaceAll('=', ':') + ')');\n const queryParamsValues = Object.values(pick(queryParams, settings.displayedQueryParams)).join(\n ' - ',\n );\n if (queryParamsValues) {\n item.text = `${queryDisplayName} - ${queryParamsValues}`;\n } else {\n item.text = queryDisplayName;\n }\n }\n } else {\n const replaceAfter = (text: string, index: number, replacement: string) => {\n return text.substring(0, index) + replacement;\n };\n\n if (paramsMatch && paramsMatch.index !== 0) {\n const matchIndex = paramsMatch.index || 0;\n // eslint-disable-next-line no-eval\n const queryParams = eval('(' + paramsMatch[0].replaceAll('=', ':') + ')');\n\n item.text = replaceAfter(\n item.text,\n matchIndex,\n JSON.stringify(pick(queryParams, settings.displayedQueryParams)),\n );\n } else {\n item.text = settings?.prometheusQueries[datasetIndex].query;\n }\n }\n return true;\n },\n },\n },\n },\n }}\n />\n )\n );\n};\n\nexport default PrometheusChart;\n","import { Box } from '@mui/material';\n\nimport { WidgetViewProps } from '@/types';\n\nimport PrometheusChart from '../PrometheusChart';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data, settings }) => {\n return (\n <Box display=\"flex\" width=\"100%\" minWidth=\"500px\" height=\"100%\" minHeight=\"250px\" p={2}>\n {settings && <PrometheusChart data={data} settings={settings} />}\n </Box>\n );\n};\n\nexport default WidgetView;\n","import { satisfies } from 'compare-versions';\nimport { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nimport { QueriesPeriod, WidgetSettings } from '@/types';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('prometheusWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n endpointUrl: '',\n queriesPeriod: QueriesPeriod.CURRENT_SHIFT,\n prometheusQueries: [],\n displayedQueryParams: [],\n xAxisUnit: '',\n yAxisUnit: '',\n },\n validationSchema: yup.object({\n endpointUrl: yup.string().required(),\n queriesPeriod: yup.string().required(),\n prometheusQueries: yup.array().of(\n yup.object().shape({\n query: yup.string().required(),\n displayName: yup.string().required(),\n }),\n ),\n displayedQueryParams: yup.array().of(yup.string().required()),\n xAxisUnit: yup.string().required(),\n yAxisUnit: yup.string().required(),\n }),\n };\n};\n\nexport const migrateSettings = (settings: WidgetSettings) => {\n if (!satisfies(settings.version || '1.0.0', '>=1.2.5')) {\n return {\n ...settings,\n prometheusQueries: settings.prometheusQueries.map((query) => ({ query, displayName: '' })),\n };\n }\n return settings;\n};\n","import { useEffect, useState } from 'react';\n\nimport { useGqlClients, WidgetProps } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps, migrateSettings } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({ url, wsUrl, lang, data, ...widgetProps }) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n\n useEffect(() => {\n if (!data && graphqlSdk) {\n graphqlSdk\n .listShifts()\n .then(({ shifts }) =>\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n shifts,\n })),\n )\n .catch(() => {});\n }\n }, [data, graphqlSdk]);\n\n return (\n <BaseWidget\n {...widgetProps}\n url={url}\n lang={lang}\n locales={locales}\n data={widgetData}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n migrateSettings={migrateSettings}\n version={LIBRARY_VERSION}\n data-testid=\"prometheus-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'prometheusWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n _data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n if (!settings?.prometheusQueries?.length) return name;\n\n const queryCount = settings.prometheusQueries.length;\n const period =\n settings.queriesPeriod === 'CURRENT_SHIFT' ? t('titleCurrentShift', lang) : t('titlePreviousShift', lang);\n\n return `${name} — ${t('titleQueries', lang, { count: queryCount })}, ${period}`;\n};\n","import { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport const thumbnail: string | undefined = undefined;\n\nexport const requiredFeatures: string[] = ['feature.prometheus-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["en","pl","ChartJS","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/types.ts","../src/components/SettingsFormContent/index.tsx","../src/helpers.ts","../src/components/PrometheusChart/GradientPlugin.ts","../src/components/PrometheusChart/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.3.18';\n","import type { BaseWidgetData, BaseWidgetSettings, ListShifts_Shift } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidgetViewProps } from 'andoncloud-widget-base';\n\ninterface WidgetSettingsData {\n shifts: ListShifts_Shift[];\n}\n\nexport interface WidgetData extends BaseWidgetData, WidgetSettingsData {}\n\nexport interface PrometheusQuery {\n query: string;\n displayName?: string;\n}\n\nexport interface WidgetSettings extends BaseWidgetSettings {\n customTitle: string;\n endpointUrl: string;\n queriesPeriod: QueriesPeriod;\n prometheusQueries: PrometheusQuery[];\n displayedQueryParams: string[];\n xAxisUnit: string;\n yAxisUnit: string;\n}\n\nexport interface WidgetViewProps extends BaseWidgetViewProps<WidgetData, WidgetSettings> {}\n\nexport enum QueriesPeriod {\n CURRENT_SHIFT = 'CURRENT_SHIFT',\n PREVIOUS_SHIFT = 'PREVIOUS_SHIFT',\n}\n\nexport interface QueriesTimeRange {\n startedAt: Date | number;\n finishedAt?: Date;\n}\n\nexport interface PrometheusChartProps {\n data: WidgetData;\n settings: WidgetSettings;\n}\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Clear } from '@mui/icons-material';\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport {\n Box,\n Button,\n FormControl,\n FormHelperText,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tab,\n TextField,\n} from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\nimport { getIn } from 'formik';\n\nimport { PrometheusQuery, QueriesPeriod, WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('settings');\n const emptyQueryItem = { query: '', displayName: '' };\n const formControlStyles = { mt: 2 };\n\n // -- Translation --\n const { t } = useTranslation();\n\n const setPrometheusQuery = (i: number, item: PrometheusQuery) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries[i] = { ...queries[i], ...item };\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const addQueryField = () => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n formProps.setFieldValue('prometheusQueries', [...queries, emptyQueryItem]);\n };\n\n const removeQueryField = (i: number) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n\n queries.splice(i, 1);\n\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const setDisplayedQueryParam = (i: number, value: string) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params[i] = value;\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const addDisplayedQueryParam = () => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n formProps.setFieldValue('displayedQueryParams', [...params, '']);\n };\n\n const removeDisplayedQueryParam = (i: number) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n\n params.splice(i, 1);\n\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const mapPeriodToLabel = (period: QueriesPeriod) => {\n switch (period) {\n case QueriesPeriod.PREVIOUS_SHIFT:\n return t('prometheusWidget.previousShift');\n default:\n return t('prometheusWidget.currentShift');\n }\n };\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('prometheusWidget.settings')} value=\"settings\" />\n <Tab label={t('prometheusWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"settings\">\n <Box mb={2}>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"endpointUrl\"\n label={t('prometheusWidget.endpointUrl')}\n value={formProps.values.endpointUrl}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.endpointUrl && Boolean(formProps.errors.endpointUrl)}\n helperText={formProps.touched.endpointUrl && formProps.errors.endpointUrl}\n data-testid=\"prometheus.settings.endpoint-url\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <InputLabel id=\"queries-period-label\">{t('prometheusWidget.period')}</InputLabel>\n <Select\n variant=\"outlined\"\n name=\"queriesPeriod\"\n labelId=\"queries-period-label\"\n value={formProps.values.queriesPeriod || QueriesPeriod.CURRENT_SHIFT}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.queriesPeriod && Boolean(formProps.errors.queriesPeriod)}\n data-testid=\"prometheus.settings.period-select\"\n fullWidth\n >\n {Object.keys(QueriesPeriod).map((key) => (\n // @ts-expect-error no typings\n <MenuItem key={key} value={QueriesPeriod[key]}>\n {/* @ts-expect-error no typings */}\n {mapPeriodToLabel(QueriesPeriod[key])}\n </MenuItem>\n ))}\n </Select>\n <FormHelperText error>{formProps.touched.queriesPeriod && formProps.errors.queriesPeriod}</FormHelperText>\n </FormControl>\n {(formProps.values.prometheusQueries || [emptyQueryItem]).map(({ query, displayName }, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\" gap={1}>\n <TextField\n label={t('prometheusWidget.query')}\n value={query}\n onChange={(e) => setPrometheusQuery(i, { query: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.query &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].query`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.query &&\n getIn(formProps.errors, `prometheusQueries.[${i}].query`)\n }\n data-testid={`prometheus.settings.query-input-${i}`}\n fullWidth\n />\n <TextField\n label={t('prometheusWidget.name')}\n value={displayName}\n onChange={(e) => setPrometheusQuery(i, { query, displayName: e.target.value })}\n onBlur={formProps.handleBlur}\n error={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n Boolean(getIn(formProps.errors, `prometheusQueries.[${i}].displayName`))\n }\n helperText={\n formProps.touched.prometheusQueries?.[i]?.displayName &&\n getIn(formProps.errors, `prometheusQueries.[${i}].displayName`)\n }\n data-testid={`prometheus.settings.query-name-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeQueryField(i)}\n data-testid={`prometheus.settings.remove-query-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addQueryField}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-query\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherQuery')}\n </Button>\n {(formProps.values.displayedQueryParams || ['']).map((param, i) => (\n <FormControl key={i} sx={formControlStyles} fullWidth>\n <Stack direction=\"row\" width=\"100%\">\n <TextField\n label={t('prometheusWidget.displayedQueryParameter')}\n value={param}\n onChange={(e) => setDisplayedQueryParam(i, e.target.value)}\n error={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n Boolean(getIn(formProps.errors, `displayedQueryParams.[${i}]`))\n }\n helperText={\n // @ts-expect-error no typings\n formProps.touched.displayedQueryParams?.[i] &&\n getIn(formProps.errors, `displayedQueryParams.[${i}]`)\n }\n data-testid={`prometheus.settings.param-input-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n onClick={() => removeDisplayedQueryParam(i)}\n data-testid={`prometheus.settings.remove-param-${i}`}\n >\n <Clear />\n </IconButton>\n </Stack>\n </FormControl>\n ))}\n <Button\n color=\"secondary\"\n onClick={addDisplayedQueryParam}\n sx={{ mt: (theme) => theme.spacing(2) }}\n data-testid=\"prometheus.settings.add-param\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherDisplayedQueryParameter')}\n </Button>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"xAxisUnit\"\n label={t('prometheusWidget.xAxisUnit')}\n value={formProps.values.xAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.xAxisUnit && Boolean(formProps.errors.xAxisUnit)}\n helperText={formProps.touched.xAxisUnit && formProps.errors.xAxisUnit}\n data-testid=\"prometheus.settings.x-axis-unit\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={formControlStyles} fullWidth>\n <TextField\n name=\"yAxisUnit\"\n label={t('prometheusWidget.yAxisUnit')}\n value={formProps.values.yAxisUnit || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n error={formProps.touched.yAxisUnit && Boolean(formProps.errors.yAxisUnit)}\n helperText={formProps.touched.yAxisUnit && formProps.errors.yAxisUnit}\n data-testid=\"prometheus.settings.y-axis-unit\"\n fullWidth\n />\n </FormControl>\n </Box>\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('prometheusWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n data-testid=\"prometheus.settings.custom-title\"\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { generateTimeRange, getCurrentShift, getRecentShift, normalizeShifts } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\n\nimport { QueriesPeriod, QueriesTimeRange, WidgetData } from './types';\n\nexport { generateTimeRange };\n\nexport const getQueriesTimeRange = (period: QueriesPeriod, data: WidgetData): QueriesTimeRange | null => {\n const currentDate = dayjs();\n const normalizedShifts = normalizeShifts(data?.shifts, currentDate);\n const currentShift = getCurrentShift(currentDate, normalizedShifts);\n const recentShift = getRecentShift(currentDate, normalizedShifts);\n\n switch (period) {\n case QueriesPeriod.CURRENT_SHIFT:\n if (currentShift) {\n return {\n startedAt: currentShift.startedAt.toDate(),\n finishedAt: currentShift.finishedAt.toDate(),\n };\n }\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n case QueriesPeriod.PREVIOUS_SHIFT:\n if (recentShift) {\n return {\n startedAt: recentShift.startedAt.toDate(),\n finishedAt: recentShift.finishedAt.toDate(),\n };\n }\n return null;\n default:\n return null;\n }\n};\n","import { Chart, ChartArea, Plugin } from 'chart.js';\nimport Color from 'color';\n\nconst createGradient = (ctx: CanvasRenderingContext2D, area: ChartArea) => {\n return ctx.createLinearGradient(0, area.bottom, 0, area.top);\n};\n\nconst GradientPlugin: Plugin = {\n id: 'gradient',\n beforeDatasetsUpdate(chart: Chart) {\n const ctx = chart.ctx;\n const datasets = chart.data.datasets;\n\n if (ctx && datasets) {\n for (let i = 0; i < datasets.length; i++) {\n const dataset = datasets[i];\n const meta = chart.getDatasetMeta(i);\n const scale = chart.scales[meta.yAxisID as string];\n\n if (scale) {\n const gradient = createGradient(ctx, scale);\n const borderColor = Color(dataset.borderColor as string);\n\n gradient.addColorStop(0, borderColor.alpha(0.1).hexa());\n gradient.addColorStop(1, borderColor.alpha(0.5).hexa());\n\n dataset.backgroundColor = gradient;\n }\n }\n }\n },\n};\n\nexport default GradientPlugin;\n","import 'chartjs-adapter-dayjs-4';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Line } from 'react-chartjs-2';\n\nimport {\n CategoryScale,\n Chart as ChartJS,\n ChartData,\n Filler,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n TimeScale,\n Tooltip,\n} from 'chart.js';\nimport dayjs from 'dayjs';\nimport pick from 'lodash.pick';\nimport { PrometheusDriver } from 'prometheus-query';\n\nimport { generateTimeRange, getQueriesTimeRange } from '@/helpers';\nimport { PrometheusChartProps, QueriesPeriod, QueriesTimeRange } from '@/types';\n\nimport GradientPlugin from './GradientPlugin';\n\nChartJS.register(CategoryScale, LinearScale, TimeScale, PointElement, LineElement, Filler, Legend, Tooltip);\n\nChartJS.defaults.font.size = 12;\nChartJS.defaults.color = 'rgba(255, 255, 255, 0.75)';\n\nconst COLORS = [\n '#36A2EB',\n '#FF6384',\n '#4BC0C0',\n '#FF9F40',\n '#9966FF',\n '#FFCD56',\n '#C9CBCF',\n '#7BC8A4',\n '#E7E9ED',\n '#FF6B6B',\n];\n\nconst PrometheusChart: React.FC<PrometheusChartProps> = ({ data, settings }) => {\n const chart = useRef<ChartJS<'line'>>(null);\n const [chartData, setChartData] = useState<ChartData<'line'>>({ labels: [], datasets: [] });\n const [queriesTimeRange, setQueriesTimeRange] = useState<QueriesTimeRange | null>(null);\n const [timeLabels, setTimeLabels] = useState<Date[]>([]);\n const hiddenSeriesRef = useRef<Record<string, boolean>>({});\n\n const fetchData = useCallback(\n async (timeRange: QueriesTimeRange) => {\n if (!settings.endpointUrl || !settings.prometheusQueries?.length) return;\n\n const driver = new PrometheusDriver({ endpoint: settings.endpointUrl });\n const start = new Date(timeRange.startedAt);\n const end = timeRange.finishedAt ? new Date(timeRange.finishedAt) : new Date();\n const step = 30;\n\n // Save hidden state before updating\n if (chart.current) {\n for (let i = 0; i < chart.current.data.datasets.length; i++) {\n const ds = chart.current.data.datasets[i];\n if (ds.label) {\n hiddenSeriesRef.current[ds.label] = !chart.current.isDatasetVisible(i);\n }\n }\n }\n\n const queries = settings.prometheusQueries.map(({ query }) => query);\n const results = await Promise.all(queries.map((query) => driver.rangeQuery(query, start, end, step)));\n\n let seriesIndex = 0;\n const datasets = results.flatMap((result, queryIndex) =>\n result.result.map((serie) => {\n const idx = seriesIndex++;\n const queryConfig = settings.prometheusQueries[queryIndex];\n const metricLabels = serie.metric.labels || {};\n const filteredValues = Object.values(pick(metricLabels, settings.displayedQueryParams)).join(' - ');\n\n let label: string;\n if (queryConfig?.displayName) {\n label = filteredValues ? `${queryConfig.displayName} - ${filteredValues}` : queryConfig.displayName;\n } else {\n const metricName = serie.metric.name || queryConfig?.query || '';\n label = filteredValues\n ? `${metricName} ${JSON.stringify(pick(metricLabels, settings.displayedQueryParams))}`\n : metricName;\n }\n\n return {\n label,\n data: serie.values.map((v: { time: Date; value: number }) => ({\n x: v.time,\n y: v.value,\n })),\n fill: true,\n tension: 0.4,\n borderColor: COLORS[idx % COLORS.length],\n backgroundColor: COLORS[idx % COLORS.length],\n borderWidth: 3,\n pointRadius: 0,\n hidden: hiddenSeriesRef.current[label] || false,\n };\n }),\n );\n\n setChartData({ labels: [], datasets });\n },\n [settings.endpointUrl, settings.prometheusQueries],\n );\n\n useEffect(() => {\n if (queriesTimeRange) {\n const startedAt = dayjs(queriesTimeRange.startedAt);\n const finishedAt = dayjs(queriesTimeRange.finishedAt);\n setTimeLabels(generateTimeRange(startedAt, finishedAt, 'minutes', 15).map((d) => d.toDate()));\n fetchData(queriesTimeRange);\n }\n }, [queriesTimeRange, fetchData]);\n\n useEffect(() => {\n setQueriesTimeRange(getQueriesTimeRange(settings.queriesPeriod, data));\n\n if (settings?.queriesPeriod === QueriesPeriod.CURRENT_SHIFT) {\n const intervalId = setInterval(() => {\n const nextTimeRange = getQueriesTimeRange(settings.queriesPeriod, data);\n setQueriesTimeRange(nextTimeRange);\n }, 30_000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n return () => {};\n }, [data, settings]);\n\n return (\n queriesTimeRange && (\n <Line\n ref={chart}\n data={chartData}\n plugins={[GradientPlugin]}\n options={{\n scales: {\n x: {\n type: 'time',\n labels: timeLabels as unknown as string[],\n time: {\n displayFormats: {\n millisecond: 'HH:mm:ss.SSS',\n second: 'HH:mm:ss',\n minute: 'HH:mm',\n hour: 'HH',\n },\n },\n ticks: {\n source: 'labels',\n },\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.xAxisUnit && {\n title: {\n display: true,\n text: settings.xAxisUnit,\n },\n }),\n },\n y: {\n grid: {\n color: 'rgba(255, 255, 255, 0.1)',\n },\n ...(settings.yAxisUnit && {\n title: {\n display: true,\n text: settings.yAxisUnit,\n },\n }),\n },\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n maintainAspectRatio: false,\n animation: {\n duration: 0,\n },\n plugins: {\n legend: {},\n },\n }}\n />\n )\n );\n};\n\nexport default PrometheusChart;\n","import { Box } from '@mui/material';\n\nimport { WidgetViewProps } from '@/types';\n\nimport PrometheusChart from '../PrometheusChart';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data, settings }) => {\n return (\n <Box display=\"flex\" width=\"100%\" minWidth=\"500px\" height=\"100%\" minHeight=\"250px\" p={2}>\n {settings && <PrometheusChart data={data} settings={settings} />}\n </Box>\n );\n};\n\nexport default WidgetView;\n","import { satisfies } from 'compare-versions';\nimport { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nimport { QueriesPeriod, WidgetSettings } from '@/types';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('prometheusWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n endpointUrl: '',\n queriesPeriod: QueriesPeriod.CURRENT_SHIFT,\n prometheusQueries: [],\n displayedQueryParams: [],\n xAxisUnit: '',\n yAxisUnit: '',\n },\n validationSchema: yup.object({\n endpointUrl: yup.string().required(),\n queriesPeriod: yup.string().required(),\n prometheusQueries: yup.array().of(\n yup.object().shape({\n query: yup.string().required(),\n displayName: yup.string().required(),\n }),\n ),\n displayedQueryParams: yup.array().of(yup.string().required()),\n xAxisUnit: yup.string().required(),\n yAxisUnit: yup.string().required(),\n }),\n };\n};\n\nexport const migrateSettings = (settings: WidgetSettings) => {\n if (!satisfies(settings.version || '1.0.0', '>=1.2.5')) {\n return {\n ...settings,\n prometheusQueries: settings.prometheusQueries.map((query) => ({ query, displayName: '' })),\n };\n }\n return settings;\n};\n","import { useEffect, useState } from 'react';\n\nimport { useGqlClients, WidgetProps } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps, migrateSettings } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({ url, wsUrl, lang, data, ...widgetProps }) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n\n useEffect(() => {\n if (!data && graphqlSdk) {\n graphqlSdk\n .listShifts()\n .then(({ shifts }) =>\n setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n shifts,\n })),\n )\n .catch(() => {});\n }\n }, [data, graphqlSdk]);\n\n return (\n <BaseWidget\n {...widgetProps}\n url={url}\n lang={lang}\n locales={locales}\n data={widgetData}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n migrateSettings={migrateSettings}\n version={LIBRARY_VERSION}\n data-testid=\"prometheus-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'prometheusWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n _data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n if (!settings?.prometheusQueries?.length) return name;\n\n const queryCount = settings.prometheusQueries.length;\n const period =\n settings.queriesPeriod === 'CURRENT_SHIFT' ? t('titleCurrentShift', lang) : t('titlePreviousShift', lang);\n\n return `${name} — ${t('titleQueries', lang, { count: queryCount })}, ${period}`;\n};\n","import { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport { default as thumbnail } from './assets/thumbnail.svg';\n\nexport const requiredFeatures: string[] = ['feature.prometheus-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/assets/thumbnail.svg
|
|
2
|
+
var thumbnail_default = "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 180\" fill=\"none\">%0A <!-- Grid lines (rgba 255,255,255,0.1) -->%0A <line x1=\"40\" y1=\"20\" x2=\"304\" y2=\"20\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"50\" x2=\"304\" y2=\"50\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"80\" x2=\"304\" y2=\"80\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"110\" x2=\"304\" y2=\"110\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A <line x1=\"40\" y1=\"140\" x2=\"304\" y2=\"140\" stroke=\"%23ffffff1a\" stroke-width=\"1\"/>%0A%0A <!-- Area fills -->%0A <defs>%0A <linearGradient id=\"g1\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">%0A <stop offset=\"0%\" stop-color=\"%2336A2EB\" stop-opacity=\"0.3\"/>%0A <stop offset=\"100%\" stop-color=\"%2336A2EB\" stop-opacity=\"0\"/>%0A </linearGradient>%0A <linearGradient id=\"g2\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">%0A <stop offset=\"0%\" stop-color=\"%23FF6384\" stop-opacity=\"0.3\"/>%0A <stop offset=\"100%\" stop-color=\"%23FF6384\" stop-opacity=\"0\"/>%0A </linearGradient>%0A </defs>%0A%0A <!-- Line 1: Uptime (higher values) -->%0A <path d=\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36 L304,140 L40,140 Z\" fill=\"url(%23g1)\"/>%0A <path d=\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36\" stroke=\"%2336A2EB\" stroke-width=\"3\" fill=\"none\"/>%0A%0A <!-- Line 2: Downtime (lower values, inverse) -->%0A <path d=\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70 L304,140 L40,140 Z\" fill=\"url(%23g2)\"/>%0A <path d=\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70\" stroke=\"%23FF6384\" stroke-width=\"3\" fill=\"none\"/>%0A%0A <!-- Line 3: removed -->%0A%0A <!-- X-axis time labels -->%0A <text x=\"60\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">06:00</text>%0A <text x=\"126\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">08:00</text>%0A <text x=\"192\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">10:00</text>%0A <text x=\"258\" y=\"155\" text-anchor=\"middle\" font-size=\"8\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">12:00</text>%0A%0A <!-- Legend -->%0A <line x1=\"44\" y1=\"10\" x2=\"58\" y2=\"10\" stroke=\"%2336A2EB\" stroke-width=\"2\"/>%0A <text x=\"62\" y=\"13\" font-size=\"9\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">Uptime</text>%0A <line x1=\"120\" y1=\"10\" x2=\"134\" y2=\"10\" stroke=\"%23FF6384\" stroke-width=\"2\"/>%0A <text x=\"138\" y=\"13\" font-size=\"9\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">Downtime</text>%0A</svg>%0A";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { thumbnail_default as t };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=thumbnail-B_DBfYD0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thumbnail-B_DBfYD0.js","names":[],"sources":["../src/assets/thumbnail.svg"],"sourcesContent":["\"data:image/svg+xml,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 320 180\\\" fill=\\\"none\\\">%0A <!-- Grid lines (rgba 255,255,255,0.1) -->%0A <line x1=\\\"40\\\" y1=\\\"20\\\" x2=\\\"304\\\" y2=\\\"20\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"50\\\" x2=\\\"304\\\" y2=\\\"50\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"80\\\" x2=\\\"304\\\" y2=\\\"80\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"110\\\" x2=\\\"304\\\" y2=\\\"110\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A <line x1=\\\"40\\\" y1=\\\"140\\\" x2=\\\"304\\\" y2=\\\"140\\\" stroke=\\\"%23ffffff1a\\\" stroke-width=\\\"1\\\"/>%0A%0A <!-- Area fills -->%0A <defs>%0A <linearGradient id=\\\"g1\\\" x1=\\\"0\\\" y1=\\\"0\\\" x2=\\\"0\\\" y2=\\\"1\\\">%0A <stop offset=\\\"0%\\\" stop-color=\\\"%2336A2EB\\\" stop-opacity=\\\"0.3\\\"/>%0A <stop offset=\\\"100%\\\" stop-color=\\\"%2336A2EB\\\" stop-opacity=\\\"0\\\"/>%0A </linearGradient>%0A <linearGradient id=\\\"g2\\\" x1=\\\"0\\\" y1=\\\"0\\\" x2=\\\"0\\\" y2=\\\"1\\\">%0A <stop offset=\\\"0%\\\" stop-color=\\\"%23FF6384\\\" stop-opacity=\\\"0.3\\\"/>%0A <stop offset=\\\"100%\\\" stop-color=\\\"%23FF6384\\\" stop-opacity=\\\"0\\\"/>%0A </linearGradient>%0A </defs>%0A%0A <!-- Line 1: Uptime (higher values) -->%0A <path d=\\\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36 L304,140 L40,140 Z\\\" fill=\\\"url(%23g1)\\\"/>%0A <path d=\\\"M40,75 C70,55 100,65 140,40 C180,18 220,45 260,30 L304,36\\\" stroke=\\\"%2336A2EB\\\" stroke-width=\\\"3\\\" fill=\\\"none\\\"/>%0A%0A <!-- Line 2: Downtime (lower values, inverse) -->%0A <path d=\\\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70 L304,140 L40,140 Z\\\" fill=\\\"url(%23g2)\\\"/>%0A <path d=\\\"M40,105 C70,90 100,100 140,80 C180,70 220,85 260,65 L304,70\\\" stroke=\\\"%23FF6384\\\" stroke-width=\\\"3\\\" fill=\\\"none\\\"/>%0A%0A <!-- Line 3: removed -->%0A%0A <!-- X-axis time labels -->%0A <text x=\\\"60\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">06:00</text>%0A <text x=\\\"126\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">08:00</text>%0A <text x=\\\"192\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">10:00</text>%0A <text x=\\\"258\\\" y=\\\"155\\\" text-anchor=\\\"middle\\\" font-size=\\\"8\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">12:00</text>%0A%0A <!-- Legend -->%0A <line x1=\\\"44\\\" y1=\\\"10\\\" x2=\\\"58\\\" y2=\\\"10\\\" stroke=\\\"%2336A2EB\\\" stroke-width=\\\"2\\\"/>%0A <text x=\\\"62\\\" y=\\\"13\\\" font-size=\\\"9\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">Uptime</text>%0A <line x1=\\\"120\\\" y1=\\\"10\\\" x2=\\\"134\\\" y2=\\\"10\\\" stroke=\\\"%23FF6384\\\" stroke-width=\\\"2\\\"/>%0A <text x=\\\"138\\\" y=\\\"13\\\" font-size=\\\"9\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">Downtime</text>%0A</svg>%0A\""],"mappings":";wBAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "andoncloud-prometheus-widget",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.18",
|
|
4
4
|
"description": "Made with create-andoncloud-widget",
|
|
5
5
|
"author": "Adrian Olszewski",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"start": "run-p build:watch start:preview",
|
|
19
19
|
"start:preview": "cd preview && npm run start",
|
|
20
20
|
"test": "cypress run --component",
|
|
21
|
-
"update": "ncu -u --reject graphql-request && npm install --ignore-scripts && cd preview && ncu -u && npm install",
|
|
21
|
+
"update": "ncu -u --reject graphql-request,typescript,@mui/material,@mui/icons-material,@mui/lab,@mui/x-date-pickers && npm install --ignore-scripts && cd preview && ncu -u && npm install --ignore-scripts",
|
|
22
22
|
"version:bump": "npm version --no-git-tag-version patch"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
@@ -46,25 +46,25 @@
|
|
|
46
46
|
"@types/lodash.pick": "^4.4.9",
|
|
47
47
|
"@types/react": "^19.2.14",
|
|
48
48
|
"ajv": "^8.18.0",
|
|
49
|
-
"andoncloud-dashboard-toolkit": "^1.5.
|
|
49
|
+
"andoncloud-dashboard-toolkit": "^1.5.79",
|
|
50
50
|
"andoncloud-library-scripts": "^2.0.0",
|
|
51
|
-
"andoncloud-sdk": "^1.7.
|
|
52
|
-
"andoncloud-widget-base": "^1.2.
|
|
53
|
-
"cypress": "^15.
|
|
51
|
+
"andoncloud-sdk": "^1.7.30",
|
|
52
|
+
"andoncloud-widget-base": "^1.2.30",
|
|
53
|
+
"cypress": "^15.13.1",
|
|
54
54
|
"eslint-config-andoncloud": "^1.1.0",
|
|
55
55
|
"graphql-request": "^6.1.0",
|
|
56
|
-
"i18next": "^
|
|
56
|
+
"i18next": "^26.0.5",
|
|
57
57
|
"mobx": "^6.15.0",
|
|
58
58
|
"mobx-react-lite": "^4.1.1",
|
|
59
|
-
"npm-check-updates": "^
|
|
59
|
+
"npm-check-updates": "^21.0.0",
|
|
60
60
|
"npm-run-all": "^4.1.5",
|
|
61
|
-
"postcss": "^8.5.
|
|
62
|
-
"react": "^19.2.
|
|
63
|
-
"react-dom": "^19.2.
|
|
64
|
-
"react-i18next": "^
|
|
65
|
-
"react-router-dom": "^7.
|
|
61
|
+
"postcss": "^8.5.9",
|
|
62
|
+
"react": "^19.2.5",
|
|
63
|
+
"react-dom": "^19.2.5",
|
|
64
|
+
"react-i18next": "^17.0.3",
|
|
65
|
+
"react-router-dom": "^7.14.1",
|
|
66
66
|
"react-scripts": "^5.0.1",
|
|
67
|
-
"tsdown": "^0.21.
|
|
67
|
+
"tsdown": "^0.21.8",
|
|
68
68
|
"typescript": "~5.9.3",
|
|
69
69
|
"webpack-dev-server": "^5.2.3"
|
|
70
70
|
},
|