Table des matières
Parfois, dans un contexte donné, on a besoin de n’afficher que certaines données dans un champ. Cela est possible avec les actions-attrs.
Affichage d’une liste en fonction de la valeur d’un autre champ
<form name="commande-form" model="com.axelor.decath.db.Commande" title="Créer une commande" >
<panel name="general">
<field name="libelle" widget="html"/>
<spacer />
<field name="service" onChange="action-attrs-service-fournisseur"/>
<field name="fournisseur" />
</panel>
<panel name="produit">
<field name="article" colSpan="12" canNew="true"/>
</panel>
</form>
<grid model="com.axelor.decath.db.Commande" title="Commandes" name="commande-grid" >
<field name="article" target-name="nom"/>
<field name="libelle"/>
</grid>
<action-attrs name="action-attrs-service-fournisseur">
<attribute name="domain" for="fournisseur"
expr="eval: "self.id IN (${service?.fournisseurList?.collect{it.id}.join(',')})""/>
</action-attrs>
Explication du code :
Lorsque l’utilisateur remplit le champ “Service”, l’attribut onChange
appelle l’action-attrs action-attrs-service-fournisseur
. Elle contient un attribut dont le fonctionnement est le suivant :
name="domain" for="fournisseur"
⇒ Application d’un filtre sur le champ fournisseur (sur la liste du champ fournisseur).expr="eval: "self.id IN (${service?.fournisseurList?.collect{it.id}.join(',')})""
⇒ Il faut lire cette expression de la droite vers la gauche (la partie après le IN d’abord). On parcoure la liste des fournisseurs du service en question (fournisseurList
) en itérant sur chaque élément (it
) en allant chercher son ID (id
) et on créer une liste avec les ID séparés par des virgules. Ensuite, on vérifie si le fournisseur est présent dans cette liste. S’il l’est, il sera proposé dans le champ “Fournisseur”.
Rendu dans l’application :
Si le service sélectionné est “Course à pied” :
Si le service sélectionné est “Football” :