Corrige le blocage des clics après le premier rafraîchissement de données

Régression introduite par le commit précédent (préservation de l'état
visuel transitoire dans applyOpenRowBindings) : la restauration du
dataset complet d'un nœud copiait aussi clickBound/hoverBound/
hoverTriggerBound — des indicateurs INTERNES au moteur (voir bindClicks/
bindHoverTexts/bindHoverTriggers), jamais un état posé par une action
"Modifier un élément". Un nœud tout juste régénéré se retrouvait donc
marqué "déjà lié" à tort, alors qu'aucun écouteur de clic n'y était
réellement rattaché : bindClicks() le voyait déjà "bound" et sautait
son rattachement, rendant l'élément silencieusement inerte pour le
reste de la partie.

Symptôme rapporté : dans un écran avec un Répéteur ET un panneau de
détail utilisant des {{champ}}, le premier clic sur une ligne fonctionne
(exécuté par les gestionnaires posés au chargement de la page), mais
plus aucun clic ne répond ensuite sur AUCUNE ligne — le Répéteur étant
regénéré dans le même sous-arbre que le panneau de détail (ancêtre
commun avec des {{champ}} non résolus), donc concerné par la même
restauration de dataset.

Fix : exclure ces trois clés internes de la sauvegarde/restauration —
seul l'état réellement transitoire (style inline, classes, data-toggle-*
posés par "Modifier un élément") doit survivre à la regénération.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-26 07:31:40 +02:00
co-authored by Claude Sonnet 5
parent 438e561b45
commit 024da11934
+13 -1
View File
@@ -355,10 +355,22 @@
// recrée entièrement ses nœuds à partir de leur état PAR DÉFAUT. // recrée entièrement ses nœuds à partir de leur état PAR DÉFAUT.
const savedState = {}; const savedState = {};
wrapper.querySelectorAll('[data-element-id]').forEach(function(node) { wrapper.querySelectorAll('[data-element-id]').forEach(function(node) {
// clickBound/hoverBound/hoverTriggerBound (voir bindClicks/
// bindHoverTexts/bindHoverTriggers) sont des indicateurs INTERNES du
// moteur, jamais un état posé par une action "Modifier un élément" —
// les restaurer sur le nœud tout neuf créé ci-dessous lui ferait
// croire à tort qu'un écouteur de clic/survol lui est déjà rattaché
// (alors qu'aucun ne l'est réellement), ce qui bloquait
// silencieusement TOUS les clics suivants sur cet élément (ex. les
// lignes d'un Répéteur voisin, une fois régénérées avec lui).
const dataset = Object.assign({}, node.dataset);
delete dataset.clickBound;
delete dataset.hoverBound;
delete dataset.hoverTriggerBound;
savedState[node.dataset.elementId] = { savedState[node.dataset.elementId] = {
style: node.getAttribute('style') || '', style: node.getAttribute('style') || '',
className: node.className, className: node.className,
dataset: Object.assign({}, node.dataset), dataset: dataset,
}; };
}); });