Pagination Standardization Contract¶
Canonical Contract¶
The monorepo standardizes list pagination on the CMS admin settings pattern:
- Query keys:
search,page(page omitted whenpage === 1). - Server-side filtering and pagination for authoritative list data.
- Consistent controls: first / previous / page-of / next / last.
- Out-of-range page requests are clamped to the last valid page.
- Pagination links preserve active filters.
Default sort order¶
Tabular list pages default to ascending alphabetical order on the primary display column (the column users scan first for identity):
| Surface kind | Default sort |
|---|---|
| User / roster tables (email-first) | email ascending (case-insensitive lower() where supported) |
| Tenant / course / theme / project tables (name-first) | name or title ascending |
| CMS admin users (email + display name columns) | displayName ascending via API default |
Audit and time feeds intentionally default to newest first (created_at or equivalent descending). Do not change these to alphabetical order:
- LMS:
admin/page.tsx(recent activity),admin/audit/page.tsx,admin/users/\[id\]/page.tsx(audit tab) - CMS:
api/admin/audit/route.ts
Theme presets merge system and custom rows, sort the combined set, then paginate so global name order matches the table.
Surface Inventory¶
LMS¶
| Surface | Path | Pattern |
|---|---|---|
| Admin dashboard audit | apps/lms/src/app/\[locale\]/admin/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Admin users | apps/lms/src/app/\[locale\]/admin/users/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Admin user audit tab | apps/lms/src/app/\[locale\]/admin/users/\[id\]/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Admin tenants | apps/lms/src/app/\[locale\]/admin/tenants/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Admin courses | apps/lms/src/app/\[locale\]/admin/courses/page.tsx |
AdminPaginationControls + server-side CMS-backed pagination |
| Admin audit | apps/lms/src/app/\[locale\]/admin/audit/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Course dashboard learners | apps/lms/src/app/\[locale\]/admin/courses/\[slug\]/dashboard/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Course students | apps/lms/src/app/\[locale\]/admin/courses/\[slug\]/students/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Course admins | apps/lms/src/app/\[locale\]/admin/courses/\[slug\]/admins/page.tsx |
AdminPaginationControls + server-side DB pagination |
| Public learn catalog | apps/lms/src/app/\[locale\]/learn/page.tsx |
Paginator with settings-style controls + server-side CMS pagination |
| Public blog list | apps/lms/src/app/\[locale\]/blog/page.tsx |
Paginator with settings-style controls + server-side list pagination |
| Learner dashboard enrollments | apps/lms/src/app/\[locale\]/learn/dashboard/page.tsx |
Paginator with settings-style controls + server-side DB pagination |
CMS¶
| Surface | Path | Pattern |
|---|---|---|
| Admin users | apps/cms/src/components/admin/user-list.tsx |
PaginationControls + server-side API pagination |
| Admin tenants | apps/cms/src/components/admin/tenant-list.tsx |
PaginationControls + server-side API pagination |
| Admin roles | apps/cms/src/components/admin/role-list.tsx |
PaginationControls + server-side API pagination |
| Admin tenant settings | apps/cms/src/components/admin/tenant-settings-form.tsx |
PaginationControls + server-side API pagination |
| Admin theme presets | apps/cms/src/components/admin/theme-preset-list.tsx |
PaginationControls + server-side API pagination |
| Workarea projects | apps/cms/src/app/\[locale\]/(workarea)/workarea/page.tsx |
PaginationControls + server-side API pagination |
| Asset manager | apps/cms/src/components/workarea/asset-manager/listing-panel.tsx |
PaginationControls + server-side API pagination |
| Asset picker dialog | apps/cms/src/components/widgets/shared/asset-picker-dialog.tsx |
PaginationControls + server-side API pagination (embedded exception) |
Drift Remediation Notes¶
- LMS admin list inputs now standardize on
searchonly. - LMS public paginator now uses the same first/prev/page-of/next/last control model.
- CMS tenant user manager now fetches all admin users across API pages for complete membership assignment.
- CMS asset manager now sends explicit
pageSizein list requests. - CMS theme preset pagination merges system + custom presets, sorts globally (by name or
createdAt), then slices the page window.