@grafana/scenes 8.2.1 → 8.2.2

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
@@ -2,14 +2,16 @@
2
2
 
3
3
  #### 🐛 Bug Fix
4
4
 
5
+ - VIzPanel: add data-viz-panel-id attribute [#1439](https://github.com/grafana/scenes/pull/1439) ([@dprokop](https://github.com/dprokop))
5
6
  - Adhoc: free form mode tests coverage [#1441](https://github.com/grafana/scenes/pull/1441) ([@kristinademeshchik](https://github.com/kristinademeshchik))
6
7
  - AdhocCombobox: apply filter and move focus to the next focusable element on tab [#1435](https://github.com/grafana/scenes/pull/1435) ([@kristinademeshchik](https://github.com/kristinademeshchik))
7
8
  - AdHocFilters: Fix stale operator list in free-form expression input [#1440](https://github.com/grafana/scenes/pull/1440) ([@kristinademeshchik](https://github.com/kristinademeshchik))
8
9
  - SceneRefreshPicker: use new loadingText prop on RefreshPicker [#1438](https://github.com/grafana/scenes/pull/1438) ([@ashharrison90](https://github.com/ashharrison90))
9
10
 
10
- #### Authors: 2
11
+ #### Authors: 3
11
12
 
12
13
  - Ashley Harrison ([@ashharrison90](https://github.com/ashharrison90))
14
+ - Dominik Prokop ([@dprokop](https://github.com/dprokop))
13
15
  - Kristina Demeshchik ([@kristinademeshchik](https://github.com/kristinademeshchik))
14
16
 
15
17
  ---
@@ -177,67 +177,76 @@ function VizPanelRenderer({ model }) {
177
177
  const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;
178
178
  const context = model.getPanelContext();
179
179
  const panelId = model.getLegacyPanelId();
180
- return /* @__PURE__ */ React.createElement("div", { className: relativeWrapper }, /* @__PURE__ */ React.createElement("div", { ref, className: absoluteWrapper, "data-viz-panel-key": model.state.key }, /* @__PURE__ */ React.createElement(
181
- PanelChrome,
180
+ return /* @__PURE__ */ React.createElement("div", { className: relativeWrapper }, /* @__PURE__ */ React.createElement(
181
+ "div",
182
182
  {
183
- title: titleInterpolated,
184
- description: (description == null ? void 0 : description.trim()) ? model.getDescription : void 0,
185
- loadingState: data.state,
186
- statusMessage: getChromeStatusMessage(data, _pluginLoadError),
187
- statusMessageOnClick: model.onStatusMessageClick,
188
- width: width === 0 ? void 0 : width,
189
- height: height === 0 ? void 0 : height,
190
- selectionId: model.state.key,
191
- displayMode,
192
- titleItems: titleItemsElement.length > 0 ? titleItemsElement : void 0,
193
- dragClass,
194
- actions: actionsElement,
195
- dragClassCancel,
196
- padding: plugin.noPadding ? "none" : "md",
197
- menu: panelMenu,
198
- onCancelQuery: model.onCancelQuery,
199
- onFocus: setPanelAttention,
200
- onMouseEnter: setPanelAttention,
201
- onMouseMove: debouncedMouseMove,
202
- subHeaderContent: subHeaderElement.length ? subHeaderElement : void 0,
203
- onDragStart: (e) => {
204
- var _a2;
205
- (_a2 = dragHooks.onDragStart) == null ? void 0 : _a2.call(dragHooks, e, model);
206
- },
207
- showMenuAlways,
208
- ...collapsible ? {
209
- collapsible: Boolean(collapsible),
210
- collapsed,
211
- onToggleCollapse: model.onToggleCollapse
212
- } : { hoverHeader, hoverHeaderOffset }
183
+ ref,
184
+ className: absoluteWrapper,
185
+ "data-viz-panel-key": model.state.key,
186
+ "data-viz-panel-id": model.getPathId()
213
187
  },
214
- (innerWidth, innerHeight) => {
215
- if (innerWidth === 0 || innerHeight === 0) {
216
- return null;
217
- }
218
- return /* @__PURE__ */ React.createElement(ErrorBoundaryAlert, { dependencies: [plugin, data] }, /* @__PURE__ */ React.createElement(PluginContextProvider, { meta: plugin.meta }, /* @__PURE__ */ React.createElement(PanelContextProvider, { value: context }, isReadyToRender && /* @__PURE__ */ React.createElement(
219
- PanelComponent,
220
- {
221
- id: panelId,
222
- data,
223
- title,
224
- timeRange,
225
- timeZone,
226
- options,
227
- fieldConfig,
228
- transparent: displayMode === "transparent",
229
- width: innerWidth,
230
- height: innerHeight,
231
- renderCounter: _renderCounter,
232
- replaceVariables: model.interpolate,
233
- onOptionsChange: model.onOptionsChange,
234
- onFieldConfigChange: model.onFieldConfigChange,
235
- onChangeTimeRange: model.onTimeRangeChange,
236
- eventBus: context.eventBus
188
+ /* @__PURE__ */ React.createElement(
189
+ PanelChrome,
190
+ {
191
+ title: titleInterpolated,
192
+ description: (description == null ? void 0 : description.trim()) ? model.getDescription : void 0,
193
+ loadingState: data.state,
194
+ statusMessage: getChromeStatusMessage(data, _pluginLoadError),
195
+ statusMessageOnClick: model.onStatusMessageClick,
196
+ width: width === 0 ? void 0 : width,
197
+ height: height === 0 ? void 0 : height,
198
+ selectionId: model.state.key,
199
+ displayMode,
200
+ titleItems: titleItemsElement.length > 0 ? titleItemsElement : void 0,
201
+ dragClass,
202
+ actions: actionsElement,
203
+ dragClassCancel,
204
+ padding: plugin.noPadding ? "none" : "md",
205
+ menu: panelMenu,
206
+ onCancelQuery: model.onCancelQuery,
207
+ onFocus: setPanelAttention,
208
+ onMouseEnter: setPanelAttention,
209
+ onMouseMove: debouncedMouseMove,
210
+ subHeaderContent: subHeaderElement.length ? subHeaderElement : void 0,
211
+ onDragStart: (e) => {
212
+ var _a2;
213
+ (_a2 = dragHooks.onDragStart) == null ? void 0 : _a2.call(dragHooks, e, model);
214
+ },
215
+ showMenuAlways,
216
+ ...collapsible ? {
217
+ collapsible: Boolean(collapsible),
218
+ collapsed,
219
+ onToggleCollapse: model.onToggleCollapse
220
+ } : { hoverHeader, hoverHeaderOffset }
221
+ },
222
+ (innerWidth, innerHeight) => {
223
+ if (innerWidth === 0 || innerHeight === 0) {
224
+ return null;
237
225
  }
238
- ))));
239
- }
240
- )));
226
+ return /* @__PURE__ */ React.createElement(ErrorBoundaryAlert, { dependencies: [plugin, data] }, /* @__PURE__ */ React.createElement(PluginContextProvider, { meta: plugin.meta }, /* @__PURE__ */ React.createElement(PanelContextProvider, { value: context }, isReadyToRender && /* @__PURE__ */ React.createElement(
227
+ PanelComponent,
228
+ {
229
+ id: panelId,
230
+ data,
231
+ title,
232
+ timeRange,
233
+ timeZone,
234
+ options,
235
+ fieldConfig,
236
+ transparent: displayMode === "transparent",
237
+ width: innerWidth,
238
+ height: innerHeight,
239
+ renderCounter: _renderCounter,
240
+ replaceVariables: model.interpolate,
241
+ onOptionsChange: model.onOptionsChange,
242
+ onFieldConfigChange: model.onFieldConfigChange,
243
+ onChangeTimeRange: model.onTimeRangeChange,
244
+ eventBus: context.eventBus
245
+ }
246
+ ))));
247
+ }
248
+ )
249
+ ));
241
250
  }
242
251
  function useClearPreviousData(data) {
243
252
  var _a, _b;
@@ -1 +1 @@
1
- {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n 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 <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 === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n // @ts-expect-error remove this on next grafana/ui update\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert 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 </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n const panelId = model.getLegacyPanelId();\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n >\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 === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n // @ts-expect-error remove this on next grafana/ui update\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert 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 </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3749,67 +3749,76 @@ function VizPanelRenderer({ model }) {
3749
3749
  const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;
3750
3750
  const context = model.getPanelContext();
3751
3751
  const panelId = model.getLegacyPanelId();
3752
- return /* @__PURE__ */ React__default.default.createElement("div", { className: relativeWrapper }, /* @__PURE__ */ React__default.default.createElement("div", { ref, className: absoluteWrapper, "data-viz-panel-key": model.state.key }, /* @__PURE__ */ React__default.default.createElement(
3753
- ui.PanelChrome,
3752
+ return /* @__PURE__ */ React__default.default.createElement("div", { className: relativeWrapper }, /* @__PURE__ */ React__default.default.createElement(
3753
+ "div",
3754
3754
  {
3755
- title: titleInterpolated,
3756
- description: (description == null ? void 0 : description.trim()) ? model.getDescription : void 0,
3757
- loadingState: data$1.state,
3758
- statusMessage: getChromeStatusMessage(data$1, _pluginLoadError),
3759
- statusMessageOnClick: model.onStatusMessageClick,
3760
- width: width === 0 ? void 0 : width,
3761
- height: height === 0 ? void 0 : height,
3762
- selectionId: model.state.key,
3763
- displayMode,
3764
- titleItems: titleItemsElement.length > 0 ? titleItemsElement : void 0,
3765
- dragClass,
3766
- actions: actionsElement,
3767
- dragClassCancel,
3768
- padding: plugin.noPadding ? "none" : "md",
3769
- menu: panelMenu,
3770
- onCancelQuery: model.onCancelQuery,
3771
- onFocus: setPanelAttention,
3772
- onMouseEnter: setPanelAttention,
3773
- onMouseMove: debouncedMouseMove,
3774
- subHeaderContent: subHeaderElement.length ? subHeaderElement : void 0,
3775
- onDragStart: (e) => {
3776
- var _a2;
3777
- (_a2 = dragHooks.onDragStart) == null ? void 0 : _a2.call(dragHooks, e, model);
3778
- },
3779
- showMenuAlways,
3780
- ...collapsible ? {
3781
- collapsible: Boolean(collapsible),
3782
- collapsed,
3783
- onToggleCollapse: model.onToggleCollapse
3784
- } : { hoverHeader, hoverHeaderOffset }
3755
+ ref,
3756
+ className: absoluteWrapper,
3757
+ "data-viz-panel-key": model.state.key,
3758
+ "data-viz-panel-id": model.getPathId()
3785
3759
  },
3786
- (innerWidth, innerHeight) => {
3787
- if (innerWidth === 0 || innerHeight === 0) {
3788
- return null;
3789
- }
3790
- return /* @__PURE__ */ React__default.default.createElement(ui.ErrorBoundaryAlert, { dependencies: [plugin, data$1] }, /* @__PURE__ */ React__default.default.createElement(data.PluginContextProvider, { meta: plugin.meta }, /* @__PURE__ */ React__default.default.createElement(ui.PanelContextProvider, { value: context }, isReadyToRender && /* @__PURE__ */ React__default.default.createElement(
3791
- PanelComponent,
3792
- {
3793
- id: panelId,
3794
- data: data$1,
3795
- title,
3796
- timeRange,
3797
- timeZone,
3798
- options,
3799
- fieldConfig,
3800
- transparent: displayMode === "transparent",
3801
- width: innerWidth,
3802
- height: innerHeight,
3803
- renderCounter: _renderCounter,
3804
- replaceVariables: model.interpolate,
3805
- onOptionsChange: model.onOptionsChange,
3806
- onFieldConfigChange: model.onFieldConfigChange,
3807
- onChangeTimeRange: model.onTimeRangeChange,
3808
- eventBus: context.eventBus
3760
+ /* @__PURE__ */ React__default.default.createElement(
3761
+ ui.PanelChrome,
3762
+ {
3763
+ title: titleInterpolated,
3764
+ description: (description == null ? void 0 : description.trim()) ? model.getDescription : void 0,
3765
+ loadingState: data$1.state,
3766
+ statusMessage: getChromeStatusMessage(data$1, _pluginLoadError),
3767
+ statusMessageOnClick: model.onStatusMessageClick,
3768
+ width: width === 0 ? void 0 : width,
3769
+ height: height === 0 ? void 0 : height,
3770
+ selectionId: model.state.key,
3771
+ displayMode,
3772
+ titleItems: titleItemsElement.length > 0 ? titleItemsElement : void 0,
3773
+ dragClass,
3774
+ actions: actionsElement,
3775
+ dragClassCancel,
3776
+ padding: plugin.noPadding ? "none" : "md",
3777
+ menu: panelMenu,
3778
+ onCancelQuery: model.onCancelQuery,
3779
+ onFocus: setPanelAttention,
3780
+ onMouseEnter: setPanelAttention,
3781
+ onMouseMove: debouncedMouseMove,
3782
+ subHeaderContent: subHeaderElement.length ? subHeaderElement : void 0,
3783
+ onDragStart: (e) => {
3784
+ var _a2;
3785
+ (_a2 = dragHooks.onDragStart) == null ? void 0 : _a2.call(dragHooks, e, model);
3786
+ },
3787
+ showMenuAlways,
3788
+ ...collapsible ? {
3789
+ collapsible: Boolean(collapsible),
3790
+ collapsed,
3791
+ onToggleCollapse: model.onToggleCollapse
3792
+ } : { hoverHeader, hoverHeaderOffset }
3793
+ },
3794
+ (innerWidth, innerHeight) => {
3795
+ if (innerWidth === 0 || innerHeight === 0) {
3796
+ return null;
3809
3797
  }
3810
- ))));
3811
- }
3812
- )));
3798
+ return /* @__PURE__ */ React__default.default.createElement(ui.ErrorBoundaryAlert, { dependencies: [plugin, data$1] }, /* @__PURE__ */ React__default.default.createElement(data.PluginContextProvider, { meta: plugin.meta }, /* @__PURE__ */ React__default.default.createElement(ui.PanelContextProvider, { value: context }, isReadyToRender && /* @__PURE__ */ React__default.default.createElement(
3799
+ PanelComponent,
3800
+ {
3801
+ id: panelId,
3802
+ data: data$1,
3803
+ title,
3804
+ timeRange,
3805
+ timeZone,
3806
+ options,
3807
+ fieldConfig,
3808
+ transparent: displayMode === "transparent",
3809
+ width: innerWidth,
3810
+ height: innerHeight,
3811
+ renderCounter: _renderCounter,
3812
+ replaceVariables: model.interpolate,
3813
+ onOptionsChange: model.onOptionsChange,
3814
+ onFieldConfigChange: model.onFieldConfigChange,
3815
+ onChangeTimeRange: model.onTimeRangeChange,
3816
+ eventBus: context.eventBus
3817
+ }
3818
+ ))));
3819
+ }
3820
+ )
3821
+ ));
3813
3822
  }
3814
3823
  function useClearPreviousData(data) {
3815
3824
  var _a, _b;