andoncloud-prometheus-widget 1.3.17 → 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.
@@ -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.17";
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,12 +9,12 @@ 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";
@@ -69,7 +70,7 @@ const resources = {
69
70
  };
70
71
  //#endregion
71
72
  //#region src/version.ts
72
- const LIBRARY_VERSION = "1.3.17";
73
+ const LIBRARY_VERSION = "1.3.18";
73
74
  //#endregion
74
75
  //#region src/types.ts
75
76
  let QueriesPeriod = /* @__PURE__ */ function(QueriesPeriod) {
@@ -591,10 +592,9 @@ const getTitle = (_data, settings, _filters, lang) => {
591
592
  //#endregion
592
593
  //#region src/index.tsx
593
594
  registerTranslations(resources);
594
- const thumbnail = void 0;
595
595
  const requiredFeatures = ["feature.prometheus-widget"];
596
596
  const extraPermissions = [];
597
597
  //#endregion
598
- 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 };
599
599
 
600
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.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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"}
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.17",
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.63",
49
+ "andoncloud-dashboard-toolkit": "^1.5.79",
50
50
  "andoncloud-library-scripts": "^2.0.0",
51
- "andoncloud-sdk": "^1.7.25",
52
- "andoncloud-widget-base": "^1.2.25",
53
- "cypress": "^15.12.0",
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": "^25.10.9",
56
+ "i18next": "^26.0.5",
57
57
  "mobx": "^6.15.0",
58
58
  "mobx-react-lite": "^4.1.1",
59
- "npm-check-updates": "^19.6.5",
59
+ "npm-check-updates": "^21.0.0",
60
60
  "npm-run-all": "^4.1.5",
61
- "postcss": "^8.5.8",
62
- "react": "^19.2.4",
63
- "react-dom": "^19.2.4",
64
- "react-i18next": "^16.6.5",
65
- "react-router-dom": "^7.13.2",
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.4",
67
+ "tsdown": "^0.21.8",
68
68
  "typescript": "~5.9.3",
69
69
  "webpack-dev-server": "^5.2.3"
70
70
  },