andoncloud-prometheus-widget 1.3.18 → 1.3.19

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.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.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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"}
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/utils.ts","../src/components/SettingsFormContent/styles.ts","../src/components/SettingsFormContent/CredentialsFields/index.tsx","../src/components/SettingsFormContent/index.tsx","../src/helpers.ts","../src/components/PrometheusChart/constants.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.19';\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 username?: string;\n password?: 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","export const isInsecureEndpoint = (url: string): boolean => /^http:\\/\\//i.test(url);\n","import { SxProps, Theme } from '@mui/material/styles';\n\nconst styles: Record<string, SxProps<Theme>> = {\n sectionDivider: {\n marginTop: 3,\n marginBottom: 1,\n color: (theme) => theme.palette.text.primary,\n fontWeight: 600,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n fontSize: '0.75rem',\n '&::before, &::after': {\n borderColor: 'rgba(255, 255, 255, 0.15)',\n },\n },\n formControl: {\n marginTop: 2,\n },\n addButton: {\n marginTop: 2,\n },\n credentialsHelper: {\n marginTop: 1,\n color: (theme) => theme.palette.text.primary,\n },\n};\n\nexport default styles;\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Alert, FormControl, FormHelperText, TextField } from '@mui/material';\nimport { FormikProps } from 'formik';\n\nimport { WidgetSettings } from '@/types';\n\nimport { isInsecureEndpoint } from '../utils';\nimport styles from '../styles';\n\ninterface CredentialsFieldsProps {\n formProps: FormikProps<WidgetSettings>;\n}\n\nconst CredentialsFields: React.FC<CredentialsFieldsProps> = ({ formProps }) => {\n // -- Local state --\n // Password input is bound to local state, NOT formik, so the saved\n // password is never written into the DOM. On change we mirror the typed\n // value into formik. If the user never types, formik keeps the saved\n // value and \"save without retyping\" preserves the stored password.\n const [passwordInput, setPasswordInput] = useState('');\n\n // -- Translation --\n const { t } = useTranslation();\n\n const handlePasswordChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setPasswordInput(event.target.value);\n formProps.setFieldValue('password', event.target.value);\n };\n\n const showInsecureWarning = isInsecureEndpoint(formProps.values.endpointUrl);\n\n return (\n <>\n <FormHelperText sx={styles.credentialsHelper} data-testid=\"prometheus.settings.credentials-helper\">\n {t('prometheusWidget.credentialsHelper')}\n </FormHelperText>\n <FormControl sx={styles.formControl} fullWidth>\n <TextField\n name=\"username\"\n label={t('prometheusWidget.username')}\n value={formProps.values.username || ''}\n onChange={formProps.handleChange}\n onBlur={formProps.handleBlur}\n data-testid=\"prometheus.settings.username\"\n fullWidth\n />\n </FormControl>\n <FormControl sx={styles.formControl} fullWidth>\n <TextField\n name=\"password\"\n type=\"password\"\n label={t('prometheusWidget.password')}\n value={passwordInput}\n onChange={handlePasswordChange}\n onBlur={formProps.handleBlur}\n data-testid=\"prometheus.settings.password\"\n fullWidth\n />\n </FormControl>\n {showInsecureWarning && (\n <Alert severity=\"warning\" sx={styles.formControl} data-testid=\"prometheus.settings.insecure-warning\">\n {t('prometheusWidget.insecureWarning')}\n </Alert>\n )}\n </>\n );\n};\n\nexport default CredentialsFields;\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 Divider,\n FormControl,\n FormHelperText,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tab,\n TextField,\n Typography,\n} from '@mui/material';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\nimport { getIn } from 'formik';\n\nimport { PrometheusQuery, QueriesPeriod, WidgetData, WidgetSettings } from '@/types';\n\nimport CredentialsFields from './CredentialsFields';\nimport styles from './styles';\n\nconst emptyQueryItem: PrometheusQuery = { query: '', displayName: '' };\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('settings');\n\n // -- Translation --\n const { t } = useTranslation();\n\n const setPrometheusQuery = (i: number, item: PrometheusQuery) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n queries[i] = { ...queries[i], ...item };\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const addQueryField = () => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n formProps.setFieldValue('prometheusQueries', [...queries, emptyQueryItem]);\n };\n\n const removeQueryField = (i: number) => {\n const queries = [...(formProps.values.prometheusQueries || [emptyQueryItem])];\n queries.splice(i, 1);\n formProps.setFieldValue('prometheusQueries', queries);\n };\n\n const setDisplayedQueryParam = (i: number, value: string) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n params[i] = value;\n formProps.setFieldValue('displayedQueryParams', params);\n };\n\n const addDisplayedQueryParam = () => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n formProps.setFieldValue('displayedQueryParams', [...params, '']);\n };\n\n const removeDisplayedQueryParam = (i: number) => {\n const params = [...(formProps.values.displayedQueryParams || [''])];\n params.splice(i, 1);\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={styles.formControl} 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 <Divider sx={styles.sectionDivider}>\n {t('prometheusWidget.sectionAuthorization')}\n </Divider>\n <CredentialsFields formProps={formProps} />\n <Divider sx={styles.sectionDivider}>\n {t('prometheusWidget.sectionData')}\n </Divider>\n <FormControl sx={styles.formControl} 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.values(QueriesPeriod).map((value) => (\n <MenuItem key={value} value={value}>\n {mapPeriodToLabel(value)}\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={styles.formControl} 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 aria-label={t('prometheusWidget.removeQuery')}\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={styles.addButton}\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={styles.formControl} 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={Boolean(\n Array.isArray(formProps.touched.displayedQueryParams) &&\n formProps.touched.displayedQueryParams[i] &&\n getIn(formProps.errors, `displayedQueryParams.[${i}]`),\n )}\n helperText={\n Array.isArray(formProps.touched.displayedQueryParams) &&\n formProps.touched.displayedQueryParams[i]\n ? getIn(formProps.errors, `displayedQueryParams.[${i}]`)\n : undefined\n }\n data-testid={`prometheus.settings.param-input-${i}`}\n fullWidth\n />\n <IconButton\n color=\"error\"\n aria-label={t('prometheusWidget.removeParam')}\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={styles.addButton}\n data-testid=\"prometheus.settings.add-param\"\n fullWidth\n >\n {t('prometheusWidget.addAnotherDisplayedQueryParameter')}\n </Button>\n <FormControl sx={styles.formControl} 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={styles.formControl} 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 type FetchErrorKind = 'auth' | 'forbidden' | 'unreachable';\n\nexport const classifyFetchError = (err: unknown): FetchErrorKind => {\n // prometheus-query wraps Axios errors as `{ httpStatus, errorType, ... }`;\n // for raw axios errors (when no Prometheus JSON body is parseable),\n // fall back to `err.response.status`.\n const e = err as { httpStatus?: number; response?: { status?: number } } | null | undefined;\n const status = e?.httpStatus ?? e?.response?.status;\n if (status === 401) return 'auth';\n if (status === 403) return 'forbidden';\n return 'unreachable';\n};\n\nexport const pickKeys = <T extends Record<string, unknown>>(obj: T, keys: string[]): Partial<T> =>\n Object.fromEntries(keys.filter((k) => k in obj).map((k) => [k, obj[k]])) as Partial<T>;\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","export const COLORS = [\n '#36A2EB',\n '#FF6384',\n '#4BC0C0',\n '#FF9F40',\n '#9966FF',\n '#FFCD56',\n '#C9CBCF',\n '#7BC8A4',\n '#E7E9ED',\n '#FF6B6B',\n];\n\nexport const GRID_LINE_COLOR = 'rgba(255, 255, 255, 0.1)';\n\nexport const DEFAULT_FONT_COLOR = 'rgba(255, 255, 255, 0.75)';\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, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Line } from 'react-chartjs-2';\n\nimport { Box, Typography } from '@mui/material';\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 { PrometheusDriver, PrometheusConnectionOptions } from 'prometheus-query';\n\nimport { classifyFetchError, FetchErrorKind, generateTimeRange, getQueriesTimeRange, pickKeys } from '@/helpers';\nimport { PrometheusChartProps, QueriesPeriod, QueriesTimeRange } from '@/types';\n\nimport { COLORS, DEFAULT_FONT_COLOR, GRID_LINE_COLOR } from './constants';\nimport GradientPlugin from './GradientPlugin';\n\nChartJS.register(CategoryScale, LinearScale, TimeScale, PointElement, LineElement, Filler, Legend, Tooltip);\n\nChartJS.defaults.font.size = 12;\nChartJS.defaults.color = DEFAULT_FONT_COLOR;\n\nconst errorTranslationKey: Record<FetchErrorKind, string> = {\n auth: 'prometheusWidget.errorAuth',\n forbidden: 'prometheusWidget.errorForbidden',\n unreachable: 'prometheusWidget.errorUnreachable',\n};\n\nconst errorMessageStyles = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n padding: 2,\n};\n\nconst PrometheusChart: React.FC<PrometheusChartProps> = ({ data, settings }) => {\n // -- Local state --\n const chart = useRef<ChartJS<'line'>>(null);\n const hiddenSeriesRef = useRef<Record<string, boolean>>({});\n const fetchGenRef = useRef(0);\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 [error, setError] = useState<FetchErrorKind | null>(null);\n\n // -- Data layer --\n // Driver is recreated whenever endpoint or credentials change so we\n // never reuse a driver carrying stale auth (AT-104). When either\n // credential is empty we omit `auth` entirely so the request is\n // anonymous (FR-003).\n const driver = useMemo(() => {\n const options: PrometheusConnectionOptions = { endpoint: settings.endpointUrl };\n if (settings.username && settings.password) {\n options.auth = { username: settings.username, password: settings.password };\n }\n return new PrometheusDriver(options);\n }, [settings.endpointUrl, settings.username, settings.password]);\n\n // -- Translation --\n const { t } = useTranslation();\n\n const fetchData = useCallback(\n async (timeRange: QueriesTimeRange) => {\n if (!settings.endpointUrl || !settings.prometheusQueries?.length) return;\n\n // AT-501: bump generation; any in-flight call's resolution is dropped if a newer call started.\n fetchGenRef.current += 1;\n const gen = fetchGenRef.current;\n\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 try {\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 if (gen !== fetchGenRef.current) return; // superseded; bail before updating state\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 || {}) as Record<string, string>;\n const filteredValues = Object.values(pickKeys(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(pickKeys(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 setError(null);\n } catch (err) {\n if (gen !== fetchGenRef.current) return;\n setError(classifyFetchError(err));\n }\n },\n [settings.endpointUrl, settings.prometheusQueries, settings.displayedQueryParams, driver],\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 if (error) {\n return (\n <Box sx={errorMessageStyles} data-testid={`prometheus-widget.error.${error}`}>\n <Typography variant=\"body2\" color=\"text.primary\">\n {t(errorTranslationKey[error])}\n </Typography>\n </Box>\n );\n }\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,\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: GRID_LINE_COLOR,\n },\n ...(settings.xAxisUnit && {\n title: {\n display: true,\n text: settings.xAxisUnit,\n },\n }),\n },\n y: {\n grid: {\n color: GRID_LINE_COLOR,\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 { PrometheusQuery, QueriesPeriod, WidgetSettings } from '@/types';\n\ntype LegacyWidgetSettings = Omit<WidgetSettings, 'prometheusQueries'> & {\n prometheusQueries: string[];\n};\n\nconst isLegacyQuery = (query: string | PrometheusQuery): query is string => typeof query === 'string';\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 username: '',\n password: '',\n queriesPeriod: QueriesPeriod.CURRENT_SHIFT,\n prometheusQueries: [] as PrometheusQuery[],\n displayedQueryParams: [] as string[],\n xAxisUnit: '',\n yAxisUnit: '',\n },\n validationSchema: yup.object({\n endpointUrl: yup.string().required(),\n username: yup.string(),\n password: yup.string(),\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 // widget-base injects the real onSubmit when mounting the form;\n // declared here only to satisfy the FormikConfig<WidgetSettings> type.\n onSubmit: () => {},\n };\n};\n\nexport const migrateSettings = (settings: WidgetSettings | LegacyWidgetSettings): WidgetSettings => {\n if (!satisfies(settings.version || '1.0.0', '>=1.2.5')) {\n const queries = settings.prometheusQueries as Array<string | PrometheusQuery>;\n return {\n ...settings,\n prometheusQueries: queries.map((query) =>\n isLegacyQuery(query) ? { query, displayName: '' } : query,\n ),\n };\n }\n return settings as WidgetSettings;\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>> = ({\n url,\n wsUrl,\n lang,\n data,\n sidePanelOpened = false,\n updateSidePanelProps = () => {},\n ...widgetProps\n}) => {\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) => ({\n ...((current || {}) as WidgetData),\n shifts,\n })),\n )\n .catch(() => {});\n }\n }, [data, graphqlSdk]);\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n sidePanelOpened={sidePanelOpened}\n updateSidePanelProps={updateSidePanelProps}\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "andoncloud-prometheus-widget",
3
- "version": "1.3.18",
3
+ "version": "1.3.19",
4
4
  "description": "Made with create-andoncloud-widget",
5
5
  "author": "Adrian Olszewski",
6
6
  "license": "MIT",
@@ -18,55 +18,58 @@
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,typescript,@mui/material,@mui/icons-material,@mui/lab,@mui/x-date-pickers && npm install --ignore-scripts && cd preview && ncu -u && npm install --ignore-scripts",
21
+ "update": "ncu -u --reject graphql-request,typescript,@mui/material,@mui/icons-material,@mui/lab,@mui/x-date-pickers,@rspack/dev-server,@rspack/core,@rsbuild/core,@rsbuild/plugin-react,react-refresh && 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": {
25
- "@mui/icons-material": "^5.0.0",
26
- "@mui/lab": "^5.0.0",
27
- "@mui/material": "^5.0.0",
28
- "andoncloud-dashboard-toolkit": "^1.0.0",
29
- "andoncloud-sdk": "^1.0.0",
30
- "andoncloud-widget-base": "^1.0.0",
25
+ "@mui/icons-material": "^5.0.0 || ^6.0.0 || ^7.0.0",
26
+ "@mui/lab": "^5.0.0 || ^6.0.0 || ^7.0.0",
27
+ "@mui/material": "^5.0.0 || ^6.0.0 || ^7.0.0",
28
+ "andoncloud-dashboard-toolkit": "^1.5.0",
29
+ "andoncloud-sdk": "^1.7.0",
30
+ "andoncloud-widget-base": "^1.2.0",
31
31
  "dayjs": "^1.11.0",
32
32
  "graphql-request": "^6.0.0",
33
- "i18next": "^22.0.0",
34
- "react": "^18.0.0",
35
- "react-i18next": "^12.0.0"
33
+ "i18next": "^22.0.0 || ^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0",
34
+ "react": "^18.0.0 || ^19.0.0",
35
+ "react-i18next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
36
36
  },
37
37
  "devDependencies": {
38
- "@craco/craco": "^7.1.0",
39
38
  "@emotion/react": "^11.14.0",
40
39
  "@emotion/styled": "^11.14.1",
41
40
  "@mui/icons-material": "^7.3.9",
42
41
  "@mui/lab": "^7.0.1-beta.23",
43
42
  "@mui/material": "^7.3.9",
44
43
  "@mui/x-date-pickers": "^8.27.2",
44
+ "@rsbuild/core": "^1.6.0",
45
+ "@rsbuild/plugin-react": "^1.3.0",
46
+ "@rspack/core": "^1.7.11",
47
+ "@rspack/dev-server": "^1.2.1",
45
48
  "@types/color": "^4.2.1",
46
- "@types/lodash.pick": "^4.4.9",
47
49
  "@types/react": "^19.2.14",
48
- "ajv": "^8.18.0",
49
- "andoncloud-dashboard-toolkit": "^1.5.79",
50
+ "actioncable": "^5.2.8",
51
+ "ajv": "^8.20.0",
52
+ "andoncloud-dashboard-toolkit": "^1.5.82",
50
53
  "andoncloud-library-scripts": "^2.0.0",
51
- "andoncloud-sdk": "^1.7.30",
52
- "andoncloud-widget-base": "^1.2.30",
53
- "cypress": "^15.13.1",
54
+ "andoncloud-sdk": "^1.7.31",
55
+ "andoncloud-widget-base": "^1.2.36",
56
+ "cypress": "^15.14.2",
57
+ "cypress-rspack-dev-server": "^1.1.2",
54
58
  "eslint-config-andoncloud": "^1.1.0",
55
59
  "graphql-request": "^6.1.0",
56
- "i18next": "^26.0.5",
57
- "mobx": "^6.15.0",
60
+ "i18next": "^26.0.8",
61
+ "mobx": "^6.15.1",
58
62
  "mobx-react-lite": "^4.1.1",
59
- "npm-check-updates": "^21.0.0",
63
+ "npm-check-updates": "^22.1.0",
60
64
  "npm-run-all": "^4.1.5",
61
- "postcss": "^8.5.9",
65
+ "postcss": "^8.5.14",
62
66
  "react": "^19.2.5",
63
67
  "react-dom": "^19.2.5",
64
- "react-i18next": "^17.0.3",
65
- "react-router-dom": "^7.14.1",
66
- "react-scripts": "^5.0.1",
67
- "tsdown": "^0.21.8",
68
- "typescript": "~5.9.3",
69
- "webpack-dev-server": "^5.2.3"
68
+ "react-i18next": "^17.0.6",
69
+ "react-refresh": "^0.14.2",
70
+ "react-router-dom": "^7.15.0",
71
+ "tsdown": "^0.21.10",
72
+ "typescript": "~5.9.3"
70
73
  },
71
74
  "files": [
72
75
  "dist"
@@ -77,7 +80,6 @@
77
80
  "color": "^5.0.3",
78
81
  "compare-versions": "^6.1.1",
79
82
  "formik": "^2.4.9",
80
- "lodash.pick": "^4.4.0",
81
83
  "prometheus-query": "^3.5.1",
82
84
  "react-chartjs-2": "^5.3.1",
83
85
  "react-text-truncate": "^0.19.0",