From 17e342738e6cc28d8252e566e15ac9d977db48ca Mon Sep 17 00:00:00 2001 From: feitianbubu Date: Tue, 9 Jun 2026 22:53:16 +0800 Subject: [PATCH] feat: persist table rows-per-page across navigation and sessions --- web/default/src/hooks/use-table-url-state.ts | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/web/default/src/hooks/use-table-url-state.ts b/web/default/src/hooks/use-table-url-state.ts index 643b935e..159041c8 100644 --- a/web/default/src/hooks/use-table-url-state.ts +++ b/web/default/src/hooks/use-table-url-state.ts @@ -25,6 +25,27 @@ import type { type SearchRecord = Record +// Page size persists globally under the classic theme's key (raw number +// string), so the choice is remembered and carries over from classic. +const PAGE_SIZE_STORAGE_KEY = 'page-size' + +function getStoredPageSize(): number | undefined { + try { + const n = parseInt(localStorage.getItem(PAGE_SIZE_STORAGE_KEY) ?? '', 10) + return n > 0 ? n : undefined // n > 0 also rejects NaN + } catch { + return undefined + } +} + +function setStoredPageSize(size: number) { + try { + localStorage.setItem(PAGE_SIZE_STORAGE_KEY, String(size)) + } catch { + /* ignore */ + } +} + export type NavigateFn = (opts: { search: | true @@ -139,7 +160,9 @@ export function useTableUrlState( const rawPageSize = (search as SearchRecord)[pageSizeKey] const pageNum = typeof rawPage === 'number' ? rawPage : defaultPage const pageSizeNum = - typeof rawPageSize === 'number' ? rawPageSize : defaultPageSize + typeof rawPageSize === 'number' + ? rawPageSize + : (getStoredPageSize() ?? defaultPageSize) return { pageIndex: Math.max(0, pageNum - 1), pageSize: pageSizeNum } }, [search, pageKey, pageSizeKey, defaultPage, defaultPageSize]) @@ -147,6 +170,7 @@ export function useTableUrlState( const next = typeof updater === 'function' ? updater(pagination) : updater const nextPage = next.pageIndex + 1 const nextPageSize = next.pageSize + if (nextPageSize !== pagination.pageSize) setStoredPageSize(nextPageSize) navigate({ search: (prev) => ({ ...(prev as SearchRecord),