diff --git a/ui/src/i18n/locales/en.ts b/ui/src/i18n/locales/en.ts index 376d2580949a..ff6a971158d1 100644 --- a/ui/src/i18n/locales/en.ts +++ b/ui/src/i18n/locales/en.ts @@ -741,6 +741,7 @@ export const en: TranslationMap = { noArchivedSessions: "No archived sessions.", noSessionsMatchFilters: "No threads match your filters.", pagination: "{start}-{end} of {total} rows", + pageSize: "Rows per page", rowsPerPage: "{count} per page", showAll: "Show all", inherit: "inherit", diff --git a/ui/src/pages/sessions/view.browser.test.ts b/ui/src/pages/sessions/view.browser.test.ts index b56cb7163b26..11730e0c00ff 100644 --- a/ui/src/pages/sessions/view.browser.test.ts +++ b/ui/src/pages/sessions/view.browser.test.ts @@ -197,6 +197,18 @@ function sessionsTableHtml() { +
+
1-25 of 30 rows
+
+ + + +
+
`; @@ -303,4 +315,15 @@ describeBrowserLayout("sessions responsive browser layout", () => { await closeFixture(fixture); } }); + + it("exposes the page-size selector by its localized accessible name", async () => { + const fixture = await openFixture(context, 1440, 900); + try { + const pageSize = fixture.page.getByRole("combobox", { name: "Rows per page" }); + await pageSize.waitFor(); + expect(await pageSize.inputValue()).toBe("25"); + } finally { + await closeFixture(fixture); + } + }); }); diff --git a/ui/src/pages/sessions/view.test.ts b/ui/src/pages/sessions/view.test.ts index 5d0fd33e9e49..951b76db4e64 100644 --- a/ui/src/pages/sessions/view.test.ts +++ b/ui/src/pages/sessions/view.test.ts @@ -318,6 +318,28 @@ describe("sessions view", () => { expect(container.querySelector(".data-table-pagination")).toBeNull(); }); + it("selects and names the current page size on first render", async () => { + const container = document.createElement("div"); + render( + renderSessions({ + ...buildProps( + buildMultiResult([ + { key: "one", kind: "direct", updatedAt: 2 }, + { key: "two", kind: "direct", updatedAt: 1 }, + ]), + ), + pageSize: 25, + }), + container, + ); + await Promise.resolve(); + + const pageSize = container.querySelector(".data-table-pagination__size"); + expect(pageSize?.getAttribute("aria-label")).toBe("Rows per page"); + expect(pageSize?.value).toBe("25"); + expect(pageSize?.selectedOptions[0]?.textContent?.trim()).toBe("25 per page"); + }); + it("keeps the filtered empty state when grouping is active", async () => { const container = document.createElement("div"); render( diff --git a/ui/src/pages/sessions/view.ts b/ui/src/pages/sessions/view.ts index 17f406a5fbf4..6f119ce2de49 100644 --- a/ui/src/pages/sessions/view.ts +++ b/ui/src/pages/sessions/view.ts @@ -1456,13 +1456,16 @@ function renderSessionsTable(props: SessionsProps, ctx: SessionsTableContext) {