From 7e80ff952a134063630f505bc7a0dcf3bb1c7922 Mon Sep 17 00:00:00 2001 From: william Date: Tue, 25 Aug 2026 13:18:12 +0200 Subject: [PATCH] =?UTF-8?q?Ajoute=20un=20s=C3=A9lecteur=20de=20champ=20pou?= =?UTF-8?q?r=20ins=C3=A9rer=20{{champ}}=20dans=20le=20Contenu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une fois "Lier à un objet de données" réglé (widget Texte/Titre...), propose maintenant les champs de CET objet en liste déroulante juste sous le champ "Contenu", avec un bouton "+ Ajouter" qui insère "{{nom_du_champ}}" à l'emplacement du curseur - plutôt que d'avoir à taper cette syntaxe à la main sans savoir quels noms de champs existent réellement. controls_with_values.py pose field_options sur le contrôle "content" quand _data_definition_id est réglé (réutilise data_binding_options, déjà calculé pour data_filtre_champ/data_filtre2_champ) ; insertFieldAtCursor() (screen_edit.html) fait l'insertion via selectionStart/selectionEnd puis déclenche un événement "input" pour que l'enregistrement automatique se déclenche normalement, comme une saisie manuelle. Co-Authored-By: Claude Sonnet 5 --- screens/widgets/controls_with_values.py | 7 ++++ templates/screen_edit.html | 48 ++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/screens/widgets/controls_with_values.py b/screens/widgets/controls_with_values.py index 9cb7b8e2..f94e4dfc 100644 --- a/screens/widgets/controls_with_values.py +++ b/screens/widgets/controls_with_values.py @@ -67,5 +67,12 @@ def controls_with_values(slug, el): control["options"] = [("", "(sélectionner un objet d'abord)")] + [(f["name"], _field_label(f)) for f in jauge_options["fields"]] if control["key"] in ("data_filtre_champ", "data_filtre2_champ"): control["options"] = [("", "(sélectionner un objet d'abord)")] + [(f["name"], _field_label(f)) for f in data_binding_options["fields"]] + if control["key"] == "content" and attributes.get("_data_definition_id"): + # Une fois "Lier à un objet de données" réglé (voir + # DATA_BINDING_CONTROLS), propose les champs de CET objet en + # liste déroulante à côté du texte — plutôt que de devoir taper + # "{{nom_du_champ}}" à la main sans savoir quels noms existent + # (voir insertFieldAtCursor() dans screen_edit.html). + control["field_options"] = [(f["name"], _field_label(f)) for f in data_binding_options["fields"]] result.append({**control, "value": _control_value(el, control)}) return result diff --git a/templates/screen_edit.html b/templates/screen_edit.html index 10e110a0..e9176906 100644 --- a/templates/screen_edit.html +++ b/templates/screen_edit.html @@ -691,8 +691,31 @@

Colle une adresse (URL) ci-dessus, ou choisis un fichier sur ton ordinateur — il sera hébergé automatiquement avec ce jeu.

{% endif %} + {% if c.field_options %} +
+
+ +
+ {% endif %} {% elif c.type == 'textarea' %} -
+
+ {% if c.field_options %} +
+
+ +
+

Insère "{{champ}}" à l'emplacement du curseur — affichera la valeur de ce champ, sur la ligne trouvée par "Donnée liée" ci-dessous.

+ {% endif %} {% elif c.type == 'color' %}
{% elif c.type == 'slider' %} @@ -1389,6 +1412,29 @@ function debouncedSubmitPropsForm() { autosaveTimer = setTimeout(submitPropsForm, 500); } +// Insère "{{champ}}" à l'emplacement du curseur dans le champ "Contenu" +// (voir controls_with_values.py, control["field_options"] posé une fois +// "Lier à un objet de données" réglé) — évite d'avoir à taper la syntaxe +// à la main sans savoir quels noms de champs existent. OPEN/CLOSE en deux +// morceaux : Jinja interpréterait "{{"/"}}" littéralement adjacents dans +// le SOURCE de ce template comme le début d'une expression s'il les +// rencontrait tels quels (même à l'intérieur d'un