CI / changes (push) Successful in 6m6s
Docker / setup (push) Successful in 14s
Docker / publish (push) Skipped
Docker / build (push) Failing after 10m1s
CI / relay-tests (push) Canceled after 0s
CI / lint (push) Canceled after 0s
CI / typecheck (push) Canceled after 0s
CI / server-tests (ubuntu-latest) (push) Canceled after 0s
CI / server-tests (windows-latest) (push) Canceled after 0s
CI / desktop-tests (ubuntu-latest) (push) Canceled after 0s
CI / desktop-tests (windows-latest) (push) Canceled after 0s
CI / app-tests (push) Canceled after 0s
CI / sdk-tests (push) Canceled after 0s
CI / playwright (shard 1/4) (push) Canceled after 0s
CI / playwright (shard 2/4) (push) Canceled after 0s
CI / playwright (shard 3/4) (push) Canceled after 0s
CI / playwright (shard 4/4) (push) Canceled after 0s
CI / format (push) Canceled after 0s
CI / cli-tests (shard 1/3) (push) Canceled after 0s
CI / cli-tests (shard 2/3) (push) Canceled after 0s
CI / cli-tests (shard 3/3) (push) Canceled after 0s
* fix(app): keep file navigation in place Retargeting a File tab allocated a new tab identity, causing the tab track to unmount and remount during navigation. Preserve the identity for File-to-File changes while retaining new instances for cross-kind replacements. * feat(app): expand workspace panel actions Keep the Command Center aligned with workspace tab and pane primitives. Add explicit panel placement, focused open behavior, keyboard navigation for empty panes, and a Changes pill that toggles the visible Side panel without closing its tab.
80 lines
3.0 KiB
TypeScript
80 lines
3.0 KiB
TypeScript
import { expect, type Locator, type Page } from "@playwright/test";
|
|
import { test } from "../support/fixtures";
|
|
import { runWorkspaceActionFromCommandCenter } from "../support/helpers/command-center-workspace-actions";
|
|
import { gotoWorkspace } from "../support/helpers/launcher";
|
|
import { seedWorkspace } from "../support/helpers/seed-client";
|
|
import { waitForWorkspaceTabsVisible } from "../support/helpers/workspace-tabs";
|
|
|
|
function visibleEmptyPane(page: Page): Locator {
|
|
return page.getByTestId("workspace-pane-empty-state").filter({ visible: true });
|
|
}
|
|
|
|
async function expectLauncherSelection(launcher: Locator, name: string): Promise<void> {
|
|
await expect(launcher.getByRole("button", { name })).toBeFocused();
|
|
}
|
|
|
|
async function openSidePanelWithKeyboard(page: Page): Promise<Locator> {
|
|
const modifier = process.platform === "darwin" ? "Meta" : "Control";
|
|
await page.keyboard.press(`${modifier}+E`);
|
|
const launcher = page
|
|
.getByTestId("workspace-side-panel")
|
|
.filter({ visible: true })
|
|
.getByTestId("workspace-pane-empty-state");
|
|
await expect(launcher).toBeVisible({ timeout: 30_000 });
|
|
return launcher;
|
|
}
|
|
|
|
test.describe("Empty pane keyboard launcher", () => {
|
|
test("Cmd+E focuses the launcher and Enter opens the selected view", async ({ page }) => {
|
|
const workspace = await seedWorkspace({ repoPrefix: "empty-pane-side-panel-keyboard-" });
|
|
|
|
try {
|
|
await gotoWorkspace(page, workspace.workspaceId);
|
|
await waitForWorkspaceTabsVisible(page);
|
|
|
|
const launcher = await openSidePanelWithKeyboard(page);
|
|
await expectLauncherSelection(launcher, "Changes");
|
|
|
|
await page.keyboard.press("ArrowDown");
|
|
await expectLauncherSelection(launcher, "Files");
|
|
await page.keyboard.press("Enter");
|
|
|
|
await expect(
|
|
page
|
|
.getByTestId("workspace-side-panel")
|
|
.filter({ visible: true })
|
|
.getByTestId("workspace-tab-files"),
|
|
).toBeVisible({ timeout: 30_000 });
|
|
} finally {
|
|
await workspace.cleanup();
|
|
}
|
|
});
|
|
|
|
test("a new split pane focuses its launcher and wraps arrow navigation", async ({ page }) => {
|
|
const workspace = await seedWorkspace({ repoPrefix: "empty-pane-split-keyboard-" });
|
|
|
|
try {
|
|
await gotoWorkspace(page, workspace.workspaceId);
|
|
await waitForWorkspaceTabsVisible(page);
|
|
await runWorkspaceActionFromCommandCenter(page, "Split pane right");
|
|
|
|
const launcher = visibleEmptyPane(page);
|
|
await expect(launcher).toBeVisible({ timeout: 30_000 });
|
|
await expectLauncherSelection(launcher, "Changes");
|
|
|
|
await page.keyboard.press("ArrowUp");
|
|
await expectLauncherSelection(launcher, "Terminal");
|
|
await page.keyboard.press("ArrowDown");
|
|
await expectLauncherSelection(launcher, "Changes");
|
|
await page.keyboard.press("ArrowDown");
|
|
await page.keyboard.press("Enter");
|
|
|
|
await expect(page.getByTestId("workspace-tab-files").filter({ visible: true })).toBeVisible({
|
|
timeout: 30_000,
|
|
});
|
|
} finally {
|
|
await workspace.cleanup();
|
|
}
|
|
});
|
|
});
|