Sur un objet, j’ai affiché deux fois la même pillbox. Je souhaite proposer une saisie en deux temps, l’objet référencé ayant deux niveaux.
Pillbox 1 : niveau 1
Pillbox 2 : les niveaux 2 correspondant aux niveaux 1 sélectionnés
J’ai donc un filtre à ajouter dans le initRefSelect et dans le preSearch.
Mon problème est que je ne sais pas identifier de quelle pillbox j’arrive dans ces deux hook.
Est-il possible de spécifier une instance particulière pour chaque pillbox ?
Je rebondis sur mon ticket car je pense que mon paramétrage n’était pas une bonne idée, j’ai donc fait deux liens différents avec deux N,N différentes.
La réponse concernant le fait de définir un nom d’instance custom m’intéresse néanmoins.
Je me retrouve du coup avec une autre question, est-il possible de filtrer une pillbox en fonction du contenu d’une autre pillbox quand on est en création ? Le mapping de relation fonctionne-t-il dans ce cas ? Sinon est-ce que passer par un paramètre de session est une bonne idée ?
Effectivement quand on ne s’en sort pas avec les noms d’instance, il est préférable de créer des objets logiques différents (qui peuvent accéder à la même table).
Le chainage de sélections en pillbox n’est pas un pattern prévu par paramétrage.
Il faut donc stocker quelque part dans l’objet ou la session, la première sélection.
En création le back n’est pas encore au courant, c’est la UI qui mémorise les relations pillbox à créer dans le paramètre “tmppb” de l’instance d’objet.
let local = obj.localParameter("tmppb"), // les pillbox par ligne de création
ids = [],
list = local ? local[$app.DEFAULT_ROW_ID] : null; // les pillbox du formulaire de création
list?.forEach(x =>
/* use x.object, x.parent.field, x.childfk, x.id ... */
x.childfk=="xxx" && ids.push(x.id)
)
Il faut donc envoyer au back les données de cette liste niveau 1 (les id ?), pour que search niveau 2 filtre ce qu’il faut.
Le trigger front est le change sur la vue de la relation présentée en pillbox.
let linkName = "childObject;foreignkey";
let v = $ui.getUIView(ctn, obj, linkName);
v && v.ui.change(() => {
$ui.view.showLoading(); // bloquer les accès UI au pillbox 2
// TODO get some ids from tmppb
$app.setSysParam("MY_PILLBOX_LEVEL1_IDS", ids.join(';'))
.then(_ => $ui.view.hideLoading());
});
Ensuite la back pourra facilement récupérer ce paramètre n’importe où.
// preSearch object niveau 2
String p = getGrant().getParameter("MY_PILLBOX_LEVEL1_IDS");
if (p!=null) { p.split(";")... setFilter/setSearchSpec... }
Il faudra penser à retirer ce paramètre ou à le réinitialiser à chaque création.
Désolée, j’ai encore une demande car je dois aussi supprimer les éléments de PILLBOX2 quand on retire un élément “mappé” de PILLBOX1.
En back, c’est fait, mais en front je ne sais pas trop comment détecter que le “change” sur PILLBOX1 est un remove ? Et comment appeler le remove des étiquettes correspondantes dans PILLBOX2 …
En cas de changement de 1, je viderai 2 tout simplement (c’est le cas pour des listes liées)
L’utilisateur qui change d’avis recommence à saisir 1 et 2, sinon tu vas te retrouver avec des combinatoires de merge indémerdables.
Vider = retirer les pillbox affichée en front + les retirer de tmppb.
Y a-t-il un moyen de détecter si le change est un remove ou un add ? Je ne veux pas vider 2 sauvagement si l’utilisateur a juste ajouté une valeur dans 1.
Mais pour l’instant je pense que je vais juste nettoyer dans le back en refusant de créer les élements de 2 qui n’ont pas de parent dans le 1.
Il faudrait que la div 2 fasse le ménage quand un objet 1 est créé ou retiré.
Le trigger arrivera à tous les composants qui ont une classe js-notify et un handler ui.notify