Axes groupés par période sur les profils utilisateur + fix soulignement des titres de cards liées

This commit is contained in:
2026-07-06 18:55:37 +02:00
parent e30b0baa50
commit 5f682a637b
7 changed files with 116 additions and 39 deletions

View File

@@ -63,7 +63,9 @@
}
function isProfileEditPage() {
return window.pagenow === 'profile' || window.pagenow === 'user-edit' || window.pagenow === 'user-new';
// NB : sur user-new.php, window.pagenow vaut 'user' (et non 'user-new').
return window.pagenow === 'profile' || window.pagenow === 'user-edit'
|| window.pagenow === 'user-new' || window.pagenow === 'user';
}
function getProfileForm() {
@@ -388,6 +390,47 @@
setTimeout(markReady, 2000);
});
// Regroupe les cases à cocher du champ « axes thématiques » par période.
// Partagé entre la page d'édition de post et la page de profil (les deux
// affichent le champ en checkbox). Données via window.thalimAxesGroups
// (localisées par inc/assets.php). Idempotent : ne fait rien si déjà groupé.
function groupAxesCheckboxes() {
if (!window.thalimAxesGroups || !thalimAxesGroups.length) return;
var row = document.querySelector('.' + CONFIG.rows.axes);
if (!row) return;
var list = row.querySelector('ul');
if (!list) return;
// Already grouped — nothing to do
if (list.querySelector('.axes-group-label')) return;
// Map existing <li> by checkbox value; preserve "add new" button
var liMap = {};
var addNewItem = null;
list.querySelectorAll('li').forEach(function(li) {
if (li.classList.contains('pods-pick-add-new')) { addNewItem = li; return; }
var cb = li.querySelector('input[type="checkbox"]');
if (cb) liMap[cb.value] = li;
});
// Rebuild list in group order
list.innerHTML = '';
thalimAxesGroups.forEach(function(group) {
var labelLi = document.createElement('li');
labelLi.className = 'axes-group-label';
labelLi.textContent = group.label;
list.appendChild(labelLi);
group.terms.forEach(function(term) {
var li = liMap[String(term.id)];
if (li) list.appendChild(li);
});
});
if (addNewItem) list.appendChild(addNewItem);
}
window.ThalimAdmin = {
CONFIG: CONFIG,
safeRun: safeRun,
@@ -399,6 +442,7 @@
reinitEditor: reinitEditor,
updatePostboxVisibility: updatePostboxVisibility,
initInfoPopovers: initInfoPopovers,
groupAxesCheckboxes: groupAxesCheckboxes,
markReady: markReady
};

View File

@@ -94,42 +94,9 @@
TA.ensureVisualMode(enEditorId);
}
function groupAxesCheckboxes() {
if (!window.thalimAxesGroups || !thalimAxesGroups.length) return;
var row = document.querySelector('.' + CONFIG.rows.axes);
if (!row) return;
var list = row.querySelector('ul');
if (!list) return;
// Already grouped — nothing to do
if (list.querySelector('.axes-group-label')) return;
// Map existing <li> by checkbox value; preserve "add new" button
var liMap = {};
var addNewItem = null;
list.querySelectorAll('li').forEach(function(li) {
if (li.classList.contains('pods-pick-add-new')) { addNewItem = li; return; }
var cb = li.querySelector('input[type="checkbox"]');
if (cb) liMap[cb.value] = li;
});
// Rebuild list in group order
list.innerHTML = '';
thalimAxesGroups.forEach(function(group) {
var labelLi = document.createElement('li');
labelLi.className = 'axes-group-label';
labelLi.textContent = group.label;
list.appendChild(labelLi);
group.terms.forEach(function(term) {
var li = liMap[String(term.id)];
if (li) list.appendChild(li);
});
});
if (addNewItem) list.appendChild(addNewItem);
}
// Regroupement des axes par période — implémentation partagée dans
// admin-base.js (réutilisée par la page de profil).
var groupAxesCheckboxes = TA.groupAxesCheckboxes;
var REF_BIB_EDITOR_ID = CONFIG.editors.refBib;
var refBibReinited = false;

View File

@@ -110,9 +110,42 @@
});
}
// Regroupe les axes thématiques par période (champ en cases à cocher, comme
// la page post — implémentation partagée dans admin-base.js). Les checkboxes
// sont rendues par le DFV React de façon asynchrone ; sur user-new.php, la
// page est très lourde (beaucoup de champs Pods) et le rendu peut arriver
// bien après le chargement. On observe donc le formulaire jusqu'à ce que les
// cases apparaissent, plutôt qu'un retry borné qui expirait sur user-new.
function groupProfileAxes() {
function tryGroup() {
var row = document.querySelector('.' + TA.CONFIG.rows.axes);
var list = row && row.querySelector('ul');
if (!list) return false;
if (list.querySelector('.axes-group-label')) return true; // déjà groupé
if (!list.querySelector('input[type="checkbox"]')) return false; // pas encore rendu
TA.groupAxesCheckboxes();
return true;
}
if (tryGroup()) return;
// On observe la LIGNE du champ (le <ul> des cases y est injecté par React)
// et on NE se déconnecte PAS au premier succès : sur user-new (item id 0),
// le DFV peut re-rendre la liste après coup et écraser le groupement — on
// le réapplique alors (tryGroup est idempotent, pas de boucle). Fallback
// sur le formulaire si la ligne n'est pas encore là.
var row = document.querySelector('.' + TA.CONFIG.rows.axes);
var scope = row || TA.getProfileForm() || document.body;
var observer = new MutationObserver(function() { tryGroup(); });
observer.observe(scope, { childList: true, subtree: true });
// Filet de sécurité : cesser d'observer après 30 s.
setTimeout(function() { observer.disconnect(); }, 30000);
}
function initProfileEditors() {
reorderProfileSections();
TA.initInfoPopovers('user');
safeRun('groupProfileAxes', groupProfileAxes);
// Hide the "À propos du compte" section heading
document.querySelectorAll('#your-profile h2, #adduser h2, #createuser h2').forEach(function(h2) {