Gestion d'affichage FieldArea

Bonjour,

Je souhaite, lorsque j’ouvre le formulaire en mode création ou en mode mise à jour qu’une section/rubrique (FieldArea) soit masquée par défaut et quand je clique sur une Action, la section s’affiche.

NB: L’action est affiché en fonction de la valeur sélectionné dans la liste déroulante.

Bonjour,

  • Pour masquer l’action (le bouton) vous pouvez faire une contrainte de type Front donc l’impact est la visibilité de l’action + l’expression un test sur la valeur du champ sélectionné [VALUE:myfield]=="abc"

  • L’action de type front doit avoir du code client :

    • dans le champ URL : javascript: myAreaMethod(obj)
    • et dans la ressource SCRIPT de votre objet, la méthode qui fait un toggle de la zone :
function myAreaMethod(obj) {
   debugger; // pour tester avec un point d'arret dans le navigateur
   console.log("myAreaMethod", obj); // autre façon de debugger un objet dans la console
   var a = $ui.getUIArea(null, obj, "myFieldAreaName");
   if (a && a.ui) { // la zone n'est pas forcement là
      a.ui.visible(!a.ui.visible()); // inverse la visibilité
   }
}

Si vous avez placé un bouton en dur dans le template (sans utiliser une action Simplicité), il faudra binder vous même le click dans le hook front form.onload pour faire la même chose.

  • Pour masquer une zone par défaut depuis un hook back (dans votre cas initUpdate, initCreate et initCopy):
FieldArea a = getFieldArea("myFieldAreaName");
if (a!=null) a.setVisible(false);

Merci @Francois, je vais tester et je vous tiendrai au courant.

L’objectif de l’action est d’afficher la zone area (FieldArea) et en même temps mettre à jour des valeurs.

Pour Information, j’ai déjà utilisé FieldArea a = getFieldArea("myFieldAreaName"); a.setVisible(false); dans initCreate() & initUpdate(), ensuite j’ai créé une méthode dans laquelle j’ai écris ce code FieldArea a = getFieldArea("myFieldAreaName"); a.setVisible(true); et la méthode je l’utilise au niveau de l’action (Back).

Résultat, la zone area (FieldArea) est masquée en création et en modification, par contre si je clique sur l’action, j’ai toujours l’area masquée.

J’ai changé l’action (Type:Front), et j’ai suivi les étapes que vous avez m’indiquer, et j’ai toujours l’area masquée.

Donc on en revient à une besoin mal exprimé dès le début. car ce n’est pas une action pure Front de “toggle” d’area, puisque vous mettez à jour vos données en même temps en back.

Une action de type BACK sur un objet fait un appel ajax pour 1) sauvegarder les données et 2) invoquer l’action sur des données à jour et donc valides, puis 3) revient en réaffichant le formulaire avec les données à jour.

Du coup vous repassez nécessairement par le hook initUpdate à la fin = qui re-masque la zone à chaque ouverture de formulaire tel que vous l’avez codé.

La zone ne doit pas s’afficher (avec du code en back) en fonction d’un bouton (en front), sauf à repartir dans un nouvelle gestion de flag complexe entre le front et le back, mais de la présence de champs renseignés ou non dans ladite zone :

initUpdate :

FieldArea a = getFieldArea("myFieldAreaName"); 
a.setVisible(!getField("myFieldInArea").isEmpty() || !getField("myField2InArea").isEmpty() ...);

La zone sera masquée si elle est vide par défaut, mais sera affichée si elle contient quelque chose de renseigné.

Le bouton UI ne servant qu’à afficher la zone si elle est vide la première fois.

Rien d’autre, sauf à penser à remettre la zone visible ou non dans le initList, sinon vous aurez des comportements bizarres quand vous allez revenir à la liste (en fonction du dernier enregistrement ouvert).

initList :

FieldArea a = getFieldArea("myFieldAreaName"); 
a.setVisible(false);
@Override
    public void initUpdate(){
    FieldArea a = getFieldArea("myFieldAreaName"); 
    a.setVisible(!getField("myFieldInArea").isEmpty() || !getField("myField2InArea").isEmpty());
    }
/**La méthode appelée au niveau de l'action du type Back*/
public String displaySectionEntretienCec(){
    	FieldArea a = getFieldArea("myFieldAreaName"); 
    a.setVisible(getField("myFieldInArea").isEmpty() || getField("myField2InArea").isEmpty());
    	return null;
    }

Toujours l’area est masquée.

vous remettez mon code avec des noms fictifs.
Sans code exact ou description détaillée de ce que vous avez codé en front et back, on ne peut pas vous aider.

Au niveau de l’action, il faut juste coder en front le toggle comme indiqué. Inutile de coder un action back, puisque le initUpdate fait déjà le travail.

@Override
    public void initCreate(){
    //Section Entretien CEC
    FieldArea a = getFieldArea("NamFse-4"); 
    a.setVisible(!getField("namFseEntCecDate").isEmpty() || !getField("namFseEntCecSynthese").isEmpty());
    }

@Override
    public void initUpdate(){
   //Section Entretien CEC
    FieldArea a = getFieldArea("NamFse-4"); 
    a.setVisible(!getField("namFseEntCecDate").isEmpty() || !getField("namFseEntCecSynthese").isEmpty());
    }

/**La méthode appelée au niveau de l'action du type Back*/
 public String displaySectionEntretienCec(){
        //Section Entretien CEC
    	FieldArea zoneEntretienCec = getFieldArea("NamFse-4");
        zoneEntretienCec.setVisible(getField("namFseEntCecDate").isEmpty() || getField("namFseEntCecSynthese").isEmpty());
        //Mettre à jour le statut et la date
    	getField("namFseStatut").setValue("ENTRETIENCEC");
    	getField("namFseEntCecDate").setValue(Tool.getCurrentDate());
    	update();
    	return null;
    }

L’action :

Besoin :

La section ‘Entretien CEC’ est masquée pendant la création et la modification, et si je clique sur l’action ‘NAM_FSE_ENTRETIEN_CEC’, le statut FSE est avancé à l’entretien CEC et la date Entretien CEC est renseignée à la date du jour.

Ce test me semble faux, mais comme déjà indiqué, vu que l’action retourne ensuite sur un rechargement du formulaire, seul le code de l’initUpdate compte au final.

Mettez des AppLog.info pour débugger votre code et tester ce que contiennent vos champs dans les logs, et donc la valeur de votre test de visibilité.

AppLog.info(getClass(), "initUpdate", "namFseEntCecDate = " + getField("namFseEntCecDate").getValue(), null);
AppLog.info(getClass(), "initUpdate", "namFseEntCecSynthese= " + getField("namFseEntCecSynthese").getValue(), null);

Voici un exemple qui fonctionne sur la démo :

  • un bouton incrémente le stock d’un produit de 1
  • et la zone 4 du produit se masque si le stock est impair
  • à chaque click le zone s’affiche ou se masque alternativement
  • le test se base sur la valeur des champs, dans votre cas il faut l’adapter à votre besoin
public void initUpdate() {
	FieldArea a = getFieldArea("DemoProduct-4");
	ObjectField s = getField("demoPrdStock");
	a.setVisible(s.getInt(0)%2 == 0); // stock pair ?
	AppLog.info(getClass(), "initUpdate", "visible = "+a.isVisible(), null);
}
// Méthode callback de l'action qui fait une mise à jour simple
public String test4() {
	ObjectField s = getField("demoPrdStock");
	s.setValue(s.getInt(0) + 1);
	save(); // mieux que update pour passer par les hook pre/postSave !
	return null;
}

Dans les logs on peut voir que l’initUpdate est appelé 2 fois

  • 1 fois pour mettre dans le contexte de l’action back en mise à jour
  • puis 1 fois lorsque le formulaire se ré-affiche

Merci @Francois, ça fonctionne