Champs JSON

Bonjour,

J’utilise les champs de modèle personnalisés de attrs.
Tout fonctionne bien quand on se limite à utiliser ces champs directement via le modèle parent.
Mais le mapping ne fonctionne pas lorsque l’on souhaite accéder à ces champs via une relation.

Exemple:

Champs personnalisés sur Product:

  • custom1
  • custom2

Ce qui fonctionne

model=“com.axelor.apps.base.db.Product”

  • Requette JPQL dans les domain des vues

self.custom1 = … and self.custom2 like …

  • Champ dans une grid ou un formulaire

<field name="attrs.custom1" width="80"/>

Ce qui ne fonctionne pas

model=“com.axelor.apps.production.db.ManufOrder”

  • Requette JPQL dans les domain des vues

self.product.code like … and self.product.attrs.custom1 = …

(on peut contourner le problème avec jsonb_extract_path_text(self.product.attrs,‘custom1’) = …

  • Champ dans une grid ou un formulaire

<field name="product.attrs.custom1" width="80"/>

Pour les JPQL on corrige en modifiant JsonFunctio.java si l’on utilise attrs dans la chemin du champ

  @Override
  public String toString() {
    String _attrs = attribute;
    String _field = field;

    if(_attrs.contains("attrs.")) {
      _attrs = _attrs.replace("attrs.", "");
      _field = _field + ".attrs";
    }
    final StringBuilder builder =
        new StringBuilder()
            .append("json_extract_")
            .append(type)
            .append("(")
            .append("self.")
            .append(_field);
    for (String item : _attrs.split("\\.")) {
      builder.append(", ").append("'").append(item).append("'");
    }
    return builder.append(")").toString();
  }
}

Je n’ai pas réussi contourner le problème simplement dans les vues, si on permet au Selector de prendre en compte le champ Query.java ligne 732

  if (json != null && json.isJson()) {
    this.names.add(func.getField() + "." + func.getAttribute());
    selects.add(func.toString());
  } else if (json != null && json.isReference()) {
    this.names.add(func.getField() + "." + func.getAttribute());
    selects.add(func.toString());
  }

c’est au niveau du code JS que cela coince… widget.slickgrid.js ligne 432

  "json": function(field, value) {
    if (!value || !field.jsonFields || field.jsonFields.length === 0) return "";

Je ne suis donc pas allé plus avant…

Pensez-vous prendre en charge ces cas d’utilisation des champs personnalisés dans les futures versions de l’ADK?