diff --git a/script.js b/script.js index 80e8b93..1e89650 100644 --- a/script.js +++ b/script.js @@ -1114,13 +1114,28 @@ const listState = createAsyncListState({ table, statusEl: $status, pagination }); + const defaultPageSize = Math.max(1, Number(pagination.pageSize) || 25); const state = { prefix: initialPrefix, filter: initialFilter, page: 1, - pageSize: pagination.pageSize, + pageSize: defaultPageSize, }; + function normalizePaginationState() { + let pageSize = Number(state.pageSize); + if (!Number.isFinite(pageSize) || pageSize <= 0) pageSize = defaultPageSize; + else pageSize = Math.max(1, Math.floor(pageSize)); + if (state.pageSize !== pageSize) state.pageSize = pageSize; + + let page = Number(state.page); + if (!Number.isFinite(page) || page <= 0) page = 1; + else page = Math.max(1, Math.floor(page)); + if (state.page !== page) state.page = page; + + return { page, pageSize }; + } + function escapeLike(str) { return String(str).replace(/[\\%_]/g, (m) => `\\${m}`); } @@ -1195,7 +1210,8 @@ const useUnfilteredQuery = !typedFilter && !state.prefix; listState.showLoading('Loading…'); - const offset = (state.page - 1) * state.pageSize; + let { page, pageSize } = normalizePaginationState(); + let offset = (page - 1) * pageSize; let total = 0; const rows = []; let usedFts = false; @@ -1207,9 +1223,13 @@ ftsCountStmt.free(); if (total > 0) { - if (offset >= total) state.page = Math.max(1, Math.ceil(total / state.pageSize)); + if (offset >= total) { + state.page = Math.max(1, Math.ceil(total / pageSize)); + ({ page, pageSize } = normalizePaginationState()); + offset = (page - 1) * pageSize; + } const ftsRowsStmt = db.prepare(applyFtsMatch(ftsRowsSql, ftsMatch)); - ftsRowsStmt.bind([state.pageSize, (state.page - 1) * state.pageSize]); + ftsRowsStmt.bind([pageSize, offset]); while (ftsRowsStmt.step()) rows.push(ftsRowsStmt.getAsObject()); ftsRowsStmt.free(); usedFts = true; @@ -1228,11 +1248,15 @@ return; } - if (offset >= total) state.page = Math.max(1, Math.ceil(total / state.pageSize)); + if (offset >= total) { + state.page = Math.max(1, Math.ceil(total / pageSize)); + ({ page, pageSize } = normalizePaginationState()); + offset = (page - 1) * pageSize; + } const rowsStmt = db.prepare(useUnfilteredQuery ? baseRowsSql : rowsSql); - if (useUnfilteredQuery) rowsStmt.bind([state.pageSize, (state.page - 1) * state.pageSize]); - else rowsStmt.bind([likeTerm, state.pageSize, (state.page - 1) * state.pageSize]); + if (useUnfilteredQuery) rowsStmt.bind([pageSize, offset]); + else rowsStmt.bind([likeTerm, pageSize, offset]); while (rowsStmt.step()) rows.push(rowsStmt.getAsObject()); rowsStmt.free(); } @@ -1248,11 +1272,12 @@ return; } + ({ page, pageSize } = normalizePaginationState()); listState.showRows({ rows, total, - page: state.page, - pageSize: state.pageSize, + page, + pageSize, }); }