@grafana/scenes 8.18.1 → 8.18.3
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 +24 -0
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +6 -12
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridLayout.js +74 -27
- package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
- package/dist/esm/core/events.js +4 -1
- package/dist/esm/core/events.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/locales/en-US/grafana-scenes.json.js +8 -0
- package/dist/esm/locales/en-US/grafana-scenes.json.js.map +1 -1
- package/dist/{grafana-scenes-Cb8bcz3V.js → grafana-scenes-CvG6Ol5c.js} +9 -1
- package/dist/{grafana-scenes-Cb8bcz3V.js.map → grafana-scenes-CvG6Ol5c.js.map} +1 -1
- package/dist/index.d.ts +18 -2
- package/dist/index.js +82 -39
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
# v8.18.3 (Wed Sep 23 2026)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- Dashboards: Move PanelContextProvider above PanelChrome [#1654](https://github.com/grafana/scenes/pull/1654) ([@mdvictor](https://github.com/mdvictor))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Victor Marin ([@mdvictor](https://github.com/mdvictor))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v8.18.2 (Fri Sep 18 2026)
|
|
14
|
+
|
|
15
|
+
#### 🐛 Bug Fix
|
|
16
|
+
|
|
17
|
+
- Undo/redo support for scene objects [#1645](https://github.com/grafana/scenes/pull/1645) ([@ifrost](https://github.com/ifrost))
|
|
18
|
+
|
|
19
|
+
#### Authors: 1
|
|
20
|
+
|
|
21
|
+
- Piotr Jamróz ([@ifrost](https://github.com/ifrost))
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
1
25
|
# v8.18.1 (Fri Sep 18 2026)
|
|
2
26
|
|
|
3
27
|
#### 🐛 Bug Fix
|
|
@@ -3,7 +3,7 @@ import React, { useContext, useMemo, useCallback, useLayoutEffect, useEffect, me
|
|
|
3
3
|
import { useMeasure, usePrevious } from 'react-use';
|
|
4
4
|
import { SetPanelAttentionEvent, renderMarkdown, AlertState, PluginContextProvider, PanelPlugin, PluginType } from '@grafana/data';
|
|
5
5
|
import { getAppEvents, config } from '@grafana/runtime';
|
|
6
|
-
import { useStyles2, Tooltip, PanelChrome, Icon,
|
|
6
|
+
import { useStyles2, Tooltip, PanelChrome, Icon, PanelContextProvider, ErrorBoundaryAlert } from '@grafana/ui';
|
|
7
7
|
import { sceneGraph } from '../../core/sceneGraph/index.js';
|
|
8
8
|
import { isSceneObject } from '../../core/types.js';
|
|
9
9
|
import { VizPanelFitContext } from './VizPanelFitContext.js';
|
|
@@ -190,14 +190,13 @@ function VizPanelRenderer({ model }) {
|
|
|
190
190
|
const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;
|
|
191
191
|
const context = model.getPanelContext();
|
|
192
192
|
const showNewPanelErrorsUI = Boolean(context.onOpenInspector);
|
|
193
|
-
const onInvestigateErrors = context.onInvestigateErrors;
|
|
194
193
|
const panelId = model.getLegacyPanelId();
|
|
195
194
|
const outdatedPluginError = t(
|
|
196
195
|
"grafana-scenes.components.viz-panel-renderer.outdated-plugin-error",
|
|
197
196
|
'An unexpected error occurred. Updating the "{{pluginName}}" plugin to the latest version may fix the problem.',
|
|
198
197
|
{ pluginName: plugin.meta.name }
|
|
199
198
|
);
|
|
200
|
-
const panelChrome = /* @__PURE__ */ React.createElement(
|
|
199
|
+
const panelChrome = /* @__PURE__ */ React.createElement(PanelContextProvider, { value: context }, /* @__PURE__ */ React.createElement(
|
|
201
200
|
PanelChrome,
|
|
202
201
|
{
|
|
203
202
|
title: titleInterpolated,
|
|
@@ -206,12 +205,7 @@ function VizPanelRenderer({ model }) {
|
|
|
206
205
|
loadingState: data.state,
|
|
207
206
|
statusMessage: getChromeStatusMessage(data, _pluginLoadError),
|
|
208
207
|
statusItems: showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : void 0,
|
|
209
|
-
statusMessageOnClick: () =>
|
|
210
|
-
var _a2;
|
|
211
|
-
model.onStatusMessageClick();
|
|
212
|
-
(_a2 = context.onOpenInspector) == null ? void 0 : _a2.call(context);
|
|
213
|
-
},
|
|
214
|
-
onInvestigateErrors: showNewPanelErrorsUI ? onInvestigateErrors : void 0,
|
|
208
|
+
statusMessageOnClick: () => model.onStatusMessageClick(),
|
|
215
209
|
width: width === 0 ? void 0 : width,
|
|
216
210
|
height: fitContent ? void 0 : height === 0 ? void 0 : height,
|
|
217
211
|
minHeight: fitContent ? fitMinHeight : void 0,
|
|
@@ -249,7 +243,7 @@ function VizPanelRenderer({ model }) {
|
|
|
249
243
|
title: plugin.meta.hasUpdate ? outdatedPluginError : void 0,
|
|
250
244
|
dependencies: [plugin, data]
|
|
251
245
|
},
|
|
252
|
-
/* @__PURE__ */ React.createElement(PluginContextProvider, { meta: plugin.meta },
|
|
246
|
+
/* @__PURE__ */ React.createElement(PluginContextProvider, { meta: plugin.meta }, isReadyToRender && /* @__PURE__ */ React.createElement(
|
|
253
247
|
PanelComponent,
|
|
254
248
|
{
|
|
255
249
|
id: panelId,
|
|
@@ -270,10 +264,10 @@ function VizPanelRenderer({ model }) {
|
|
|
270
264
|
onChangeTimeRange: model.onTimeRangeChange,
|
|
271
265
|
eventBus: context.eventBus
|
|
272
266
|
}
|
|
273
|
-
))
|
|
267
|
+
))
|
|
274
268
|
);
|
|
275
269
|
}
|
|
276
|
-
);
|
|
270
|
+
));
|
|
277
271
|
if (fitContent) {
|
|
278
272
|
return /* @__PURE__ */ React.createElement(
|
|
279
273
|
"div",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { config, 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 { VizPanelFitContext } from './VizPanelFitContext';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const { enabled: fitContent, minHeight: fitMinHeight } = useContext(VizPanelFitContext);\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n const alertState = dataWithFieldConfig.alertState;\n // @ts-expect-error ruleUID is added in a newer @grafana/data version\n const ruleUID: string | undefined = alertState.ruleUID;\n const alertRuleHref = ruleUID ? `${config.appSubUrl ?? ''}/alerting/grafana/${ruleUID}/view` : undefined;\n\n titleItemsElement.push(\n <Tooltip content={alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n href={alertRuleHref}\n className={cx({\n [alertStateStyles.ok]: alertState.state === AlertState.OK,\n [alertStateStyles.pending]: alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n // The host only provides this when it wants an \"Investigate errors\" action offered in the\n // status popover (e.g. gated on assistant availability); PanelChrome renders it generically.\n // @ts-expect-error onInvestigateErrors is added in a newer @grafana/ui version\n const onInvestigateErrors: (() => void) | undefined = context.onInvestigateErrors;\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n const panelChrome = (\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n onInvestigateErrors={showNewPanelErrorsUI ? onInvestigateErrors : undefined}\n width={width === 0 ? undefined : width}\n // In fit-content mode the height is content-driven: leave it undefined so\n // PanelChrome flows. A min-height floor keeps the chrome filled when\n // content is short; the layout's CSS caps the max.\n height={fitContent ? undefined : height === 0 ? undefined : height}\n minHeight={fitContent ? fitMinHeight : undefined}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n // In fit-content mode height is auto (innerHeight is 0/undefined by\n // design), so only width gates rendering.\n if (innerWidth === 0 || (!fitContent && innerHeight === 0)) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight || 0}\n // @ts-expect-error remove on next @grafana/data update (adds PanelProps.fitContent)\n fitContent={fitContent || undefined}\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\n // Fit-content: render the panel in normal flow (no absolute positioning) so\n // its content drives the height. `useMeasure` still tracks width; height is\n // ignored. The cell's CSS min/max bounds the final size.\n if (fitContent) {\n return (\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={fitContentWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n data-plugin-id={plugin.meta.id}\n >\n {panelChrome}\n </div>\n );\n }\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n data-plugin-id={plugin.meta.id}\n >\n {panelChrome}\n </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[]> | undefined>(undefined);\n const currVals = useRef<Set<any[]> | undefined>(undefined);\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Fit-content wrapper: in normal flow so the panel content defines the height.\n * Width is still 100% of the (layout-constrained) cell.\n *\n * The single-cell grid + minHeight combo makes the chrome fill the cell when\n * the layout stretches it (e.g. matched row heights, where a sibling made the\n * row taller) while staying content-sized when the cell is auto: percentage\n * min-height resolves to nothing against an indefinite parent, and a grid's\n * lone auto row absorbs any extra height the min-height creates.\n */\nconst fitContentWrapper = css({\n position: 'relative',\n width: '100%',\n display: 'grid',\n minHeight: '100%',\n // PanelChrome gets a measured pixel width; without inline-size containment\n // that becomes the subtree's min-content width and flex/grid ancestors with\n // `min-width: auto` can never shrink again (the absolute wrapper provides\n // this decoupling in the default path). Containment zeroes the wrapper's\n // intrinsic inline size while keeping the block axis content-driven.\n contain: 'inline-size',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { config, 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 { VizPanelFitContext } from './VizPanelFitContext';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const { enabled: fitContent, minHeight: fitMinHeight } = useContext(VizPanelFitContext);\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n const alertState = dataWithFieldConfig.alertState;\n // @ts-expect-error ruleUID is added in a newer @grafana/data version\n const ruleUID: string | undefined = alertState.ruleUID;\n const alertRuleHref = ruleUID ? `${config.appSubUrl ?? ''}/alerting/grafana/${ruleUID}/view` : undefined;\n\n titleItemsElement.push(\n <Tooltip content={alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n href={alertRuleHref}\n className={cx({\n [alertStateStyles.ok]: alertState.state === AlertState.OK,\n [alertStateStyles.pending]: alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n // Wraps the whole chrome, not just the panel body, so header-slot content\n // can also reach PanelContext via usePanelContext() instead of being passed\n // props explicitly. PanelChrome itself reads onOpenInspector/onInvestigateErrors from this\n // context rather than through props.\n const panelChrome = (\n <PanelContextProvider value={context}>\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n // Report the interaction for analytics; PanelChrome opens the inspector itself via\n // PanelContext's onOpenInspector.\n statusMessageOnClick={() => model.onStatusMessageClick()}\n width={width === 0 ? undefined : width}\n // In fit-content mode the height is content-driven: leave it undefined so\n // PanelChrome flows. A min-height floor keeps the chrome filled when\n // content is short; the layout's CSS caps the max.\n height={fitContent ? undefined : height === 0 ? undefined : height}\n minHeight={fitContent ? fitMinHeight : undefined}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n // In fit-content mode height is auto (innerHeight is 0/undefined by\n // design), so only width gates rendering.\n if (innerWidth === 0 || (!fitContent && innerHeight === 0)) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n {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 || 0}\n // @ts-expect-error remove on next @grafana/data update (adds PanelProps.fitContent)\n fitContent={fitContent || undefined}\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 </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </PanelContextProvider>\n );\n\n // Fit-content: render the panel in normal flow (no absolute positioning) so\n // its content drives the height. `useMeasure` still tracks width; height is\n // ignored. The cell's CSS min/max bounds the final size.\n if (fitContent) {\n return (\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={fitContentWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n data-plugin-id={plugin.meta.id}\n >\n {panelChrome}\n </div>\n );\n }\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n data-plugin-id={plugin.meta.id}\n >\n {panelChrome}\n </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[]> | undefined>(undefined);\n const currVals = useRef<Set<any[]> | undefined>(undefined);\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Fit-content wrapper: in normal flow so the panel content defines the height.\n * Width is still 100% of the (layout-constrained) cell.\n *\n * The single-cell grid + minHeight combo makes the chrome fill the cell when\n * the layout stretches it (e.g. matched row heights, where a sibling made the\n * row taller) while staying content-sized when the cell is auto: percentage\n * min-height resolves to nothing against an indefinite parent, and a grid's\n * lone auto row absorbs any extra height the min-height creates.\n */\nconst fitContentWrapper = css({\n position: 'relative',\n width: '100%',\n display: 'grid',\n minHeight: '100%',\n // PanelChrome gets a measured pixel width; without inline-size containment\n // that becomes the subtree's min-content width and flex/grid ancestors with\n // `min-width: auto` can never shrink again (the absolute wrapper provides\n // this decoupling in the default path). Containment zeroes the wrapper's\n // intrinsic inline size while keeping the block axis content-driven.\n contain: 'inline-size',\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,3 +1,5 @@
|
|
|
1
|
+
import { t } from '@grafana/i18n';
|
|
2
|
+
import { StateCommittedEvent } from '../../../core/events.js';
|
|
1
3
|
import { SceneObjectBase } from '../../../core/SceneObjectBase.js';
|
|
2
4
|
import { DEFAULT_PANEL_SPAN } from './constants.js';
|
|
3
5
|
import { isSceneGridRow } from './SceneGridItem.js';
|
|
@@ -25,28 +27,23 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
|
|
|
25
27
|
layout = [...this._oldLayout];
|
|
26
28
|
this._loadOldLayout = false;
|
|
27
29
|
}
|
|
28
|
-
|
|
29
|
-
const child = this.getSceneLayoutChild(item.i);
|
|
30
|
-
const nextSize = {
|
|
31
|
-
x: item.x,
|
|
32
|
-
y: item.y,
|
|
33
|
-
width: item.w,
|
|
34
|
-
height: item.h
|
|
35
|
-
};
|
|
36
|
-
if (!isItemSizeEqual(child.state, nextSize)) {
|
|
37
|
-
child.setState({
|
|
38
|
-
...nextSize
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
this.setState({ children: sortChildrenByPosition(this.state.children) });
|
|
30
|
+
this._applyLayout(layout);
|
|
43
31
|
};
|
|
44
|
-
this.onResizeStop = (
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
this.onResizeStop = (layout) => {
|
|
33
|
+
const from = this._captureLayout(layout);
|
|
34
|
+
const hasChanges = layout.some(
|
|
35
|
+
(item, i) => item.x !== from[i].x || item.y !== from[i].y || item.w !== from[i].w || item.h !== from[i].h
|
|
36
|
+
);
|
|
37
|
+
if (!hasChanges) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this._commitState({
|
|
41
|
+
source: this,
|
|
42
|
+
description: t("grafana-scenes.components.layout.grid.scene-grid-layout.resize-panel", "Resize panel"),
|
|
43
|
+
replay: () => this._applyLayout(layout),
|
|
44
|
+
revert: () => this._applyLayout(from)
|
|
49
45
|
});
|
|
46
|
+
this._skipOnLayoutChange = true;
|
|
50
47
|
};
|
|
51
48
|
this.onDragStart = (gridLayout) => {
|
|
52
49
|
this._oldLayout = [...gridLayout];
|
|
@@ -56,15 +53,16 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
|
|
|
56
53
|
gridLayout = sortGridLayout(gridLayout);
|
|
57
54
|
const indexOfUpdatedItem = gridLayout.findIndex((item) => item.i === updatedItem.i);
|
|
58
55
|
let newParent = this.findGridItemSceneParent(gridLayout, indexOfUpdatedItem - 1);
|
|
59
|
-
|
|
56
|
+
const positionChanges = [];
|
|
60
57
|
for (let i = 0; i < gridLayout.length; i++) {
|
|
61
58
|
const gridItem = gridLayout[i];
|
|
62
59
|
const child = this.getSceneLayoutChild(gridItem.i);
|
|
63
60
|
const childSize = child.state;
|
|
64
61
|
if ((childSize == null ? void 0 : childSize.x) !== gridItem.x || (childSize == null ? void 0 : childSize.y) !== gridItem.y) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
y:
|
|
62
|
+
positionChanges.push({
|
|
63
|
+
child,
|
|
64
|
+
from: { x: childSize.x, y: childSize.y },
|
|
65
|
+
to: { x: gridItem.x, y: gridItem.y }
|
|
68
66
|
});
|
|
69
67
|
}
|
|
70
68
|
}
|
|
@@ -77,10 +75,32 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
|
|
|
77
75
|
}
|
|
78
76
|
newParent = this;
|
|
79
77
|
}
|
|
80
|
-
|
|
81
|
-
|
|
78
|
+
const isReparenting = newParent !== sceneChild.parent && !this._loadOldLayout;
|
|
79
|
+
const prevChildren = this.state.children;
|
|
80
|
+
if (this._loadOldLayout) {
|
|
81
|
+
positionChanges.forEach(({ child, to }) => child.setState(to));
|
|
82
|
+
const nextChildren = isReparenting ? this.moveChildTo(sceneChild, newParent) : prevChildren;
|
|
83
|
+
this.setState({ children: sortChildrenByPosition(nextChildren) });
|
|
84
|
+
this._skipOnLayoutChange = true;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (positionChanges.length === 0 && !isReparenting) {
|
|
88
|
+
this._skipOnLayoutChange = true;
|
|
89
|
+
return;
|
|
82
90
|
}
|
|
83
|
-
this.
|
|
91
|
+
this._commitState({
|
|
92
|
+
source: this,
|
|
93
|
+
description: t("grafana-scenes.components.layout.grid.scene-grid-layout.move-panel", "Move panel"),
|
|
94
|
+
replay: () => {
|
|
95
|
+
positionChanges.forEach(({ child, to }) => child.setState(to));
|
|
96
|
+
const nextChildren = isReparenting ? this.moveChildTo(sceneChild, newParent) : prevChildren;
|
|
97
|
+
this.setState({ children: sortChildrenByPosition(nextChildren) });
|
|
98
|
+
},
|
|
99
|
+
revert: () => {
|
|
100
|
+
positionChanges.forEach(({ child, from }) => child.setState(from));
|
|
101
|
+
this.setState({ children: sortChildrenByPosition(prevChildren) });
|
|
102
|
+
}
|
|
103
|
+
});
|
|
84
104
|
this._skipOnLayoutChange = true;
|
|
85
105
|
};
|
|
86
106
|
}
|
|
@@ -167,6 +187,29 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
|
|
|
167
187
|
ignoreLayoutChange(shouldIgnore) {
|
|
168
188
|
this._skipOnLayoutChange = shouldIgnore;
|
|
169
189
|
}
|
|
190
|
+
_applyLayout(layout) {
|
|
191
|
+
for (const item of layout) {
|
|
192
|
+
const child = this.getSceneLayoutChild(item.i);
|
|
193
|
+
const nextSize = {
|
|
194
|
+
x: item.x,
|
|
195
|
+
y: item.y,
|
|
196
|
+
width: item.w,
|
|
197
|
+
height: item.h
|
|
198
|
+
};
|
|
199
|
+
if (!isItemSizeEqual(child.state, nextSize)) {
|
|
200
|
+
child.setState({
|
|
201
|
+
...nextSize
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
this.setState({ children: sortChildrenByPosition(this.state.children) });
|
|
206
|
+
}
|
|
207
|
+
_captureLayout(layout) {
|
|
208
|
+
return layout.map((item) => {
|
|
209
|
+
const { x, y, width, height } = this.getSceneLayoutChild(item.i).state;
|
|
210
|
+
return { ...item, x, y, w: width, h: height };
|
|
211
|
+
});
|
|
212
|
+
}
|
|
170
213
|
/**
|
|
171
214
|
* Will also scan row children and return child of the row
|
|
172
215
|
*/
|
|
@@ -185,6 +228,10 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
|
|
|
185
228
|
}
|
|
186
229
|
throw new Error("Scene layout child not found for GridItem");
|
|
187
230
|
}
|
|
231
|
+
_commitState(payload) {
|
|
232
|
+
payload.replay();
|
|
233
|
+
this.publishEvent(new StateCommittedEvent(payload), true);
|
|
234
|
+
}
|
|
188
235
|
pushChildDown(child, amount) {
|
|
189
236
|
child.setState({
|
|
190
237
|
y: child.state.y + amount
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneGridLayout.js","sources":["../../../../../src/components/layout/grid/SceneGridLayout.tsx"],"sourcesContent":["import { PointerEvent } from 'react';\nimport ReactGridLayout from 'react-grid-layout';\n\nimport { SceneObjectBase } from '../../../core/SceneObjectBase';\nimport { SceneLayout, SceneObjectState } from '../../../core/types';\nimport { DEFAULT_PANEL_SPAN } from './constants';\nimport { isSceneGridRow } from './SceneGridItem';\nimport { SceneGridLayoutRenderer } from './SceneGridLayoutRenderer';\n\nimport { SceneGridRow } from './SceneGridRow';\nimport { SceneGridItemLike, SceneGridItemPlacement, SceneGridLayoutDragStartEvent } from './types';\nimport { fitPanelsInHeight } from './utils';\nimport { VizPanel } from '../../VizPanel/VizPanel';\nimport { isRepeatCloneOrChildOf } from '../../../utils/utils';\n\ninterface SceneGridLayoutState extends SceneObjectState {\n /**\n * Turn on or off dragging for all items. Individual items can still disabled via isDraggable property\n **/\n isDraggable?: boolean;\n /** Enable or disable item resizing */\n isResizable?: boolean;\n isLazy?: boolean;\n /**\n * Fit panels to height of the grid. This will scale down the panels vertically to fit available height.\n * The row height is not changed, only the y position and height of the panels.\n * UNSAFE: This feature is experimental and it might change in the future.\n */\n UNSAFE_fitPanels?: boolean;\n children: SceneGridItemLike[];\n}\n\nexport class SceneGridLayout extends SceneObjectBase<SceneGridLayoutState> implements SceneLayout {\n public static Component = SceneGridLayoutRenderer;\n\n private _skipOnLayoutChange = false;\n private _oldLayout: ReactGridLayout.Layout[] = [];\n private _loadOldLayout = false;\n\n public constructor(state: SceneGridLayoutState) {\n super({\n ...state,\n children: sortChildrenByPosition(state.children),\n });\n }\n\n /**\n * SceneLayout interface. Used for example by VizPanelRenderer\n */\n public isDraggable(): boolean {\n return this.state.isDraggable ?? false;\n }\n\n public getDragClass() {\n return `grid-drag-handle-${this.state.key}`;\n }\n\n public getDragClassCancel() {\n return `grid-drag-cancel`;\n }\n\n public getDragHooks() {\n if (!this.isDraggable()) {\n return {};\n }\n\n return {\n onDragStart: (evt: PointerEvent, panel: VizPanel) => {\n this.publishEvent(new SceneGridLayoutDragStartEvent({ evt, panel }), true);\n },\n };\n }\n\n public adjustYPositions(after: number, amount: number) {\n for (const child of this.state.children) {\n if (child.state.y! > after) {\n child.setState({ y: child.state.y! + amount });\n }\n if (child instanceof SceneGridRow) {\n for (const rowChild of child.state.children) {\n if (rowChild.state.y! > after) {\n rowChild.setState({ y: rowChild.state.y! + amount });\n }\n }\n }\n }\n }\n\n public toggleRow(row: SceneGridRow) {\n const isCollapsed = row.state.isCollapsed;\n\n if (!isCollapsed) {\n row.setState({ isCollapsed: true });\n // To force re-render\n this.setState({});\n return;\n }\n\n const rowChildren = row.state.children;\n\n if (rowChildren.length === 0) {\n row.setState({ isCollapsed: false });\n this.setState({});\n return;\n }\n\n // Ok we are expanding row. We need to update row children y pos (incase they are incorrect) and push items below down\n // Code copied from DashboardModel toggleRow()\n\n const rowY = row.state.y!;\n const firstPanelYPos = rowChildren[0].state.y ?? rowY;\n const yDiff = firstPanelYPos - (rowY + 1);\n\n // y max will represent the bottom y pos after all panels have been added\n // needed to know home much panels below should be pushed down\n let yMax = rowY;\n\n for (const panel of rowChildren) {\n // set the y gridPos if it wasn't already set\n const newSize = { ...panel.state };\n newSize.y = newSize.y ?? rowY;\n // make sure y is adjusted (in case row moved while collapsed)\n newSize.y -= yDiff;\n\n if (newSize.y! !== panel.state.y!) {\n panel.setState(newSize);\n }\n\n // update insert post and y max\n yMax = Math.max(yMax, Number(newSize.y!) + Number(newSize.height!));\n }\n\n const pushDownAmount = yMax - rowY - 1;\n\n // push panels below down\n for (const child of this.state.children) {\n if (child.state.y! > rowY) {\n this.pushChildDown(child, pushDownAmount);\n }\n\n if (isSceneGridRow(child) && child !== row) {\n for (const rowChild of child.state.children) {\n if (rowChild.state.y! > rowY) {\n this.pushChildDown(rowChild, pushDownAmount);\n }\n }\n }\n }\n\n row.setState({ isCollapsed: false });\n // Trigger re-render\n this.setState({});\n }\n\n public ignoreLayoutChange(shouldIgnore: boolean) {\n this._skipOnLayoutChange = shouldIgnore;\n }\n\n public onLayoutChange = (layout: ReactGridLayout.Layout[]) => {\n if (this._skipOnLayoutChange) {\n // Layout has been updated by other RTL handler already\n this._skipOnLayoutChange = false;\n return;\n }\n\n // We replace with the old layout only if the current state is invalid\n if (this._loadOldLayout) {\n layout = [...this._oldLayout];\n this._loadOldLayout = false;\n }\n\n for (const item of layout) {\n const child = this.getSceneLayoutChild(item.i);\n\n const nextSize: SceneGridItemPlacement = {\n x: item.x,\n y: item.y,\n width: item.w,\n height: item.h,\n };\n\n if (!isItemSizeEqual(child.state, nextSize)) {\n child.setState({\n ...nextSize,\n });\n }\n }\n\n this.setState({ children: sortChildrenByPosition(this.state.children) });\n };\n\n /**\n * Will also scan row children and return child of the row\n */\n public getSceneLayoutChild(key: string): SceneGridItemLike {\n for (const child of this.state.children) {\n if (child.state.key === key) {\n return child;\n }\n\n if (child instanceof SceneGridRow) {\n for (const rowChild of child.state.children) {\n if (rowChild.state.key === key) {\n return rowChild;\n }\n }\n }\n }\n\n throw new Error('Scene layout child not found for GridItem');\n }\n\n public onResizeStop: ReactGridLayout.ItemCallback = (_, o, n) => {\n const child = this.getSceneLayoutChild(n.i);\n child.setState({\n width: n.w,\n height: n.h,\n });\n };\n\n private pushChildDown(child: SceneGridItemLike, amount: number) {\n child.setState({\n y: child.state.y! + amount,\n });\n }\n\n /**\n * We assume the layout array is sorted according to y pos, and walk upwards until we find a row.\n * If it is collapsed there is no row to add it to. The default is then to return the SceneGridLayout itself\n */\n private findGridItemSceneParent(layout: ReactGridLayout.Layout[], startAt: number): SceneGridRow | SceneGridLayout {\n for (let i = startAt; i >= 0; i--) {\n const gridItem = layout[i];\n const sceneChild = this.getSceneLayoutChild(gridItem.i);\n\n if (sceneChild instanceof SceneGridRow) {\n // the closest row is collapsed return null\n if (sceneChild.state.isCollapsed) {\n return this;\n }\n\n return sceneChild;\n }\n }\n\n return this;\n }\n\n /**\n * Helper func to check if we are dropping a row in between panels of another row\n */\n private isRowDropValid(\n gridLayout: ReactGridLayout.Layout[],\n updatedItem: ReactGridLayout.Layout,\n indexOfUpdatedItem: number\n ): boolean {\n // if the row is dropped at the end of the dashboard grid layout, we accept this valid state\n if (gridLayout[gridLayout.length - 1].i === updatedItem.i) {\n return true;\n }\n\n // if the next child after the updated item is a scene grid row, then we are either at the top\n // of the dashboard, or between rows\n // if it's not a grid row, but it's parent is the layout, it means we are not in between a\n // rows children, so also valid state\n const nextSceneChild = this.getSceneLayoutChild(gridLayout[indexOfUpdatedItem + 1].i);\n if (nextSceneChild instanceof SceneGridRow) {\n return true;\n } else if (nextSceneChild.parent instanceof SceneGridLayout) {\n return true;\n }\n\n return false;\n }\n\n /**\n * This likely needs a slightly different approach. Where we clone or deactivate or and re-activate the moved child\n */\n public moveChildTo(child: SceneGridItemLike, target: SceneGridLayout | SceneGridRow) {\n const currentParent = child.parent!;\n let rootChildren = this.state.children;\n\n const newChild = child.clone({ key: child.state.key });\n\n // Remove from current parent row\n if (currentParent instanceof SceneGridRow) {\n const newRow = currentParent.clone();\n newRow.setState({\n children: newRow.state.children.filter((c) => c.state.key !== child.state.key),\n });\n\n // new children with new row\n rootChildren = rootChildren.map((c) => (c === currentParent ? newRow : c));\n\n // if target is also a row\n if (target instanceof SceneGridRow) {\n const targetRow = target.clone();\n targetRow.setState({ children: [...targetRow.state.children, newChild] });\n rootChildren = rootChildren.map((c) => (c === target ? targetRow : c));\n } else {\n // target is the main grid\n rootChildren = [...rootChildren, newChild];\n }\n } else {\n if (!(target instanceof SceneGridLayout)) {\n // current parent is the main grid remove it from there\n rootChildren = rootChildren.filter((c) => c.state.key !== child.state.key);\n // Clone the target row and add the child\n const targetRow = target.clone();\n targetRow.setState({ children: [...targetRow.state.children, newChild] });\n // Replace row with new row\n rootChildren = rootChildren.map((c) => (c === target ? targetRow : c));\n }\n }\n\n return rootChildren;\n }\n\n public onDragStart: ReactGridLayout.ItemCallback = (gridLayout) => {\n this._oldLayout = [...gridLayout];\n };\n\n public onDragStop: ReactGridLayout.ItemCallback = (gridLayout, o, updatedItem) => {\n const sceneChild = this.getSceneLayoutChild(updatedItem.i)!;\n\n // Need to resort the grid layout based on new position (needed to find the new parent)\n gridLayout = sortGridLayout(gridLayout);\n\n // Update the parent if the child if it has moved to a row or back to the grid\n const indexOfUpdatedItem = gridLayout.findIndex((item) => item.i === updatedItem.i);\n let newParent = this.findGridItemSceneParent(gridLayout, indexOfUpdatedItem - 1);\n let newChildren = this.state.children;\n\n // Update children positions if they have changed\n for (let i = 0; i < gridLayout.length; i++) {\n const gridItem = gridLayout[i];\n const child = this.getSceneLayoutChild(gridItem.i)!;\n const childSize = child.state;\n\n if (childSize?.x !== gridItem.x || childSize?.y !== gridItem.y) {\n child.setState({\n x: gridItem.x,\n y: gridItem.y,\n });\n }\n }\n\n // Dot not allow dragging into repeated row clone\n if (newParent instanceof SceneGridRow && isRepeatCloneOrChildOf(newParent)) {\n this._loadOldLayout = true;\n }\n\n // if the child is a row and we are moving it under an uncollapsed row, keep the scene grid layout as parent\n // and set the old layout flag if the state is invalid. We allow setting the children in an invalid state,\n // as the layout will be updated in onLayoutChange and avoid flickering\n if (sceneChild instanceof SceneGridRow && newParent instanceof SceneGridRow) {\n if (!this.isRowDropValid(gridLayout, updatedItem, indexOfUpdatedItem)) {\n this._loadOldLayout = true;\n }\n\n newParent = this;\n }\n\n if (newParent !== sceneChild.parent && !this._loadOldLayout) {\n newChildren = this.moveChildTo(sceneChild, newParent);\n }\n\n this.setState({ children: sortChildrenByPosition(newChildren) });\n this._skipOnLayoutChange = true;\n };\n\n private toGridCell(child: SceneGridItemLike): ReactGridLayout.Layout {\n const size = child.state;\n\n let x = Number.isFinite(Number(size.x)) ? Number(size.x) : 0;\n let y = Number.isFinite(Number(size.y)) ? Number(size.y) : 0;\n const w = Number.isFinite(Number(size.width)) ? Number(size.width) : DEFAULT_PANEL_SPAN;\n const h = Number.isFinite(Number(size.height)) ? Number(size.height) : DEFAULT_PANEL_SPAN;\n\n let isDraggable = child.state.isDraggable;\n let isResizable = child.state.isResizable;\n\n if (child instanceof SceneGridRow) {\n isDraggable = child.state.isCollapsed ? true : false;\n isResizable = false;\n }\n\n // If this is a repeated row, we should not allow dragging\n if (isRepeatCloneOrChildOf(child)) {\n isDraggable = false;\n isResizable = false;\n }\n\n return { i: child.state.key!, x, y, h, w, isResizable, isDraggable };\n }\n\n public buildGridLayout(width: number, height: number): ReactGridLayout.Layout[] {\n let cells: ReactGridLayout.Layout[] = [];\n\n for (const child of this.state.children) {\n cells.push(this.toGridCell(child));\n\n if (child instanceof SceneGridRow && !child.state.isCollapsed) {\n for (const rowChild of child.state.children) {\n cells.push(this.toGridCell(rowChild));\n }\n }\n }\n\n // Sort by position\n cells = sortGridLayout(cells);\n\n if (this.state.UNSAFE_fitPanels) {\n cells = fitPanelsInHeight(cells, height);\n }\n\n if (width < 768) {\n // We should not persist the mobile layout\n this._skipOnLayoutChange = true;\n return cells.map((cell) => ({ ...cell, w: 24 }));\n }\n\n this._skipOnLayoutChange = false;\n\n return cells;\n }\n}\n\nfunction isItemSizeEqual(a: SceneGridItemPlacement, b: SceneGridItemPlacement) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\nfunction sortChildrenByPosition(children: SceneGridItemLike[]) {\n children.forEach((child) => {\n if (child instanceof SceneGridRow) {\n child.setState({ children: sortChildrenByPosition(child.state.children) });\n }\n });\n\n return [...children].sort((a, b) => {\n return a.state.y! - b.state.y! || a.state.x! - b.state.x!;\n });\n}\n\nfunction sortGridLayout(layout: ReactGridLayout.Layout[]) {\n return [...layout].sort((a, b) => a.y - b.y || a.x! - b.x);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneGridLayout.js","sources":["../../../../../src/components/layout/grid/SceneGridLayout.tsx"],"sourcesContent":["import { PointerEvent } from 'react';\nimport ReactGridLayout from 'react-grid-layout';\n\nimport { t } from '@grafana/i18n';\n\nimport { StateCommittedEvent, StateCommittedPayload } from '../../../core/events';\nimport { SceneObjectBase } from '../../../core/SceneObjectBase';\nimport { SceneLayout, SceneObjectState } from '../../../core/types';\nimport { DEFAULT_PANEL_SPAN } from './constants';\nimport { isSceneGridRow } from './SceneGridItem';\nimport { SceneGridLayoutRenderer } from './SceneGridLayoutRenderer';\n\nimport { SceneGridRow } from './SceneGridRow';\nimport { SceneGridItemLike, SceneGridItemPlacement, SceneGridLayoutDragStartEvent } from './types';\nimport { fitPanelsInHeight } from './utils';\nimport { VizPanel } from '../../VizPanel/VizPanel';\nimport { isRepeatCloneOrChildOf } from '../../../utils/utils';\n\ninterface SceneGridLayoutState extends SceneObjectState {\n /**\n * Turn on or off dragging for all items. Individual items can still disabled via isDraggable property\n **/\n isDraggable?: boolean;\n /** Enable or disable item resizing */\n isResizable?: boolean;\n isLazy?: boolean;\n /**\n * Fit panels to height of the grid. This will scale down the panels vertically to fit available height.\n * The row height is not changed, only the y position and height of the panels.\n * UNSAFE: This feature is experimental and it might change in the future.\n */\n UNSAFE_fitPanels?: boolean;\n children: SceneGridItemLike[];\n}\n\nexport class SceneGridLayout extends SceneObjectBase<SceneGridLayoutState> implements SceneLayout {\n public static Component = SceneGridLayoutRenderer;\n\n private _skipOnLayoutChange = false;\n private _oldLayout: ReactGridLayout.Layout[] = [];\n private _loadOldLayout = false;\n\n public constructor(state: SceneGridLayoutState) {\n super({\n ...state,\n children: sortChildrenByPosition(state.children),\n });\n }\n\n /**\n * SceneLayout interface. Used for example by VizPanelRenderer\n */\n public isDraggable(): boolean {\n return this.state.isDraggable ?? false;\n }\n\n public getDragClass() {\n return `grid-drag-handle-${this.state.key}`;\n }\n\n public getDragClassCancel() {\n return `grid-drag-cancel`;\n }\n\n public getDragHooks() {\n if (!this.isDraggable()) {\n return {};\n }\n\n return {\n onDragStart: (evt: PointerEvent, panel: VizPanel) => {\n this.publishEvent(new SceneGridLayoutDragStartEvent({ evt, panel }), true);\n },\n };\n }\n\n public adjustYPositions(after: number, amount: number) {\n for (const child of this.state.children) {\n if (child.state.y! > after) {\n child.setState({ y: child.state.y! + amount });\n }\n if (child instanceof SceneGridRow) {\n for (const rowChild of child.state.children) {\n if (rowChild.state.y! > after) {\n rowChild.setState({ y: rowChild.state.y! + amount });\n }\n }\n }\n }\n }\n\n public toggleRow(row: SceneGridRow) {\n const isCollapsed = row.state.isCollapsed;\n\n if (!isCollapsed) {\n row.setState({ isCollapsed: true });\n // To force re-render\n this.setState({});\n return;\n }\n\n const rowChildren = row.state.children;\n\n if (rowChildren.length === 0) {\n row.setState({ isCollapsed: false });\n this.setState({});\n return;\n }\n\n // Ok we are expanding row. We need to update row children y pos (incase they are incorrect) and push items below down\n // Code copied from DashboardModel toggleRow()\n\n const rowY = row.state.y!;\n const firstPanelYPos = rowChildren[0].state.y ?? rowY;\n const yDiff = firstPanelYPos - (rowY + 1);\n\n // y max will represent the bottom y pos after all panels have been added\n // needed to know home much panels below should be pushed down\n let yMax = rowY;\n\n for (const panel of rowChildren) {\n // set the y gridPos if it wasn't already set\n const newSize = { ...panel.state };\n newSize.y = newSize.y ?? rowY;\n // make sure y is adjusted (in case row moved while collapsed)\n newSize.y -= yDiff;\n\n if (newSize.y! !== panel.state.y!) {\n panel.setState(newSize);\n }\n\n // update insert post and y max\n yMax = Math.max(yMax, Number(newSize.y!) + Number(newSize.height!));\n }\n\n const pushDownAmount = yMax - rowY - 1;\n\n // push panels below down\n for (const child of this.state.children) {\n if (child.state.y! > rowY) {\n this.pushChildDown(child, pushDownAmount);\n }\n\n if (isSceneGridRow(child) && child !== row) {\n for (const rowChild of child.state.children) {\n if (rowChild.state.y! > rowY) {\n this.pushChildDown(rowChild, pushDownAmount);\n }\n }\n }\n }\n\n row.setState({ isCollapsed: false });\n // Trigger re-render\n this.setState({});\n }\n\n public ignoreLayoutChange(shouldIgnore: boolean) {\n this._skipOnLayoutChange = shouldIgnore;\n }\n\n public onLayoutChange = (layout: ReactGridLayout.Layout[]) => {\n if (this._skipOnLayoutChange) {\n // Layout has been updated by other RTL handler already\n this._skipOnLayoutChange = false;\n return;\n }\n\n // We replace with the old layout only if the current state is invalid\n if (this._loadOldLayout) {\n layout = [...this._oldLayout];\n this._loadOldLayout = false;\n }\n\n this._applyLayout(layout);\n };\n\n private _applyLayout(layout: ReactGridLayout.Layout[]) {\n for (const item of layout) {\n const child = this.getSceneLayoutChild(item.i);\n\n const nextSize: SceneGridItemPlacement = {\n x: item.x,\n y: item.y,\n width: item.w,\n height: item.h,\n };\n\n if (!isItemSizeEqual(child.state, nextSize)) {\n child.setState({\n ...nextSize,\n });\n }\n }\n\n this.setState({ children: sortChildrenByPosition(this.state.children) });\n }\n\n private _captureLayout(layout: ReactGridLayout.Layout[]): ReactGridLayout.Layout[] {\n return layout.map((item) => {\n const { x, y, width, height } = this.getSceneLayoutChild(item.i).state;\n return { ...item, x: x!, y: y!, w: width!, h: height! };\n });\n }\n\n /**\n * Will also scan row children and return child of the row\n */\n public getSceneLayoutChild(key: string): SceneGridItemLike {\n for (const child of this.state.children) {\n if (child.state.key === key) {\n return child;\n }\n\n if (child instanceof SceneGridRow) {\n for (const rowChild of child.state.children) {\n if (rowChild.state.key === key) {\n return rowChild;\n }\n }\n }\n }\n\n throw new Error('Scene layout child not found for GridItem');\n }\n\n public onResizeStop: ReactGridLayout.ItemCallback = (layout) => {\n const from = this._captureLayout(layout);\n const hasChanges = layout.some(\n (item, i) => item.x !== from[i].x || item.y !== from[i].y || item.w !== from[i].w || item.h !== from[i].h\n );\n\n if (!hasChanges) {\n return;\n }\n\n this._commitState({\n source: this,\n description: t('grafana-scenes.components.layout.grid.scene-grid-layout.resize-panel', 'Resize panel'),\n replay: () => this._applyLayout(layout),\n revert: () => this._applyLayout(from),\n });\n\n this._skipOnLayoutChange = true;\n };\n\n private _commitState(payload: StateCommittedPayload) {\n payload.replay();\n this.publishEvent(new StateCommittedEvent(payload), true);\n }\n\n private pushChildDown(child: SceneGridItemLike, amount: number) {\n child.setState({\n y: child.state.y! + amount,\n });\n }\n\n /**\n * We assume the layout array is sorted according to y pos, and walk upwards until we find a row.\n * If it is collapsed there is no row to add it to. The default is then to return the SceneGridLayout itself\n */\n private findGridItemSceneParent(layout: ReactGridLayout.Layout[], startAt: number): SceneGridRow | SceneGridLayout {\n for (let i = startAt; i >= 0; i--) {\n const gridItem = layout[i];\n const sceneChild = this.getSceneLayoutChild(gridItem.i);\n\n if (sceneChild instanceof SceneGridRow) {\n // the closest row is collapsed return null\n if (sceneChild.state.isCollapsed) {\n return this;\n }\n\n return sceneChild;\n }\n }\n\n return this;\n }\n\n /**\n * Helper func to check if we are dropping a row in between panels of another row\n */\n private isRowDropValid(\n gridLayout: ReactGridLayout.Layout[],\n updatedItem: ReactGridLayout.Layout,\n indexOfUpdatedItem: number\n ): boolean {\n // if the row is dropped at the end of the dashboard grid layout, we accept this valid state\n if (gridLayout[gridLayout.length - 1].i === updatedItem.i) {\n return true;\n }\n\n // if the next child after the updated item is a scene grid row, then we are either at the top\n // of the dashboard, or between rows\n // if it's not a grid row, but it's parent is the layout, it means we are not in between a\n // rows children, so also valid state\n const nextSceneChild = this.getSceneLayoutChild(gridLayout[indexOfUpdatedItem + 1].i);\n if (nextSceneChild instanceof SceneGridRow) {\n return true;\n } else if (nextSceneChild.parent instanceof SceneGridLayout) {\n return true;\n }\n\n return false;\n }\n\n /**\n * This likely needs a slightly different approach. Where we clone or deactivate or and re-activate the moved child\n */\n public moveChildTo(child: SceneGridItemLike, target: SceneGridLayout | SceneGridRow) {\n const currentParent = child.parent!;\n let rootChildren = this.state.children;\n\n const newChild = child.clone({ key: child.state.key });\n\n // Remove from current parent row\n if (currentParent instanceof SceneGridRow) {\n const newRow = currentParent.clone();\n newRow.setState({\n children: newRow.state.children.filter((c) => c.state.key !== child.state.key),\n });\n\n // new children with new row\n rootChildren = rootChildren.map((c) => (c === currentParent ? newRow : c));\n\n // if target is also a row\n if (target instanceof SceneGridRow) {\n const targetRow = target.clone();\n targetRow.setState({ children: [...targetRow.state.children, newChild] });\n rootChildren = rootChildren.map((c) => (c === target ? targetRow : c));\n } else {\n // target is the main grid\n rootChildren = [...rootChildren, newChild];\n }\n } else {\n if (!(target instanceof SceneGridLayout)) {\n // current parent is the main grid remove it from there\n rootChildren = rootChildren.filter((c) => c.state.key !== child.state.key);\n // Clone the target row and add the child\n const targetRow = target.clone();\n targetRow.setState({ children: [...targetRow.state.children, newChild] });\n // Replace row with new row\n rootChildren = rootChildren.map((c) => (c === target ? targetRow : c));\n }\n }\n\n return rootChildren;\n }\n\n public onDragStart: ReactGridLayout.ItemCallback = (gridLayout) => {\n this._oldLayout = [...gridLayout];\n };\n\n public onDragStop: ReactGridLayout.ItemCallback = (gridLayout, o, updatedItem) => {\n const sceneChild = this.getSceneLayoutChild(updatedItem.i)!;\n\n // Need to resort the grid layout based on new position (needed to find the new parent)\n gridLayout = sortGridLayout(gridLayout);\n\n // Update the parent if the child if it has moved to a row or back to the grid\n const indexOfUpdatedItem = gridLayout.findIndex((item) => item.i === updatedItem.i);\n let newParent = this.findGridItemSceneParent(gridLayout, indexOfUpdatedItem - 1);\n\n // Collect position changes instead of applying them immediately, so we can capture a\n // consistent \"from\" snapshot before anything mutates (see _commitState).\n const positionChanges: PositionChange[] = [];\n for (let i = 0; i < gridLayout.length; i++) {\n const gridItem = gridLayout[i];\n const child = this.getSceneLayoutChild(gridItem.i)!;\n const childSize = child.state;\n\n if (childSize?.x !== gridItem.x || childSize?.y !== gridItem.y) {\n positionChanges.push({\n child,\n from: { x: childSize.x, y: childSize.y },\n to: { x: gridItem.x, y: gridItem.y },\n });\n }\n }\n\n // Dot not allow dragging into repeated row clone\n if (newParent instanceof SceneGridRow && isRepeatCloneOrChildOf(newParent)) {\n this._loadOldLayout = true;\n }\n\n // if the child is a row and we are moving it under an uncollapsed row, keep the scene grid layout as parent\n // and set the old layout flag if the state is invalid. We allow setting the children in an invalid state,\n // as the layout will be updated in onLayoutChange and avoid flickering\n if (sceneChild instanceof SceneGridRow && newParent instanceof SceneGridRow) {\n if (!this.isRowDropValid(gridLayout, updatedItem, indexOfUpdatedItem)) {\n this._loadOldLayout = true;\n }\n\n newParent = this;\n }\n\n const isReparenting = newParent !== sceneChild.parent && !this._loadOldLayout;\n const prevChildren = this.state.children;\n\n if (this._loadOldLayout) {\n positionChanges.forEach(({ child, to }) => child.setState(to));\n const nextChildren = isReparenting ? this.moveChildTo(sceneChild, newParent) : prevChildren;\n this.setState({ children: sortChildrenByPosition(nextChildren) });\n this._skipOnLayoutChange = true;\n return;\n }\n\n if (positionChanges.length === 0 && !isReparenting) {\n this._skipOnLayoutChange = true;\n return;\n }\n\n this._commitState({\n source: this,\n description: t('grafana-scenes.components.layout.grid.scene-grid-layout.move-panel', 'Move panel'),\n replay: () => {\n positionChanges.forEach(({ child, to }) => child.setState(to));\n const nextChildren = isReparenting ? this.moveChildTo(sceneChild, newParent) : prevChildren;\n this.setState({ children: sortChildrenByPosition(nextChildren) });\n },\n revert: () => {\n positionChanges.forEach(({ child, from }) => child.setState(from));\n this.setState({ children: sortChildrenByPosition(prevChildren) });\n },\n });\n\n this._skipOnLayoutChange = true;\n };\n\n private toGridCell(child: SceneGridItemLike): ReactGridLayout.Layout {\n const size = child.state;\n\n let x = Number.isFinite(Number(size.x)) ? Number(size.x) : 0;\n let y = Number.isFinite(Number(size.y)) ? Number(size.y) : 0;\n const w = Number.isFinite(Number(size.width)) ? Number(size.width) : DEFAULT_PANEL_SPAN;\n const h = Number.isFinite(Number(size.height)) ? Number(size.height) : DEFAULT_PANEL_SPAN;\n\n let isDraggable = child.state.isDraggable;\n let isResizable = child.state.isResizable;\n\n if (child instanceof SceneGridRow) {\n isDraggable = child.state.isCollapsed ? true : false;\n isResizable = false;\n }\n\n // If this is a repeated row, we should not allow dragging\n if (isRepeatCloneOrChildOf(child)) {\n isDraggable = false;\n isResizable = false;\n }\n\n return { i: child.state.key!, x, y, h, w, isResizable, isDraggable };\n }\n\n public buildGridLayout(width: number, height: number): ReactGridLayout.Layout[] {\n let cells: ReactGridLayout.Layout[] = [];\n\n for (const child of this.state.children) {\n cells.push(this.toGridCell(child));\n\n if (child instanceof SceneGridRow && !child.state.isCollapsed) {\n for (const rowChild of child.state.children) {\n cells.push(this.toGridCell(rowChild));\n }\n }\n }\n\n // Sort by position\n cells = sortGridLayout(cells);\n\n if (this.state.UNSAFE_fitPanels) {\n cells = fitPanelsInHeight(cells, height);\n }\n\n if (width < 768) {\n // We should not persist the mobile layout\n this._skipOnLayoutChange = true;\n return cells.map((cell) => ({ ...cell, w: 24 }));\n }\n\n this._skipOnLayoutChange = false;\n\n return cells;\n }\n}\n\nfunction isItemSizeEqual(a: SceneGridItemPlacement, b: SceneGridItemPlacement) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\nfunction sortChildrenByPosition(children: SceneGridItemLike[]) {\n children.forEach((child) => {\n if (child instanceof SceneGridRow) {\n child.setState({ children: sortChildrenByPosition(child.state.children) });\n }\n });\n\n return [...children].sort((a, b) => {\n return a.state.y! - b.state.y! || a.state.x! - b.state.x!;\n });\n}\n\nfunction sortGridLayout(layout: ReactGridLayout.Layout[]) {\n return [...layout].sort((a, b) => a.y - b.y || a.x! - b.x);\n}\n\ninterface PositionChange {\n child: SceneGridItemLike;\n from: SceneGridItemPlacement;\n to: SceneGridItemPlacement;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/core/events.js
CHANGED
|
@@ -3,9 +3,12 @@ import { BusEventWithPayload } from '@grafana/data';
|
|
|
3
3
|
class SceneObjectStateChangedEvent extends BusEventWithPayload {
|
|
4
4
|
}
|
|
5
5
|
SceneObjectStateChangedEvent.type = "scene-object-state-change";
|
|
6
|
+
class StateCommittedEvent extends BusEventWithPayload {
|
|
7
|
+
}
|
|
8
|
+
StateCommittedEvent.type = "scene-object-state-committed";
|
|
6
9
|
class UserActionEvent extends BusEventWithPayload {
|
|
7
10
|
}
|
|
8
11
|
UserActionEvent.type = "scene-object-user-action";
|
|
9
12
|
|
|
10
|
-
export { SceneObjectStateChangedEvent, UserActionEvent };
|
|
13
|
+
export { SceneObjectStateChangedEvent, StateCommittedEvent, UserActionEvent };
|
|
11
14
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sources":["../../../src/core/events.ts"],"sourcesContent":["import { BusEventWithPayload } from '@grafana/data';\n\nimport { SceneObject, SceneObjectState } from './types';\n\nexport interface SceneObjectStateChangedPayload<TState extends SceneObjectState = SceneObjectState> {\n prevState: TState;\n newState: TState;\n partialUpdate: Partial<TState>;\n changedObject: SceneObject<TState>;\n}\n\nexport class SceneObjectStateChangedEvent extends BusEventWithPayload<SceneObjectStateChangedPayload> {\n public static readonly type = 'scene-object-state-change';\n}\n\ntype UserActionEventType =\n | 'panel-description-shown'\n | 'panel-status-message-clicked'\n | 'panel-cancel-query-clicked'\n | 'panel-menu-shown';\n\ninterface UserActionEventPayload {\n origin: SceneObject;\n interaction: UserActionEventType;\n}\nexport class UserActionEvent extends BusEventWithPayload<UserActionEventPayload> {\n public static readonly type = 'scene-object-user-action';\n}\n"],"names":[],"mappings":";;AAWO,MAAM,qCAAqC,mBAAA,CAAoD;AAEtG;AAFa,4BAAA,CACY,IAAA,GAAO,2BAAA;AAazB,MAAM,wBAAwB,mBAAA,CAA4C;AAEjF;AAFa,eAAA,CACY,IAAA,GAAO,0BAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"events.js","sources":["../../../src/core/events.ts"],"sourcesContent":["import { BusEventWithPayload } from '@grafana/data';\n\nimport { SceneObject, SceneObjectState } from './types';\n\nexport interface SceneObjectStateChangedPayload<TState extends SceneObjectState = SceneObjectState> {\n prevState: TState;\n newState: TState;\n partialUpdate: Partial<TState>;\n changedObject: SceneObject<TState>;\n}\n\nexport class SceneObjectStateChangedEvent extends BusEventWithPayload<SceneObjectStateChangedPayload> {\n public static readonly type = 'scene-object-state-change';\n}\n\nexport interface StateCommittedPayload {\n source: SceneObject;\n description: string;\n replay: () => void;\n revert: () => void;\n}\n\n/**\n * Published by a SceneObject after it applies a discrete, user-driven change it wants to be\n * undoable after already committed to state\n */\nexport class StateCommittedEvent extends BusEventWithPayload<StateCommittedPayload> {\n public static readonly type = 'scene-object-state-committed';\n}\n\ntype UserActionEventType =\n | 'panel-description-shown'\n | 'panel-status-message-clicked'\n | 'panel-cancel-query-clicked'\n | 'panel-menu-shown';\n\ninterface UserActionEventPayload {\n origin: SceneObject;\n interaction: UserActionEventType;\n}\nexport class UserActionEvent extends BusEventWithPayload<UserActionEventPayload> {\n public static readonly type = 'scene-object-user-action';\n}\n"],"names":[],"mappings":";;AAWO,MAAM,qCAAqC,mBAAA,CAAoD;AAEtG;AAFa,4BAAA,CACY,IAAA,GAAO,2BAAA;AAczB,MAAM,4BAA4B,mBAAA,CAA2C;AAEpF;AAFa,mBAAA,CACY,IAAA,GAAO,8BAAA;AAazB,MAAM,wBAAwB,mBAAA,CAA4C;AAEjF;AAFa,eAAA,CACY,IAAA,GAAO,0BAAA;;;;"}
|
package/dist/esm/index.js
CHANGED
|
@@ -12,7 +12,7 @@ import { getVariableControlId, escapeURLDelimiters, escapeLabelValueInExactSelec
|
|
|
12
12
|
export { escapeUrlPipeDelimiters, getQueriesForVariables } from './variables/utils.js';
|
|
13
13
|
import { isSwitchVariable, isGroupByVariable, isTextBoxVariable, isQueryVariable, isIntervalVariable, isDataSourceVariable, isCustomVariable, isConstantVariable, isAdHocVariable } from './variables/variants/guards.js';
|
|
14
14
|
export { isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isSceneObject } from './core/types.js';
|
|
15
|
-
export { SceneObjectStateChangedEvent, UserActionEvent } from './core/events.js';
|
|
15
|
+
export { SceneObjectStateChangedEvent, StateCommittedEvent, UserActionEvent } from './core/events.js';
|
|
16
16
|
export { sceneGraph } from './core/sceneGraph/index.js';
|
|
17
17
|
export { getClosest } from './core/sceneGraph/utils.js';
|
|
18
18
|
import * as index from './behaviors/index.js';
|
|
@@ -33,6 +33,14 @@ var grafanaScenes = {
|
|
|
33
33
|
"group-by-key": "Group by {{keyLabel}}",
|
|
34
34
|
"remove-group-by-key": "Remove group by {{keyLabel}}"
|
|
35
35
|
},
|
|
36
|
+
layout: {
|
|
37
|
+
grid: {
|
|
38
|
+
"scene-grid-layout": {
|
|
39
|
+
"move-panel": "Move panel",
|
|
40
|
+
"resize-panel": "Resize panel"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
36
44
|
"nested-scene-renderer": {
|
|
37
45
|
"collapse-button-label": "Collapse scene",
|
|
38
46
|
"expand-button-label": "Expand scene",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grafana-scenes.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grafana-scenes.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|