andoncloud-prometheus-widget 1.3.16 → 1.3.17

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.d.ts CHANGED
@@ -30,7 +30,7 @@ declare const getDisplayName: (lang: string) => string;
30
30
  declare const getTitle: (_data: WidgetData | undefined, settings: WidgetSettings | undefined, _filters: FilterValues | undefined, lang: string) => string;
31
31
  //#endregion
32
32
  //#region src/version.d.ts
33
- declare const LIBRARY_VERSION = "1.3.16";
33
+ declare const LIBRARY_VERSION = "1.3.17";
34
34
  //#endregion
35
35
  //#region src/index.d.ts
36
36
  declare const thumbnail: string | undefined;
package/dist/index.js CHANGED
@@ -18,63 +18,58 @@ import Color from "color";
18
18
  import { satisfies } from "compare-versions";
19
19
  import * as yup from "yup";
20
20
  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
21
  //#endregion
70
22
  //#region src/locales/index.ts
71
23
  const resources = {
72
- en: { translation: translation_default$1 },
73
- pl: { translation: translation_default }
24
+ en: { translation: { prometheusWidget: {
25
+ "addAnotherDisplayedQueryParameter": "Add another displayed query parameter",
26
+ "addAnotherQuery": "Add another query",
27
+ "advanced": "Advanced",
28
+ "currentShift": "Current shift",
29
+ "customTitle": "Custom title",
30
+ "displayedQueryParameter": "Displayed query parameter",
31
+ "endpointUrl": "Endpoint URL",
32
+ "name": "Name",
33
+ "period": "Period",
34
+ "previousShift": "Previous shift",
35
+ "query": "Query",
36
+ "settings": "Settings",
37
+ "thisFieldIsRequired": "This field is required",
38
+ "xAxisUnit": "X axis unit",
39
+ "displayName": "PromQL chart",
40
+ "titleQueries_one": "{{count}} query",
41
+ "titleQueries_other": "{{count}} queries",
42
+ "titleCurrentShift": "current shift",
43
+ "titlePreviousShift": "previous shift",
44
+ "yAxisUnit": "Y axis unit"
45
+ } } },
46
+ pl: { translation: { 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
+ } } }
74
69
  };
75
70
  //#endregion
76
71
  //#region src/version.ts
77
- const LIBRARY_VERSION = "1.3.16";
72
+ const LIBRARY_VERSION = "1.3.17";
78
73
  //#endregion
79
74
  //#region src/types.ts
80
75
  let QueriesPeriod = /* @__PURE__ */ function(QueriesPeriod) {
@@ -409,11 +404,17 @@ const PrometheusChart = ({ data, settings }) => {
409
404
  let seriesIndex = 0;
410
405
  setChartData({
411
406
  labels: [],
412
- datasets: results.flatMap((result) => result.result.map((serie) => {
407
+ datasets: results.flatMap((result, queryIndex) => result.result.map((serie) => {
413
408
  const idx = seriesIndex++;
414
- const metricName = serie.metric.name || "";
415
- const labelsStr = Object.entries(serie.metric.labels || {}).map(([k, v]) => `${k}="${v}"`).join(", ");
416
- const label = labelsStr ? `${metricName}{${labelsStr}}` : metricName;
409
+ const queryConfig = settings.prometheusQueries[queryIndex];
410
+ const metricLabels = serie.metric.labels || {};
411
+ const filteredValues = Object.values(pick(metricLabels, settings.displayedQueryParams)).join(" - ");
412
+ let label;
413
+ if (queryConfig?.displayName) label = filteredValues ? `${queryConfig.displayName} - ${filteredValues}` : queryConfig.displayName;
414
+ else {
415
+ const metricName = serie.metric.name || queryConfig?.query || "";
416
+ label = filteredValues ? `${metricName} ${JSON.stringify(pick(metricLabels, settings.displayedQueryParams))}` : metricName;
417
+ }
417
418
  return {
418
419
  label,
419
420
  data: serie.values.map((v) => ({
@@ -482,30 +483,7 @@ const PrometheusChart = ({ data, settings }) => {
482
483
  elements: { point: { radius: 0 } },
483
484
  maintainAspectRatio: false,
484
485
  animation: { duration: 0 },
485
- plugins: { legend: { labels: { filter: (item) => {
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
- } } } }
486
+ plugins: { legend: {} }
509
487
  }
510
488
  });
511
489
  };
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.17';\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} from 'chart.js';\nimport 'chartjs-adapter-dayjs-4';\nimport { PrometheusDriver } from 'prometheus-query';\nimport 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, 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 ? `${metricName} ${JSON.stringify(pick(metricLabels, settings.displayedQueryParams))}` : 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 }, [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 },\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "andoncloud-prometheus-widget",
3
- "version": "1.3.16",
3
+ "version": "1.3.17",
4
4
  "description": "Made with create-andoncloud-widget",
5
5
  "author": "Adrian Olszewski",
6
6
  "license": "MIT",