diff --git a/templates/play.html b/templates/play.html index 5d14cb78..fb68b1be 100644 --- a/templates/play.html +++ b/templates/play.html @@ -796,10 +796,32 @@ // l'éditeur — contourne la contrainte de clé étrangère de // target_element_id, qui empêche d'y stocker un sentinel comme // EVENT_ROW_ID directement (voir screens/flow/ensure_flow_schema.py). + // + // data-element-id N'EST PAS unique quand l'élément vit dans un + // Répéteur : chaque ligne rejoue le MÊME modèle, donc le MÊME + // data-element-id se répète à l'identique sur chaque ligne (voir + // render_repeater.py, seul data-row-id — posé sur .repeaterItem, + // l'englobant — distingue réellement une ligne d'une autre). Un + // simple document.querySelector('[data-element-id]') global + // prendrait toujours la PREMIÈRE ligne, jamais la bonne — sans + // rapport avec l'événement reçu. Quand l'événement transmet aussi + // une ligne (row_id), la recherche est donc scopée à L'INTÉRIEUR de + // ce .repeaterItem précis ; sinon (élément fixe, ou événement sans + // paramètre de ligne), recherche globale comme avant. const resolvedElementId = node.target_element_from_event ? (window.lastEventParams ? window.lastEventParams.element_id : null) : node.target_element_id; - const targetEl = resolvedElementId ? document.querySelector('[data-element-id="' + resolvedElementId + '"]') : null; + const resolvedRowId = node.target_element_from_event && window.lastEventParams + ? window.lastEventParams.row_id : null; + let targetEl = null; + if (resolvedElementId != null) { + if (resolvedRowId != null) { + const rowEl = document.querySelector('.repeaterItem[data-row-id="' + resolvedRowId + '"]'); + targetEl = rowEl ? rowEl.querySelector('[data-element-id="' + resolvedElementId + '"]') : null; + } else { + targetEl = document.querySelector('[data-element-id="' + resolvedElementId + '"]'); + } + } if (targetEl) applyElementProperty(targetEl, node.element_property, node.element_value); return Promise.resolve(); } else if (node.action_type === 'declencher_evenement' && node.target_custom_event_id) {