Skip to content

Commit 869814e

Browse files
authored
DashboardScene: Fix empty row repeat issue (#86095)
1 parent f85470d commit 869814e

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

public/app/features/dashboard-scene/scene/RowRepeaterBehavior.test.tsx

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,30 @@ describe('RowRepeaterBehavior', () => {
7474
expect(grid.state.children.length).toBe(4);
7575
});
7676
});
77+
78+
describe('Given scene empty row', () => {
79+
let scene: EmbeddedScene;
80+
let grid: SceneGridLayout;
81+
let repeatBehavior: RowRepeaterBehavior;
82+
83+
beforeEach(async () => {
84+
({ scene, grid, repeatBehavior } = buildScene({ variableQueryTime: 0 }));
85+
86+
repeatBehavior.setState({ sources: [] });
87+
activateFullSceneTree(scene);
88+
await new Promise((r) => setTimeout(r, 1));
89+
});
90+
91+
it('Should repeat row', () => {
92+
// Verify that panel above row remains
93+
expect(grid.state.children[0]).toBeInstanceOf(SceneGridItem);
94+
// Verify that first row still has repeat behavior
95+
const row1 = grid.state.children[1] as SceneGridRow;
96+
const row2 = grid.state.children[2] as SceneGridRow;
97+
expect(row1.state.y).toBe(10);
98+
expect(row2.state.y).toBe(11);
99+
});
100+
});
77101
});
78102

79103
interface SceneOptions {
@@ -84,6 +108,22 @@ interface SceneOptions {
84108
}
85109

86110
function buildScene(options: SceneOptions) {
111+
const repeatBehavior = new RowRepeaterBehavior({
112+
variableName: 'server',
113+
sources: [
114+
new SceneGridItem({
115+
x: 0,
116+
y: 11,
117+
width: 24,
118+
height: 5,
119+
body: new SceneCanvasText({
120+
key: 'canvas-1',
121+
text: 'Panel inside repeated row, server = $server',
122+
}),
123+
}),
124+
],
125+
});
126+
87127
const grid = new SceneGridLayout({
88128
children: [
89129
new SceneGridItem({
@@ -100,23 +140,7 @@ function buildScene(options: SceneOptions) {
100140
y: 10,
101141
width: 24,
102142
height: 1,
103-
$behaviors: [
104-
new RowRepeaterBehavior({
105-
variableName: 'server',
106-
sources: [
107-
new SceneGridItem({
108-
x: 0,
109-
y: 11,
110-
width: 24,
111-
height: 5,
112-
body: new SceneCanvasText({
113-
key: 'canvas-1',
114-
text: 'Panel inside repeated row, server = $server',
115-
}),
116-
}),
117-
],
118-
}),
119-
],
143+
$behaviors: [repeatBehavior],
120144
}),
121145
new SceneGridRow({
122146
x: 0,
@@ -173,5 +197,5 @@ function buildScene(options: SceneOptions) {
173197
body: grid,
174198
});
175199

176-
return { scene, grid };
200+
return { scene, grid, repeatBehavior };
177201
}

public/app/features/dashboard-scene/scene/RowRepeaterBehavior.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ function getRowContentHeight(panels: SceneGridItemLike[]): number {
151151
let maxY = 0;
152152
let minY = Number.MAX_VALUE;
153153

154+
if (panels.length === 0) {
155+
return 0;
156+
}
157+
154158
for (const panel of panels) {
155159
if (panel.state.y! + panel.state.height! > maxY) {
156160
maxY = panel.state.y! + panel.state.height!;

0 commit comments

Comments
 (0)