fix(ui): unify Session navigation and restore uniform tab borders
This commit is contained in:
@@ -409,7 +409,7 @@ test("context panels stay inside the manager and the Tables grid sits in a sideb
|
||||
|
||||
await page.goto(stack.publicUrl);
|
||||
await signInAsAdmin(page);
|
||||
await expectCurrentNavigation(page, "New session");
|
||||
await expectCurrentNavigation(page, "Session");
|
||||
await expectSelectedSessionScopeTab(page, "My sessions");
|
||||
await page.getByRole("tab", { name: "All sessions", exact: true }).click();
|
||||
await expectSelectedSessionScopeTab(page, "All sessions");
|
||||
@@ -808,7 +808,7 @@ test("Workspace and Pi management share the centered work-area panel without cov
|
||||
.getByRole("button", { name: "Close Pi management" })
|
||||
.click();
|
||||
await expect(piTrigger).toBeFocused();
|
||||
await expectCurrentNavigation(page, "New session");
|
||||
await expectCurrentNavigation(page, "Session");
|
||||
}
|
||||
|
||||
await page.setViewportSize({ width: 720, height: 800 });
|
||||
|
||||
@@ -39,7 +39,7 @@ test("F1 loop: new question → F1 widget → respond", async ({ page }) => {
|
||||
await signInLocally(page);
|
||||
|
||||
// Focus the composer for a new session.
|
||||
await page.getByRole("button", { name: "New session", exact: true }).click();
|
||||
await page.getByRole("button", { name: "Session", exact: true }).click();
|
||||
|
||||
// Fill in the question.
|
||||
await page.getByLabel("New question").fill("quante cardioversioni nel 2024");
|
||||
|
||||
@@ -135,7 +135,7 @@ for (const width of [390, 1280]) {
|
||||
expect(Math.abs(modelBox!.y - doneBox!.y)).toBeLessThan(1);
|
||||
expect(doneBox!.x).toBeGreaterThan(modelBox!.x + modelBox!.width);
|
||||
for (const name of ["My sessions", "All sessions"]) {
|
||||
await expect(page.getByRole("tab", { name, exact: true })).toHaveCSS("border-bottom-width", "0px");
|
||||
await expect(page.getByRole("tab", { name, exact: true })).toHaveCSS("border-bottom-width", "1px");
|
||||
}
|
||||
}
|
||||
expect(await inspect(page)).toEqual({ overflow: 0, serif: [], tiny: [] });
|
||||
@@ -162,6 +162,42 @@ for (const width of [390, 1280]) {
|
||||
});
|
||||
}
|
||||
|
||||
test("session tabs have padded labels and matching one-pixel borders on every side", async ({ page }, testInfo) => {
|
||||
await page.setViewportSize({ width: 1280, height: 1000 });
|
||||
await fixtures(page);
|
||||
await page.goto("/?thoth_route=administration%2Fdatabase");
|
||||
const header = page.locator(".thot-full-header");
|
||||
for (const locale of ["en", "it"]) {
|
||||
await header.getByRole("combobox").selectOption(locale);
|
||||
await expect(page.getByRole("button", { name: locale === "it" ? "Sessione" : "Session", exact: true })).toHaveCount(1);
|
||||
await expect(page.getByRole("button", { name: /^(New session|Return to session|Nuova sessione|Torna alla sessione)$/ })).toHaveCount(0);
|
||||
const tabs = page.locator('[role="tablist"]').getByRole("tab");
|
||||
for (const theme of ["light", "dark"]) {
|
||||
if (theme === "dark") await header.getByRole("button", { name: locale === "it" ? "Usa il tema scuro" : "Use dark theme", exact: true }).click();
|
||||
for (const selected of [0, 1]) {
|
||||
await tabs.nth(selected).click();
|
||||
await expect(tabs.nth(selected)).toHaveAttribute("aria-selected", "true");
|
||||
for (const tab of await tabs.all()) {
|
||||
await expect(tab).toHaveCSS("border-bottom-width", "1px");
|
||||
const borders = await tab.evaluate(el => {
|
||||
const css = getComputedStyle(el);
|
||||
return { widths: [css.borderTopWidth, css.borderRightWidth, css.borderBottomWidth, css.borderLeftWidth],
|
||||
colors: [css.borderTopColor, css.borderRightColor, css.borderBottomColor, css.borderLeftColor],
|
||||
paddingX: css.paddingLeft, paddingY: css.paddingTop,
|
||||
fits: el.scrollHeight <= el.clientHeight };
|
||||
});
|
||||
expect(borders.widths).toEqual(["1px", "1px", "1px", "1px"]);
|
||||
expect(new Set(borders.colors).size).toBe(1);
|
||||
expect(borders).toMatchObject({ paddingX: "11px", paddingY: "3px", fits: true });
|
||||
}
|
||||
}
|
||||
await page.mouse.move(0, 0);
|
||||
await page.screenshot({ path: testInfo.outputPath(`session-tabs-${locale}-${theme}.png`), animations: "disabled" });
|
||||
if (theme === "dark") await header.getByRole("button", { name: locale === "it" ? "Usa il tema chiaro" : "Use light theme", exact: true }).click();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
for (const locale of ["en", "it"]) {
|
||||
test(`login keeps only the main title in ${locale}`, async ({ page }, testInfo) => {
|
||||
await fixtures(page);
|
||||
@@ -202,7 +238,7 @@ for (const route of ["/", "/?thoth_route=administration%2Fdatabase"]) {
|
||||
await page.goto(route);
|
||||
if (route !== "/") {
|
||||
await navigation(page);
|
||||
await page.getByRole("button", { name: "Return to session", exact: true }).click();
|
||||
await page.getByRole("button", { name: "Session", exact: true }).click();
|
||||
}
|
||||
const prompt = page.getByRole("textbox", { name: "New question", exact: true });
|
||||
await expect(prompt).toBeVisible();
|
||||
@@ -234,14 +270,14 @@ for (const route of ["/", "/?thoth_route=administration%2Fdatabase"]) {
|
||||
expect(await prompt.evaluate(el => el.scrollHeight > el.clientHeight)).toBe(true);
|
||||
await admin(page, "Database");
|
||||
await navigation(page);
|
||||
await page.getByRole("button", { name: "Return to session", exact: true }).click();
|
||||
await page.getByRole("button", { name: "Session", exact: true }).click();
|
||||
await expect(prompt).toHaveValue(question);
|
||||
await readable();
|
||||
await page.screenshot({ path: testInfo.outputPath("Prompt-multiline-mobile.png") });
|
||||
await prompt.fill("");
|
||||
await readable();
|
||||
await expect.poll(() => prompt.evaluate(el => el.clientHeight)).toBe(emptyHeight);
|
||||
expect(writes).toEqual([]);
|
||||
expect(writes).toEqual(route === "/" ? ["/runtime/prewarm"] : ["/runtime/prewarm", "/runtime/prewarm"]);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -361,13 +397,13 @@ test("theme follows the app, not an unrelated OS preference; keyboard tabs and d
|
||||
await admin(page, "Memory");
|
||||
await page.getByRole("button", { name: "New card", exact: true }).click();
|
||||
await page.getByRole("textbox", { name: "Title", exact: true }).fill("Keep this draft");
|
||||
await page.getByRole("button", { name: "Return to session", exact: true }).click();
|
||||
await page.getByRole("button", { name: "Session", exact: true }).click();
|
||||
await expect(page.getByRole("textbox", { name: "Title", exact: true })).toHaveValue("Keep this draft");
|
||||
await page.screenshot({ path: testInfo.outputPath("Memory-dark-unsaved.png") });
|
||||
await page.getByRole("button", { name: "Cancel", exact: true }).click();
|
||||
await page.getByRole("button", { name: "Return to session", exact: true }).click();
|
||||
await page.getByRole("button", { name: "Session", exact: true }).click();
|
||||
await expect(page.getByRole("textbox", { name: "New question", exact: true })).toBeVisible();
|
||||
expect(writes).toEqual([]);
|
||||
expect(writes).toEqual(["/runtime/prewarm"]);
|
||||
});
|
||||
|
||||
test("host header and left rail leave the application a bounded working area", async ({ page }, testInfo) => {
|
||||
|
||||
Reference in New Issue
Block a user