@grafana/scenes 6.35.1--canary.1148.17638520145.0 → 6.35.1

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,16 @@
1
+ # v6.35.1 (Thu Sep 11 2025)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Transformations: Support series <-> annotations conversions [#1207](https://github.com/grafana/scenes/pull/1207) ([@leeoniya](https://github.com/leeoniya) [@dprokop](https://github.com/dprokop))
6
+
7
+ #### Authors: 2
8
+
9
+ - Dominik Prokop ([@dprokop](https://github.com/dprokop))
10
+ - Leon Sorokin ([@leeoniya](https://github.com/leeoniya))
11
+
12
+ ---
13
+
1
14
  # v6.35.0 (Wed Sep 10 2025)
2
15
 
3
16
  #### 🚀 Enhancement
@@ -1,5 +1,5 @@
1
1
  import { Trans } from '@grafana/i18n';
2
- import React, { useMemo, useCallback, useEffect } from 'react';
2
+ import React, { useMemo, useCallback } from 'react';
3
3
  import { useMeasure } from 'react-use';
4
4
  import { SetPanelAttentionEvent, AlertState, PluginContextProvider } from '@grafana/data';
5
5
  import { getAppEvents } from '@grafana/runtime';
@@ -9,7 +9,6 @@ import { isSceneObject } from '../../core/types.js';
9
9
  import { css, cx } from '@emotion/css';
10
10
  import { debounce } from 'lodash';
11
11
  import { VizPanelSeriesLimit } from './VizPanelSeriesLimit.js';
12
- import { useLazyLoaderIsInView } from '../layout/LazyLoader.js';
13
12
 
14
13
  function VizPanelRenderer({ model }) {
15
14
  var _a;
@@ -53,12 +52,6 @@ function VizPanelRenderer({ model }) {
53
52
  const sceneTimeRange = sceneGraph.getTimeRange(model);
54
53
  const timeZone = sceneTimeRange.getTimeZone();
55
54
  const timeRange = model.getTimeRange(dataWithFieldConfig);
56
- const isInView = useLazyLoaderIsInView();
57
- useEffect(() => {
58
- if (dataObject.isInViewChanged) {
59
- dataObject.isInViewChanged(isInView);
60
- }
61
- }, [isInView, dataObject]);
62
55
  const titleInterpolated = model.interpolate(title, void 0, "text");
63
56
  const alertStateStyles = useStyles2(getAlertStateStyles);
64
57
  if (!plugin) {
@@ -1 +1 @@
1
- {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans } from '@grafana/i18n';\nimport React, { RefCallback, useCallback, useEffect, useMemo } from 'react';\nimport { useMeasure } from 'react-use';\n\n// @ts-ignore\nimport { AlertState, GrafanaTheme2, PanelData, PluginContextProvider, SetPanelAttentionEvent } 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 titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n } = model.useState();\n const [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 const plugin = model.getPlugin();\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 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) {\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 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 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 const panelId = model.getLegacyPanelId();\n\n return (\n <div className={relativeWrapper}>\n <div ref={ref as RefCallback<HTMLDivElement>} className={absoluteWrapper} data-viz-panel-key={model.state.key}>\n {width > 0 && height > 0 && (\n // @ts-expect-error showMenuAlways remove when updating to @grafana/ui@12 fixed in https://github.com/grafana/grafana/pull/103553\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusMessageOnClick={model.onStatusMessageClick}\n width={width}\n height={height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement}\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 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 <>\n <ErrorBoundaryAlert dependencies={[plugin, data]}>\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 )}\n </div>\n </div>\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\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"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans } from '@grafana/i18n';\nimport React, { RefCallback, useCallback, useMemo } from 'react';\nimport { useMeasure } from 'react-use';\n\n// @ts-ignore\nimport { AlertState, GrafanaTheme2, PanelData, PluginContextProvider, SetPanelAttentionEvent } 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';\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 titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n } = model.useState();\n const [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 const plugin = model.getPlugin();\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 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 // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin) {\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 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 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 const panelId = model.getLegacyPanelId();\n\n return (\n <div className={relativeWrapper}>\n <div ref={ref as RefCallback<HTMLDivElement>} className={absoluteWrapper} data-viz-panel-key={model.state.key}>\n {width > 0 && height > 0 && (\n // @ts-expect-error showMenuAlways remove when updating to @grafana/ui@12 fixed in https://github.com/grafana/grafana/pull/103553\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusMessageOnClick={model.onStatusMessageClick}\n width={width}\n height={height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement}\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 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 <>\n <ErrorBoundaryAlert dependencies={[plugin, data]}>\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 )}\n </div>\n </div>\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\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"],"names":["_a"],"mappings":"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"}
@@ -40,7 +40,7 @@ const LazyLoader = React.forwardRef(
40
40
  }
41
41
  };
42
42
  });
43
- return /* @__PURE__ */ React.createElement("div", { id, ref: innerRef, className: `${hideEmpty} ${className}`, ...rest }, !loaded ? t("grafana-scenes.components.lazy-loader.placeholder", "\xA0") : /* @__PURE__ */ React.createElement(LazyLoaderInViewContext.Provider, { value: isInView }, children));
43
+ return /* @__PURE__ */ React.createElement("div", { id, ref: innerRef, className: `${hideEmpty} ${className}`, ...rest }, !loaded || !isInView ? t("grafana-scenes.components.lazy-loader.placeholder", "\xA0") : children);
44
44
  }
45
45
  );
46
46
  function getStyles() {
@@ -65,10 +65,6 @@ LazyLoader.observer = new IntersectionObserver(
65
65
  },
66
66
  { rootMargin: "100px" }
67
67
  );
68
- const LazyLoaderInViewContext = React.createContext(true);
69
- function useLazyLoaderIsInView() {
70
- return React.useContext(LazyLoaderInViewContext);
71
- }
72
68
 
73
- export { LazyLoader, LazyLoaderInViewContext, useLazyLoaderIsInView, useUniqueId };
69
+ export { LazyLoader, useUniqueId };
74
70
  //# sourceMappingURL=LazyLoader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LazyLoader.js","sources":["../../../../src/components/layout/LazyLoader.tsx"],"sourcesContent":["import React, { ForwardRefExoticComponent, useImperativeHandle, useRef, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { uniqueId } from 'lodash';\nimport { css } from '@emotion/css';\nimport { useStyles2 } from '@grafana/ui';\nimport { t } from '@grafana/i18n';\n\nexport function useUniqueId(): string {\n const idRefLazy = useRef<string | undefined>(undefined);\n idRefLazy.current ??= uniqueId();\n return idRefLazy.current;\n}\n\nexport interface Props extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange' | 'children'> {\n children: React.ReactNode;\n key: string;\n onLoad?: () => void;\n onChange?: (isInView: boolean) => void;\n}\n\nexport interface LazyLoaderType extends ForwardRefExoticComponent<Props> {\n addCallback: (id: string, c: (e: IntersectionObserverEntry) => void) => void;\n callbacks: Record<string, (e: IntersectionObserverEntry) => void>;\n observer: IntersectionObserver;\n}\n\nexport const LazyLoader: LazyLoaderType = React.forwardRef<HTMLDivElement, Props>(\n ({ children, onLoad, onChange, className, ...rest }, ref) => {\n const id = useUniqueId();\n const { hideEmpty } = useStyles2(getStyles);\n const [loaded, setLoaded] = useState(false);\n const [isInView, setIsInView] = useState(false);\n const innerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(ref, () => innerRef.current!);\n\n useEffectOnce(() => {\n LazyLoader.addCallback(id, (entry) => {\n if (!loaded && entry.isIntersecting) {\n setLoaded(true);\n onLoad?.();\n }\n\n setIsInView(entry.isIntersecting);\n onChange?.(entry.isIntersecting);\n });\n\n const wrapperEl = innerRef.current;\n\n if (wrapperEl) {\n LazyLoader.observer.observe(wrapperEl);\n }\n\n return () => {\n wrapperEl && LazyLoader.observer.unobserve(wrapperEl);\n delete LazyLoader.callbacks[id];\n if (Object.keys(LazyLoader.callbacks).length === 0) {\n LazyLoader.observer.disconnect();\n }\n };\n });\n\n // since we will hide empty lazyloaded divs, we need to include a\n // non-breaking space while the loader has not been loaded. after it has\n // been loaded, we can remove the non-breaking space and show the children.\n // If the children render empty, the whole loader will be hidden by css.\n return (\n <div id={id} ref={innerRef} className={`${hideEmpty} ${className}`} {...rest}>\n {!loaded ? (\n t('grafana-scenes.components.lazy-loader.placeholder', '\\u00A0')\n ) : (\n <LazyLoaderInViewContext.Provider value={isInView}>{children}</LazyLoaderInViewContext.Provider>\n )}\n </div>\n );\n }\n) as LazyLoaderType;\n\nfunction getStyles() {\n return {\n hideEmpty: css({\n '&:empty': {\n display: 'none',\n },\n }),\n };\n}\n\nLazyLoader.displayName = 'LazyLoader';\nLazyLoader.callbacks = {} as Record<string, (e: IntersectionObserverEntry) => void>;\nLazyLoader.addCallback = (id: string, c: (e: IntersectionObserverEntry) => void) => (LazyLoader.callbacks[id] = c);\nLazyLoader.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (typeof LazyLoader.callbacks[entry.target.id] === 'function') {\n LazyLoader.callbacks[entry.target.id](entry);\n }\n }\n },\n { rootMargin: '100px' }\n);\n\nexport const LazyLoaderInViewContext = React.createContext<boolean>(true);\n\nexport function useLazyLoaderIsInView(): boolean {\n return React.useContext(LazyLoaderInViewContext);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LazyLoader.js","sources":["../../../../src/components/layout/LazyLoader.tsx"],"sourcesContent":["import React, { ForwardRefExoticComponent, useImperativeHandle, useRef, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { uniqueId } from 'lodash';\nimport { css } from '@emotion/css';\nimport { useStyles2 } from '@grafana/ui';\nimport { t } from '@grafana/i18n';\n\nexport function useUniqueId(): string {\n const idRefLazy = useRef<string | undefined>(undefined);\n idRefLazy.current ??= uniqueId();\n return idRefLazy.current;\n}\n\nexport interface Props extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange' | 'children'> {\n children: React.ReactNode;\n key: string;\n onLoad?: () => void;\n onChange?: (isInView: boolean) => void;\n}\n\nexport interface LazyLoaderType extends ForwardRefExoticComponent<Props> {\n addCallback: (id: string, c: (e: IntersectionObserverEntry) => void) => void;\n callbacks: Record<string, (e: IntersectionObserverEntry) => void>;\n observer: IntersectionObserver;\n}\n\nexport const LazyLoader: LazyLoaderType = React.forwardRef<HTMLDivElement, Props>(\n ({ children, onLoad, onChange, className, ...rest }, ref) => {\n const id = useUniqueId();\n const { hideEmpty } = useStyles2(getStyles);\n const [loaded, setLoaded] = useState(false);\n const [isInView, setIsInView] = useState(false);\n const innerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(ref, () => innerRef.current!);\n\n useEffectOnce(() => {\n LazyLoader.addCallback(id, (entry) => {\n if (!loaded && entry.isIntersecting) {\n setLoaded(true);\n onLoad?.();\n }\n\n setIsInView(entry.isIntersecting);\n onChange?.(entry.isIntersecting);\n });\n\n const wrapperEl = innerRef.current;\n\n if (wrapperEl) {\n LazyLoader.observer.observe(wrapperEl);\n }\n\n return () => {\n wrapperEl && LazyLoader.observer.unobserve(wrapperEl);\n delete LazyLoader.callbacks[id];\n if (Object.keys(LazyLoader.callbacks).length === 0) {\n LazyLoader.observer.disconnect();\n }\n };\n });\n\n // since we will hide empty lazyloaded divs, we need to include a\n // non-breaking space while the loader has not been loaded. after it has\n // been loaded, we can remove the non-breaking space and show the children.\n // If the children render empty, the whole loader will be hidden by css.\n return (\n <div id={id} ref={innerRef} className={`${hideEmpty} ${className}`} {...rest}>\n {!loaded || !isInView ? t('grafana-scenes.components.lazy-loader.placeholder', '\\u00A0') : children}\n </div>\n );\n }\n) as LazyLoaderType;\n\nfunction getStyles() {\n return {\n hideEmpty: css({\n '&:empty': {\n display: 'none',\n },\n }),\n };\n}\n\nLazyLoader.displayName = 'LazyLoader';\nLazyLoader.callbacks = {} as Record<string, (e: IntersectionObserverEntry) => void>;\nLazyLoader.addCallback = (id: string, c: (e: IntersectionObserverEntry) => void) => (LazyLoader.callbacks[id] = c);\nLazyLoader.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (typeof LazyLoader.callbacks[entry.target.id] === 'function') {\n LazyLoader.callbacks[entry.target.id](entry);\n }\n }\n },\n { rootMargin: '100px' }\n);\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { MonoTypeOperatorFunction, Observable, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n BusEventHandler,\n BusEventType,\n DataFrame,\n DataQueryRequest,\n DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { DataQuery, DataTopic, TimeZone } from '@grafana/schema';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\nimport { SceneObjectRef } from './SceneObjectRef';\nimport { VizPanel } from '../components/VizPanel/VizPanel';\nimport { WeekStart } from '@grafana/ui';\n\nexport interface SceneObjectState {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneDataProvider;\n $variables?: SceneVariables;\n /**\n * @experimental\n * Can be used to add extra behaviors to a scene object.\n * These are activated when the their parent scene object is activated.\n */\n $behaviors?: Array<SceneObject | SceneStatelessBehavior>;\n}\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n}\n\nexport type SceneComponent<TModel> = (props: SceneComponentProps<TModel>) => React.ReactElement | null;\n\nexport interface SceneDataState extends SceneObjectState {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** Controls if activation blocks rendering */\n readonly renderBeforeActivation: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler;\n\n /** Subscribe to state changes */\n subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /**\n * Called when the Component is mounted. This will also activate any $data, $variables or $timeRange scene object on this level.\n * Don't override this in your custom SceneObjects, instead use addActivationHandler from the constructor.\n **/\n activate(): CancelActivationHandler;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n\n /** Returns a SceneObjectRef that will resolve to this object */\n getRef(): SceneObjectRef<this>;\n\n /**\n * Allows external code to register code that is executed on activate and deactivate. This allow you\n * to wire up scene objects that need to respond to state changes in other objects from the outside.\n **/\n addActivationHandler(handler: SceneActivationHandler): void;\n\n /**\n * Loop through state and call callback for each direct child scene object.\n * Checks 1 level deep properties and arrays. So a scene object hidden in a nested plain object will not be detected.\n * Return false to exit loop early.\n */\n forEachChild(callback: (child: SceneObject) => void): void | false;\n\n /**\n * Useful for edge cases when you want to move a scene object to another parent.\n */\n clearParent(): void;\n}\n\nexport type SceneActivationHandler = () => SceneDeactivationHandler | void;\nexport type SceneDeactivationHandler = () => void;\n\n/**\n * Function returned by activate() that when called will deactivate the object if it's the last activator\n **/\nexport type CancelActivationHandler = () => void;\n\nexport interface SceneLayoutState extends SceneObjectState {\n children: SceneObject[];\n}\n\nexport interface SceneLayout<T extends SceneLayoutState = SceneLayoutState> extends SceneObject<T> {\n isDraggable(): boolean;\n getDragClass?(): string;\n getDragClassCancel?(): string;\n getDragHooks?(): { onDragStart?: (e: React.PointerEvent, panel: VizPanel) => void };\n}\n\nexport interface SceneTimeRangeState extends SceneObjectState {\n from: string;\n to: string;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n timeZone?: TimeZone;\n /** weekStart will change the global date locale so having multiple different weekStart values is not supported */\n weekStart?: WeekStart;\n /**\n * @internal\n * To enable feature parity with the old time range picker, not sure if it will be kept.\n * Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.\n * */\n UNSAFE_nowDelay?: string;\n\n refreshOnActivate?: {\n /**\n * When set, the time range will invalidate relative ranges after the specified interval has elapsed\n */\n afterMs?: number;\n /**\n * When set, the time range will invalidate relative ranges after the specified percentage of the current interval has elapsed.\n * If both invalidate values are set, the smaller value will be used for the given interval.\n */\n percent?: number;\n };\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeZoneChange(timeZone: TimeZone): void;\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n getTimeZone(): TimeZone;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync extends SceneObject {\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface SceneObjectUrlSyncHandler {\n getKeys(): string[];\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n shouldCreateHistoryStep?(values: SceneObjectUrlValues): boolean;\n performBrowserHistoryAction?(callback: () => void): void;\n}\n\nexport interface DataRequestEnricher {\n // Return partial data query request that will be merged with the original request provided by SceneQueryRunner\n enrichDataRequest(source: SceneObject): Partial<DataQueryRequest> | null;\n}\n\nexport interface FiltersRequestEnricher {\n // Return partial getTagKeys or getTagValues query request that will be merged with the original request provided by ad hoc or group by variable\n enrichFiltersRequest(\n source: SceneObject\n ): Partial<DataSourceGetTagKeysOptions | DataSourceGetTagValuesOptions> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport function isFiltersRequestEnricher(obj: any): obj is FiltersRequestEnricher {\n return 'enrichFiltersRequest' in obj;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type CustomTransformOperator = (context: DataTransformContext) => MonoTypeOperatorFunction<DataFrame[]>;\nexport type CustomTransformerDefinition =\n | { operator: CustomTransformOperator; topic: DataTopic }\n | CustomTransformOperator;\nexport type SceneStateChangedHandler<TState> = (newState: TState, prevState: TState) => void;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface SceneDataProviderResult {\n data: PanelData;\n origin: SceneDataProvider;\n}\n\nexport interface SceneDataProvider<T extends SceneObjectState = SceneDataState> extends SceneObject<T> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataProviderResult>;\n /**\n * Can be used to disable query execution for scene elements that are out of view\n */\n isInViewChanged?(isInView: boolean): void;\n}\n\nexport interface SceneDataLayerProviderState extends SceneDataState {\n name: string;\n description?: string;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneDataProvider<SceneDataLayerProviderState> {\n isDataLayer: true;\n}\n\nexport function isDataLayer(obj: SceneObject): obj is SceneDataLayerProvider {\n return 'isDataLayer' in obj;\n}\n\nexport interface DataLayerFilter {\n panelId: number;\n}\n\nexport interface SceneStatelessBehavior<T extends SceneObject = any> {\n (sceneObject: T): CancelActivationHandler | void;\n}\n\nexport type ControlsLayout = 'horizontal' | 'vertical';\n\nexport interface UseStateHookOptions {\n /**\n * For some edge cases other scene objects want to subscribe to scene object state for objects\n * that are not active, or whose main React Component can be un-mounted. Set this to true\n * to keep the scene object active even if the React component is unmounted.\n *\n * Normally you would not need this but this can be useful in some edge cases.\n *\n * @experimental\n */\n shouldActivateOrKeepAlive?: boolean;\n}\n\nexport interface SceneDataQuery extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\nexport interface SceneUrlSyncOptions {\n /**\n * This will update the url to contain all scene url state\n * when the scene is initialized. Important for browser history \"back\" actions.\n */\n updateUrlOnInit?: boolean;\n /**\n * This is only supported by some objects if they implement\n * shouldCreateHistoryStep where they can control what changes\n * url changes should add a new browser history entry.\n */\n createBrowserHistorySteps?: boolean;\n /**\n * This will automatically prefix url search parameters when syncing.\n * Can be used to prevent collisions when multiple Scene apps are embedded in the page.\n */\n namespace?: string;\n /**\n * When `namespace` is provided, this prevents some url search parameters to be automatically prefixed.\n * Defaults to the timerange parameters ([\"from\", \"to\", \"timezone\"])\n */\n excludeFromNamespace?: string[];\n}\n"],"names":[],"mappings":"AA0LO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,MAAA;AAC1B;AA2BO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA;AAChC;AAEO,SAAS,yBAAyB,GAAyC,EAAA;AAChF,EAAA,OAAO,sBAA0B,IAAA,GAAA;AACnC;AA0CO,SAAS,YAAY,GAAiD,EAAA;AAC3E,EAAA,OAAO,aAAiB,IAAA,GAAA;AAC1B;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { MonoTypeOperatorFunction, Observable, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n BusEventHandler,\n BusEventType,\n DataFrame,\n DataQueryRequest,\n DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { DataQuery, DataTopic, TimeZone } from '@grafana/schema';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\nimport { SceneObjectRef } from './SceneObjectRef';\nimport { VizPanel } from '../components/VizPanel/VizPanel';\nimport { WeekStart } from '@grafana/ui';\n\nexport interface SceneObjectState {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneDataProvider;\n $variables?: SceneVariables;\n /**\n * @experimental\n * Can be used to add extra behaviors to a scene object.\n * These are activated when the their parent scene object is activated.\n */\n $behaviors?: Array<SceneObject | SceneStatelessBehavior>;\n}\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n}\n\nexport type SceneComponent<TModel> = (props: SceneComponentProps<TModel>) => React.ReactElement | null;\n\nexport interface SceneDataState extends SceneObjectState {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** Controls if activation blocks rendering */\n readonly renderBeforeActivation: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler;\n\n /** Subscribe to state changes */\n subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /**\n * Called when the Component is mounted. This will also activate any $data, $variables or $timeRange scene object on this level.\n * Don't override this in your custom SceneObjects, instead use addActivationHandler from the constructor.\n **/\n activate(): CancelActivationHandler;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n\n /** Returns a SceneObjectRef that will resolve to this object */\n getRef(): SceneObjectRef<this>;\n\n /**\n * Allows external code to register code that is executed on activate and deactivate. This allow you\n * to wire up scene objects that need to respond to state changes in other objects from the outside.\n **/\n addActivationHandler(handler: SceneActivationHandler): void;\n\n /**\n * Loop through state and call callback for each direct child scene object.\n * Checks 1 level deep properties and arrays. So a scene object hidden in a nested plain object will not be detected.\n * Return false to exit loop early.\n */\n forEachChild(callback: (child: SceneObject) => void): void | false;\n\n /**\n * Useful for edge cases when you want to move a scene object to another parent.\n */\n clearParent(): void;\n}\n\nexport type SceneActivationHandler = () => SceneDeactivationHandler | void;\nexport type SceneDeactivationHandler = () => void;\n\n/**\n * Function returned by activate() that when called will deactivate the object if it's the last activator\n **/\nexport type CancelActivationHandler = () => void;\n\nexport interface SceneLayoutState extends SceneObjectState {\n children: SceneObject[];\n}\n\nexport interface SceneLayout<T extends SceneLayoutState = SceneLayoutState> extends SceneObject<T> {\n isDraggable(): boolean;\n getDragClass?(): string;\n getDragClassCancel?(): string;\n getDragHooks?(): { onDragStart?: (e: React.PointerEvent, panel: VizPanel) => void };\n}\n\nexport interface SceneTimeRangeState extends SceneObjectState {\n from: string;\n to: string;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n timeZone?: TimeZone;\n /** weekStart will change the global date locale so having multiple different weekStart values is not supported */\n weekStart?: WeekStart;\n /**\n * @internal\n * To enable feature parity with the old time range picker, not sure if it will be kept.\n * Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.\n * */\n UNSAFE_nowDelay?: string;\n\n refreshOnActivate?: {\n /**\n * When set, the time range will invalidate relative ranges after the specified interval has elapsed\n */\n afterMs?: number;\n /**\n * When set, the time range will invalidate relative ranges after the specified percentage of the current interval has elapsed.\n * If both invalidate values are set, the smaller value will be used for the given interval.\n */\n percent?: number;\n };\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeZoneChange(timeZone: TimeZone): void;\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n getTimeZone(): TimeZone;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync extends SceneObject {\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface SceneObjectUrlSyncHandler {\n getKeys(): string[];\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n shouldCreateHistoryStep?(values: SceneObjectUrlValues): boolean;\n performBrowserHistoryAction?(callback: () => void): void;\n}\n\nexport interface DataRequestEnricher {\n // Return partial data query request that will be merged with the original request provided by SceneQueryRunner\n enrichDataRequest(source: SceneObject): Partial<DataQueryRequest> | null;\n}\n\nexport interface FiltersRequestEnricher {\n // Return partial getTagKeys or getTagValues query request that will be merged with the original request provided by ad hoc or group by variable\n enrichFiltersRequest(\n source: SceneObject\n ): Partial<DataSourceGetTagKeysOptions | DataSourceGetTagValuesOptions> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport function isFiltersRequestEnricher(obj: any): obj is FiltersRequestEnricher {\n return 'enrichFiltersRequest' in obj;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type CustomTransformOperator = (context: DataTransformContext) => MonoTypeOperatorFunction<DataFrame[]>;\nexport type CustomTransformerDefinition =\n | { operator: CustomTransformOperator; topic: DataTopic }\n | CustomTransformOperator;\nexport type SceneStateChangedHandler<TState> = (newState: TState, prevState: TState) => void;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface SceneDataProviderResult {\n data: PanelData;\n origin: SceneDataProvider;\n}\n\nexport interface SceneDataProvider<T extends SceneObjectState = SceneDataState> extends SceneObject<T> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneDataState {\n name: string;\n description?: string;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneDataProvider<SceneDataLayerProviderState> {\n isDataLayer: true;\n}\n\nexport function isDataLayer(obj: SceneObject): obj is SceneDataLayerProvider {\n return 'isDataLayer' in obj;\n}\n\nexport interface DataLayerFilter {\n panelId: number;\n}\n\nexport interface SceneStatelessBehavior<T extends SceneObject = any> {\n (sceneObject: T): CancelActivationHandler | void;\n}\n\nexport type ControlsLayout = 'horizontal' | 'vertical';\n\nexport interface UseStateHookOptions {\n /**\n * For some edge cases other scene objects want to subscribe to scene object state for objects\n * that are not active, or whose main React Component can be un-mounted. Set this to true\n * to keep the scene object active even if the React component is unmounted.\n *\n * Normally you would not need this but this can be useful in some edge cases.\n *\n * @experimental\n */\n shouldActivateOrKeepAlive?: boolean;\n}\n\nexport interface SceneDataQuery extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\nexport interface SceneUrlSyncOptions {\n /**\n * This will update the url to contain all scene url state\n * when the scene is initialized. Important for browser history \"back\" actions.\n */\n updateUrlOnInit?: boolean;\n /**\n * This is only supported by some objects if they implement\n * shouldCreateHistoryStep where they can control what changes\n * url changes should add a new browser history entry.\n */\n createBrowserHistorySteps?: boolean;\n /**\n * This will automatically prefix url search parameters when syncing.\n * Can be used to prevent collisions when multiple Scene apps are embedded in the page.\n */\n namespace?: string;\n /**\n * When `namespace` is provided, this prevents some url search parameters to be automatically prefixed.\n * Defaults to the timerange parameters ([\"from\", \"to\", \"timezone\"])\n */\n excludeFromNamespace?: string[];\n}\n"],"names":[],"mappings":"AA0LO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,MAAA;AAC1B;AA2BO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA;AAChC;AAEO,SAAS,yBAAyB,GAAyC,EAAA;AAChF,EAAA,OAAO,sBAA0B,IAAA,GAAA;AACnC;AAsCO,SAAS,YAAY,GAAiD,EAAA;AAC3E,EAAA,OAAO,aAAiB,IAAA,GAAA;AAC1B;;;;"}
@@ -75,10 +75,6 @@ class SceneDataTransformer extends SceneObjectBase {
75
75
  }
76
76
  return clone;
77
77
  }
78
- isInViewChanged(isInView) {
79
- var _a, _b;
80
- (_b = (_a = this.state.$data) == null ? void 0 : _a.isInViewChanged) == null ? void 0 : _b.call(_a, isInView);
81
- }
82
78
  haveAlreadyTransformedData(data) {
83
79
  if (!this._prevDataFromSource) {
84
80
  return false;
@@ -134,15 +130,21 @@ class SceneDataTransformer extends SceneObjectBase {
134
130
  if (data.annotations && data.annotations.length > 0 && annotationsTransformations.length > 0) {
135
131
  streams.push(transformDataFrame(annotationsTransformations, (_a = data.annotations) != null ? _a : []));
136
132
  }
133
+ let series = [];
134
+ let annotations = [];
137
135
  this._transformSub = forkJoin(streams).pipe(
138
- map((values) => {
139
- const transformedSeries = values[0];
140
- const transformedAnnotations = values[1];
141
- return {
142
- ...data,
143
- series: transformedSeries,
144
- annotations: transformedAnnotations != null ? transformedAnnotations : data.annotations
145
- };
136
+ map((results) => {
137
+ results.forEach((frames) => {
138
+ var _a2;
139
+ for (const frame of frames) {
140
+ if (((_a2 = frame.meta) == null ? void 0 : _a2.dataTopic) === DataTopic.Annotations) {
141
+ annotations.push(frame);
142
+ } else {
143
+ series.push(frame);
144
+ }
145
+ }
146
+ });
147
+ return { ...data, series, annotations };
146
148
  }),
147
149
  catchError((err) => {
148
150
  var _a2;
@@ -1 +1 @@
1
- {"version":3,"file":"SceneDataTransformer.js","sources":["../../../src/querying/SceneDataTransformer.ts"],"sourcesContent":["import {\n DataTopic,\n DataTransformerConfig,\n LoadingState,\n PanelData,\n ScopedVars,\n transformDataFrame,\n} from '@grafana/data';\nimport { toDataQueryError } from '@grafana/runtime';\nimport { catchError, forkJoin, map, of, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { CustomTransformerDefinition, SceneDataProvider, SceneDataProviderResult, SceneDataState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneDataLayerSet } from './SceneDataLayerSet';\n\nexport interface SceneDataTransformerState extends SceneDataState {\n /**\n * Array of standard transformation configs and custom transform operators\n */\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>;\n}\n\n/**\n * You can use this as a $data object. It can either transform an inner $data DataProvider or if that is not set it will\n * subscribe to a DataProvider higher up in the scene graph and transform its data.\n *\n * The transformations array supports custom (runtime defined) transformation as well as declarative core transformations.\n * You can manually re-process the transformations by calling reprocessTransformations(). This is useful if you have\n * transformations that depend on other scene object states.\n */\nexport class SceneDataTransformer extends SceneObjectBase<SceneDataTransformerState> implements SceneDataProvider {\n private _transformSub?: Unsubscribable;\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _prevDataFromSource?: PanelData;\n\n /**\n * Scan transformations for variable usage and re-process transforms when a variable values change\n */\n protected _variableDependency: VariableDependencyConfig<SceneDataTransformerState> = new VariableDependencyConfig(\n this,\n {\n statePaths: ['transformations'],\n onReferencedVariableValueChanged: () => this.reprocessTransformations(),\n }\n );\n\n public constructor(state: SceneDataTransformerState) {\n super(state);\n\n this.addActivationHandler(() => this.activationHandler());\n }\n\n private activationHandler() {\n const sourceData = this.getSourceData();\n\n this._subs.add(sourceData.subscribeToState((state) => this.transform(state.data)));\n\n if (sourceData.state.data) {\n this.transform(sourceData.state.data);\n }\n\n return () => {\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n };\n }\n\n private getSourceData(): SceneDataProvider {\n if (this.state.$data) {\n if (this.state.$data instanceof SceneDataLayerSet) {\n throw new Error('SceneDataLayerSet can not be used as data provider for SceneDataTransformer.');\n }\n return this.state.$data;\n }\n\n if (!this.parent || !this.parent.parent) {\n throw new Error('SceneDataTransformer must either have $data set on it or have a parent.parent with $data');\n }\n\n return sceneGraph.getData(this.parent.parent);\n }\n\n public setContainerWidth(width: number) {\n if (this.state.$data && this.state.$data.setContainerWidth) {\n this.state.$data.setContainerWidth(width);\n }\n }\n\n public isDataReadyToDisplay() {\n const dataObject = this.getSourceData();\n if (dataObject.isDataReadyToDisplay) {\n return dataObject.isDataReadyToDisplay();\n }\n\n return true;\n }\n\n public reprocessTransformations() {\n this.transform(this.getSourceData().state.data, true);\n }\n\n public cancelQuery() {\n this.getSourceData().cancelQuery?.();\n }\n\n public getResultsStream() {\n return this._results;\n }\n\n public clone(withState?: Partial<SceneDataTransformerState>) {\n const clone = super.clone(withState);\n\n if (this._prevDataFromSource) {\n clone['_prevDataFromSource'] = this._prevDataFromSource;\n }\n\n return clone;\n }\n\n public isInViewChanged(isInView: boolean) {\n this.state.$data?.isInViewChanged?.(isInView);\n }\n\n private haveAlreadyTransformedData(data: PanelData) {\n if (!this._prevDataFromSource) {\n return false;\n }\n\n if (data === this._prevDataFromSource) {\n return true;\n }\n\n const { series, annotations } = this._prevDataFromSource;\n\n if (data.series === series && data.annotations === annotations) {\n if (this.state.data && data.state !== this.state.data.state) {\n this.setState({ data: { ...this.state.data, state: data.state } });\n }\n return true;\n }\n\n return false;\n }\n\n private transform(data: PanelData | undefined, force = false) {\n if (this.state.transformations.length === 0 || !data) {\n this._prevDataFromSource = data;\n this.setState({ data });\n\n if (data) {\n this._results.next({ origin: this, data });\n }\n return;\n }\n\n // Skip transform step if we have already transformed this data\n if (!force && this.haveAlreadyTransformedData(data)) {\n return;\n }\n\n let interpolatedTransformations = this._interpolateVariablesInTransformationConfigs(data);\n\n const seriesTransformations = interpolatedTransformations\n .filter((transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic == null || transformation.topic === DataTopic.Series;\n }\n\n return true;\n })\n .map((transformation) => ('operator' in transformation ? transformation.operator : transformation));\n\n const annotationsTransformations = interpolatedTransformations\n .filter((transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic === DataTopic.Annotations;\n }\n\n return false;\n })\n .map((transformation) => ('operator' in transformation ? transformation.operator : transformation));\n\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n\n const ctx = {\n interpolate: (value: string, scopedVars?: ScopedVars) => {\n return sceneGraph.interpolate(this, value, { ...data.request?.scopedVars, ...scopedVars });\n },\n };\n\n let streams = [transformDataFrame(seriesTransformations, data.series, ctx)];\n\n if (data.annotations && data.annotations.length > 0 && annotationsTransformations.length > 0) {\n streams.push(transformDataFrame(annotationsTransformations, data.annotations ?? []));\n }\n\n this._transformSub = forkJoin(streams)\n .pipe(\n map((values) => {\n const transformedSeries = values[0];\n const transformedAnnotations = values[1];\n\n return {\n ...data,\n series: transformedSeries,\n annotations: transformedAnnotations ?? data.annotations,\n };\n }),\n catchError((err) => {\n console.error('Error transforming data: ', err);\n const sourceErr = this.getSourceData().state.data?.errors || [];\n\n const transformationError = toDataQueryError(err);\n transformationError.message = `Error transforming data: ${transformationError.message}`;\n\n const result: PanelData = {\n ...data,\n state: LoadingState.Error,\n // Combine transformation error with upstream errors\n errors: [...sourceErr, transformationError],\n };\n\n return of(result);\n })\n )\n .subscribe((transformedData) => {\n this.setState({ data: transformedData });\n this._results.next({ origin: this, data: transformedData });\n this._prevDataFromSource = data;\n });\n }\n\n private _interpolateVariablesInTransformationConfigs(\n data: PanelData\n ): Array<DataTransformerConfig | CustomTransformerDefinition> {\n const transformations = this.state.transformations;\n\n if (this._variableDependency.getNames().size === 0) {\n return transformations;\n }\n\n const onlyObjects = transformations.every((t) => typeof t === 'object');\n\n // If all transformations are config object we can interpolate them all at once\n if (onlyObjects) {\n return JSON.parse(sceneGraph.interpolate(this, JSON.stringify(transformations), data.request?.scopedVars));\n }\n\n return transformations.map((t) => {\n return typeof t === 'object'\n ? JSON.parse(sceneGraph.interpolate(this, JSON.stringify(t), data.request?.scopedVars))\n : t;\n });\n }\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"SceneDataTransformer.js","sources":["../../../src/querying/SceneDataTransformer.ts"],"sourcesContent":["import {\n DataFrame,\n DataTopic,\n DataTransformerConfig,\n LoadingState,\n PanelData,\n ScopedVars,\n transformDataFrame,\n} from '@grafana/data';\nimport { toDataQueryError } from '@grafana/runtime';\nimport { catchError, forkJoin, map, of, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { CustomTransformerDefinition, SceneDataProvider, SceneDataProviderResult, SceneDataState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { SceneDataLayerSet } from './SceneDataLayerSet';\n\nexport interface SceneDataTransformerState extends SceneDataState {\n /**\n * Array of standard transformation configs and custom transform operators\n */\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>;\n}\n\n/**\n * You can use this as a $data object. It can either transform an inner $data DataProvider or if that is not set it will\n * subscribe to a DataProvider higher up in the scene graph and transform its data.\n *\n * The transformations array supports custom (runtime defined) transformation as well as declarative core transformations.\n * You can manually re-process the transformations by calling reprocessTransformations(). This is useful if you have\n * transformations that depend on other scene object states.\n */\nexport class SceneDataTransformer extends SceneObjectBase<SceneDataTransformerState> implements SceneDataProvider {\n private _transformSub?: Unsubscribable;\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _prevDataFromSource?: PanelData;\n\n /**\n * Scan transformations for variable usage and re-process transforms when a variable values change\n */\n protected _variableDependency: VariableDependencyConfig<SceneDataTransformerState> = new VariableDependencyConfig(\n this,\n {\n statePaths: ['transformations'],\n onReferencedVariableValueChanged: () => this.reprocessTransformations(),\n }\n );\n\n public constructor(state: SceneDataTransformerState) {\n super(state);\n\n this.addActivationHandler(() => this.activationHandler());\n }\n\n private activationHandler() {\n const sourceData = this.getSourceData();\n\n this._subs.add(sourceData.subscribeToState((state) => this.transform(state.data)));\n\n if (sourceData.state.data) {\n this.transform(sourceData.state.data);\n }\n\n return () => {\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n };\n }\n\n private getSourceData(): SceneDataProvider {\n if (this.state.$data) {\n if (this.state.$data instanceof SceneDataLayerSet) {\n throw new Error('SceneDataLayerSet can not be used as data provider for SceneDataTransformer.');\n }\n return this.state.$data;\n }\n\n if (!this.parent || !this.parent.parent) {\n throw new Error('SceneDataTransformer must either have $data set on it or have a parent.parent with $data');\n }\n\n return sceneGraph.getData(this.parent.parent);\n }\n\n public setContainerWidth(width: number) {\n if (this.state.$data && this.state.$data.setContainerWidth) {\n this.state.$data.setContainerWidth(width);\n }\n }\n\n public isDataReadyToDisplay() {\n const dataObject = this.getSourceData();\n if (dataObject.isDataReadyToDisplay) {\n return dataObject.isDataReadyToDisplay();\n }\n\n return true;\n }\n\n public reprocessTransformations() {\n this.transform(this.getSourceData().state.data, true);\n }\n\n public cancelQuery() {\n this.getSourceData().cancelQuery?.();\n }\n\n public getResultsStream() {\n return this._results;\n }\n\n public clone(withState?: Partial<SceneDataTransformerState>) {\n const clone = super.clone(withState);\n\n if (this._prevDataFromSource) {\n clone['_prevDataFromSource'] = this._prevDataFromSource;\n }\n\n return clone;\n }\n\n private haveAlreadyTransformedData(data: PanelData) {\n if (!this._prevDataFromSource) {\n return false;\n }\n\n if (data === this._prevDataFromSource) {\n return true;\n }\n\n const { series, annotations } = this._prevDataFromSource;\n\n if (data.series === series && data.annotations === annotations) {\n if (this.state.data && data.state !== this.state.data.state) {\n this.setState({ data: { ...this.state.data, state: data.state } });\n }\n return true;\n }\n\n return false;\n }\n\n private transform(data: PanelData | undefined, force = false) {\n if (this.state.transformations.length === 0 || !data) {\n this._prevDataFromSource = data;\n this.setState({ data });\n\n if (data) {\n this._results.next({ origin: this, data });\n }\n return;\n }\n\n // Skip transform step if we have already transformed this data\n if (!force && this.haveAlreadyTransformedData(data)) {\n return;\n }\n\n let interpolatedTransformations = this._interpolateVariablesInTransformationConfigs(data);\n\n const seriesTransformations = interpolatedTransformations\n .filter((transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic == null || transformation.topic === DataTopic.Series;\n }\n\n return true;\n })\n .map((transformation) => ('operator' in transformation ? transformation.operator : transformation));\n\n const annotationsTransformations = interpolatedTransformations\n .filter((transformation) => {\n if ('options' in transformation || 'topic' in transformation) {\n return transformation.topic === DataTopic.Annotations;\n }\n\n return false;\n })\n .map((transformation) => ('operator' in transformation ? transformation.operator : transformation));\n\n if (this._transformSub) {\n this._transformSub.unsubscribe();\n }\n\n const ctx = {\n interpolate: (value: string, scopedVars?: ScopedVars) => {\n return sceneGraph.interpolate(this, value, { ...data.request?.scopedVars, ...scopedVars });\n },\n };\n\n let streams = [transformDataFrame(seriesTransformations, data.series, ctx)];\n\n if (data.annotations && data.annotations.length > 0 && annotationsTransformations.length > 0) {\n streams.push(transformDataFrame(annotationsTransformations, data.annotations ?? []));\n }\n\n let series: DataFrame[] = [];\n let annotations: DataFrame[] = [];\n\n this._transformSub = forkJoin(streams)\n .pipe(\n map((results) => {\n // this strategy allows transformations to take in series frames and produce anno frames\n // we look at each transformation's result and put it in the correct place\n results.forEach((frames) => {\n for (const frame of frames) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations.push(frame);\n } else {\n series.push(frame);\n }\n }\n });\n\n return { ...data, series, annotations };\n }),\n catchError((err) => {\n console.error('Error transforming data: ', err);\n const sourceErr = this.getSourceData().state.data?.errors || [];\n\n const transformationError = toDataQueryError(err);\n transformationError.message = `Error transforming data: ${transformationError.message}`;\n\n const result: PanelData = {\n ...data,\n state: LoadingState.Error,\n // Combine transformation error with upstream errors\n errors: [...sourceErr, transformationError],\n };\n\n return of(result);\n })\n )\n .subscribe((transformedData) => {\n this.setState({ data: transformedData });\n this._results.next({ origin: this, data: transformedData });\n this._prevDataFromSource = data;\n });\n }\n\n private _interpolateVariablesInTransformationConfigs(\n data: PanelData\n ): Array<DataTransformerConfig | CustomTransformerDefinition> {\n const transformations = this.state.transformations;\n\n if (this._variableDependency.getNames().size === 0) {\n return transformations;\n }\n\n const onlyObjects = transformations.every((t) => typeof t === 'object');\n\n // If all transformations are config object we can interpolate them all at once\n if (onlyObjects) {\n return JSON.parse(sceneGraph.interpolate(this, JSON.stringify(transformations), data.request?.scopedVars));\n }\n\n return transformations.map((t) => {\n return typeof t === 'object'\n ? JSON.parse(sceneGraph.interpolate(this, JSON.stringify(t), data.request?.scopedVars))\n : t;\n });\n }\n}\n"],"names":["_a"],"mappings":"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"}
@@ -34,8 +34,6 @@ class SceneQueryRunner extends SceneObjectBase {
34
34
  this._variableValueRecorder = new VariableValueRecorder();
35
35
  this._results = new ReplaySubject(1);
36
36
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
37
- this._isInView = true;
38
- this._queryNotExecutedWhenOutOfView = false;
39
37
  this._variableDependency = new VariableDependencyConfig(this, {
40
38
  statePaths: ["queries", "datasource", "minInterval"],
41
39
  onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),
@@ -275,11 +273,6 @@ class SceneQueryRunner extends SceneObjectBase {
275
273
  if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
276
274
  return;
277
275
  }
278
- if (this.isQueryModeAuto() && !this._isInView) {
279
- this._queryNotExecutedWhenOutOfView = true;
280
- return;
281
- }
282
- this._queryNotExecutedWhenOutOfView = false;
283
276
  if (!this._dataLayersSub) {
284
277
  this._handleDataLayers();
285
278
  }
@@ -443,13 +436,6 @@ class SceneQueryRunner extends SceneObjectBase {
443
436
  var _a;
444
437
  return ((_a = this.state.runQueriesMode) != null ? _a : "auto") === "auto";
445
438
  }
446
- isInViewChanged(isInView) {
447
- writeSceneLog("SceneQueryRunner", `isInViewChanged: ${isInView}`, this.state.key);
448
- this._isInView = isInView;
449
- if (isInView && this._queryNotExecutedWhenOutOfView) {
450
- this.runQueries();
451
- }
452
- }
453
439
  }
454
440
  function findFirstDatasource(targets) {
455
441
  var _a, _b;