// object_form.js — ajoute/retire des lignes de champ dans le formulaire de // définition d'objet, bascule l'affichage du sélecteur "objet lié" // 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']; function wireRow(row) { // Ligne de TABLEAU dense (une ligne = un champ, comme "Champs // existants" dans object_edit.html) : "Objet lié" et "Mini"/"Maxi" // gardent toujours leur colonne (jamais masquée, sinon les colonnes // des différentes lignes ne s'alignent plus) — seul leur CONTENU // bascule entre le vrai champ de saisie et un espace réservé "—" // quand il ne s'applique pas au type choisi. var typeSelect = row.querySelector('.fieldTypeSelect'); var relationTarget = row.querySelector('.relationTarget'); var relationPlaceholder = row.querySelector('.relationPlaceholder'); var boundsTargets = row.querySelectorAll('.boundsTarget'); var boundsPlaceholders = row.querySelectorAll('.boundsPlaceholder'); function toggle(target, placeholder, visible) { target.style.display = visible ? '' : 'none'; placeholder.style.display = visible ? 'none' : ''; } function syncFieldTypeVisibility() { var isRelation = typeSelect.value === 'relation'; var isNumeric = NUMERIC_FIELD_TYPES.includes(typeSelect.value); toggle(relationTarget, relationPlaceholder, isRelation); boundsTargets.forEach(function (el, i) { toggle(el, boundsPlaceholders[i], isNumeric); }); } typeSelect.addEventListener('change', syncFieldTypeVisibility); syncFieldTypeVisibility(); row.querySelector('.btnRemoveField').addEventListener('click', function () { row.remove(); }); } function addFieldRow() { var clone = template.content.cloneNode(true); fieldsList.appendChild(clone); wireRow(fieldsList.lastElementChild); } btnAddField.addEventListener('click', addFieldRow); // Toujours démarrer avec un premier champ prêt à remplir. addFieldRow(); })();