pagination.ts
| 1 | /** |
| 2 | * Compute pagination state for a list view. |
| 3 | * |
| 4 | * Clamps `page` into [1, totalPages] so an out-of-range query string |
| 5 | * (?page=999) lands on the last page instead of an empty offset. |
| 6 | */ |
| 7 | export function paginate( |
| 8 | rawPage: number | undefined, |
| 9 | totalCount: number, |
| 10 | perPage: number, |
| 11 | ): { page: number; totalPages: number; offset: number } { |
| 12 | const totalPages = Math.max(1, Math.ceil(totalCount / perPage)); |
| 13 | const page = Math.min(Math.max(1, rawPage ?? 1), totalPages); |
| 14 | return { page, totalPages, offset: (page - 1) * perPage }; |
| 15 | } |
| 16 |