@grafana/scenes 8.18.1 → 8.18.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
@@ -1,3 +1,15 @@
1
+ # v8.18.2 (Fri Sep 18 2026)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - Undo/redo support for scene objects [#1645](https://github.com/grafana/scenes/pull/1645) ([@ifrost](https://github.com/ifrost))
6
+
7
+ #### Authors: 1
8
+
9
+ - Piotr Jamróz ([@ifrost](https://github.com/ifrost))
10
+
11
+ ---
12
+
1
13
  # v8.18.1 (Fri Sep 18 2026)
2
14
 
3
15
  #### 🐛 Bug Fix
@@ -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
- for (const item of layout) {
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 = (_, o, n) => {
45
- const child = this.getSceneLayoutChild(n.i);
46
- child.setState({
47
- width: n.w,
48
- height: n.h
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
- let newChildren = this.state.children;
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
- child.setState({
66
- x: gridItem.x,
67
- y: gridItem.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
- if (newParent !== sceneChild.parent && !this._loadOldLayout) {
81
- newChildren = this.moveChildTo(sceneChild, newParent);
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.setState({ children: sortChildrenByPosition(newChildren) });
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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"}
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -35,6 +35,14 @@ var grafanaScenes = {
35
35
  "group-by-key": "Group by {{keyLabel}}",
36
36
  "remove-group-by-key": "Remove group by {{keyLabel}}"
37
37
  },
38
+ layout: {
39
+ grid: {
40
+ "scene-grid-layout": {
41
+ "move-panel": "Move panel",
42
+ "resize-panel": "Resize panel"
43
+ }
44
+ }
45
+ },
38
46
  "nested-scene-renderer": {
39
47
  "collapse-button-label": "Collapse scene",
40
48
  "expand-button-label": "Expand scene",
@@ -198,4 +206,4 @@ var grafanaScenes = {
198
206
  };
199
207
 
200
208
  exports.default = grafanaScenes;
201
- //# sourceMappingURL=grafana-scenes-Cb8bcz3V.js.map
209
+ //# sourceMappingURL=grafana-scenes-CvG6Ol5c.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grafana-scenes-Cb8bcz3V.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"grafana-scenes-CvG6Ol5c.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1789,6 +1789,19 @@ interface SceneObjectStateChangedPayload<TState extends SceneObjectState = Scene
1789
1789
  declare class SceneObjectStateChangedEvent extends BusEventWithPayload<SceneObjectStateChangedPayload> {
1790
1790
  static readonly type = "scene-object-state-change";
1791
1791
  }
1792
+ interface StateCommittedPayload {
1793
+ source: SceneObject;
1794
+ description: string;
1795
+ replay: () => void;
1796
+ revert: () => void;
1797
+ }
1798
+ /**
1799
+ * Published by a SceneObject after it applies a discrete, user-driven change it wants to be
1800
+ * undoable after already committed to state
1801
+ */
1802
+ declare class StateCommittedEvent extends BusEventWithPayload<StateCommittedPayload> {
1803
+ static readonly type = "scene-object-state-committed";
1804
+ }
1792
1805
  type UserActionEventType = 'panel-description-shown' | 'panel-status-message-clicked' | 'panel-cancel-query-clicked' | 'panel-menu-shown';
1793
1806
  interface UserActionEventPayload {
1794
1807
  origin: SceneObject;
@@ -3504,11 +3517,14 @@ declare class SceneGridLayout extends SceneObjectBase<SceneGridLayoutState> impl
3504
3517
  toggleRow(row: SceneGridRow): void;
3505
3518
  ignoreLayoutChange(shouldIgnore: boolean): void;
3506
3519
  onLayoutChange: (layout: ReactGridLayout.Layout[]) => void;
3520
+ private _applyLayout;
3521
+ private _captureLayout;
3507
3522
  /**
3508
3523
  * Will also scan row children and return child of the row
3509
3524
  */
3510
3525
  getSceneLayoutChild(key: string): SceneGridItemLike;
3511
3526
  onResizeStop: ReactGridLayout.ItemCallback;
3527
+ private _commitState;
3512
3528
  private pushChildDown;
3513
3529
  /**
3514
3530
  * We assume the layout array is sorted according to y pos, and walk upwards until we find a row.
@@ -4163,5 +4179,5 @@ declare const sceneUtils: {
4163
4179
 
4164
4180
 
4165
4181
 
4166
- export { AdHocFiltersComboboxRenderer, AdHocFiltersVariable, AdHocFiltersVariableController, ConstantVariable, ControlsLabel, CustomVariable, DataProviderProxy, DataSourceVariable, EmbeddedScene, FieldConfigBuilder, FieldConfigBuilders, FieldConfigOverridesBuilder, GRID_CELL_HEIGHT, GRID_COLUMN_COUNT, GROUP_BY_OPERATOR, GroupByVariable, IntervalVariable, LazyLoader, LocalValueVariable, MultiOrSingleValueSelect, MultiValueVariable, NestedScene, NewSceneObjectAddedEvent, OPERATORS, PATH_ID_SEPARATOR, PanelBuilders, PanelOptionsBuilders, QueryVariable, RuntimeDataSource, SafeSerializableSceneObject, SceneApp, SceneAppPage, SceneByFrameRepeater, SceneByVariableRepeater, SceneCSSGridItem, SceneCSSGridLayout, SceneCanvasText, SceneControlsSpacer, SceneDataLayerBase, SceneDataLayerControls, SceneDataLayerSet, SceneDataLayerSetBase, SceneDataNode, SceneDataTransformer, SceneDebugger, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridLayoutDragStartEvent, SceneGridRow, SceneObjectBase, SceneObjectRef, SceneObjectRemovedEvent, SceneObjectStateChangedEvent, SceneObjectUrlSyncConfig, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneTimePicker, SceneTimeRange, SceneTimeRangeCompare, SceneTimeRangeTransformerBase, SceneTimeZoneOverride, SceneToolbarButton, SceneToolbarInput, SceneVariableSet, SceneVariableValueChangedEvent, ScopesVariable, SplitLayout, SwitchVariable, TestVariable, TextBoxVariable, UrlSyncContextProvider, UrlSyncManager, UserActionEvent, VariableDependencyConfig, VariableValueControl, VariableValueSelectWrapper, VariableValueSelectors, VizConfigBuilder, VizConfigBuilders, VizPanel, VizPanelBuilder, VizPanelExploreButton, VizPanelFitScope, VizPanelMenu, index$2 as behaviors, index as dataLayers, escapeUrlPipeDelimiters, formatRegistry, getClosest, getCompareSeriesRefId, getExploreURL, getQueriesForVariables, isCustomVariableValue, isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isGroupByFilter, isSceneObject, isSystemTransformationsProvider, loadResources, index$1 as performanceUtils, registerQueryWithController, registerRuntimeDataSource, sceneGraph, sceneUtils, timeShiftAlignmentProcessor, useSceneApp, useSceneObjectState, useUrlSync, writePerformanceLog };
4167
- export type { AdHocFilterInteractionHandler, AdHocFilterWithLabels, AdHocFiltersController, AdHocFiltersControllerState, CancelActivationHandler, ControlSourceRef, ControlsLayout, CustomFormatterVariable, CustomTransformOperator, CustomTransformerDefinition, CustomVariableValue, DataLayerFilter, DataRequestEnricher, DataSourceControlRef, DeepPartial, EmbeddedSceneState, ExtraQueryDataProcessor, ExtraQueryDescriptor, ExtraQueryProvider, FiltersRequestEnricher, FormatVariable, InterpolationFormatParameter, LazyLoaderMode, MacroVariableConstructor, MultiValueVariableState, OperatorDefinition, QueryRunnerState, ResolvedSystemTransformations, SceneActivationHandler, SceneAppDrilldownView, SceneAppPageLike, SceneAppPageState, SceneAppRoute, SceneComponent, SceneComponentProps, SceneDataLayerProvider, SceneDataLayerProviderState, SceneDataProvider, SceneDataProviderResult, SceneDataQuery, SceneDataState, SceneDataTransformerState, SceneDeactivationHandler, SceneFlexItemLike, SceneFlexItemPlacement, SceneFlexItemState, SceneGridItemLike, SceneGridItemStateLike, SceneLayout, SceneLayoutChildOptions, SceneLayoutState, SceneObject, SceneObjectState, SceneObjectStateChangedPayload, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryControllerEntry, SceneQueryControllerEntryType, SceneQueryControllerLike, SceneRefreshPickerState, SceneRouteMatch, SceneStateChangedHandler, SceneStatelessBehavior, SceneTimeRangeLike, SceneTimeRangeState, SceneUrlSyncOptions, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSetState, SceneVariableState, SceneVariables, SystemTransformation, SystemTransformationPosition, SystemTransformationsProvider, TransformationOrigin, UrlSyncManagerLike, UseStateHookOptions, ValidateAndUpdateResult, VariableCustomFormatterFn, VariableGetOptionsArgs, VariableValue, VariableValueOption, VariableValueOptionProperties, VariableValueSingle, VizConfig, VizPanelFitScopeProps, VizPanelState };
4182
+ export { AdHocFiltersComboboxRenderer, AdHocFiltersVariable, AdHocFiltersVariableController, ConstantVariable, ControlsLabel, CustomVariable, DataProviderProxy, DataSourceVariable, EmbeddedScene, FieldConfigBuilder, FieldConfigBuilders, FieldConfigOverridesBuilder, GRID_CELL_HEIGHT, GRID_COLUMN_COUNT, GROUP_BY_OPERATOR, GroupByVariable, IntervalVariable, LazyLoader, LocalValueVariable, MultiOrSingleValueSelect, MultiValueVariable, NestedScene, NewSceneObjectAddedEvent, OPERATORS, PATH_ID_SEPARATOR, PanelBuilders, PanelOptionsBuilders, QueryVariable, RuntimeDataSource, SafeSerializableSceneObject, SceneApp, SceneAppPage, SceneByFrameRepeater, SceneByVariableRepeater, SceneCSSGridItem, SceneCSSGridLayout, SceneCanvasText, SceneControlsSpacer, SceneDataLayerBase, SceneDataLayerControls, SceneDataLayerSet, SceneDataLayerSetBase, SceneDataNode, SceneDataTransformer, SceneDebugger, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridLayoutDragStartEvent, SceneGridRow, SceneObjectBase, SceneObjectRef, SceneObjectRemovedEvent, SceneObjectStateChangedEvent, SceneObjectUrlSyncConfig, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneTimePicker, SceneTimeRange, SceneTimeRangeCompare, SceneTimeRangeTransformerBase, SceneTimeZoneOverride, SceneToolbarButton, SceneToolbarInput, SceneVariableSet, SceneVariableValueChangedEvent, ScopesVariable, SplitLayout, StateCommittedEvent, SwitchVariable, TestVariable, TextBoxVariable, UrlSyncContextProvider, UrlSyncManager, UserActionEvent, VariableDependencyConfig, VariableValueControl, VariableValueSelectWrapper, VariableValueSelectors, VizConfigBuilder, VizConfigBuilders, VizPanel, VizPanelBuilder, VizPanelExploreButton, VizPanelFitScope, VizPanelMenu, index$2 as behaviors, index as dataLayers, escapeUrlPipeDelimiters, formatRegistry, getClosest, getCompareSeriesRefId, getExploreURL, getQueriesForVariables, isCustomVariableValue, isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isGroupByFilter, isSceneObject, isSystemTransformationsProvider, loadResources, index$1 as performanceUtils, registerQueryWithController, registerRuntimeDataSource, sceneGraph, sceneUtils, timeShiftAlignmentProcessor, useSceneApp, useSceneObjectState, useUrlSync, writePerformanceLog };
4183
+ export type { AdHocFilterInteractionHandler, AdHocFilterWithLabels, AdHocFiltersController, AdHocFiltersControllerState, CancelActivationHandler, ControlSourceRef, ControlsLayout, CustomFormatterVariable, CustomTransformOperator, CustomTransformerDefinition, CustomVariableValue, DataLayerFilter, DataRequestEnricher, DataSourceControlRef, DeepPartial, EmbeddedSceneState, ExtraQueryDataProcessor, ExtraQueryDescriptor, ExtraQueryProvider, FiltersRequestEnricher, FormatVariable, InterpolationFormatParameter, LazyLoaderMode, MacroVariableConstructor, MultiValueVariableState, OperatorDefinition, QueryRunnerState, ResolvedSystemTransformations, SceneActivationHandler, SceneAppDrilldownView, SceneAppPageLike, SceneAppPageState, SceneAppRoute, SceneComponent, SceneComponentProps, SceneDataLayerProvider, SceneDataLayerProviderState, SceneDataProvider, SceneDataProviderResult, SceneDataQuery, SceneDataState, SceneDataTransformerState, SceneDeactivationHandler, SceneFlexItemLike, SceneFlexItemPlacement, SceneFlexItemState, SceneGridItemLike, SceneGridItemStateLike, SceneLayout, SceneLayoutChildOptions, SceneLayoutState, SceneObject, SceneObjectState, SceneObjectStateChangedPayload, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryControllerEntry, SceneQueryControllerEntryType, SceneQueryControllerLike, SceneRefreshPickerState, SceneRouteMatch, SceneStateChangedHandler, SceneStatelessBehavior, SceneTimeRangeLike, SceneTimeRangeState, SceneUrlSyncOptions, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSetState, SceneVariableState, SceneVariables, StateCommittedPayload, SystemTransformation, SystemTransformationPosition, SystemTransformationsProvider, TransformationOrigin, UrlSyncManagerLike, UseStateHookOptions, ValidateAndUpdateResult, VariableCustomFormatterFn, VariableGetOptionsArgs, VariableValue, VariableValueOption, VariableValueOptionProperties, VariableValueSingle, VizConfig, VizPanelFitScopeProps, VizPanelState };
package/dist/index.js CHANGED
@@ -133,6 +133,9 @@ function EmptyRenderer(_) {
133
133
  class SceneObjectStateChangedEvent extends data.BusEventWithPayload {
134
134
  }
135
135
  SceneObjectStateChangedEvent.type = "scene-object-state-change";
136
+ class StateCommittedEvent extends data.BusEventWithPayload {
137
+ }
138
+ StateCommittedEvent.type = "scene-object-state-committed";
136
139
  class UserActionEvent extends data.BusEventWithPayload {
137
140
  }
138
141
  UserActionEvent.type = "scene-object-user-action";
@@ -15946,28 +15949,23 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
15946
15949
  layout = [...this._oldLayout];
15947
15950
  this._loadOldLayout = false;
15948
15951
  }
15949
- for (const item of layout) {
15950
- const child = this.getSceneLayoutChild(item.i);
15951
- const nextSize = {
15952
- x: item.x,
15953
- y: item.y,
15954
- width: item.w,
15955
- height: item.h
15956
- };
15957
- if (!isItemSizeEqual(child.state, nextSize)) {
15958
- child.setState({
15959
- ...nextSize
15960
- });
15961
- }
15962
- }
15963
- this.setState({ children: sortChildrenByPosition(this.state.children) });
15952
+ this._applyLayout(layout);
15964
15953
  };
15965
- this.onResizeStop = (_, o, n) => {
15966
- const child = this.getSceneLayoutChild(n.i);
15967
- child.setState({
15968
- width: n.w,
15969
- height: n.h
15954
+ this.onResizeStop = (layout) => {
15955
+ const from = this._captureLayout(layout);
15956
+ const hasChanges = layout.some(
15957
+ (item, i) => item.x !== from[i].x || item.y !== from[i].y || item.w !== from[i].w || item.h !== from[i].h
15958
+ );
15959
+ if (!hasChanges) {
15960
+ return;
15961
+ }
15962
+ this._commitState({
15963
+ source: this,
15964
+ description: i18n.t("grafana-scenes.components.layout.grid.scene-grid-layout.resize-panel", "Resize panel"),
15965
+ replay: () => this._applyLayout(layout),
15966
+ revert: () => this._applyLayout(from)
15970
15967
  });
15968
+ this._skipOnLayoutChange = true;
15971
15969
  };
15972
15970
  this.onDragStart = (gridLayout) => {
15973
15971
  this._oldLayout = [...gridLayout];
@@ -15977,15 +15975,16 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
15977
15975
  gridLayout = sortGridLayout(gridLayout);
15978
15976
  const indexOfUpdatedItem = gridLayout.findIndex((item) => item.i === updatedItem.i);
15979
15977
  let newParent = this.findGridItemSceneParent(gridLayout, indexOfUpdatedItem - 1);
15980
- let newChildren = this.state.children;
15978
+ const positionChanges = [];
15981
15979
  for (let i = 0; i < gridLayout.length; i++) {
15982
15980
  const gridItem = gridLayout[i];
15983
15981
  const child = this.getSceneLayoutChild(gridItem.i);
15984
15982
  const childSize = child.state;
15985
15983
  if ((childSize == null ? void 0 : childSize.x) !== gridItem.x || (childSize == null ? void 0 : childSize.y) !== gridItem.y) {
15986
- child.setState({
15987
- x: gridItem.x,
15988
- y: gridItem.y
15984
+ positionChanges.push({
15985
+ child,
15986
+ from: { x: childSize.x, y: childSize.y },
15987
+ to: { x: gridItem.x, y: gridItem.y }
15989
15988
  });
15990
15989
  }
15991
15990
  }
@@ -15998,10 +15997,32 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
15998
15997
  }
15999
15998
  newParent = this;
16000
15999
  }
16001
- if (newParent !== sceneChild.parent && !this._loadOldLayout) {
16002
- newChildren = this.moveChildTo(sceneChild, newParent);
16000
+ const isReparenting = newParent !== sceneChild.parent && !this._loadOldLayout;
16001
+ const prevChildren = this.state.children;
16002
+ if (this._loadOldLayout) {
16003
+ positionChanges.forEach(({ child, to }) => child.setState(to));
16004
+ const nextChildren = isReparenting ? this.moveChildTo(sceneChild, newParent) : prevChildren;
16005
+ this.setState({ children: sortChildrenByPosition(nextChildren) });
16006
+ this._skipOnLayoutChange = true;
16007
+ return;
16008
+ }
16009
+ if (positionChanges.length === 0 && !isReparenting) {
16010
+ this._skipOnLayoutChange = true;
16011
+ return;
16003
16012
  }
16004
- this.setState({ children: sortChildrenByPosition(newChildren) });
16013
+ this._commitState({
16014
+ source: this,
16015
+ description: i18n.t("grafana-scenes.components.layout.grid.scene-grid-layout.move-panel", "Move panel"),
16016
+ replay: () => {
16017
+ positionChanges.forEach(({ child, to }) => child.setState(to));
16018
+ const nextChildren = isReparenting ? this.moveChildTo(sceneChild, newParent) : prevChildren;
16019
+ this.setState({ children: sortChildrenByPosition(nextChildren) });
16020
+ },
16021
+ revert: () => {
16022
+ positionChanges.forEach(({ child, from }) => child.setState(from));
16023
+ this.setState({ children: sortChildrenByPosition(prevChildren) });
16024
+ }
16025
+ });
16005
16026
  this._skipOnLayoutChange = true;
16006
16027
  };
16007
16028
  }
@@ -16088,6 +16109,29 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
16088
16109
  ignoreLayoutChange(shouldIgnore) {
16089
16110
  this._skipOnLayoutChange = shouldIgnore;
16090
16111
  }
16112
+ _applyLayout(layout) {
16113
+ for (const item of layout) {
16114
+ const child = this.getSceneLayoutChild(item.i);
16115
+ const nextSize = {
16116
+ x: item.x,
16117
+ y: item.y,
16118
+ width: item.w,
16119
+ height: item.h
16120
+ };
16121
+ if (!isItemSizeEqual(child.state, nextSize)) {
16122
+ child.setState({
16123
+ ...nextSize
16124
+ });
16125
+ }
16126
+ }
16127
+ this.setState({ children: sortChildrenByPosition(this.state.children) });
16128
+ }
16129
+ _captureLayout(layout) {
16130
+ return layout.map((item) => {
16131
+ const { x, y, width, height } = this.getSceneLayoutChild(item.i).state;
16132
+ return { ...item, x, y, w: width, h: height };
16133
+ });
16134
+ }
16091
16135
  /**
16092
16136
  * Will also scan row children and return child of the row
16093
16137
  */
@@ -16106,6 +16150,10 @@ const _SceneGridLayout = class _SceneGridLayout extends SceneObjectBase {
16106
16150
  }
16107
16151
  throw new Error("Scene layout child not found for GridItem");
16108
16152
  }
16153
+ _commitState(payload) {
16154
+ payload.replay();
16155
+ this.publishEvent(new StateCommittedEvent(payload), true);
16156
+ }
16109
16157
  pushChildDown(child, amount) {
16110
16158
  child.setState({
16111
16159
  y: child.state.y + amount
@@ -19135,7 +19183,7 @@ function __variableDynamicImportRuntime0__(path) {
19135
19183
  switch (path) {
19136
19184
  case '../locales/cs-CZ/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CI4Hd3Ir.js'); });
19137
19185
  case '../locales/de-DE/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-x4udT7z_.js'); });
19138
- case '../locales/en-US/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-Cb8bcz3V.js'); });
19186
+ case '../locales/en-US/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-CvG6Ol5c.js'); });
19139
19187
  case '../locales/es-ES/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-Drcb844D.js'); });
19140
19188
  case '../locales/fr-FR/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-34JjEvff.js'); });
19141
19189
  case '../locales/hu-HU/grafana-scenes.json': return Promise.resolve().then(function () { return require('./grafana-scenes-kXk-X6BX.js'); });
@@ -19265,6 +19313,7 @@ exports.SceneVariableSet = SceneVariableSet;
19265
19313
  exports.SceneVariableValueChangedEvent = SceneVariableValueChangedEvent;
19266
19314
  exports.ScopesVariable = ScopesVariable;
19267
19315
  exports.SplitLayout = SplitLayout;
19316
+ exports.StateCommittedEvent = StateCommittedEvent;
19268
19317
  exports.SwitchVariable = SwitchVariable;
19269
19318
  exports.TestVariable = TestVariable;
19270
19319
  exports.TextBoxVariable = TextBoxVariable;