Files
Forge-Engine/static/object_form.js
T
williamandClaude Sonnet 5 e1216e99d5 Rend le panneau "Nouvel objet" compact — lignes de tableau, pas des cartes
Chaque champ prenait une grosse carte (~250px de haut : libellés Bulma
pleine taille, "Retirer ce champ" en texte) — inutilisable pour un objet
à 10+ champs, ce qui est pourtant l'usage visé par ce panneau.

Remplacé par une vraie ligne de tableau dense, sur le même principe que
"Champs existants" dans object_edit.html (déjà compact et sobre dans le
reste de l'outil) : une ligne = un champ, colonnes Nom/Type/Objet
lié/Mini/Maxi/Obligatoire, action "Retirer" réduite à une icône. Les
colonnes conditionnelles (Objet lié pour une relation, Mini/Maxi pour un
nombre) restent TOUJOURS présentes — sans quoi les colonnes de lignes
différentes ne s'aligneraient plus — seul leur contenu bascule entre le
vrai champ de saisie et un espace réservé "—", au lieu de masquer toute
la cellule comme avant.

object_form.js adapté en conséquence : bounds désormais 2 cibles
séparées (mini/maxi, chacune dans sa propre cellule) au lieu d'une seule
enveloppe commune, et chaque bascule s'accompagne de celle de son
espace réservé.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-27 11:04:13 +02:00

62 lines
2.7 KiB
JavaScript

// 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();
})();