fix(app): restore tabs without layout flicker

This commit is contained in:
Mohamed Boudra
2026-08-18 00:21:51 +02:00
parent ed8371d083
commit 2538dd1e7b
18 changed files with 86 additions and 59 deletions
@@ -58,7 +58,7 @@ function inFlightTurn(page: Page) {
async function openForkMenu(page: Page, trigger: ReturnType<Page["getByRole"]>): Promise<void> {
await trigger.click();
await expect(page.getByRole("button", { name: "Fork in a new tab" })).toBeVisible({
await expect(page.getByRole("menuitem", { name: "Fork in a new tab" })).toBeVisible({
timeout: 10_000,
});
}
@@ -80,7 +80,7 @@ export async function openMostRecentAssistantForkMenu(page: Page): Promise<void>
export async function forkMostRecentAssistantTurnToNewTab(page: Page): Promise<void> {
await openMostRecentAssistantForkMenu(page);
await page.getByRole("button", { name: "Fork in a new tab" }).click();
await page.getByRole("menuitem", { name: "Fork in a new tab" }).click();
}
export async function expectInFlightForkAvailable(page: Page): Promise<void> {
@@ -92,12 +92,12 @@ export async function expectInFlightForkAvailable(page: Page): Promise<void> {
export async function forkInFlightTurnToNewTab(page: Page): Promise<void> {
const trigger = inFlightTurn(page).getByRole("button", { name: "Fork chat" });
await openForkMenu(page, trigger);
await page.getByRole("button", { name: "Fork in a new tab" }).click();
await page.getByRole("menuitem", { name: "Fork in a new tab" }).click();
}
export async function forkMostRecentAssistantTurnToNewWorkspace(page: Page): Promise<void> {
await openMostRecentAssistantForkMenu(page);
await page.getByRole("button", { name: "Fork in a new workspace" }).click();
await page.getByRole("menuitem", { name: "Fork in a new workspace" }).click();
}
export async function expectChatHistoryAttachment(page: Page): Promise<void> {
@@ -1,6 +1,7 @@
import { expect, type Locator, type Page } from "@playwright/test";
import { openSettings } from "./app";
import { openSettingsSection } from "./settings";
import { runWorkspaceActionFromCommandCenter } from "./command-center-workspace-actions";
export function chatOutlineRail(page: Page): Locator {
return page.getByTestId("chat-outline-rail");
@@ -41,7 +42,7 @@ export async function clickChatOutlineRowEdge(page: Page, position: number): Pro
}
export async function splitCurrentPanelRight(page: Page): Promise<void> {
await page.getByRole("button", { name: "Split pane right" }).first().click();
await runWorkspaceActionFromCommandCenter(page, "Split pane right");
}
export async function disableChatOutlineFromAppearance(page: Page): Promise<void> {
@@ -64,3 +64,12 @@ export async function createTerminalFromCommandCenter(page: Page, panel: Locator
await page.keyboard.press("Enter");
await expectTerminalTabOpen(page);
}
export async function runWorkspaceActionFromCommandCenter(
page: Page,
title: string,
): Promise<void> {
const panel = await openCommandCenter(page);
await panel.getByTestId("command-center-input").fill(title);
await action(panel, title).click();
}
+1 -1
View File
@@ -82,7 +82,7 @@ export async function openAttachmentMenu(page: Page): Promise<void> {
export async function expectAttachmentSheetRowsOnTitleRail(page: Page): Promise<void> {
const title = page.getByText("Add attachment", { exact: true });
const firstItemGlyph = page
.getByRole("button", { name: "Add image", exact: true })
.getByRole("menuitem", { name: "Add image", exact: true })
.locator("svg")
.first();
await waitForSettledPosition(title);
+2 -2
View File
@@ -177,7 +177,7 @@ export async function renameHostFromSettings(page: Page, name: string): Promise<
export async function chooseHostColor(page: Page, colorName: string): Promise<void> {
await page.getByRole("button", { name: /^Color, / }).click();
await page.getByRole("button", { name: colorName, exact: true }).click();
await page.getByRole("menuitem", { name: colorName, exact: true }).click();
await expect(page.getByRole("button", { name: `Color, ${colorName}` })).toBeVisible();
}
@@ -186,7 +186,7 @@ export async function chooseHostBadgeDisplay(
option: "Name" | "Icon only" | "Hidden",
): Promise<void> {
await page.getByTestId("host-appearance-badge-display").click();
await page.getByRole("button", { name: option, exact: true }).click();
await page.getByRole("menuitem", { name: option, exact: true }).click();
await expect(page.getByRole("button", { name: `Sidebar badge, ${option}` })).toBeVisible();
}
@@ -239,7 +239,7 @@ export async function removeProjectScript(page: Page, scriptName: string): Promi
const id = (await row.getAttribute("data-testid"))!.replace("script-row-", "");
await page.getByTestId(`script-row-menu-${id}`).click();
page.once("dialog", (dialog) => void dialog.accept());
await page.getByRole("button", { name: "Remove" }).click();
await page.getByRole("menuitem", { name: "Remove" }).click();
}
// --- File manipulation ---
+5 -5
View File
@@ -77,9 +77,9 @@ export async function expectWorkspaceContextMenuActions(
): Promise<void> {
const workspaceKey = `${getServerId()}:${workspaceId}`;
const menu = page.getByTestId(`sidebar-workspace-context-menu-${workspaceKey}`);
await expect(menu.getByRole("button", { name: "Copy path" })).toBeVisible();
await expect(menu.getByRole("button", { name: "Rename workspace" })).toBeVisible();
await expect(menu.getByRole("button", { name: "Archive" })).toBeVisible();
await expect(menu.getByRole("menuitem", { name: "Copy path" })).toBeVisible();
await expect(menu.getByRole("menuitem", { name: "Rename workspace" })).toBeVisible();
await expect(menu.getByRole("menuitem", { name: "Archive" })).toBeVisible();
}
export async function openProjectContextMenu(page: Page, projectViewKey: string): Promise<void> {
@@ -101,8 +101,8 @@ export async function expectProjectContextMenuActions(
projectViewKey: string,
): Promise<void> {
const menu = page.getByTestId(`sidebar-project-context-menu-${projectViewKey}`);
await expect(menu.getByRole("button", { name: "Open project settings" })).toBeVisible();
await expect(menu.getByRole("button", { name: "Remove project" })).toBeVisible();
await expect(menu.getByRole("menuitem", { name: "Open project settings" })).toBeVisible();
await expect(menu.getByRole("menuitem", { name: "Remove project" })).toBeVisible();
}
export async function selectWorkspaceInSidebar(page: Page, workspaceId: string): Promise<void> {