InitRefSelect et Bouton associer

Bonjour,

Je suis en Simplicité® version 4.0.P09b

J’utilise un initRefSelect pour filtrer une liste d’enregistrements par rapport à une valeur de champs et ça marche.
Je souhaite afficher le bouton associer à l’utilisateur et pouvoir avoir le même filtre que pour la création “unitaire”, est ce que c’est possible? et comment?

En vous remerciant par avance.
Zouhair

Hello,

Je n’ai pas eu de réponse sur mon post. Peut-être que ce n’est pas très clair :face_with_raised_eyebrow:

Le cas échéant, comment vous expliquer mieux ce que je cherche à faire.

Cordialement,
Zouhair

La hook initRefSelect ne sert pas à filtrer l’associate mais le popup de sélection unitaire.

Sur l’IHM legacy, le bouton “Associate” utilise l’instance “ref_” donc il faut mettre le code de filtrage sur cette instance car également utilisée par le popup de sélection.

Exemple, pour filtrer l’objet lié sur avec la valeur d’un champ du père :

myObject.preSearch = function() {
  if (this.isRefInstance()) {
    var parent = this.getParentObject();
    if (parent)
      this.setFieldFilter("childfield", parent.getFieldValue("parentfield"));
  }
}

L’associate n’est pas encore implémenté en V4 responsive, mais c’est dans le backlog.

Bonsoir,

Je reviens sur ce post parce que j’ai testé le bout de code :
En cliquant sur associer dans le panel d’une relation d’un objet :

  • ça rentre, dans le presearch,
  • ça rentre dans la boucle avec la condition this.isRefInstance()
  • mais par contre il ne rentre pas dans boucle if(parent). En mettant un console.log pour m’afficher parent, il me renvoie null donc je ne peux pas filtrer sur le bouton associer.

Est ce que j’ai faux quelque part et donc il me manque quelque chose (j’ai strictement copié ton code)? ou est ce qu’il y a quelque chose à corriger sur la plateforme?

Cordialement,
Zouhair

Le parent est valorisé pour les instances “Panel” (liste associée à un parent direct), il ne l’ai peut être pas pour les références d’une association.

Il faut donc passer le contexte d’une autre façon. En général on passe par

  • des variables globales stockée dans les droits de session
  • ou locales stockées dans l’instance d’objet

Par exemple à l’ouverture du formulaire parent, on positionne une variable de contexte dans le initUpdate pour mémoriser des infos sur l’objet ouvert :

myParentObject.initUpdate = function() {
   this.getGrant().setParameter("myParentId", this.getRowId());
   this.getGrant().setParameter("myParentType", this.getFieldValue("fieldType"));
}

et dans le preSearch de l’objet de l’association, on peut récupérer ce contexte :

myChildObject.preSearch = function() {
  if (this.isRefInstance()) {
    var parentId = this.getGrant().getParameter("myParentId");
    if (parentId) this.setFieldFilter("childfield", parentId);
    var parentType = this.getGrant().getParameter("myParentType");
    if (parentType ) this.setFieldFilter("childType", parentType);
  }
}

On peut ainsi mémoriser toute variable durant la session.

est-ce-que vous avez des exemples de SCRIPT permettant de mémoriser les infos de l’objet ouvert en création quand la saisie change.

je m’explique, dans mon objet réservation, l’utilisateur saisi une date de début et une date de fin.
je voudrais mémoriser ces dates dans des variables afin de les utiliser dans le preSearch d’un objet associé.

Pour échanger des variables entre objets le mieux est de valoriser un parametre système (soit niveau objet soit niveau session=grant)

Et une bonne option pour échanger des données complexes est de le valoriser avec un JSONObject/JSONArray

1 Like

est-ce-qu’il y a de la doc la dessus ?

Si on parle bien de scripts Rhino (serveur) il y a qques exemples dans ce document: https://www.simplicite.io/resources/documentation/01-core/advanced-code-examples.md

non, ça ne semble pas correspondre à mon pb.

J’ai un objet réservation. dans cet objet, l’utilisateur saisi une date de début et une date de fin.
ensuite, il doit sélectionner une ressource (objet lié). je veux passer à ressource les dates saisies mais pas encore enregistrée afin d’afficher que les ressources disponibles entre les 2 dates.

je dois donc affecter des paramètres en fonction du changement des champs date.

Le link mapping est un mécanisme standard qui permet de filtrer/restreindre une selection en fonction de valeurs déjà saisies dans le formulaire. Je pense que c’est juste ça dont vous avez besoin dans votre cas.

Cf. au niveau du Link vous avez un onglet Link mapping

Il y a un exemple sur la Démo à jour sur le Link demoCtcOrdId qui, au niveau des contacts, restreint les commandes sélectionnables en fonction du client sélectionné

je vais regarder mais je ne pense pas que ce soit ça.
je veux restreindre les ressources en fonction des dates déjà réservées.
je dois donc faire une requete en fonction de 2 dates saisies

Je pense que ça doit le faire avec des link mappings, @Francois peux tu donner ton avis car je sais que tu as travaillé sur les link mappings recemment

Si ça ne le fait pas avec les link mappings simples il est toujours possible de setter un (ou plusieurs) paramètre(s) avec vos dates sur on change via Ajax et de vous en servir pour faire un filtrage sur votre objet lié.

Cf. https://www.simplicite.io/resources/documentation/03-apis/ajax-api.md au § “System parameters” pour le call Ajax pour setter un paramètre de session, et cf. https://www.simplicite.io/resources/documentation/04-ui/responsive.md pour la manière de coder un hook client on change sur vos champs date.

Un LinkMap sur une relation ne peut que faire qu’un égalité avec un champ ou une valeur fixe.

  • Soit vous avez besoin des paramétres en back / rhino pour un usage ultérieur (par exemple dans le postValidate du save pour revérfier la regle de gestion, ajouter des filtres dans le preSearch du popup…)

Dans ce cas, il faut binder un “onchange” sur les champs nécessaires pour les notifier au serveur avant ouverture du popup (réponse de @david)

  • Soit c’est juste un aide à la saisie au niveau de la liste des référence, alors il faut juste ajouter un hook client sur le “beforeload(ctn,obj)” du popup donc de l’instance “ref” de l’objet référencé :

Avant affichage de la liste popup, lire les valeurs du formulaire et forcer les filters de l’objet lié dans le hook beforeload (les dates passeront dans les paramètres de recherche du popup).

Il faudra donc nécessairement que l’objet référencé comporte ces champs (non persistants ou masqué) pour pouvoir les récuperer côté back dans le preSearch / forcer une searchspec ou des setFilters spécifiques.

blinder un onchange ?

“binder” = attacher un handler à un event relatif à un composant UI (comme un champ)

Exemple:

ui.getUIField(ctn, obj, "myField").ui.on("change", function(evt) { ...}

Il y a des exemples détaillés dans https://www.simplicite.io/resources/documentation/04-ui/responsive.md

j’arrive à récupérer la valeur qui a changé.
maintenant, je voudrais la garder comme paramètre système, afin de l’utiliser dans un hook.

je fais :
fieldDtDeb.ui.on(“change”, function() {
var datedeb = fieldDtDeb.ui.val();

                app.setSysParam(function(value) {}, "RESADTDEB", dateDeb, false);

et ça ne fonctionne pas.

j’ai cherché dans la doc, je ne trouve pas comment faire

c’est bon, ça fonctionne !

j’avais fait une faute de frappe …

NB: Pour plus de clarté (mais seulement sur la branche master pour le moment) on a ajouté des alias get/setParameter au niveau grant, on peut donc désormais écrire:

app.grant.setParameter(function() { console.log("MYPARAM set!"); }, "MYPARAM", value);

et:

app.grant.getParameter(function(value) { console.log("MYPARAM = " + value); }, "MYPARAM");

Ce sera poussé sur la branche release dans les jours qui viennent