@grafana/scenes 3.4.0 → 3.4.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 +13 -0
- package/dist/esm/behaviors/SceneQueryController.js +3 -0
- package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +2 -3
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/querying/registerQueryWithController.js +6 -2
- package/dist/esm/querying/registerQueryWithController.js.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# v3.4.1 (Wed Feb 14 2024)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- SceneQueryController: Fixes double complete counting [#600](https://github.com/grafana/scenes/pull/600) ([@torkelo](https://github.com/torkelo))
|
|
6
|
+
- VizPanel: Fixes streaming issue [#602](https://github.com/grafana/scenes/pull/602) ([@torkelo](https://github.com/torkelo))
|
|
7
|
+
|
|
8
|
+
#### Authors: 1
|
|
9
|
+
|
|
10
|
+
- Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
1
14
|
# v3.4.0 (Wed Feb 14 2024)
|
|
2
15
|
|
|
3
16
|
### Release Notes
|
|
@@ -34,6 +34,9 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
queryCompleted(entry) {
|
|
37
|
+
if (!__privateGet(this, _running).has(entry)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
37
40
|
__privateGet(this, _running).delete(entry);
|
|
38
41
|
this.changeRunningQueryCount(-1);
|
|
39
42
|
if (__privateGet(this, _running).size === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneQueryController.js","sources":["../../../src/behaviors/SceneQueryController.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObject, SceneObjectState, SceneStatelessBehavior } from '../core/types';\nimport { DataQueryRequest } from '@grafana/data';\nimport { LoadingState } from '@grafana/schema';\n\nexport interface SceneQueryStateControllerState extends SceneObjectState {\n isRunning: boolean;\n}\n\nexport interface SceneQueryControllerLike extends SceneObject<SceneQueryStateControllerState> {\n isQueryController: true;\n cancelAll(): void;\n\n queryStarted(entry: SceneQueryControllerEntry): void;\n queryCompleted(entry: SceneQueryControllerEntry): void;\n}\n\nexport function isQueryController(s: SceneObject | SceneStatelessBehavior): s is SceneQueryControllerLike {\n return 'isQueryController' in s;\n}\n\nexport interface QueryResultWithState {\n state: LoadingState;\n}\n\nexport interface SceneQueryControllerEntry {\n request?: DataQueryRequest;\n type: SceneQueryControllerEntryType;\n origin: SceneObject;\n cancel?: () => void;\n}\n\nexport type SceneQueryControllerEntryType = 'data' | 'annotations' | 'variable' | 'alerts';\n\nexport class SceneQueryController\n extends SceneObjectBase<SceneQueryStateControllerState>\n implements SceneQueryControllerLike\n{\n public isQueryController: true = true;\n\n #running = new Set<SceneQueryControllerEntry>();\n\n public constructor() {\n super({ isRunning: false });\n\n // Clear running state on deactivate\n this.addActivationHandler(() => {\n return () => this.#running.clear();\n });\n }\n\n public queryStarted(entry: SceneQueryControllerEntry) {\n this.#running.add(entry);\n\n this.changeRunningQueryCount(1);\n\n if (!this.state.isRunning) {\n this.setState({ isRunning: true });\n }\n }\n\n public queryCompleted(entry: SceneQueryControllerEntry) {\n this.#running.delete(entry);\n\n this.changeRunningQueryCount(-1);\n\n if (this.#running.size === 0) {\n this.setState({ isRunning: false });\n }\n }\n\n private changeRunningQueryCount(dir: 1 | -1) {\n /**\n * Used by grafana-image-renderer to know when all queries are completed.\n */\n (window as any).__grafanaRunningQueryCount = ((window as any).__grafanaRunningQueryCount ?? 0) + dir;\n }\n\n public cancelAll() {\n for (const entry of this.#running.values()) {\n entry.cancel?.();\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,IAAA,QAAA,CAAA;AAiBO,SAAS,kBAAkB,CAAwE,EAAA;AACxG,EAAA,OAAO,mBAAuB,IAAA,CAAA,CAAA;AAChC,CAAA;AAeO,MAAM,6BACH,eAEV,CAAA;AAAA,EAKS,WAAc,GAAA;AACnB,IAAM,KAAA,CAAA,EAAE,SAAW,EAAA,KAAA,EAAO,CAAA,CAAA;AAL5B,IAAA,IAAA,CAAO,iBAA0B,GAAA,IAAA,CAAA;AAEjC,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,sBAAe,GAA+B,EAAA,CAAA,CAAA;AAM5C,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAO,OAAA,MAAM,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,KAAM,EAAA,CAAA;AAAA,KAClC,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,aAAa,KAAkC,EAAA;AACpD,IAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,IAAI,KAAK,CAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,wBAAwB,CAAC,CAAA,CAAA;AAE9B,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AACzB,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,SAAW,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,KACnC;AAAA,GACF;AAAA,EAEO,eAAe,KAAkC,EAAA;AACtD,IAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,OAAO,KAAK,CAAA,CAAA;AAE1B,IAAA,IAAA,CAAK,wBAAwB,CAAE,CAAA,CAAA,CAAA;AAE/B,IAAI,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,IAAA,KAAS,CAAG,EAAA;AAC5B,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,SAAW,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KACpC;AAAA,GACF;AAAA,EAEQ,wBAAwB,GAAa,EAAA;
|
|
1
|
+
{"version":3,"file":"SceneQueryController.js","sources":["../../../src/behaviors/SceneQueryController.ts"],"sourcesContent":["import { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObject, SceneObjectState, SceneStatelessBehavior } from '../core/types';\nimport { DataQueryRequest } from '@grafana/data';\nimport { LoadingState } from '@grafana/schema';\n\nexport interface SceneQueryStateControllerState extends SceneObjectState {\n isRunning: boolean;\n}\n\nexport interface SceneQueryControllerLike extends SceneObject<SceneQueryStateControllerState> {\n isQueryController: true;\n cancelAll(): void;\n\n queryStarted(entry: SceneQueryControllerEntry): void;\n queryCompleted(entry: SceneQueryControllerEntry): void;\n}\n\nexport function isQueryController(s: SceneObject | SceneStatelessBehavior): s is SceneQueryControllerLike {\n return 'isQueryController' in s;\n}\n\nexport interface QueryResultWithState {\n state: LoadingState;\n}\n\nexport interface SceneQueryControllerEntry {\n request?: DataQueryRequest;\n type: SceneQueryControllerEntryType;\n origin: SceneObject;\n cancel?: () => void;\n}\n\nexport type SceneQueryControllerEntryType = 'data' | 'annotations' | 'variable' | 'alerts';\n\nexport class SceneQueryController\n extends SceneObjectBase<SceneQueryStateControllerState>\n implements SceneQueryControllerLike\n{\n public isQueryController: true = true;\n\n #running = new Set<SceneQueryControllerEntry>();\n\n public constructor() {\n super({ isRunning: false });\n\n // Clear running state on deactivate\n this.addActivationHandler(() => {\n return () => this.#running.clear();\n });\n }\n\n public queryStarted(entry: SceneQueryControllerEntry) {\n this.#running.add(entry);\n\n this.changeRunningQueryCount(1);\n\n if (!this.state.isRunning) {\n this.setState({ isRunning: true });\n }\n }\n\n public queryCompleted(entry: SceneQueryControllerEntry) {\n if (!this.#running.has(entry)) {\n return;\n }\n\n this.#running.delete(entry);\n\n this.changeRunningQueryCount(-1);\n\n if (this.#running.size === 0) {\n this.setState({ isRunning: false });\n }\n }\n\n private changeRunningQueryCount(dir: 1 | -1) {\n /**\n * Used by grafana-image-renderer to know when all queries are completed.\n */\n (window as any).__grafanaRunningQueryCount = ((window as any).__grafanaRunningQueryCount ?? 0) + dir;\n }\n\n public cancelAll() {\n for (const entry of this.#running.values()) {\n entry.cancel?.();\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,IAAA,QAAA,CAAA;AAiBO,SAAS,kBAAkB,CAAwE,EAAA;AACxG,EAAA,OAAO,mBAAuB,IAAA,CAAA,CAAA;AAChC,CAAA;AAeO,MAAM,6BACH,eAEV,CAAA;AAAA,EAKS,WAAc,GAAA;AACnB,IAAM,KAAA,CAAA,EAAE,SAAW,EAAA,KAAA,EAAO,CAAA,CAAA;AAL5B,IAAA,IAAA,CAAO,iBAA0B,GAAA,IAAA,CAAA;AAEjC,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,sBAAe,GAA+B,EAAA,CAAA,CAAA;AAM5C,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAO,OAAA,MAAM,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,KAAM,EAAA,CAAA;AAAA,KAClC,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,aAAa,KAAkC,EAAA;AACpD,IAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,IAAI,KAAK,CAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,wBAAwB,CAAC,CAAA,CAAA;AAE9B,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AACzB,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,SAAW,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,KACnC;AAAA,GACF;AAAA,EAEO,eAAe,KAAkC,EAAA;AACtD,IAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,KAAK,CAAG,EAAA;AAC7B,MAAA,OAAA;AAAA,KACF;AAEA,IAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,OAAO,KAAK,CAAA,CAAA;AAE1B,IAAA,IAAA,CAAK,wBAAwB,CAAE,CAAA,CAAA,CAAA;AAE/B,IAAI,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,IAAA,KAAS,CAAG,EAAA;AAC5B,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,SAAW,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KACpC;AAAA,GACF;AAAA,EAEQ,wBAAwB,GAAa,EAAA;AA3E/C,IAAA,IAAA,EAAA,CAAA;AA+EI,IAAC,MAAe,CAAA,0BAAA,GAAA,CAAA,CAA+B,EAAe,GAAA,MAAA,CAAA,0BAAA,KAAf,YAA6C,CAAK,IAAA,GAAA,CAAA;AAAA,GACnG;AAAA,EAEO,SAAY,GAAA;AAlFrB,IAAA,IAAA,EAAA,CAAA;AAmFI,IAAA,KAAA,MAAW,KAAS,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,MAAA,EAAU,EAAA;AAC1C,MAAA,CAAA,EAAA,GAAA,KAAA,CAAM,MAAN,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACF;AAAA,GACF;AACF,CAAA;AA/CE,QAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -214,12 +214,11 @@ const getAlertStateStyles = (theme) => {
|
|
|
214
214
|
};
|
|
215
215
|
};
|
|
216
216
|
function getPanelTimeRange(sceneTimeRange, plugin, data) {
|
|
217
|
-
var _a;
|
|
218
217
|
if (!plugin || plugin.meta.skipDataQuery) {
|
|
219
218
|
return sceneTimeRange.state.value;
|
|
220
219
|
}
|
|
221
|
-
if (data &&
|
|
222
|
-
return data.
|
|
220
|
+
if (data && data.timeRange) {
|
|
221
|
+
return data.timeRange;
|
|
223
222
|
}
|
|
224
223
|
return sceneTimeRange.state.value;
|
|
225
224
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import React, { RefCallback } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { AlertState, GrafanaTheme2, PanelData, PanelPlugin, PluginContextProvider } from '@grafana/data';\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, SceneTimeRangeLike } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n $data,\n displayMode,\n hoverHeader,\n menu,\n headerActions,\n titleItems,\n description,\n } = model.useState();\n const [ref, { width, height }] = useMeasure();\n const plugin = model.getPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dataObject = sceneGraph.getData(model);\n const rawData = dataObject.useState();\n const dataWithFieldConfig = model.applyFieldConfig(rawData.data!);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = getPanelTimeRange(sceneTimeRange, plugin, 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 <div>Loading plugin panel...</div>;\n }\n\n if (!plugin.panel) {\n return <div>Panel plugin has no panel component</div>;\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 ($data && $data.setContainerWidth) {\n $data.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 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 = context.instanceState?.legacyPanelId ?? 1;\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 <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 displayMode={displayMode}\n hoverHeader={hoverHeader}\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 >\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={false}\n width={innerWidth}\n height={innerHeight}\n renderCounter={0}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={getAppEvents()}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n </>\n )}\n </PanelChrome>\n )}\n </div>\n </div>\n );\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\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 ancestor = item.parent;\n\n while (ancestor && ancestor !== layout) {\n if ('isDraggable' in ancestor.state && ancestor.state.isDraggable === false) {\n return true;\n }\n\n ancestor = ancestor.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\nfunction getPanelTimeRange(sceneTimeRange: SceneTimeRangeLike, plugin: PanelPlugin | undefined, data?: PanelData) {\n if (!plugin || plugin.meta.skipDataQuery) {\n return sceneTimeRange.state.value;\n }\n\n if (data && data.request?.range) {\n return data.request.range;\n }\n\n return sceneTimeRange.state.value;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import React, { RefCallback } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { AlertState, GrafanaTheme2, PanelData, PanelPlugin, PluginContextProvider } from '@grafana/data';\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, SceneTimeRangeLike } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n $data,\n displayMode,\n hoverHeader,\n menu,\n headerActions,\n titleItems,\n description,\n } = model.useState();\n const [ref, { width, height }] = useMeasure();\n const plugin = model.getPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dataObject = sceneGraph.getData(model);\n const rawData = dataObject.useState();\n const dataWithFieldConfig = model.applyFieldConfig(rawData.data!);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = getPanelTimeRange(sceneTimeRange, plugin, 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 <div>Loading plugin panel...</div>;\n }\n\n if (!plugin.panel) {\n return <div>Panel plugin has no panel component</div>;\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 ($data && $data.setContainerWidth) {\n $data.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 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 = context.instanceState?.legacyPanelId ?? 1;\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 <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 displayMode={displayMode}\n hoverHeader={hoverHeader}\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 >\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={false}\n width={innerWidth}\n height={innerHeight}\n renderCounter={0}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={getAppEvents()}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n </>\n )}\n </PanelChrome>\n )}\n </div>\n </div>\n );\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\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 ancestor = item.parent;\n\n while (ancestor && ancestor !== layout) {\n if ('isDraggable' in ancestor.state && ancestor.state.isDraggable === false) {\n return true;\n }\n\n ancestor = ancestor.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\nfunction getPanelTimeRange(sceneTimeRange: SceneTimeRangeLike, plugin: PanelPlugin | undefined, data?: PanelData) {\n if (!plugin || plugin.meta.skipDataQuery) {\n return sceneTimeRange.state.value;\n }\n\n if (data && data.timeRange) {\n return data.timeRange;\n }\n\n return sceneTimeRange.state.value;\n}\n"],"names":[],"mappings":";;;;;;;;;AAagB,SAAA,gBAAA,CAAiB,EAAE,KAAA,EAAwC,EAAA;AAb3E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAcE,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,GACF,GAAI,MAAM,QAAS,EAAA,CAAA;AACnB,EAAA,MAAM,CAAC,GAAK,EAAA,EAAE,OAAO,MAAO,EAAC,IAAI,UAAW,EAAA,CAAA;AAC5C,EAAM,MAAA,MAAA,GAAS,MAAM,SAAU,EAAA,CAAA;AAE/B,EAAA,MAAM,EAAE,SAAA,EAAW,eAAgB,EAAA,GAAI,eAAe,KAAK,CAAA,CAAA;AAC3D,EAAM,MAAA,UAAA,GAAa,UAAW,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAC3C,EAAM,MAAA,OAAA,GAAU,WAAW,QAAS,EAAA,CAAA;AACpC,EAAA,MAAM,mBAAsB,GAAA,KAAA,CAAM,gBAAiB,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAA;AAChE,EAAM,MAAA,cAAA,GAAiB,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AACpD,EAAM,MAAA,QAAA,GAAW,eAAe,WAAY,EAAA,CAAA;AAC5C,EAAA,MAAM,SAAY,GAAA,iBAAA,CAAkB,cAAgB,EAAA,MAAA,EAAQ,mBAAmB,CAAA,CAAA;AAG/E,EAAA,MAAM,iBAAoB,GAAA,KAAA,CAAM,WAAY,CAAA,KAAA,EAAO,QAAW,MAAM,CAAA,CAAA;AAEpE,EAAM,MAAA,gBAAA,GAAmB,WAAW,mBAAmB,CAAA,CAAA;AAEvD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAI,yBAAuB,CAAA,CAAA;AAAA,GACrC;AAEA,EAAI,IAAA,CAAC,OAAO,KAAO,EAAA;AACjB,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAI,qCAAmC,CAAA,CAAA;AAAA,GACjD;AAEA,EAAA,MAAM,iBAAiB,MAAO,CAAA,KAAA,CAAA;AAG9B,EAAI,IAAA,KAAA,IAAS,MAAM,iBAAmB,EAAA;AACpC,IAAA,KAAA,CAAM,iBAAkB,CAAA,IAAA,CAAK,KAAM,CAAA,KAAK,CAAC,CAAA,CAAA;AAAA,GAC3C;AAEA,EAAA,IAAI,oBAAuC,EAAC,CAAA;AAE5C,EAAA,IAAI,UAAY,EAAA;AACd,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,UAAU,CAAG,EAAA;AAC7B,MAAA,iBAAA,GAAoB,iBAAkB,CAAA,MAAA;AAAA,QACpC,UAAA,CAAW,GAAI,CAAA,CAAC,SAAc,KAAA;AAC5B,UAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,UAAU,SAAV,EAAA;AAAA,YAAoB,KAAO,EAAA,SAAA;AAAA,YAAW,GAAA,EAAK,CAAG,EAAA,SAAA,CAAU,KAAM,CAAA,GAAA,CAAA,CAAA;AAAA,WAAO,CAAA,CAAA;AAAA,SAC9E,CAAA;AAAA,OACH,CAAA;AAAA,KACF,MAAA,IAAW,aAAc,CAAA,UAAU,CAAG,EAAA;AACpC,MAAkB,iBAAA,CAAA,IAAA,iBAAM,KAAA,CAAA,aAAA,CAAA,UAAA,CAAW,SAAX,EAAA;AAAA,QAAqB,KAAO,EAAA,UAAA;AAAA,OAAY,CAAE,CAAA,CAAA;AAAA,KAC7D,MAAA;AACL,MAAA,iBAAA,CAAkB,KAAK,UAAU,CAAA,CAAA;AAAA,KACnC;AAAA,GACF;AAGA,EAAI,IAAA,KAAA,CAAM,MAAM,UAAY,EAAA;AAC1B,IAAA,iBAAA,CAAkB,IAAK,iBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,KAAA,CAAM,WAAW,SAAvB,EAAA;AAAA,MAAiC,KAAA,EAAO,MAAM,KAAM,CAAA,UAAA;AAAA,MAAY,GAAA,EAAK,MAAM,KAAM,CAAA,GAAA;AAAA,KAAK,CAAE,CAAA,CAAA;AAAA,GAClH;AAEA,EAAA,IAAI,oBAAoB,UAAY,EAAA;AAClC,IAAkB,iBAAA,CAAA,IAAA;AAAA,sBACf,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA;AAAA,QAAQ,OAAS,EAAA,CAAA,EAAA,GAAA,mBAAA,CAAoB,UAAW,CAAA,KAAA,KAA/B,IAAwC,GAAA,EAAA,GAAA,SAAA;AAAA,QAAW,GAAA,EAAK,CAAqB,kBAAA,EAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAA,CAAA;AAAA,OACzG,kBAAA,KAAA,CAAA,aAAA,CAAC,YAAY,SAAZ,EAAA;AAAA,QACC,WAAW,EAAG,CAAA;AAAA,UACZ,CAAC,gBAAiB,CAAA,EAAA,GAAK,mBAAoB,CAAA,UAAA,CAAW,UAAU,UAAW,CAAA,EAAA;AAAA,UAC3E,CAAC,gBAAiB,CAAA,OAAA,GAAU,mBAAoB,CAAA,UAAA,CAAW,UAAU,UAAW,CAAA,OAAA;AAAA,UAChF,CAAC,gBAAiB,CAAA,QAAA,GAAW,mBAAoB,CAAA,UAAA,CAAW,UAAU,UAAW,CAAA,QAAA;AAAA,SAClF,CAAA;AAAA,OAAA,kBAEA,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA;AAAA,QACC,IAAM,EAAA,mBAAA,CAAoB,UAAW,CAAA,KAAA,KAAU,aAAa,aAAgB,GAAA,OAAA;AAAA,QAC5E,SAAU,EAAA,kBAAA;AAAA,QACV,IAAK,EAAA,IAAA;AAAA,OACP,CACF,CACF,CAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,IAAI,IAAM,EAAA;AACR,IAAY,SAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,KAAK,SAAL,EAAA;AAAA,MAAe,KAAO,EAAA,IAAA;AAAA,KAAM,CAAA,CAAA;AAAA,GAC3C;AAEA,EAAI,IAAA,cAAA,CAAA;AAEJ,EAAA,IAAI,aAAe,EAAA;AACjB,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAA,cAAA,mBAEK,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,aAAA,CAAc,GAAI,CAAA,CAAC,MAAW,KAAA;AAC7B,QAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAO,SAAP,EAAA;AAAA,UAAiB,KAAO,EAAA,MAAA;AAAA,UAAQ,GAAA,EAAK,CAAG,EAAA,MAAA,CAAO,KAAM,CAAA,GAAA,CAAA,CAAA;AAAA,SAAO,CAAA,CAAA;AAAA,OACrE,CACH,CAAA,CAAA;AAAA,KAEJ,MAAA,IAAW,aAAc,CAAA,aAAa,CAAG,EAAA;AACvC,MAAiB,cAAA,mBAAA,KAAA,CAAA,aAAA,CAAC,cAAc,SAAd,EAAA;AAAA,QAAwB,KAAO,EAAA,aAAA;AAAA,OAAe,CAAA,CAAA;AAAA,KAC3D,MAAA;AACL,MAAiB,cAAA,GAAA,aAAA,CAAA;AAAA,KACnB;AAAA,GACF;AAGA,EAAA,MAAM,IAAO,GAAA,mBAAA,CAAA;AAEb,EAAA,MAAM,eAAkB,GAAA,UAAA,CAAW,oBAAuB,GAAA,UAAA,CAAW,sBAAyB,GAAA,IAAA,CAAA;AAE9F,EAAM,MAAA,OAAA,GAAU,MAAM,eAAgB,EAAA,CAAA;AACtC,EAAA,MAAM,OAAU,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,aAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,kBAAvB,IAAwC,GAAA,EAAA,GAAA,CAAA,CAAA;AAExD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,SAAW,EAAA,eAAA;AAAA,GAAA,kBACb,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,GAAA;AAAA,IAAyC,SAAW,EAAA,eAAA;AAAA,IAAiB,oBAAA,EAAoB,MAAM,KAAM,CAAA,GAAA;AAAA,GAAA,EACvG,KAAQ,GAAA,CAAA,IAAK,MAAS,GAAA,CAAA,oBACpB,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA;AAAA,IACC,KAAO,EAAA,iBAAA;AAAA,IACP,WAAa,EAAA,CAAA,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAa,IAAS,EAAA,IAAA,KAAA,CAAM,cAAiB,GAAA,KAAA,CAAA;AAAA,IAC1D,cAAc,IAAK,CAAA,KAAA;AAAA,IACnB,aAAA,EAAe,sBAAuB,CAAA,IAAA,EAAM,gBAAgB,CAAA;AAAA,IAC5D,sBAAsB,KAAM,CAAA,oBAAA;AAAA,IAC5B,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAY,EAAA,iBAAA;AAAA,IACZ,SAAA;AAAA,IACA,OAAS,EAAA,cAAA;AAAA,IACT,eAAA;AAAA,IACA,OAAA,EAAS,MAAO,CAAA,SAAA,GAAY,MAAS,GAAA,IAAA;AAAA,IACrC,IAAM,EAAA,SAAA;AAAA,IACN,eAAe,KAAM,CAAA,aAAA;AAAA,GAAA,EAEpB,CAAC,UAAA,EAAY,WACZ,qBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA;AAAA,IAAmB,YAAA,EAAc,CAAC,MAAA,EAAQ,IAAI,CAAA;AAAA,GAAA,kBAC5C,KAAA,CAAA,aAAA,CAAA,qBAAA,EAAA;AAAA,IAAsB,MAAM,MAAO,CAAA,IAAA;AAAA,GAAA,kBACjC,KAAA,CAAA,aAAA,CAAA,oBAAA,EAAA;AAAA,IAAqB,KAAO,EAAA,OAAA;AAAA,GAAA,EAC1B,mCACE,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA;AAAA,IACC,EAAI,EAAA,OAAA;AAAA,IACJ,IAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAa,EAAA,KAAA;AAAA,IACb,KAAO,EAAA,UAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,aAAe,EAAA,CAAA;AAAA,IACf,kBAAkB,KAAM,CAAA,WAAA;AAAA,IACxB,iBAAiB,KAAM,CAAA,eAAA;AAAA,IACvB,qBAAqB,KAAM,CAAA,mBAAA;AAAA,IAC3B,mBAAmB,KAAM,CAAA,iBAAA;AAAA,IACzB,UAAU,YAAa,EAAA;AAAA,GACzB,CAEJ,CACF,CACF,CACF,CAEJ,CAEJ,CACF,CAAA,CAAA;AAEJ,CAAA;AAEA,SAAS,eAAe,KAAiB,EAAA;AA7LzC,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA8LE,EAAM,MAAA,YAAA,GAAe,UAAW,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAC/C,EAAA,MAAM,cAAc,YAAc,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,WAAA,EAAA,CAAA;AAElC,EAAA,IAAI,CAAC,YAAgB,IAAA,CAAC,eAAe,oBAAqB,CAAA,KAAA,EAAO,YAAY,CAAG,EAAA;AAC9E,IAAA,OAAO,EAAE,SAAA,EAAW,EAAI,EAAA,eAAA,EAAiB,EAAG,EAAA,CAAA;AAAA,GAC9C;AAEA,EAAO,OAAA,EAAE,YAAW,EAAa,GAAA,YAAA,CAAA,YAAA,KAAb,uCAA+B,eAAiB,EAAA,CAAA,EAAA,GAAA,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAc,uBAAd,IAAqC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,YAAA,CAAA,EAAA,CAAA;AAC3G,CAAA;AAMA,SAAS,oBAAA,CAAqB,MAAmB,MAAqB,EAAA;AACpE,EAAA,IAAI,WAAW,IAAK,CAAA,MAAA,CAAA;AAEpB,EAAO,OAAA,QAAA,IAAY,aAAa,MAAQ,EAAA;AACtC,IAAA,IAAI,iBAAiB,QAAS,CAAA,KAAA,IAAS,QAAS,CAAA,KAAA,CAAM,gBAAgB,KAAO,EAAA;AAC3E,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,QAAA,GAAW,QAAS,CAAA,MAAA,CAAA;AAAA,GACtB;AAEA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEA,SAAS,sBAAA,CAAuB,MAAiB,kBAAwC,EAAA;AACvF,EAAA,IAAI,kBAAoB,EAAA;AACtB,IAAO,OAAA,kBAAA,CAAA;AAAA,GACT;AAEA,EAAA,IAAI,OAAU,GAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA,CAAA;AAGhD,EAAA,IAAI,KAAK,MAAQ,EAAA;AACf,IAAU,OAAA,GAAA,IAAA,CAAK,OAAO,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,OAAO,CAAE,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GACvD;AACA,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAEA,MAAM,kBAAkB,GAAI,CAAA;AAAA,EAC1B,QAAU,EAAA,UAAA;AAAA,EACV,KAAO,EAAA,MAAA;AAAA,EACP,MAAQ,EAAA,MAAA;AACV,CAAC,CAAA,CAAA;AAOD,MAAM,kBAAkB,GAAI,CAAA;AAAA,EAC1B,QAAU,EAAA,UAAA;AAAA,EACV,KAAO,EAAA,MAAA;AAAA,EACP,MAAQ,EAAA,MAAA;AACV,CAAC,CAAA,CAAA;AAED,MAAM,mBAAA,GAAsB,CAAC,KAAyB,KAAA;AACpD,EAAO,OAAA;AAAA,IACL,IAAI,GAAI,CAAA;AAAA,MACN,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA;AAAA,KAC7B,CAAA;AAAA,IACD,SAAS,GAAI,CAAA;AAAA,MACX,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA;AAAA,KAC7B,CAAA;AAAA,IACD,UAAU,GAAI,CAAA;AAAA,MACZ,KAAA,EAAO,KAAM,CAAA,MAAA,CAAO,KAAM,CAAA,IAAA;AAAA,KAC3B,CAAA;AAAA,GACH,CAAA;AACF,CAAA,CAAA;AAEA,SAAS,iBAAA,CAAkB,cAAoC,EAAA,MAAA,EAAiC,IAAkB,EAAA;AAChH,EAAA,IAAI,CAAC,MAAA,IAAU,MAAO,CAAA,IAAA,CAAK,aAAe,EAAA;AACxC,IAAA,OAAO,eAAe,KAAM,CAAA,KAAA,CAAA;AAAA,GAC9B;AAEA,EAAI,IAAA,IAAA,IAAQ,KAAK,SAAW,EAAA;AAC1B,IAAA,OAAO,IAAK,CAAA,SAAA,CAAA;AAAA,GACd;AAEA,EAAA,OAAO,eAAe,KAAM,CAAA,KAAA,CAAA;AAC9B;;;;"}
|
|
@@ -13,9 +13,11 @@ function registerQueryWithController(entry) {
|
|
|
13
13
|
entry.cancel = () => observer.complete();
|
|
14
14
|
}
|
|
15
15
|
queryControler.queryStarted(entry);
|
|
16
|
+
let markedAsCompleted = false;
|
|
16
17
|
const sub = queryStream.subscribe({
|
|
17
18
|
next: (v) => {
|
|
18
|
-
if (v.state !== LoadingState.Loading) {
|
|
19
|
+
if (!markedAsCompleted && v.state !== LoadingState.Loading) {
|
|
20
|
+
markedAsCompleted = true;
|
|
19
21
|
queryControler.queryCompleted(entry);
|
|
20
22
|
}
|
|
21
23
|
observer.next(v);
|
|
@@ -27,7 +29,9 @@ function registerQueryWithController(entry) {
|
|
|
27
29
|
});
|
|
28
30
|
return () => {
|
|
29
31
|
sub.unsubscribe();
|
|
30
|
-
|
|
32
|
+
if (!markedAsCompleted) {
|
|
33
|
+
queryControler.queryCompleted(entry);
|
|
34
|
+
}
|
|
31
35
|
};
|
|
32
36
|
});
|
|
33
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerQueryWithController.js","sources":["../../../src/querying/registerQueryWithController.ts"],"sourcesContent":["import { Observable } from 'rxjs';\nimport { LoadingState } from '@grafana/schema';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { QueryResultWithState, SceneQueryControllerEntry } from '../behaviors/SceneQueryController';\n\n/**\n * Will look for a scene object with a behavior that is a SceneQueryController and register the query with it.\n */\nexport function registerQueryWithController<T extends QueryResultWithState>(entry: SceneQueryControllerEntry) {\n return (queryStream: Observable<T>) => {\n const queryControler = sceneGraph.getQueryController(entry.origin);\n if (!queryControler) {\n return queryStream;\n }\n\n return new Observable<T>((observer) => {\n if (!entry.cancel) {\n entry.cancel = () => observer.complete();\n }\n\n queryControler.queryStarted(entry);\n\n const sub = queryStream.subscribe({\n next: (v) => {\n if (v.state !== LoadingState.Loading) {\n queryControler.queryCompleted(entry);\n }\n\n observer.next(v);\n },\n error: (e) => observer.error(e),\n complete: () => {\n observer.complete();\n },\n });\n\n return () => {\n sub.unsubscribe();\n queryControler.queryCompleted(entry);\n };\n });\n };\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,4BAA4D,KAAkC,EAAA;AAC5G,EAAA,OAAO,CAAC,WAA+B,KAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,kBAAmB,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACjE,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAO,OAAA,WAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAI,UAAc,CAAA,CAAC,QAAa,KAAA;AACrC,MAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,QAAM,KAAA,CAAA,MAAA,GAAS,MAAM,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,OACzC;AAEA,MAAA,cAAA,CAAe,aAAa,KAAK,CAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"registerQueryWithController.js","sources":["../../../src/querying/registerQueryWithController.ts"],"sourcesContent":["import { Observable } from 'rxjs';\nimport { LoadingState } from '@grafana/schema';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { QueryResultWithState, SceneQueryControllerEntry } from '../behaviors/SceneQueryController';\n\n/**\n * Will look for a scene object with a behavior that is a SceneQueryController and register the query with it.\n */\nexport function registerQueryWithController<T extends QueryResultWithState>(entry: SceneQueryControllerEntry) {\n return (queryStream: Observable<T>) => {\n const queryControler = sceneGraph.getQueryController(entry.origin);\n if (!queryControler) {\n return queryStream;\n }\n\n return new Observable<T>((observer) => {\n if (!entry.cancel) {\n entry.cancel = () => observer.complete();\n }\n\n queryControler.queryStarted(entry);\n let markedAsCompleted = false;\n\n const sub = queryStream.subscribe({\n next: (v) => {\n if (!markedAsCompleted && v.state !== LoadingState.Loading) {\n markedAsCompleted = true;\n queryControler.queryCompleted(entry);\n }\n\n observer.next(v);\n },\n error: (e) => observer.error(e),\n complete: () => {\n observer.complete();\n },\n });\n\n return () => {\n sub.unsubscribe();\n\n if (!markedAsCompleted) {\n queryControler.queryCompleted(entry);\n }\n };\n });\n };\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,4BAA4D,KAAkC,EAAA;AAC5G,EAAA,OAAO,CAAC,WAA+B,KAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,kBAAmB,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACjE,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAO,OAAA,WAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,IAAI,UAAc,CAAA,CAAC,QAAa,KAAA;AACrC,MAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,QAAM,KAAA,CAAA,MAAA,GAAS,MAAM,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,OACzC;AAEA,MAAA,cAAA,CAAe,aAAa,KAAK,CAAA,CAAA;AACjC,MAAA,IAAI,iBAAoB,GAAA,KAAA,CAAA;AAExB,MAAM,MAAA,GAAA,GAAM,YAAY,SAAU,CAAA;AAAA,QAChC,IAAA,EAAM,CAAC,CAAM,KAAA;AACX,UAAA,IAAI,CAAC,iBAAA,IAAqB,CAAE,CAAA,KAAA,KAAU,aAAa,OAAS,EAAA;AAC1D,YAAoB,iBAAA,GAAA,IAAA,CAAA;AACpB,YAAA,cAAA,CAAe,eAAe,KAAK,CAAA,CAAA;AAAA,WACrC;AAEA,UAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,SACjB;AAAA,QACA,KAAO,EAAA,CAAC,CAAM,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,QAC9B,UAAU,MAAM;AACd,UAAA,QAAA,CAAS,QAAS,EAAA,CAAA;AAAA,SACpB;AAAA,OACD,CAAA,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,WAAY,EAAA,CAAA;AAEhB,QAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,UAAA,cAAA,CAAe,eAAe,KAAK,CAAA,CAAA;AAAA,SACrC;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH,CAAA;AACF;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -1406,6 +1406,9 @@ class SceneQueryController extends SceneObjectBase {
|
|
|
1406
1406
|
}
|
|
1407
1407
|
}
|
|
1408
1408
|
queryCompleted(entry) {
|
|
1409
|
+
if (!__privateGet(this, _running).has(entry)) {
|
|
1410
|
+
return;
|
|
1411
|
+
}
|
|
1409
1412
|
__privateGet(this, _running).delete(entry);
|
|
1410
1413
|
this.changeRunningQueryCount(-1);
|
|
1411
1414
|
if (__privateGet(this, _running).size === 0) {
|
|
@@ -2326,9 +2329,11 @@ function registerQueryWithController(entry) {
|
|
|
2326
2329
|
entry.cancel = () => observer.complete();
|
|
2327
2330
|
}
|
|
2328
2331
|
queryControler.queryStarted(entry);
|
|
2332
|
+
let markedAsCompleted = false;
|
|
2329
2333
|
const sub = queryStream.subscribe({
|
|
2330
2334
|
next: (v) => {
|
|
2331
|
-
if (v.state !== schema.LoadingState.Loading) {
|
|
2335
|
+
if (!markedAsCompleted && v.state !== schema.LoadingState.Loading) {
|
|
2336
|
+
markedAsCompleted = true;
|
|
2332
2337
|
queryControler.queryCompleted(entry);
|
|
2333
2338
|
}
|
|
2334
2339
|
observer.next(v);
|
|
@@ -2340,7 +2345,9 @@ function registerQueryWithController(entry) {
|
|
|
2340
2345
|
});
|
|
2341
2346
|
return () => {
|
|
2342
2347
|
sub.unsubscribe();
|
|
2343
|
-
|
|
2348
|
+
if (!markedAsCompleted) {
|
|
2349
|
+
queryControler.queryCompleted(entry);
|
|
2350
|
+
}
|
|
2344
2351
|
};
|
|
2345
2352
|
});
|
|
2346
2353
|
};
|
|
@@ -6734,12 +6741,11 @@ const getAlertStateStyles = (theme) => {
|
|
|
6734
6741
|
};
|
|
6735
6742
|
};
|
|
6736
6743
|
function getPanelTimeRange(sceneTimeRange, plugin, data) {
|
|
6737
|
-
var _a;
|
|
6738
6744
|
if (!plugin || plugin.meta.skipDataQuery) {
|
|
6739
6745
|
return sceneTimeRange.state.value;
|
|
6740
6746
|
}
|
|
6741
|
-
if (data &&
|
|
6742
|
-
return data.
|
|
6747
|
+
if (data && data.timeRange) {
|
|
6748
|
+
return data.timeRange;
|
|
6743
6749
|
}
|
|
6744
6750
|
return sceneTimeRange.state.value;
|
|
6745
6751
|
}
|