Fix client autocomplete pagination + hide admin sidebar on front-end pages

fetchClientNames() requested page[limit]=200 but never followed
links.next, and JSON:API silently clamps to a 50-item hard cap -- with
106 client terms, everything past the 50th alphabetically (e.g. "LE
CAMPUS") was dropped. Now loops through every page like fetchLignes()
already does.

The core Navigation module's admin sidebar (#admin-toolbar) was showing
on our custom /lignes, /dashboard, /lignes/historique and lier-entree
pages. Added a route-scoped library (attached only for those route
names in hook_page_attachments(), not folded into the always-on
admin_chrome attachment) so real Drupal admin pages keep the sidebar.
This commit is contained in:
2026-09-05 13:27:33 +02:00
parent 82b03ac5e2
commit 73818779c1
4 changed files with 47 additions and 4 deletions
@@ -0,0 +1,13 @@
/* The core Navigation module's admin sidebar (#admin-toolbar, ~65px fixed
rail) + its collapsed-state control bar and overlay. Only attached on
this module's own front-end routes (see
figli_compta_ledger_page_attachments()) -- real Drupal admin pages
(/admin/*, node edit forms, etc.) keep the sidebar as normal. */
#admin-toolbar,
.admin-toolbar-control-bar,
.admin-toolbar-overlay {
display: none !important;
}
.dialog-off-canvas-main-canvas {
margin-inline-start: 0 !important;
}
@@ -33,3 +33,8 @@ admin_chrome:
js/admin-chrome.js: {} js/admin-chrome.js: {}
dependencies: dependencies:
- core/drupal - core/drupal
hide_admin_sidebar:
css:
theme:
css/hide-admin-sidebar.css: {}
@@ -222,9 +222,24 @@ function figli_compta_ledger_theme($existing, $type, $theme, $path) {
* Core Navigation's top bar renders empty (whitespace-only regions defeat * Core Navigation's top bar renders empty (whitespace-only regions defeat
* its own :not(:empty) visibility check) on every page, not just admin * its own :not(:empty) visibility check) on every page, not just admin
* routes -- attach the fix globally rather than per-route. * routes -- attach the fix globally rather than per-route.
*
* The admin sidebar itself (#admin-toolbar) is only hidden on this
* module's own front-end pages -- real Drupal admin pages (/admin/*, node
* edit forms, etc.) should keep it, so that one is route-scoped rather
* than folded into the always-on admin_chrome attachment above.
*/ */
function figli_compta_ledger_page_attachments(array &$attachments) { function figli_compta_ledger_page_attachments(array &$attachments) {
$attachments['#attached']['library'][] = 'figli_compta_ledger/admin_chrome'; $attachments['#attached']['library'][] = 'figli_compta_ledger/admin_chrome';
$front_end_routes = [
'figli_compta_ledger.home',
'figli_compta_ledger.dashboard',
'figli_compta_ledger.history',
'figli_compta_ledger.link_entree',
];
if (in_array(\Drupal::routeMatch()->getRouteName(), $front_end_routes, TRUE)) {
$attachments['#attached']['library'][] = 'figli_compta_ledger/hide_admin_sidebar';
}
} }
/** /**
@@ -124,10 +124,20 @@
} }
async function fetchClientNames() { async function fetchClientNames() {
const res = await fetch('/jsonapi/taxonomy_term/client?sort=name&page[limit]=200', { headers: { Accept: 'application/vnd.api+json' } }); // page[limit]=200 is silently clamped to core's hard cap of 50 by
if (!res.ok) throw new Error('JSON:API a répondu ' + res.status); // JSON:API (Query\OffsetPage::SIZE_MAX) -- with 106 client terms,
const json = await res.json(); // that cut off everything past the 50th alphabetically (e.g. "LE
return (json.data || []).map((t) => t.attributes.name).filter(Boolean).sort(); // CAMPUS") unless every page is followed, same as fetchLignes() above.
let url = '/jsonapi/taxonomy_term/client?sort=name&page[limit]=50';
const names = [];
while (url) {
const res = await fetch(url, { headers: { Accept: 'application/vnd.api+json' } });
if (!res.ok) throw new Error('JSON:API a répondu ' + res.status);
const json = await res.json();
names.push(...(json.data || []).map((t) => t.attributes.name).filter(Boolean));
url = json.links && json.links.next ? json.links.next.href : null;
}
return names.sort();
} }
async function fetchYearsList() { async function fetchYearsList() {