Business object hook pour traiter un changement d'affichage en fonction d'une valeur de champs

Bonjour,

dans mon formulaire de création de message, j’ai attribut média.

quand je change de média, je veux afficher un champs contenu différent : texte ou texte riche.
pour cela, j’ai 2 attributs : aleMsgTxt et aleMsgTxtRiche que je veux afficher ou cacher en fonction du média sélectionné. le média est un objet lié qui a un attribut aleParamMediaTypeContenu qui contient TEXTE ou TEXTE_RICHE selon ce qui a été défini par l’utilisateur.

j’ai donc écrit un hook :

        p.form.onload = function(ctn, obj) {
            // Quand le média change => on vide les champs paramMsg et aleMsgTxt et aleMsgTxtRiche
            var media = ui.getUIField(ctn, obj, "aleMsgParamMedia_fk");
            var msgType = ui.getUIField(ctn, obj, "aleMsgParamMsg_fk");
            var msgTxt=ui.getUIField(ctn, obj, "aleMsgTxt");
            var msgTxtRiche=ui.getUIField(ctn, obj, "aleMsgTxtRiche");
            media.ui.change(function() {
            	console.log("media.ui.val :"+media.ui.val());
				var typeContenu=ui.getUIField(ctn,obj,"aleMsgParamMedia_fk.aleParamMediaTypeContenu");
               	if(ui.getUIField(ctn,obj,"aleMsgParamMedia_fk.aleParamMediaTypeContenu").ui.val()=="TEXTE"){
               		ui.getUIField(ctn, obj, "aleMsgTxt").ui.visible(Simplicite.VIS_FORM);
               		msgTxtRiche.ui.visible(Simplicite.VIS_HIDDEN);
               	}else{
               		ui.getUIField(ctn, obj, "aleMsgTxt").ui.visible(Simplicite.VIS_HIDDEN);
               		msgTxtRiche.ui.visible(Simplicite.VIS_FORM);
               	} 
            });

Mon problème : quand je change ma sélection de média, je ne récupère pas la bonne valeur de aleMsgParamMedia_fk.aleParamMediaTypeContenu. il y a un clique de décalage.

Exemple : pour un sms c’est du texte, pour le mail c’est du texte riche.
quand je change sms en mail => aleMsgParamMedia_fk.aleParamMediaTypeContenu=TEXTE
quand je rechange mail en sms => aleMsgParamMedia_fk.aleParamMediaTypeContenu=TEXTE_RICHE

il faut sélectionner 2 fois de suite le même média pour avoir le bon effet …

ma version :

J’ai l’impression que ce besoin est faisable via une simple contrainte “Front”.

  • Expression true
  • Impact 1 sur le champs aleMsgTxt : visible = [VALUE:aleMsgParamMedia_fk.aleParamMediaTypeContenu]==‘TEXTE’ ? ObjectField.VIS_FORM : ObjectField.VIS_HIDDEN
  • Impact 2 sur le champs aleMsgTxtRiche : visible = [VALUE:aleMsgParamMedia_fk.aleParamMediaTypeContenu]==‘TEXTE’ ? ObjectField.VIS_HIDDEN : ObjectField.VIS_FORM

Sinon par code le change ne doit pas être positionné sur le bon champ, il faut le mettre sur aleParamMediaTypeContenu.
Car visiblement la FK envoit un trigger change avant que tous les champs aient été valorisés sur l’IHM.
il n’y a aucune synchronization entre le change de la FK et ses champs liés qui sont valorisés de manière asynchrone.

A mon sens il faut tester le onchange du champ qu’on veut tester directement et non sa FK.

var type = ui.getUIField(ctn, obj, "aleMsgParamMedia_fk.aleParamMediaTypeContenu");
type.ui.change(...)