fix(ui): keep the empty side panel closed (#126047)

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
This commit is contained in:
ClawSweeper
2026-08-18 15:11:24 -07:00
committed by GitHub
parent 20b6a04036
commit cd0cdfd521
2 changed files with 58 additions and 1 deletions
@@ -3,6 +3,7 @@ import type { Page } from "playwright";
import { expect, it } from "vitest";
import { waitForControlUiGatewayReady } from "../test-helpers/control-ui-e2e-readiness.ts";
import {
controlUiBundledSettingsStorageKey,
installMockGateway,
type ControlUiMockGatewayScenario,
} from "../test-helpers/control-ui-e2e.ts";
@@ -13,6 +14,8 @@ const suite = createControlUiE2eSuite({
startServerBeforeBrowser: true,
});
const HIDDEN_BOARD_SESSION_KEY = "agent:main:hidden-board-slot";
const ONE_PIXEL_PNG = Buffer.from(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wl2nPcAAAAASUVORK5CYII=",
"base64",
@@ -232,6 +235,38 @@ async function openColdSidebar(page: Page, scenario = coldOpenScenario()) {
return choices;
}
async function seedHiddenBoardSlot(page: Page) {
const settingsKey = controlUiBundledSettingsStorageKey(suite.server.baseUrl);
await page.addInitScript(
({ key, sessionKey }) => {
localStorage.setItem(
key,
JSON.stringify({
sessionKey,
sidebarSessionLayouts: {
[sessionKey]: {
columns: [
{
id: "side-panel-column",
side: "right",
panels: [{ id: "chat", slot: "chat" }],
activePanelId: "chat",
height: 360,
width: 480,
},
],
dock: "right",
open: true,
expanded: false,
},
},
}),
);
},
{ key: settingsKey, sessionKey: HIDDEN_BOARD_SESSION_KEY },
);
}
async function readColdOpenOutcome(page: Page): Promise<ColdOpenOutcome> {
const activePanel = page.locator(".side-panel__panel:not([hidden])");
await activePanel.waitFor();
@@ -280,6 +315,29 @@ async function readSlotColdOpenOutcome(
}
suite.define(() => {
it("closes a projected-empty side panel when a hidden board tab remains persisted", async () => {
const context = await suite.newBrowserContext({ serviceWorkers: "block" });
try {
const page = await context.newPage();
await seedHiddenBoardSlot(page);
await installMockGateway(page, {
...coldOpenScenario(),
sessionKey: HIDDEN_BOARD_SESSION_KEY,
});
await page.goto(`${suite.server.baseUrl}chat`);
await waitForControlUiGatewayReady(page);
const panel = page.locator(".sidebar-region__right-runtime .side-panel");
await panel.locator(".side-panel-empty--selector").waitFor();
expect(await panel.locator("wa-tab").count()).toBe(0);
await panel.getByRole("button", { name: "Close", exact: true }).click();
await expect.poll(() => panel.count()).toBe(0);
} finally {
await suite.closeBrowserContext(context);
}
});
it("preserves the production header-action shapes for Side chat and Discussion", async () => {
const context = await suite.newBrowserContext({ serviceWorkers: "block" });
const page = await context.newPage();
-1
View File
@@ -121,7 +121,6 @@ export function closeSlot(layout: SidebarLayout, slot: SidebarSlotId): SidebarLa
.find((entry) => entry.slot === slot);
if (panel) {
removePanel(next, panel.id);
next.open = true;
}
return next;
}