diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c801c4b8..e0cd8ba6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,11 +68,17 @@ jobs: docker exec ${{ steps.postgres.outputs.container }} \ psql -U dispatch -d postgres -c "CREATE DATABASE dispatch_ci;" + - name: Pick E2E port + id: e2e + run: | + PORT=$((RANDOM % 10000 + 20000)) + echo "port=$PORT" >> "$GITHUB_OUTPUT" + - name: E2E tests run: npx playwright test env: CI: "true" - E2E_PORT: "8799" + E2E_PORT: "${{ steps.e2e.outputs.port }}" DATABASE_URL: postgres://dispatch:dispatch@127.0.0.1:${{ steps.postgres.outputs.port }}/dispatch_ci - name: Upload Playwright report diff --git a/e2e/settings.spec.ts b/e2e/settings.spec.ts index 7cb42d2d..19c3d066 100644 --- a/e2e/settings.spec.ts +++ b/e2e/settings.spec.ts @@ -10,12 +10,13 @@ test.describe("Settings pane", () => { // Settings overlay should appear with a "Settings" heading and "Release" nav item await expect(page.getByText("Settings").first()).toBeVisible({ timeout: 3_000 }); - await expect(page.getByText("Release", { exact: true })).toBeVisible(); + const releaseNav = page.getByRole("navigation").getByText("Release"); + await expect(releaseNav).toBeVisible(); // Close it via the X button (sr-only "Close") await page.getByRole("button", { name: "Close" }).click(); // The Release nav item should no longer be visible (pane is closed) - await expect(page.getByText("Release", { exact: true })).not.toBeVisible({ timeout: 3_000 }); + await expect(releaseNav).not.toBeVisible({ timeout: 3_000 }); }); }); diff --git a/web/src/App.tsx b/web/src/App.tsx index eab943a1..30e0593f 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1429,12 +1429,12 @@ export function App(): JSX.Element { agents={agents} selectedAgentId={selectedAgentId} overflowAgentId={overflowAgentId} - onOpenCreateDialog={openCreateDialog} - onOpenEditWorktreeDialog={openEditWorktreeDialog} - onOpenSettings={() => setSettingsPaneOpen(true)} + onOpenCreateDialog={() => { setMobileLeftOpen(false); openCreateDialog(); }} + onOpenEditWorktreeDialog={(agent) => { setMobileLeftOpen(false); openEditWorktreeDialog(agent); }} + onOpenSettings={() => { setMobileLeftOpen(false); setSettingsPaneOpen(true); }} setOverflowAgentId={setOverflowAgentId} setDeleteTarget={setDeleteTarget} - setDeleteConfirmOpen={setDeleteConfirmOpen} + setDeleteConfirmOpen={(open) => { if (open) setMobileLeftOpen(false); setDeleteConfirmOpen(open); }} agentVisualState={agentVisualState} borderForAgentState={borderForAgentState} toggleAgentDetails={toggleAgentDetails} diff --git a/web/src/components/app/release-manager.tsx b/web/src/components/app/release-manager.tsx index 917e270b..75cb00c8 100644 --- a/web/src/components/app/release-manager.tsx +++ b/web/src/components/app/release-manager.tsx @@ -249,9 +249,9 @@ export function ReleaseManager(): JSX.Element { const phaseIndex = job ? PHASES_ORDER.indexOf(job.phase) : -1; return ( -