Librairie NodeJs / React / Afficher liste liée

Bonjour,

J’aimerais savoir s’il y’a une possibilité de récupérer une liste liée à une liste énuméré provenant du même objet métier, en utilisant la librairie npm de Simplicité.

Exemple :
1ere liste (document type)
2ème liste (document sub type)

Lorsque je sélectionne la valeur “30”, sur ma 2ème liste je souhaiterais voir apparaître la liste filtrée pour cette valeur. Plus précisément pouvoir récupérer la liste liée “DOCPROPERTYSUBTYPE”

Pour le moment, j’ai uniquement réussi à récupérer ces deux listes de façon globale à partir de ce code :

const immoDocProperty = await app.getBusinessObject('ImmoDocProperty');
const immoDocPropertyMeta = await immoDocProperty.getMetaData();

const typeList = await immoDocProperty.getField("DocPropertyImmoDocId__documentType").listOfValues;    
const subTypeList = await immoDocProperty.getField("DocPropertyImmoDocId__documentSubType").listOfValues;

Merci d’avance pour votre aide.
Paul

Vous devez récupérer les meta données pour avoir les listes de valeurs contextualisées, ex:

  1. get sur le record A (cf. BusinessObject - Documentation)
  2. getmetadata (cf. BusinessObject - Documentation) => les listes de valeurs sont contextualisées pour le record A

Je n’ai pas de problème à récupérer les métadonnées pour un objet en particulier.

Je ne comprends pas pourquoi je dois :

1/ get sur le record A ( qui correspond à récupérer les informations de seulement une entrée dans l’objet métier )

Or ce que je souhaite, c’est récupérer toute la liste liée à la valeur 30 de la première liste documentType (cf capture 1 sur le 1er post)

const subTypeList = await immoDocProperty.getField("DocPropertyImmoDocId__documentSubType").listOfValues;

Cette ligne me donne bien une liste de valeur globale, mais je ne vois pas comment je peux récupérer cette liste qui sera filtré en fonction de valeur de la 1ère liste énuméré.

Est-ce que cela est plus compréhensible ?

Merci
Paul

Voici un exemple concret de ce qu’on a dans la version UI :

Dans la liste “Menu concerné” la valeur “Bien” fait ressortir une liste de valeurs associé à “Bien”

ci-dessous, une autre liste de valeurs est associé à la valeur “Société”

Sachant que la deuxième liste appartient à la meme liste de valeurs que la précédente.

Bonjour @david,

Ce que @Paul_S essaie de faire, c’est que depuis un site externe, afficher une liste de valeur A, pour laquelle, chaque valeur possède une liste liée.

Si l’utilisateur sélectionne une valeur A1 ( Bien par exemple), on affiche dans le champ de la liste B, la liste B1 qui est liée à la valeur A1 (DOCPROPERTYSUBTYPE qui est liée à Bien). Et ainsi de suite.

Une solution serait d’aller piocher dans l’objet système FieldListLink pour justement récupérer la liste B1 qui est liée au code A1.

Est-ce qu’il n’y aurait pas une autre solution pour répondre à ce besoin ? avec éventuellement un exemple svp ?

Merci d’avance.

Abed.

Non il n’est pas souhaitable de donner accès à un frontend directement sur des objets système.

Je vais regarder comment ceci est implémenté dans la UI standard. Ce sont les mêmes couches d’API qui sont wrappées dans la lib npm.

La UI utilise la couche Ajax qui implémente le service “getlinkedlist”

/**
 * Gets a linked list of an enum field
 * @param field Enum field name
 * @param value Selected value(s) separated with ";"
 * @param target Linked field
 * @param lov Current linked list name
 * @param callback <code>function(target, new list \{name, items\})</code>
 * @param params Optional async and error handler
 * @param params.all Get all linked values when value is empty
 * @function
 */
object.getLinkedList(field, value, target, lov, callback, params)

Surement à wrapper sur les autres interfaces Node/React.
L’option “all:true” permet de lister toutes les valeurs liées possibles = utilisé dans le choix d’une recherche sans présélectionner la liste mère.

OK ce service n’est pas encore wrappée dans la lib npm.
Je m’en occupe. Je vous tiens au courant.

Ca a été ajouté dans la version 2.2.18 de la lib npm, cf. getFieldLinkedList

Exemple d’usage

const list = await ctc.getFieldLinkedList('myField', 'myLinkedField', 'MYCODE1');
for (const item of list.items)
	console.log(`${item.code} (${item.value})`);

Merci @david
@Paul_S reviendra vers vous si besoin.

Merci pour votre réponse,

J’ai fait le test avec ce code ci-dessous et j’obtiens un résultat vide. est-ce normal ?

const immoDocument = await app.getBusinessObject('immoDocument');
const immoDocumentMeta = await immoDocument.getMetaData();
const list = await immoDocument.getFieldLinkedList("documentType","documentSubType","30"); 

console.log(list);

Voici ce que j’obtiens :

Déjà le await devant app.getBusinessObject() n’a pas de sens => cette methode ne renvoie pas une Promise.

Sinon vous n’obtenez pas un résultat “vide” mais un résultat qui indique qu’il n’ya pas de liste liée pour la combinaison des field, linked field et code que vous passez.

Sans plus d’informations sur votre paramétrage je ne peux pas vous aider.

Test fait sur la démo (en 5.1 à jour):

console.log(await app.getBusinessObject('DemoContact').getFieldLinkedList('demoCtcType', 'demoCtcSubType', 'INF'));

resultat:

{
  name: 'DEMO_CTC_SUBTYPE_INF',
  items: [
    { code: '', value: '', enabled: true },
    { code: 'ORDSTATUS', value: 'Order status', enabled: true },
    { code: 'PRDINFO', value: 'Information produit', enabled: true }
  ]
}

C’est ok, j’obtiens la bonne liste.

Voici le code que j’ai utilisé :

console.log(await app.getBusinessObject('immoDocument').getFieldLinkedList('documentType', 'documentSubType', 30));

Dans notre paramétrage, le code qui est passé est un nombre entier et non un string, ce qui a faussé mon résultat.

Merci encore pour votre aide.

Paul

Je ne vois pas raison que ça change quelque chose de passer 30 ou '30'

Le code passé à la fonction getFieldLinkedList est passé en attribut HTTP (via encodeURIComponent) lors de l’appel API et à l’arrivée ce sera donc vu comme un string (car de toute façon coté serveur les codes d’une liste de valeur sont des strings).

encodeURIComponent(30) ou encodeURIComponent('30') donnent la même chose = dans les deux cas un string qui contient 30

Votre pb devait être ailleurs

Oui, effectivement je viens de faire le test. Cela fonctionne bien en passant “30”.

J’ai du avoir une erreur de saisie sur le nom du champ.

Merci.

Ou alors un effet inattendu de votre await devant votre app.getBusinessObject(...); cf. une de mes réponse précédente…

Oui c’est possible, je vais le retirer partout ou celui ci est présent devant un app.getBusinessObject

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.