Quel hook pour masquer la vue d'un objet lié dans un formulaire en fonction d'un champ?

Bonjour,
Dans le formulaire de l’objet principal, j’affiche les données d’un objet lié.

J’aimerai mettre des contraintes sur cette vue de données, mais je ne trouve pas comment.

Template :

Bonjour,

Une liste fille (filtrée par rapport à un objet père) est une instance particulière, donc vous pouvez y faire tout ce que vous voulez via Hook, Constraint… en testant le nom de cette instance.

  • isPanelInstance() = teste si c’est un liste fille
  • getInstanceName() = vous donnera le nom de l’instance en l’occurrence panel_ajax_<objectName>_<foreignkeyName>
  • getParentObject() = vous donnera dans certain hook l’objet parent pour accéder à ses valeurs

Exprimez clairement votre besoin sur ce que vous voulez faire dans la liste pour qu’on vous oriente plus précisément.

Merci pour ces premières infos.

J’aimerai que la liste soit visible si :

  • le but du courrier est “information” ou “signature”

et qu’elle reste visible dès le moment où il y a une personne, quelle que soit le but

Pour masquer dynamiquement les panels enfant, il faut ajouter le hook canReference à l’objet parent.

exemple :

@Override
public boolean canReference(String objectName, String fieldName) {
  if ("MyPanelObject".equals(objectName))
    return "information".equals(getFieldValue("myField"));   
  // default visibility
  return super.canReference(objectName, fieldName);
}

vous pouvez mettre des choses plus complexes dans le if, comme un count des objets liés.

https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md

Je ne suis pas sûr de bien comprendre :

MyPanelObject = le nom de l’objet enfant?

return "information" => information = code de la liste de valeur ?

@Override
public boolean canReference(String objectName, String fieldName) {
if (“CourrierDEJQBoCopie”.equals(objectName))
return “INF”.equals(getFieldValue(“CourrierDEJQBoCourrierButLibelle”));
// default visibility
return super.canReference(objectName, fieldName);
}

  • dans un canReference il y a 2 arguments : le nom de l’objet lié/fils/panel, et le nom du champ qui fait la jointure (foreignkey) car on peut avoir 2 liens différents vers un même objet fils à différencier
  • le getFieldValue renvoit la valeur stockée en base et non la valeur affichée (traduite dans le cas d’un enum, formattée dans le cas d’une date…)

Votre besoin est donc quelque chose comme ça mais je ne peux pas deviner votre paramétrage :

if ("CourrierDEJQBoCopie".equals(objectName)) {
  String but = getFieldValue("CourrierDEJQBoCourrierButLibelle");
  return "INF".equals(but) || "SIG".equals(but);
}

ça marche… j’ai pas tout de suite compris qu’il fallait enregistrer pour que je vois (ou pas :-) ) le résultat mais ça fonctionne.

Est-ce que je peux améliorer pour que la visibilité soit immédiate lorsque je change le but et pas seulement au moment de l’enregistrement?

Pour les interactions UI, il y a 2 façons de faire :

  1. Pour un cas simple comme celui là, il faut passer par une contrainte sur l’objet père :
  • type = Front
  • condition = true
  • impact sur la vue
    • Vue de CourrierDEJQBoCopie
    • Visible si expression javascript vraie : [VALUE:CourrierDEJQBoCourrierButLibelle]=="INF" || [VALUE:CourrierDEJQBoCourrierButLibelle]=="SIG"
    • on peut aussi utiliser l’alias obj et écrire obj.getFieldValue("CourrierDEJQBoCourrierButLibelle")=="INF" || obj.getFieldValue("CourrierDEJQBoCourrierButLibelle")=="SIG"
  1. ou bien pour les cas tordus : on peut coder/binder un “change” sur le champ dans le hook form.onload qui fait un show/hide du panel en question en fonction d’un truc compliqué qu’une contrainte ne sait pas faire.

    https://docs.simplicite.io/documentation/04-ui/responsive.md

J’étais bien parti sur le cas simple, mais je m’étais arrêté parce que je n’avais pas de vue CourrierDEJQBoCopie et que je n’ai pas réussi à en créer une pour cet objet.

J’ai contourné en mettant la vue liste fille qui a été créé par Simplicité dans une zone d’attributs de mon formulaire (objet père) et j’ai mis la contrainte sur la zone.

Par contre, je ne sais toujours pas créer une vue sur un objet :slight_smile:

Une vue est un template de zones pouvant contenir des objets (date, recherche, liste fille, external object…)

Au runtime, une liste fille simple (Link) génère une vue (View) par défaut avec une seule zone = Liste fille, il n’est pas nécessaire de la paramétrer.

En fait, dans votre cas au niveau de l’impact, il faut sélectionner comme cible/target le Link entre votre objet père et fils, et non une Vue puisqu’elle n’est pas paramétrée.

image

Mais bon on peut aussi créer une zone qui contient le Link, ça ajoute un niveau de container en plus afin de mettre plusieurs choses ensemble à rendre visible ou pas .

Et sinon pour créer une Vue à l’avenir :

C’est tout bon, merci pour votre aide.