Dans le code du bundle UI, je vois que le problème se situe au niveau de la méthode mergeRowMeta
this.mergeRowMeta = function(obj, p) {
let fs = obj.item.meta.fields;
obj.item.meta.fields = obj.getFields().map(f=>{
let x = fs.find(x=>x.name == f.name);
return x ? $.extend({}, f, x) : $.extend({}, f);
}
);
obj.item.meta = $.extend({}, obj.metadata, obj.item.meta);
if (obj.item._index !== undefined)
p.index = obj.item._index;
}
J’ai bien les bonnes valeurs au niveau de obj.Field.listOfValues mais dans obj.item.metadata je n’en ai qu’une (celle qui a été enregistrée pour l’instance).
Est-ce un problème au niveau de mon URL d’action ?
Le back envoie les metatata de l’objet et uniquement le delta par ligne.
Donc cette méthode étend/complete les métadata de chaque record reçue du back pour limiter la volumétrie HTTP.
aucun des 2 objets n’existe.
La liste de valeur est-elle dynamique ? un modèle d’états ou sous contraintes ?
La liste de valeurs est peut être bonne/complète au niveau des metadata de l’objet (dans obj.metadata pour faire une recherche par exemple), mais elle peut être différente pour chaque ligne (obj.list[i].meta) pour respecter un state modèle du record en question.
Bref il faut peut être appeler le service metadata dans le CONTEXT_LIST avant de faire le displayList en mode édition pour remettre l’objet dans le bon état en back.
Ou utiliser un instance dédiée si l’instance main est déjà chargée dans un autre contexte.
(si inst n’est pas spécifié dans les paramètres du displayList, par défaut ce sera the_ajax_xxx)
Dans une liste éditable, il faut regarder chaque record dans la liste obj.list[i].meta.fields après le mergeRowMeta.
obj.item est le record courant, en général celui du formulaire.
Si la liste n’a aucun code front ou back, je ne vois pas du tout pourquoi sa définition pourrait changer. Là on dirait un state-model où seule la valeur initiale / par défaut est proposée en création.
On pourra essayer de reproduire de notre côté car l’action semble élémentaire, si tu ne trouves pas de solution.
D’accord alors obj.list[i].meta.fields contient toujours la liste avec une seule valeur, c’est dans getBusinessObject() qu’il est initialisé avec this._businessObjectsCache[objName + ":" + objInstName] qui n’a que la valeur en base dans listOfValues.
J’ai fini par trouver en comparant les url de mon action et du bouton Edit list au moment du call. Mon action envoie un contexte LIST alors que le bouton envoie UPDATE.
Avec cette URL j’ai bien ma liste de valeurs complète javascript:$ui.displayList(null, "RciDomFctApp",{nav:'add', fixedFilters: {"rciDomfctappAppId": rowId}, edit: "rows", inst: "panel_ajax_RciDomFctApp_rciDomfctappDomId", context: "5"}, null)
Bravo, pour plus de lisibilité au lieu de “5”, il faut plutôt utiliser la constante :
en V6 $app.CONTEXT_UPDATE
en V5 $ui.app.CONTEXT_UPDATE
Effectivement, dans le CONTEXT_LIST simple, chaque liste de valeurs sur chaque ligne ne contient que la valeur affichée pour optimiser la bande passante.