@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 +12 -0
- 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 +77 -28
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -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-
|
|
209
|
+
//# sourceMappingURL=grafana-scenes-CvG6Ol5c.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grafana-scenes-
|
|
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
|
-
|
|
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 = (
|
|
15966
|
-
const
|
|
15967
|
-
|
|
15968
|
-
|
|
15969
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15987
|
-
|
|
15988
|
-
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
|
-
|
|
16002
|
-
|
|
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.
|
|
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-
|
|
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;
|