Vider un champ sur contrainte Readonly

Request description

Bonjour,

J’ai une contrainte qui passe en champ (Integer) en updatable = false.
Ma contrainte est back + front car j’en ai besoin pour un calcul de complétude en back également.

Je cherche un moyen de vider la valeur de mon champ à l’activation de la contrainte Readonly.

Champ en écriture
image
Champ en readonly
image

J’ai tenté de mettre en place un deuxième impact de type Field Value, mais je rencontre plusieurs soucis :

  • si je mets l’expression de l’impact = “”, j’entre dans une boucle infinie car le change() se déclenche à chaque fois (on compare null et “”)

  • si je mets l’expression de l’impact = null, j’ai une erreur comme quoi ce n’est pas une valeur numérique

  • le champ étant passé en Readonly, j’ai l’impression que dans tous les cas, le Save n’envoie pas la nouvelle valeur vide au back

Auriez vous une solution à me conseiller, ou est-ce mieux d’implémenter mon besoin en javascript ?

Merci pour votre aide,
Emmanuelle

Mon paramétrage


[Platform]
Status=OK
Version=6.3.7

Bonjour Emmanuelle,

A priori tu peux utiliser deux contraintes, chacune avec un impact :

  • Contrainte 1 : (champ updatable si false)
    • Expression : true
    • Impact sur updatable, Expression : [VALUE:myBoolean]==false
  • Contrainte 2 : (champ vide si true)
    • Expression : [VALUE:myBoolean]==true]
    • Impact sur value, Expression : ""

Bonjour Alistair,

Merci de ton retour rapide !
Avec Expression = "" j’ai malheureusement mon souci de boucle infinie.

Champ updatable
image

Champ passe à Readonly et se vide (j’ai coché NA)
image

Si je touche à un champ au hasard dans mon form, on repasse dans applyConstraint et ça boucle sur le change()

if (_field && _expr !== undefined) {
         if (_field.ui && _field.ui.val() != _expr)
                  _field.ui.val(_expr).change();
         }

Je ne peux plus rien faire à part fermer l’onglet …

Je ne reproduis pas, même en modifiant un autre champ dans le formulaire.

Est-ce que tu peux me partager le code généré par les contraintes ?

Allons bon, on dirait que j’ai encore réussi à faire un paramétrage farfelu … c’est peut-être une histoire de rendering, j’essaie de paramétrer un cas simple et je t’envoie le tout !

Bon, tu ne vas pas me croire, mais j’ai l’impression que la loop survient quand le nom du champ qui déclenche la contrainte contient le nom du champ qui la subit :sweat_smile:

J’ai créé un Booléen demoIntegerNa et un Int demoInteger → boucle infinie
Je renomme demoInteger en demoIntger sans “e” → plus de boucle infinie

Dans le code de la contrainte, je vois que les champs de nom “contenu” par les déclencheurs apparaissent dans l’array en haut qui est sensé éviter ce cas :

Ici, demoSupInteger apparaît alors qu’il n’est déclencheur d’aucune contrainte.

if (field && field.name && ["demoBool", "demoSupName", "demoSupIntegerNa", "demoSupInteger"].indexOf(field.name) < 0) {
            cbk && cbk();
            return;
        }

Après renommage, demoSupIntger sans ‘e’ n’apparaît pas

if (field && field.name && ["demoBool", "demoSupName", "demoSupIntegerNa"].indexOf(field.name) < 0) {
            cbk && cbk();
            return;
        }

Je mets mon paramétrage en PJ
Constraint LOOP.xml (2.6 KB)
Object_field LOOP.xml (2.1 KB)

Pour reproduire :

  • NA à false
  • entrer une valeur dans Integer
  • cocher NA
    → LOOP

Je reproduis bien avec ton paramétrage, et ton analyse est la bonne.

Le code qui génère la liste des champs “condition” fait une recherche par sous-chaine, demoSupInteger étant un préfixe de demoSupIntegerNa, il était ajouté à cette liste.

Nous avons rendu le code plus robuste. Ça sera corrigé en 6.3.8

Top, merci beaucoup et bonne fin de journée !