From c484b1f13471a9cdea116b5fe204008bf19628f8 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 28 Aug 2025 20:38:11 +1000 Subject: [PATCH] Table pagination fix (#10236) * Correct pagination offset calculation * Add playwright tests * Enhanced playwright test * Add comment * Fix typo --- src/frontend/src/tables/InvenTreeTable.tsx | 2 +- src/frontend/tests/helpers.ts | 2 +- src/frontend/tests/pui_tables.spec.ts | 32 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/tables/InvenTreeTable.tsx b/src/frontend/src/tables/InvenTreeTable.tsx index dcf6d9259f..ffabe6cd83 100644 --- a/src/frontend/src/tables/InvenTreeTable.tsx +++ b/src/frontend/src/tables/InvenTreeTable.tsx @@ -355,7 +355,7 @@ export function InvenTreeTable>({ useEffect(() => { if ( tableState.page > 1 && - pageSize * tableState.page > tableState.recordCount + pageSize * (tableState.page - 1) > tableState.recordCount ) { tableState.setPage(1); } else if (tableState.page < 1) { diff --git a/src/frontend/tests/helpers.ts b/src/frontend/tests/helpers.ts index 8d864a6116..cdfbcd8f86 100644 --- a/src/frontend/tests/helpers.ts +++ b/src/frontend/tests/helpers.ts @@ -33,7 +33,7 @@ export const clickButtonIfVisible = async (page, name, timeout = 500) => { */ export const clearTableFilters = async (page) => { await openFilterDrawer(page); - await clickButtonIfVisible(page, 'Clear Filters'); + await clickButtonIfVisible(page, 'Clear Filters', 250); await closeFilterDrawer(page); await page.waitForLoadState('networkidle'); }; diff --git a/src/frontend/tests/pui_tables.spec.ts b/src/frontend/tests/pui_tables.spec.ts index 7e421e48fe..f2d61ab62c 100644 --- a/src/frontend/tests/pui_tables.spec.ts +++ b/src/frontend/tests/pui_tables.spec.ts @@ -39,6 +39,38 @@ test('Tables - Filters', async ({ browser }) => { await clearTableFilters(page); }); +test('Tables - Pagination', async ({ browser }) => { + const page = await doCachedLogin(browser, { + url: 'manufacturing/index/buildorders', + username: 'steven', + password: 'wizardstaff' + }); + + await clearTableFilters(page); + + // Expected pagination size is 25 + // Note: Due to other tests, there may be more than 25 items in the list + await page.getByText(/1 - 25 \/ 2[2|8]/).waitFor(); + await page.getByRole('button', { name: 'Next page' }).click(); + await page.getByText(/26 - 2[7|8] \/ 2[7|8]/).waitFor(); + + // Set page size to 10 + await page.getByRole('button', { name: '25' }).click(); + await page.getByRole('menuitem', { name: '10', exact: true }).click(); + + await page.getByText(/1 - 10 \/ 2[7|8]/).waitFor(); + await page.getByRole('button', { name: '3' }).click(); + await page.getByText(/21 - 2[7|8] \/ 2[7|8]/).waitFor(); + await page.getByRole('button', { name: 'Previous page' }).click(); + await page.getByText(/11 - 20 \/ 2[7|8]/).waitFor(); + + // Set page size back to 25 + await page.getByRole('button', { name: '10' }).click(); + await page.getByRole('menuitem', { name: '25', exact: true }).click(); + + await page.getByText(/1 - 25 \/ 2[7|8]/).waitFor(); +}); + test('Tables - Columns', async ({ browser }) => { // Go to the "stock list" page const page = await doCachedLogin(browser, {