Fix browse artists pagination normalization

This commit is contained in:
Jordan Wages 2025-09-24 01:01:47 -05:00
commit 9fb5abf519

View file

@ -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,
});
}