From 2bb0c253f95100903e2b94435c5248725773aa30 Mon Sep 17 00:00:00 2001 From: william Date: Mon, 24 Aug 2026 09:21:19 +0200 Subject: [PATCH] Fix object-form breaking on repeat pjax visits, and stray autofill in game rename field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit object_form.js declared top-level const bindings, which pjax replays verbatim on every visit — the second visit threw "already declared" and silently broke "Ajouter un champ"/"Créer l'objet". Wrapped it in an IIFE. Also renamed the generic name="name" rename-game field to name="game_name" with autocomplete off, since browsers were autofilling it with unrelated previously-typed values. --- routes/games/game_rename.py | 2 +- static/object_form.js | 61 +++++++++++++++++++---------------- templates/game_dashboard.html | 2 +- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/routes/games/game_rename.py b/routes/games/game_rename.py index 64477672..1fdd5730 100644 --- a/routes/games/game_rename.py +++ b/routes/games/game_rename.py @@ -7,7 +7,7 @@ from core.flask_app import app @app.route("/game//rename", methods=["POST"]) def game_rename(slug): - new_name = request.form.get("name", "").strip() + new_name = request.form.get("game_name", "").strip() if new_name: db.update_game_name(slug, new_name) return redirect(url_for("game_dashboard", slug=slug)) diff --git a/static/object_form.js b/static/object_form.js index bdda379e..c0202878 100644 --- a/static/object_form.js +++ b/static/object_form.js @@ -3,36 +3,43 @@ // uniquement quand le type choisi est "relation", et l'affichage des // bornes mini/maxi (2.2 — bornage automatique) uniquement pour un champ // numérique. +// +// Tout est enfermé dans une IIFE : cette page est chargée via pjax (voir +// pjax.js), qui rejoue ce script telle-quelle à chaque visite sans +// rechargement complet — une déclaration `const`/`let` au premier niveau +// ferait planter la deuxième exécution ("already declared") et bloquerait +// silencieusement "Ajouter un champ"/"Créer l'objet" dès la deuxième visite +// de cette page dans une même session. +(function () { + var fieldsList = document.getElementById('fieldsList'); + var template = document.getElementById('fieldRowTemplate'); + var btnAddField = document.getElementById('btnAddField'); + var NUMERIC_FIELD_TYPES = ['nombre_entier', 'nombre_decimal']; -const fieldsList = document.getElementById('fieldsList'); -const template = document.getElementById('fieldRowTemplate'); -const btnAddField = document.getElementById('btnAddField'); -const NUMERIC_FIELD_TYPES = ['nombre_entier', 'nombre_decimal']; + function wireRow(row) { + var typeSelect = row.querySelector('.fieldTypeSelect'); + var relationWrap = row.querySelector('.relationTarget'); + var boundsWrap = row.querySelector('.boundsTarget'); + function syncFieldTypeVisibility() { + relationWrap.style.display = typeSelect.value === 'relation' ? 'block' : 'none'; + if (boundsWrap) boundsWrap.style.display = NUMERIC_FIELD_TYPES.includes(typeSelect.value) ? 'flex' : 'none'; + } + typeSelect.addEventListener('change', syncFieldTypeVisibility); + syncFieldTypeVisibility(); -function wireRow(row) { - const typeSelect = row.querySelector('.fieldTypeSelect'); - const relationWrap = row.querySelector('.relationTarget'); - const boundsWrap = row.querySelector('.boundsTarget'); - function syncFieldTypeVisibility() { - relationWrap.style.display = typeSelect.value === 'relation' ? 'block' : 'none'; - if (boundsWrap) boundsWrap.style.display = NUMERIC_FIELD_TYPES.includes(typeSelect.value) ? 'flex' : 'none'; + row.querySelector('.btnRemoveField').addEventListener('click', function () { + row.remove(); + }); } - typeSelect.addEventListener('change', syncFieldTypeVisibility); - syncFieldTypeVisibility(); - row.querySelector('.btnRemoveField').addEventListener('click', () => { - row.remove(); - }); -} + function addFieldRow() { + var clone = template.content.cloneNode(true); + fieldsList.appendChild(clone); + wireRow(fieldsList.lastElementChild); + } -function addFieldRow() { - const clone = template.content.cloneNode(true); - const row = clone.querySelector('.fieldRowCard'); - fieldsList.appendChild(clone); - wireRow(fieldsList.lastElementChild); -} + btnAddField.addEventListener('click', addFieldRow); -btnAddField.addEventListener('click', addFieldRow); - -// Toujours démarrer avec un premier champ prêt à remplir. -addFieldRow(); + // Toujours démarrer avec un premier champ prêt à remplir. + addFieldRow(); +})(); diff --git a/templates/game_dashboard.html b/templates/game_dashboard.html index d8b255e8..c6c92792 100644 --- a/templates/game_dashboard.html +++ b/templates/game_dashboard.html @@ -49,7 +49,7 @@
- +