@grafana/scenes 8.13.3 → 8.13.5

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/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ # v8.13.5 (Wed Jul 29 2026)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Scenes: add data-plugin-id to render boundary [#1590](https://github.com/grafana/scenes/pull/1590) ([@jackw](https://github.com/jackw))
6
+
7
+ #### Authors: 1
8
+
9
+ - Jack Westbrook ([@jackw](https://github.com/jackw))
10
+
11
+ ---
12
+
13
+ # v8.13.4 (Thu Jul 23 2026)
14
+
15
+ #### 🐛 Bug Fix
16
+
17
+ - SceneTimeRangeCompare: make timeShiftAlignmentProcessor non-mutating and export it [#1583](https://github.com/grafana/scenes/pull/1583) ([@dprokop](https://github.com/dprokop))
18
+
19
+ #### Authors: 1
20
+
21
+ - Dominik Prokop ([@dprokop](https://github.com/dprokop))
22
+
23
+ ---
24
+
1
25
  # v8.13.3 (Mon Jul 20 2026)
2
26
 
3
27
  #### 🐛 Bug Fix
@@ -5,10 +5,9 @@ import React from 'react';
5
5
  import { sceneGraph } from '../core/sceneGraph/index.js';
6
6
  import { SceneObjectBase } from '../core/SceneObjectBase.js';
7
7
  import { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig.js';
8
- import { getCompareSeriesRefId } from '../utils/getCompareSeriesRefId.js';
9
8
  import { parseUrlParam } from '../utils/parseUrlParam.js';
9
+ import { timeShiftAlignmentProcessor } from '../utils/timeShiftAlignmentProcessor.js';
10
10
  import { css } from '@emotion/css';
11
- import { of } from 'rxjs';
12
11
 
13
12
  const PREVIOUS_PERIOD_VALUE = "__previousPeriod";
14
13
  const NO_PERIOD_VALUE = "__noPeriod";
@@ -139,21 +138,6 @@ class SceneTimeRangeCompare extends SceneObjectBase {
139
138
  }
140
139
  }
141
140
  SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
142
- const timeShiftAlignmentProcessor = (primary, secondary) => {
143
- const diff = secondary.timeRange.from.diff(primary.timeRange.from);
144
- secondary.series.forEach((series) => {
145
- series.refId = getCompareSeriesRefId(series.refId || "");
146
- series.meta = {
147
- ...series.meta,
148
- // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released
149
- timeCompare: {
150
- diffMs: diff,
151
- isTimeShiftQuery: true
152
- }
153
- };
154
- });
155
- return of(secondary);
156
- };
157
141
  function SceneTimeRangeCompareRenderer({ model }) {
158
142
  var _a;
159
143
  const styles = useStyles2(getStyles$4);
@@ -1 +1 @@
1
- {"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import { t, Trans } from '@grafana/i18n';\nimport { DataQueryRequest, DateTime, dateTime, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport { ButtonGroup, ButtonSelect, Checkbox, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneDataQuery, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { DataQueryExtended } from '../querying/SceneQueryRunner';\nimport { ExtraQueryDescriptor, ExtraQueryDataProcessor, ExtraQueryProvider } from '../querying/ExtraQueryProvider';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { getCompareSeriesRefId } from '../utils/getCompareSeriesRefId';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { css } from '@emotion/css';\nimport { of } from 'rxjs';\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n hideCheckbox?: boolean;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\nconst NO_PERIOD_VALUE = '__noPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const NO_COMPARE_OPTION = {\n label: 'None',\n value: NO_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: 'Day before', value: '24h' },\n { label: 'Week before', value: '1w' },\n { label: 'Month before', value: '1M' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements ExtraQueryProvider<SceneTimeRangeCompareState>\n{\n static Component = SceneTimeRangeCompareRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['compareWith'] });\n\n public constructor(state: Partial<SceneTimeRangeCompareState>) {\n super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });\n\n this._subs.add(\n sceneTimeRange.subscribeToState((timeRange) => {\n const compareOptions = this.getCompareOptions(timeRange.value);\n const stateUpdate: Partial<SceneTimeRangeCompareState> = { compareOptions };\n\n // if current compareWith is not applicable to the new time range, set it to previous period comparison\n if (Boolean(this.state.compareWith) && !compareOptions.find(({ value }) => value === this.state.compareWith)) {\n stateUpdate.compareWith = PREVIOUS_PERIOD_VALUE;\n }\n\n this.setState(stateUpdate);\n })\n );\n };\n\n public getCompareOptions = (timeRange: TimeRange) => {\n const diffDays = Math.ceil(timeRange.to.diff(timeRange.from));\n\n const matchIndex = DEFAULT_COMPARE_OPTIONS.findIndex(({ value }) => {\n const intervalInMs = rangeUtil.intervalToMs(value);\n return intervalInMs >= diffDays;\n });\n\n return [\n NO_COMPARE_OPTION,\n PREVIOUS_PERIOD_COMPARE_OPTION,\n ...DEFAULT_COMPARE_OPTIONS.slice(matchIndex).map(({ label, value }) => ({ label, value })),\n ];\n };\n\n public onCompareWithChanged = (compareWith: string) => {\n if (compareWith === NO_PERIOD_VALUE) {\n this.onClearCompare();\n } else {\n this.setState({ compareWith });\n }\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n // Get a time shifted request to compare with the primary request.\n public getExtraQueries(request: DataQueryRequest): ExtraQueryDescriptor[] {\n const extraQueries: ExtraQueryDescriptor[] = [];\n const compareRange = this.getCompareTimeRange(request.range);\n if (!compareRange) {\n return extraQueries;\n }\n\n const targets = request.targets.filter((query: DataQueryExtended) => query.timeRangeCompare !== false);\n if (targets.length) {\n extraQueries.push({\n req: {\n ...request,\n targets,\n range: compareRange,\n },\n processor: timeShiftAlignmentProcessor,\n });\n }\n return extraQueries;\n }\n\n // The query runner should rerun the comparison query if the compareWith value has changed and there are queries that haven't opted out of TWC\n public shouldRerun(\n prev: SceneTimeRangeCompareState,\n next: SceneTimeRangeCompareState,\n queries: SceneDataQuery[]\n ): boolean {\n return (\n prev.compareWith !== next.compareWith && queries.find((query) => query.timeRangeCompare !== false) !== undefined\n );\n }\n\n public getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined {\n let compareFrom: DateTime;\n let compareTo: DateTime;\n\n if (this.state.compareWith) {\n if (this.state.compareWith === PREVIOUS_PERIOD_VALUE) {\n const diffMs = timeRange.to.diff(timeRange.from);\n compareFrom = dateTime(timeRange.from!).subtract(diffMs);\n compareTo = dateTime(timeRange.to!).subtract(diffMs);\n } else {\n compareFrom = dateTime(timeRange.from!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n compareTo = dateTime(timeRange.to!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n }\n return {\n from: compareFrom,\n to: compareTo,\n raw: {\n from: compareFrom,\n to: compareTo,\n },\n };\n }\n\n return undefined;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return {\n compareWith: this.state.compareWith,\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n if (!values.compareWith) {\n return;\n }\n\n const compareWith = parseUrlParam(values.compareWith);\n\n if (compareWith) {\n const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);\n\n if (compareOptions.find(({ value }) => value === compareWith)) {\n this.setState({\n compareWith,\n });\n } else {\n this.setState({\n compareWith: '__previousPeriod',\n });\n }\n }\n }\n}\n\n// Processor function for use with time shifted comparison series.\n// This aligns the secondary series with the primary and adds custom\n// metadata and config to the secondary series' fields so that it is\n// rendered appropriately.\nconst timeShiftAlignmentProcessor: ExtraQueryDataProcessor = (primary, secondary) => {\n const diff = secondary.timeRange.from.diff(primary.timeRange.from);\n secondary.series.forEach((series) => {\n series.refId = getCompareSeriesRefId(series.refId || '');\n series.meta = {\n ...series.meta,\n // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released\n timeCompare: {\n diffMs: diff,\n isTimeShiftQuery: true,\n },\n };\n });\n return of(secondary);\n};\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const styles = useStyles2(getStyles);\n const { compareWith, compareOptions, hideCheckbox } = model.useState();\n\n const [previousCompare, setPreviousCompare] = React.useState(compareWith);\n const previousValue = compareOptions.find(({ value }) => value === previousCompare) ?? PREVIOUS_PERIOD_COMPARE_OPTION;\n\n const value = compareOptions.find(({ value }) => value === compareWith);\n const enabled = Boolean(value);\n\n const onClick = () => {\n if (enabled) {\n setPreviousCompare(compareWith);\n model.onClearCompare();\n } else if (!enabled) {\n model.onCompareWithChanged(previousValue.value);\n }\n };\n\n // When hideCheckbox is true, always show select and use NO_COMPARE_OPTION when no comparison is active\n const selectValue = hideCheckbox && !compareWith ? NO_COMPARE_OPTION : value;\n const showSelect = hideCheckbox || enabled;\n\n // Create display value with \"Comparison\" prefix when hideCheckbox is true\n const displayValue =\n hideCheckbox && selectValue\n ? {\n ...selectValue,\n label: `Comparison: ${selectValue.label}`,\n }\n : selectValue;\n\n return (\n <ButtonGroup>\n {!hideCheckbox && (\n <ToolbarButton\n variant=\"canvas\"\n tooltip={t(\n 'grafana-scenes.components.scene-time-range-compare-renderer.button-tooltip',\n 'Enable time frame comparison'\n )}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <Checkbox label=\" \" value={enabled} onClick={onClick} />\n <Trans i18nKey=\"grafana-scenes.components.scene-time-range-compare-renderer.button-label\">Comparison</Trans>\n </ToolbarButton>\n )}\n\n {showSelect ? (\n <ButtonSelect\n variant=\"canvas\"\n value={displayValue}\n options={compareOptions}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton className={styles.previewButton} disabled variant=\"canvas\" isOpen={false}>\n {previousValue.label}\n </ToolbarButton>\n )}\n </ButtonGroup>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n previewButton: css({\n '&:disabled': {\n border: `1px solid ${theme.colors.secondary.border}`,\n color: theme.colors.text.disabled,\n opacity: 1,\n },\n }),\n };\n}\n"],"names":["getStyles","value"],"mappings":"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"}
1
+ {"version":3,"file":"SceneTimeRangeCompare.js","sources":["../../../src/components/SceneTimeRangeCompare.tsx"],"sourcesContent":["import { t, Trans } from '@grafana/i18n';\nimport { DataQueryRequest, DateTime, dateTime, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport { ButtonGroup, ButtonSelect, Checkbox, ToolbarButton, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneDataQuery, SceneObjectState, SceneObjectUrlValues } from '../core/types';\nimport { DataQueryExtended } from '../querying/SceneQueryRunner';\nimport { ExtraQueryDescriptor, ExtraQueryProvider } from '../querying/ExtraQueryProvider';\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\nimport { parseUrlParam } from '../utils/parseUrlParam';\nimport { timeShiftAlignmentProcessor } from '../utils/timeShiftAlignmentProcessor';\nimport { css } from '@emotion/css';\n\ninterface SceneTimeRangeCompareState extends SceneObjectState {\n compareWith?: string;\n compareOptions: Array<{ label: string; value: string }>;\n hideCheckbox?: boolean;\n}\n\nconst PREVIOUS_PERIOD_VALUE = '__previousPeriod';\nconst NO_PERIOD_VALUE = '__noPeriod';\n\nexport const PREVIOUS_PERIOD_COMPARE_OPTION = {\n label: 'Previous period',\n value: PREVIOUS_PERIOD_VALUE,\n};\n\nexport const NO_COMPARE_OPTION = {\n label: 'None',\n value: NO_PERIOD_VALUE,\n};\n\nexport const DEFAULT_COMPARE_OPTIONS = [\n { label: 'Day before', value: '24h' },\n { label: 'Week before', value: '1w' },\n { label: 'Month before', value: '1M' },\n];\n\nexport class SceneTimeRangeCompare\n extends SceneObjectBase<SceneTimeRangeCompareState>\n implements ExtraQueryProvider<SceneTimeRangeCompareState>\n{\n static Component = SceneTimeRangeCompareRenderer;\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['compareWith'] });\n\n public constructor(state: Partial<SceneTimeRangeCompareState>) {\n super({ compareOptions: DEFAULT_COMPARE_OPTIONS, ...state });\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n this.setState({ compareOptions: this.getCompareOptions(sceneTimeRange.state.value) });\n\n this._subs.add(\n sceneTimeRange.subscribeToState((timeRange) => {\n const compareOptions = this.getCompareOptions(timeRange.value);\n const stateUpdate: Partial<SceneTimeRangeCompareState> = { compareOptions };\n\n // if current compareWith is not applicable to the new time range, set it to previous period comparison\n if (Boolean(this.state.compareWith) && !compareOptions.find(({ value }) => value === this.state.compareWith)) {\n stateUpdate.compareWith = PREVIOUS_PERIOD_VALUE;\n }\n\n this.setState(stateUpdate);\n })\n );\n };\n\n public getCompareOptions = (timeRange: TimeRange) => {\n const diffDays = Math.ceil(timeRange.to.diff(timeRange.from));\n\n const matchIndex = DEFAULT_COMPARE_OPTIONS.findIndex(({ value }) => {\n const intervalInMs = rangeUtil.intervalToMs(value);\n return intervalInMs >= diffDays;\n });\n\n return [\n NO_COMPARE_OPTION,\n PREVIOUS_PERIOD_COMPARE_OPTION,\n ...DEFAULT_COMPARE_OPTIONS.slice(matchIndex).map(({ label, value }) => ({ label, value })),\n ];\n };\n\n public onCompareWithChanged = (compareWith: string) => {\n if (compareWith === NO_PERIOD_VALUE) {\n this.onClearCompare();\n } else {\n this.setState({ compareWith });\n }\n };\n\n public onClearCompare = () => {\n this.setState({ compareWith: undefined });\n };\n\n // Get a time shifted request to compare with the primary request.\n public getExtraQueries(request: DataQueryRequest): ExtraQueryDescriptor[] {\n const extraQueries: ExtraQueryDescriptor[] = [];\n const compareRange = this.getCompareTimeRange(request.range);\n if (!compareRange) {\n return extraQueries;\n }\n\n const targets = request.targets.filter((query: DataQueryExtended) => query.timeRangeCompare !== false);\n if (targets.length) {\n extraQueries.push({\n req: {\n ...request,\n targets,\n range: compareRange,\n },\n processor: timeShiftAlignmentProcessor,\n });\n }\n return extraQueries;\n }\n\n // The query runner should rerun the comparison query if the compareWith value has changed and there are queries that haven't opted out of TWC\n public shouldRerun(\n prev: SceneTimeRangeCompareState,\n next: SceneTimeRangeCompareState,\n queries: SceneDataQuery[]\n ): boolean {\n return (\n prev.compareWith !== next.compareWith && queries.find((query) => query.timeRangeCompare !== false) !== undefined\n );\n }\n\n public getCompareTimeRange(timeRange: TimeRange): TimeRange | undefined {\n let compareFrom: DateTime;\n let compareTo: DateTime;\n\n if (this.state.compareWith) {\n if (this.state.compareWith === PREVIOUS_PERIOD_VALUE) {\n const diffMs = timeRange.to.diff(timeRange.from);\n compareFrom = dateTime(timeRange.from!).subtract(diffMs);\n compareTo = dateTime(timeRange.to!).subtract(diffMs);\n } else {\n compareFrom = dateTime(timeRange.from!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n compareTo = dateTime(timeRange.to!).subtract(rangeUtil.intervalToMs(this.state.compareWith));\n }\n return {\n from: compareFrom,\n to: compareTo,\n raw: {\n from: compareFrom,\n to: compareTo,\n },\n };\n }\n\n return undefined;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return {\n compareWith: this.state.compareWith,\n };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n if (!values.compareWith) {\n return;\n }\n\n const compareWith = parseUrlParam(values.compareWith);\n\n if (compareWith) {\n const compareOptions = this.getCompareOptions(sceneGraph.getTimeRange(this).state.value);\n\n if (compareOptions.find(({ value }) => value === compareWith)) {\n this.setState({\n compareWith,\n });\n } else {\n this.setState({\n compareWith: '__previousPeriod',\n });\n }\n }\n }\n}\n\nfunction SceneTimeRangeCompareRenderer({ model }: SceneComponentProps<SceneTimeRangeCompare>) {\n const styles = useStyles2(getStyles);\n const { compareWith, compareOptions, hideCheckbox } = model.useState();\n\n const [previousCompare, setPreviousCompare] = React.useState(compareWith);\n const previousValue = compareOptions.find(({ value }) => value === previousCompare) ?? PREVIOUS_PERIOD_COMPARE_OPTION;\n\n const value = compareOptions.find(({ value }) => value === compareWith);\n const enabled = Boolean(value);\n\n const onClick = () => {\n if (enabled) {\n setPreviousCompare(compareWith);\n model.onClearCompare();\n } else if (!enabled) {\n model.onCompareWithChanged(previousValue.value);\n }\n };\n\n // When hideCheckbox is true, always show select and use NO_COMPARE_OPTION when no comparison is active\n const selectValue = hideCheckbox && !compareWith ? NO_COMPARE_OPTION : value;\n const showSelect = hideCheckbox || enabled;\n\n // Create display value with \"Comparison\" prefix when hideCheckbox is true\n const displayValue =\n hideCheckbox && selectValue\n ? {\n ...selectValue,\n label: `Comparison: ${selectValue.label}`,\n }\n : selectValue;\n\n return (\n <ButtonGroup>\n {!hideCheckbox && (\n <ToolbarButton\n variant=\"canvas\"\n tooltip={t(\n 'grafana-scenes.components.scene-time-range-compare-renderer.button-tooltip',\n 'Enable time frame comparison'\n )}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onClick();\n }}\n >\n <Checkbox label=\" \" value={enabled} onClick={onClick} />\n <Trans i18nKey=\"grafana-scenes.components.scene-time-range-compare-renderer.button-label\">Comparison</Trans>\n </ToolbarButton>\n )}\n\n {showSelect ? (\n <ButtonSelect\n variant=\"canvas\"\n value={displayValue}\n options={compareOptions}\n onChange={(v) => {\n model.onCompareWithChanged(v.value!);\n }}\n />\n ) : (\n <ToolbarButton className={styles.previewButton} disabled variant=\"canvas\" isOpen={false}>\n {previousValue.label}\n </ToolbarButton>\n )}\n </ButtonGroup>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n previewButton: css({\n '&:disabled': {\n border: `1px solid ${theme.colors.secondary.border}`,\n color: theme.colors.text.disabled,\n opacity: 1,\n },\n }),\n };\n}\n"],"names":["getStyles","value"],"mappings":"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"}
@@ -197,7 +197,8 @@ function VizPanelRenderer({ model }) {
197
197
  className: absoluteWrapper,
198
198
  "data-viz-panel-key": model.state.key,
199
199
  "data-viz-panel-id": model.getPathId(),
200
- "data-testid": `${plugin.meta.id}-${model.state.key}`
200
+ "data-testid": `${plugin.meta.id}-${model.state.key}`,
201
+ "data-plugin-id": plugin.meta.id
201
202
  },
202
203
  /* @__PURE__ */ React.createElement(
203
204
  PanelChrome,
@@ -1 +1 @@
1
- {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n >\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n width={width === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight}\n renderCounter={_renderCounter}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={context.eventBus}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n data-plugin-id={plugin.meta.id}\n >\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n width={width === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight}\n renderCounter={_renderCounter}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={context.eventBus}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -95,6 +95,8 @@ export { VizConfigBuilder } from './core/PanelBuilders/VizConfigBuilder.js';
95
95
  export { VizConfigBuilders } from './core/PanelBuilders/VizConfigBuilders.js';
96
96
  export { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject.js';
97
97
  export { getExploreURL } from './utils/explore.js';
98
+ export { getCompareSeriesRefId } from './utils/getCompareSeriesRefId.js';
99
+ export { timeShiftAlignmentProcessor } from './utils/timeShiftAlignmentProcessor.js';
98
100
  export { loadResources } from './utils/loadResources.js';
99
101
  export { FieldConfigBuilders } from './core/PanelBuilders/FieldConfigBuilders.js';
100
102
  export { FieldConfigOverridesBuilder } from './core/PanelBuilders/FieldConfigOverridesBuilder.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/cloneSceneObject';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { buildPathIdFor } from './utils/pathId';\nimport { isRepeatCloneOrChildOf } from './utils/utils';\n\nimport { registerVariableMacro } from './variables/macros';\nimport {\n escapeLabelValueInExactSelector,\n escapeLabelValueInRegexSelector,\n escapeURLDelimiters,\n renderPrometheusLabelFilters,\n getVariableControlId,\n} from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n isSwitchVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport { getClosest } from './core/sceneGraph/utils';\nexport * as behaviors from './behaviors';\nexport * as performanceUtils from './performance';\nexport { writePerformanceLog } from './utils/writePerformanceLog';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { DataProviderProxy } from './querying/DataProviderProxy';\nexport {\n type ExtraQueryDescriptor,\n type ExtraQueryProvider,\n type ExtraQueryDataProcessor,\n} from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer, type SceneDataTransformerState } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n} from './behaviors/types';\n\nexport type { AdHocFilterInteractionHandler } from './core/sceneGraph/getReportInteractionHandler';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { SwitchVariable } from './variables/variants/SwitchVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport { ScopesVariable } from './variables/variants/ScopesVariable';\nexport {\n MultiValueVariable,\n type MultiValueVariableState,\n type VariableGetOptionsArgs,\n} from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport {\n AdHocFiltersVariable,\n OPERATORS,\n GROUP_BY_OPERATOR,\n isGroupByFilter,\n type OperatorDefinition,\n} from './variables/adhoc/AdHocFiltersVariable';\nexport type { AdHocFilterWithLabels } from './variables/adhoc/AdHocFiltersVariable';\nexport type {\n AdHocFiltersController,\n AdHocFiltersControllerState,\n} from './variables/adhoc/controller/AdHocFiltersController';\nexport { AdHocFiltersVariableController } from './variables/adhoc/controller/AdHocFiltersVariableController';\nexport { AdHocFiltersComboboxRenderer } from './variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\nexport { escapeUrlPipeDelimiters, getQueriesForVariables } from './variables/utils';\n\nexport {\n type UrlSyncManagerLike,\n UrlSyncManager,\n NewSceneObjectAddedEvent,\n SceneObjectRemovedEvent,\n} from './services/UrlSyncManager';\nexport { useUrlSync } from './services/useUrlSync';\nexport { UrlSyncContextProvider } from './services/UrlSyncContextProvider';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { VizPanelExploreButton } from './components/VizPanel/VizPanelExploreButton';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker, type SceneRefreshPickerState } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemPlacement,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridLayoutDragStartEvent } from './components/layout/grid/types';\nexport { GRID_CELL_HEIGHT, GRID_COLUMN_COUNT } from './components/layout/grid/constants';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport { LazyLoader, type LazyLoaderMode } from './components/layout/LazyLoader';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { FieldConfigBuilder } from './core/PanelBuilders/FieldConfigBuilder';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\nexport { VariableValueSelectWrapper } from './variables/components/VariableValueSelectors';\nexport { ControlsLabel } from './utils/ControlsLabel';\nexport { MultiOrSingleValueSelect } from './variables/components/VariableValueSelect';\nexport { VizConfigBuilder } from './core/PanelBuilders/VizConfigBuilder';\nexport { VizConfigBuilders } from './core/PanelBuilders/VizConfigBuilders';\nexport { type VizConfig } from './core/PanelBuilders/types';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n escapeLabelValueInRegexSelector,\n escapeLabelValueInExactSelector,\n escapeURLDelimiters,\n getVariableControlId,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n isSwitchVariable,\n isRepeatCloneOrChildOf,\n buildPathIdFor,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\nexport { loadResources } from './utils/loadResources';\nexport { PATH_ID_SEPARATOR } from './utils/pathId';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyKO,MAAM,UAAA,GAAa;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA,+BAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/cloneSceneObject';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\nimport { buildPathIdFor } from './utils/pathId';\nimport { isRepeatCloneOrChildOf } from './utils/utils';\n\nimport { registerVariableMacro } from './variables/macros';\nimport {\n escapeLabelValueInExactSelector,\n escapeLabelValueInRegexSelector,\n escapeURLDelimiters,\n renderPrometheusLabelFilters,\n getVariableControlId,\n} from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n isSwitchVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport { getClosest } from './core/sceneGraph/utils';\nexport * as behaviors from './behaviors';\nexport * as performanceUtils from './performance';\nexport { writePerformanceLog } from './utils/writePerformanceLog';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { DataProviderProxy } from './querying/DataProviderProxy';\nexport {\n type ExtraQueryDescriptor,\n type ExtraQueryProvider,\n type ExtraQueryDataProcessor,\n} from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer, type SceneDataTransformerState } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n} from './behaviors/types';\n\nexport type { AdHocFilterInteractionHandler } from './core/sceneGraph/getReportInteractionHandler';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { SwitchVariable } from './variables/variants/SwitchVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport { ScopesVariable } from './variables/variants/ScopesVariable';\nexport {\n MultiValueVariable,\n type MultiValueVariableState,\n type VariableGetOptionsArgs,\n} from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport {\n AdHocFiltersVariable,\n OPERATORS,\n GROUP_BY_OPERATOR,\n isGroupByFilter,\n type OperatorDefinition,\n} from './variables/adhoc/AdHocFiltersVariable';\nexport type { AdHocFilterWithLabels } from './variables/adhoc/AdHocFiltersVariable';\nexport type {\n AdHocFiltersController,\n AdHocFiltersControllerState,\n} from './variables/adhoc/controller/AdHocFiltersController';\nexport { AdHocFiltersVariableController } from './variables/adhoc/controller/AdHocFiltersVariableController';\nexport { AdHocFiltersComboboxRenderer } from './variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\nexport { escapeUrlPipeDelimiters, getQueriesForVariables } from './variables/utils';\n\nexport {\n type UrlSyncManagerLike,\n UrlSyncManager,\n NewSceneObjectAddedEvent,\n SceneObjectRemovedEvent,\n} from './services/UrlSyncManager';\nexport { useUrlSync } from './services/useUrlSync';\nexport { UrlSyncContextProvider } from './services/UrlSyncContextProvider';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { VizPanelExploreButton } from './components/VizPanel/VizPanelExploreButton';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker, type SceneRefreshPickerState } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemPlacement,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridLayoutDragStartEvent } from './components/layout/grid/types';\nexport { GRID_CELL_HEIGHT, GRID_COLUMN_COUNT } from './components/layout/grid/constants';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport { LazyLoader, type LazyLoaderMode } from './components/layout/LazyLoader';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { FieldConfigBuilder } from './core/PanelBuilders/FieldConfigBuilder';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\nexport { VariableValueSelectWrapper } from './variables/components/VariableValueSelectors';\nexport { ControlsLabel } from './utils/ControlsLabel';\nexport { MultiOrSingleValueSelect } from './variables/components/VariableValueSelect';\nexport { VizConfigBuilder } from './core/PanelBuilders/VizConfigBuilder';\nexport { VizConfigBuilders } from './core/PanelBuilders/VizConfigBuilders';\nexport { type VizConfig } from './core/PanelBuilders/types';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n escapeLabelValueInRegexSelector,\n escapeLabelValueInExactSelector,\n escapeURLDelimiters,\n getVariableControlId,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n isSwitchVariable,\n isRepeatCloneOrChildOf,\n buildPathIdFor,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\nexport { getCompareSeriesRefId } from './utils/getCompareSeriesRefId';\nexport { timeShiftAlignmentProcessor } from './utils/timeShiftAlignmentProcessor';\nexport { loadResources } from './utils/loadResources';\nexport { PATH_ID_SEPARATOR } from './utils/pathId';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyKO,MAAM,UAAA,GAAa;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA,+BAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- const getCompareSeriesRefId = (refId) => `${refId}-compare`;
1
+ const getCompareSeriesRefId = (refId) => refId.endsWith("-compare") ? refId : `${refId}-compare`;
2
2
 
3
3
  export { getCompareSeriesRefId };
4
4
  //# sourceMappingURL=getCompareSeriesRefId.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCompareSeriesRefId.js","sources":["../../../src/utils/getCompareSeriesRefId.ts"],"sourcesContent":["export const getCompareSeriesRefId = (refId: string) => `${refId}-compare`;\n"],"names":[],"mappings":"AAAO,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB,CAAA,EAAG,KAAK,CAAA,QAAA;;;;"}
1
+ {"version":3,"file":"getCompareSeriesRefId.js","sources":["../../../src/utils/getCompareSeriesRefId.ts"],"sourcesContent":["// Idempotent: compare queries may already carry the -compare suffix on their refId\n// (set at request time for cache identity), so re-applying must not double-suffix.\nexport const getCompareSeriesRefId = (refId: string) => (refId.endsWith('-compare') ? refId : `${refId}-compare`);\n"],"names":[],"mappings":"AAEO,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAmB,KAAA,CAAM,SAAS,UAAU,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,QAAA;;;;"}
@@ -0,0 +1,21 @@
1
+ import { of } from 'rxjs';
2
+ import { getCompareSeriesRefId } from './getCompareSeriesRefId.js';
3
+
4
+ const timeShiftAlignmentProcessor = (primary, secondary) => {
5
+ const diff = secondary.timeRange.from.diff(primary.timeRange.from);
6
+ const series = secondary.series.map((frame) => ({
7
+ ...frame,
8
+ refId: getCompareSeriesRefId(frame.refId || ""),
9
+ meta: {
10
+ ...frame.meta,
11
+ timeCompare: {
12
+ diffMs: diff,
13
+ isTimeShiftQuery: true
14
+ }
15
+ }
16
+ }));
17
+ return of({ ...secondary, series });
18
+ };
19
+
20
+ export { timeShiftAlignmentProcessor };
21
+ //# sourceMappingURL=timeShiftAlignmentProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeShiftAlignmentProcessor.js","sources":["../../../src/utils/timeShiftAlignmentProcessor.ts"],"sourcesContent":["import { of } from 'rxjs';\n\nimport { ExtraQueryDataProcessor } from '../querying/ExtraQueryProvider';\nimport { getCompareSeriesRefId } from './getCompareSeriesRefId';\n\n// Processor function for use with time shifted comparison series.\n// This aligns the secondary series with the primary and adds custom\n// metadata and config to the secondary series' fields so that it is\n// rendered appropriately.\nexport const timeShiftAlignmentProcessor: ExtraQueryDataProcessor = (primary, secondary) => {\n const diff = secondary.timeRange.from.diff(primary.timeRange.from);\n // Build new frame objects rather than mutating secondary.series in place. With streaming/split-chunk\n // queries (e.g. Loki), the frame objects here are owned by the datasource's response accumulator and\n // get re-processed on every chunk - mutating refId in place made each re-processed chunk look like a\n // brand new series to the merge layer, appending duplicate compare series instead of replacing one.\n const series = secondary.series.map((frame) => ({\n ...frame,\n refId: getCompareSeriesRefId(frame.refId || ''),\n meta: {\n ...frame.meta,\n timeCompare: {\n diffMs: diff,\n isTimeShiftQuery: true,\n },\n },\n }));\n return of({ ...secondary, series });\n};\n"],"names":[],"mappings":";;;AASO,MAAM,2BAAA,GAAuD,CAAC,OAAA,EAAS,SAAA,KAAc;AAC1F,EAAA,MAAM,OAAO,SAAA,CAAU,SAAA,CAAU,KAAK,IAAA,CAAK,OAAA,CAAQ,UAAU,IAAI,CAAA;AAKjE,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAC9C,GAAG,KAAA;AAAA,IACH,KAAA,EAAO,qBAAA,CAAsB,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAAA,IAC9C,IAAA,EAAM;AAAA,MACJ,GAAG,KAAA,CAAM,IAAA;AAAA,MACT,WAAA,EAAa;AAAA,QACX,MAAA,EAAQ,IAAA;AAAA,QACR,gBAAA,EAAkB;AAAA;AACpB;AACF,GACF,CAAE,CAAA;AACF,EAAA,OAAO,EAAA,CAAG,EAAE,GAAG,SAAA,EAAW,QAAQ,CAAA;AACpC;;;;"}
package/dist/index.d.ts CHANGED
@@ -3891,6 +3891,10 @@ declare class SafeSerializableSceneObject implements ScopedVar {
3891
3891
  */
3892
3892
  declare function getExploreURL(data: PanelData, model: SceneObject, timeRange: RawTimeRange, transform?: (query: DataQuery) => DataQuery): Promise<string>;
3893
3893
 
3894
+ declare const getCompareSeriesRefId: (refId: string) => string;
3895
+
3896
+ declare const timeShiftAlignmentProcessor: ExtraQueryDataProcessor;
3897
+
3894
3898
  /**
3895
3899
  * Loads the translation resources for the given language and returns them.
3896
3900
  */
@@ -3956,5 +3960,5 @@ declare const sceneUtils: {
3956
3960
  buildPathIdFor: typeof buildPathIdFor;
3957
3961
  };
3958
3962
 
3959
- export { AdHocFiltersComboboxRenderer, AdHocFiltersVariable, AdHocFiltersVariableController, ConstantVariable, ControlsLabel, CustomVariable, DataProviderProxy, DataSourceVariable, EmbeddedScene, FieldConfigBuilder, FieldConfigBuilders, FieldConfigOverridesBuilder, GRID_CELL_HEIGHT, GRID_COLUMN_COUNT, GROUP_BY_OPERATOR, GroupByVariable, IntervalVariable, LazyLoader, LocalValueVariable, MultiOrSingleValueSelect, MultiValueVariable, NestedScene, NewSceneObjectAddedEvent, OPERATORS, PATH_ID_SEPARATOR, PanelBuilders, PanelOptionsBuilders, QueryVariable, RuntimeDataSource, SafeSerializableSceneObject, SceneApp, SceneAppPage, SceneByFrameRepeater, SceneByVariableRepeater, SceneCSSGridItem, SceneCSSGridLayout, SceneCanvasText, SceneControlsSpacer, SceneDataLayerBase, SceneDataLayerControls, SceneDataLayerSet, SceneDataLayerSetBase, SceneDataNode, SceneDataTransformer, SceneDebugger, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridLayoutDragStartEvent, SceneGridRow, SceneObjectBase, SceneObjectRef, SceneObjectRemovedEvent, SceneObjectStateChangedEvent, SceneObjectUrlSyncConfig, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneTimePicker, SceneTimeRange, SceneTimeRangeCompare, SceneTimeRangeTransformerBase, SceneTimeZoneOverride, SceneToolbarButton, SceneToolbarInput, SceneVariableSet, SceneVariableValueChangedEvent, ScopesVariable, SplitLayout, SwitchVariable, TestVariable, TextBoxVariable, UrlSyncContextProvider, UrlSyncManager, UserActionEvent, VariableDependencyConfig, VariableValueControl, VariableValueSelectWrapper, VariableValueSelectors, VizConfigBuilder, VizConfigBuilders, VizPanel, VizPanelBuilder, VizPanelExploreButton, VizPanelMenu, index$2 as behaviors, index as dataLayers, escapeUrlPipeDelimiters, formatRegistry, getClosest, getExploreURL, getQueriesForVariables, isCustomVariableValue, isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isGroupByFilter, isSceneObject, loadResources, index$1 as performanceUtils, registerQueryWithController, registerRuntimeDataSource, sceneGraph, sceneUtils, useSceneApp, useSceneObjectState, useUrlSync, writePerformanceLog };
3963
+ export { AdHocFiltersComboboxRenderer, AdHocFiltersVariable, AdHocFiltersVariableController, ConstantVariable, ControlsLabel, CustomVariable, DataProviderProxy, DataSourceVariable, EmbeddedScene, FieldConfigBuilder, FieldConfigBuilders, FieldConfigOverridesBuilder, GRID_CELL_HEIGHT, GRID_COLUMN_COUNT, GROUP_BY_OPERATOR, GroupByVariable, IntervalVariable, LazyLoader, LocalValueVariable, MultiOrSingleValueSelect, MultiValueVariable, NestedScene, NewSceneObjectAddedEvent, OPERATORS, PATH_ID_SEPARATOR, PanelBuilders, PanelOptionsBuilders, QueryVariable, RuntimeDataSource, SafeSerializableSceneObject, SceneApp, SceneAppPage, SceneByFrameRepeater, SceneByVariableRepeater, SceneCSSGridItem, SceneCSSGridLayout, SceneCanvasText, SceneControlsSpacer, SceneDataLayerBase, SceneDataLayerControls, SceneDataLayerSet, SceneDataLayerSetBase, SceneDataNode, SceneDataTransformer, SceneDebugger, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridLayoutDragStartEvent, SceneGridRow, SceneObjectBase, SceneObjectRef, SceneObjectRemovedEvent, SceneObjectStateChangedEvent, SceneObjectUrlSyncConfig, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneTimePicker, SceneTimeRange, SceneTimeRangeCompare, SceneTimeRangeTransformerBase, SceneTimeZoneOverride, SceneToolbarButton, SceneToolbarInput, SceneVariableSet, SceneVariableValueChangedEvent, ScopesVariable, SplitLayout, SwitchVariable, TestVariable, TextBoxVariable, UrlSyncContextProvider, UrlSyncManager, UserActionEvent, VariableDependencyConfig, VariableValueControl, VariableValueSelectWrapper, VariableValueSelectors, VizConfigBuilder, VizConfigBuilders, VizPanel, VizPanelBuilder, VizPanelExploreButton, VizPanelMenu, index$2 as behaviors, index as dataLayers, escapeUrlPipeDelimiters, formatRegistry, getClosest, getCompareSeriesRefId, getExploreURL, getQueriesForVariables, isCustomVariableValue, isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isGroupByFilter, isSceneObject, loadResources, index$1 as performanceUtils, registerQueryWithController, registerRuntimeDataSource, sceneGraph, sceneUtils, timeShiftAlignmentProcessor, useSceneApp, useSceneObjectState, useUrlSync, writePerformanceLog };
3960
3964
  export type { AdHocFilterInteractionHandler, AdHocFilterWithLabels, AdHocFiltersController, AdHocFiltersControllerState, CancelActivationHandler, ControlSourceRef, ControlsLayout, CustomFormatterVariable, CustomTransformOperator, CustomTransformerDefinition, CustomVariableValue, DataLayerFilter, DataRequestEnricher, DataSourceControlRef, DeepPartial, EmbeddedSceneState, ExtraQueryDataProcessor, ExtraQueryDescriptor, ExtraQueryProvider, FiltersRequestEnricher, FormatVariable, InterpolationFormatParameter, LazyLoaderMode, MacroVariableConstructor, MultiValueVariableState, OperatorDefinition, QueryRunnerState, SceneActivationHandler, SceneAppDrilldownView, SceneAppPageLike, SceneAppPageState, SceneAppRoute, SceneComponent, SceneComponentProps, SceneDataLayerProvider, SceneDataLayerProviderState, SceneDataProvider, SceneDataProviderResult, SceneDataQuery, SceneDataState, SceneDataTransformerState, SceneDeactivationHandler, SceneFlexItemLike, SceneFlexItemPlacement, SceneFlexItemState, SceneGridItemLike, SceneGridItemStateLike, SceneLayout, SceneLayoutChildOptions, SceneLayoutState, SceneObject, SceneObjectState, SceneObjectStateChangedPayload, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryControllerEntry, SceneQueryControllerEntryType, SceneQueryControllerLike, SceneRefreshPickerState, SceneRouteMatch, SceneStateChangedHandler, SceneStatelessBehavior, SceneTimeRangeLike, SceneTimeRangeState, SceneUrlSyncOptions, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSetState, SceneVariableState, SceneVariables, UrlSyncManagerLike, UseStateHookOptions, ValidateAndUpdateResult, VariableCustomFormatterFn, VariableGetOptionsArgs, VariableValue, VariableValueOption, VariableValueOptionProperties, VariableValueSingle, VizConfig, VizPanelState };
package/dist/index.js CHANGED
@@ -3790,7 +3790,8 @@ function VizPanelRenderer({ model }) {
3790
3790
  className: absoluteWrapper,
3791
3791
  "data-viz-panel-key": model.state.key,
3792
3792
  "data-viz-panel-id": model.getPathId(),
3793
- "data-testid": `${plugin.meta.id}-${model.state.key}`
3793
+ "data-testid": `${plugin.meta.id}-${model.state.key}`,
3794
+ "data-plugin-id": plugin.meta.id
3794
3795
  },
3795
3796
  /* @__PURE__ */ React__default.default.createElement(
3796
3797
  ui.PanelChrome,
@@ -16530,7 +16531,23 @@ function isImageRenderer() {
16530
16531
  return typeof window !== "undefined" && typeof window.__grafanaImageRendererMessageChannel === "function";
16531
16532
  }
16532
16533
 
16533
- const getCompareSeriesRefId = (refId) => `${refId}-compare`;
16534
+ const getCompareSeriesRefId = (refId) => refId.endsWith("-compare") ? refId : `${refId}-compare`;
16535
+
16536
+ const timeShiftAlignmentProcessor = (primary, secondary) => {
16537
+ const diff = secondary.timeRange.from.diff(primary.timeRange.from);
16538
+ const series = secondary.series.map((frame) => ({
16539
+ ...frame,
16540
+ refId: getCompareSeriesRefId(frame.refId || ""),
16541
+ meta: {
16542
+ ...frame.meta,
16543
+ timeCompare: {
16544
+ diffMs: diff,
16545
+ isTimeShiftQuery: true
16546
+ }
16547
+ }
16548
+ }));
16549
+ return rxjs.of({ ...secondary, series });
16550
+ };
16534
16551
 
16535
16552
  const PREVIOUS_PERIOD_VALUE = "__previousPeriod";
16536
16553
  const NO_PERIOD_VALUE = "__noPeriod";
@@ -16661,21 +16678,6 @@ class SceneTimeRangeCompare extends SceneObjectBase {
16661
16678
  }
16662
16679
  }
16663
16680
  SceneTimeRangeCompare.Component = SceneTimeRangeCompareRenderer;
16664
- const timeShiftAlignmentProcessor = (primary, secondary) => {
16665
- const diff = secondary.timeRange.from.diff(primary.timeRange.from);
16666
- secondary.series.forEach((series) => {
16667
- series.refId = getCompareSeriesRefId(series.refId || "");
16668
- series.meta = {
16669
- ...series.meta,
16670
- // @ts-ignore Remove when https://github.com/grafana/grafana/pull/71129 is released
16671
- timeCompare: {
16672
- diffMs: diff,
16673
- isTimeShiftQuery: true
16674
- }
16675
- };
16676
- });
16677
- return rxjs.of(secondary);
16678
- };
16679
16681
  function SceneTimeRangeCompareRenderer({ model }) {
16680
16682
  var _a;
16681
16683
  const styles = ui.useStyles2(getStyles$4);
@@ -18927,6 +18929,7 @@ exports.dataLayers = index;
18927
18929
  exports.escapeUrlPipeDelimiters = escapeUrlPipeDelimiters;
18928
18930
  exports.formatRegistry = formatRegistry;
18929
18931
  exports.getClosest = getClosest;
18932
+ exports.getCompareSeriesRefId = getCompareSeriesRefId;
18930
18933
  exports.getExploreURL = getExploreURL;
18931
18934
  exports.getQueriesForVariables = getQueriesForVariables;
18932
18935
  exports.isCustomVariableValue = isCustomVariableValue;
@@ -18941,6 +18944,7 @@ exports.registerQueryWithController = registerQueryWithController;
18941
18944
  exports.registerRuntimeDataSource = registerRuntimeDataSource;
18942
18945
  exports.sceneGraph = sceneGraph;
18943
18946
  exports.sceneUtils = sceneUtils;
18947
+ exports.timeShiftAlignmentProcessor = timeShiftAlignmentProcessor;
18944
18948
  exports.useSceneApp = useSceneApp;
18945
18949
  exports.useSceneObjectState = useSceneObjectState;
18946
18950
  exports.useUrlSync = useUrlSync;