A new super admin settings page, /admin/settings/database, lists every table with its record count and size, and one page of the open table's records newest key first. Values are cut inside SQL (400 characters, with a flag saying so) and a record opens whole in a modal, so a table of long texts reads without shipping it all. A search matches every column's text, word by word or as a phrase, which is the one thing that also works on a virtual table. Nothing in it writes: the catalog, the records and the single record are all reads, GET only.
24 lines
704 B
TypeScript
24 lines
704 B
TypeScript
type Params = {
|
|
/**
|
|
* The page asked for, from 1.
|
|
*/
|
|
page: number;
|
|
/**
|
|
* How many records the table holds (or how many matched a search).
|
|
*/
|
|
total: number;
|
|
page_size: number;
|
|
};
|
|
|
|
/**
|
|
* The page that actually gets read: a page past the end of the table lands
|
|
* on its last one (so a stale link or a deleted record never shows an empty
|
|
* page), and a table with nothing in it still has a first page.
|
|
*/
|
|
export default function clampPage({ page, total, page_size }: Params): number {
|
|
const size = Math.max(1, Math.trunc(page_size) || 1);
|
|
const last = Math.max(1, Math.ceil(total / size));
|
|
|
|
return Math.min(Math.max(1, Math.trunc(page) || 1), last);
|
|
}
|