Extract pagination into templates/partials/pagination.php

The pagination nav was duplicated between public/index.php and public/search.php
with structural differences: index.php used string concatenation for query params
and had first/last-page buttons (« »); search.php used http_build_query but had
only prev/next (‹ ›) and a flat <span> rather than a <ul>/<li> structure.

- Add templates/partials/pagination.php: accepts $page, $totalPages, $baseParams[]
  (any array of query params to preserve); builds URLs with http_build_query;
  renders a semantic <nav>/<ul>/<li> block with first/prev/info/next/last buttons,
  correct aria-disabled + tabindex on disabled links, and aria-label on each button.
  Returns immediately (no output) when $totalPages <= 1.

- Replace inline pagination block in index.php with:
    $baseParams = array_filter(['year' => $year]);
    include pagination.php

- Replace inline pagination block in search.php with:
    $baseParams = array_diff_key($_GET, ['page' => '']);
    include pagination.php
  This also upgrades search.php to the full first/last button set it was missing.

Both callers verified with php -l. No functional change to existing behaviour.
This commit is contained in:
Pontoporeia
2026-04-02 12:20:31 +02:00
parent 0ab08f3aa0
commit 7834d88873
4 changed files with 72 additions and 49 deletions

View File

@@ -43,7 +43,7 @@ PHP has no component system, but `include`/`require` with variable scoping works
- [ ] **`jury-fieldset.php`** — the entire jury composition fieldset + JS is duplicated verbatim between `add.php` and `edit.php`; extract into one partial accepting `$juryPresident`, `$juryPromoteur`, `$juryPromoteurExt`, `$juryLecteurs[]`
### Shared UI partials — `templates/partials/`
- [ ] **`pagination.php`** — pagination nav is duplicated between `index.php` and `search.php` with minor variations; unify into one partial accepting `$page`, `$totalPages`, `$baseParams[]`
- [x] **`pagination.php`** — pagination nav is duplicated between `index.php` and `search.php` with minor variations; unify into one partial accepting `$page`, `$totalPages`, `$baseParams[]`
- [ ] **`status-badge.php`** — the published/pending badge + access badge pattern is repeated in `index.php` admin table rows; extract into a partial
- [ ] **`admin-alert.php`** — rename/merge `flash-messages.php` to also handle the 3 different legacy flash key patterns (`$_SESSION['error']`, `$_SESSION['admin_error']`, `$_SESSION['edit_error']`, etc.) that pages still consume manually instead of via `App::consumeFlash()`
@@ -79,7 +79,7 @@ The admin system page (`/admin/system.php`) runs expensive operations on every l
- [ ] Extract `ThesisEditController` — merges edit.php + actions/edit.php, deduplicate jury fieldset (§2 step 5)
- [ ] Extract remaining controllers one by one (§2 step 6)
- [ ] Consolidate action handlers into controller methods (§4)
- [ ] Introduce pagination partial `templates/partials/pagination.php` (§6)
- [x] Introduce pagination partial `templates/partials/pagination.php` (§6)
- [ ] Introduce admin form partials: select-field, checkbox-list, jury-fieldset (§6)
- [ ] Unify flash message keys project-wide to `_flash_error` / `_flash_success` (§7)
- [ ] Move OG tag construction into controller logic (§8)