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 @@
- +