Corrige le contenu de "Donnée liée" figé après un changement de variable/donnée

Bug rapporté : changer une variable globale utilisée comme valeur de
comparaison d'une "Donnée liée" (Texte/Titre, dans une boîte de dialogue
posée comme élément de jeu réutilisable) recalculait bien, côté SERVEUR,
la bonne ligne à afficher — mais le contenu affiché en jeu restait figé
sur son ancienne ligne tant que la page n'était pas complètement
rechargée.

Cause : templates/play.html ne régénère, après une action "Modifier une
variable"/"Modifier une donnée", QUE les éléments dont le rendered_html
porte un marqueur connu (voir refreshRuntimeData()/hasMarker() —
"repeaterItem", "jaugeBar", "visibilityGated"). Un Texte/Titre "Donnée
liée" n'en portait AUCUN : jamais identifié comme "dépendant de la
donnée", donc jamais régénéré, même si le nouveau HTML était déjà prêt
côté serveur à chaque rendu.

Correctif : nouveau marqueur "dataBound" (render_element_html.py), posé
dès que _data_definition_id est réglé, reconnu par hasMarker(). Un
exemplaire d'élément de jeu (ex. la boîte de dialogue posée sur une
scène) porte ce marqueur EN PROFONDEUR dans son propre rendered_html dès
qu'un de ses descendants internes en a un — il se retrouve donc bien
régénéré dans son ensemble, sans changement supplémentaire nécessaire.

Deux nouveaux tests, confirmés en échec sur l'ancien code (même scénario
que le rapport : reproduit avec objet "dialog" + variable "dialog_order"
+ élément de jeu réutilisable) puis au vert avec le correctif. 155 tests
au vert au total.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-08-28 09:47:12 +02:00
co-authored by Claude Sonnet 5
parent 8cffbeac68
commit 124f250d2b
3 changed files with 129 additions and 4 deletions
+20 -1
View File
@@ -52,8 +52,27 @@ def render_element_html(el, slug=None, children_map=None, ctx=None, parent_flex_
if play_mode and has_visibility_condition and not is_element_visible(slug, attrs_raw, ctx):
return f'<div class="visibilityGated" data-element-id="{el["id"]}" style="display:none;"></div>'
# "Donnée liée" (DATA_BINDING_CONTROLS, Texte/Titre) : son contenu
# ({{champ}}) dépend de la ligne trouvée par ses conditions au moment du
# rendu — potentiellement via une "Variable globale" en valeur de
# comparaison (voir _resolve_filter_value). Comme "visibilityGated"
# juste au-dessus, un marqueur ("dataBound") reste posé sur le HTML pour
# que refreshRuntimeData() (play.html) sache qu'il faut réévaluer cet
# élément après toute action "Modifier une donnée"/"Modifier une
# variable" — sans lui, changer la variable choisie changeait bien QUELLE
# ligne aurait dû s'afficher (recalculé correctement côté serveur à
# chaque rendu), mais le client ne redemandait jamais le nouveau HTML de
# CET élément précis : le texte affiché restait figé sur son ancienne
# ligne jusqu'au prochain rechargement complet de la page.
has_data_binding = bool(attrs_raw.get("_data_definition_id"))
def _mark(html_str):
return html_str + "<!--visibilityGated-->" if has_visibility_condition else html_str
markers = ""
if has_visibility_condition:
markers += "<!--visibilityGated-->"
if has_data_binding:
markers += "<!--dataBound-->"
return html_str + markers
bound_ctx = _resolve_bound_row_ctx(slug, attrs_raw)
if bound_ctx: