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() {
+
`;
@@ -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) {