Rafraîchir un formulaire suite à une mise à jour d'une liste fille (pillbox)

Bonjour,

Sur un formulaire d’objet, j’affiche en pillbox un objet lié par relation N,N.

Mon champ Full Online Process est calculé en fonction de cette relation (si j’ai au moins un élément, le champ est positionné à Oui).

J’ai mis le code qui positionne ce booléen dans le PostCreate et PreDelete de ma relation N,N.
Quand j’ajoute ou retire un élément de la pillbox, le booléen est bien mis à jour mais ce n’est pas visible car il n’y a pas de rafraîchissement du formulaire.
Y a-t-il un moyen de recharger le formulaire dans mon code Java ? Ou je dois forcément passer en Front ?

Version=4.0.P25
BuiltOn=2021-05-11 12:16 (revision f1e6126ade1a40961ade1593e9981d6c5f386392)

Merci !
Emmanuelle

Simplicité n’a pas moyen de savoir que les champs front sont liés en back.

Il faudrait un trigger en front pour signaler un “onchange” de la pillbox afin d’y coder quelque chose de spécifique (ici passer un booléen field.ui.val('1') si le contenu de la pillbox est > 0).

On va devoir ajouter un évènement change sur la UI sur la vue du composant, à date ça n’existe que sur un Field.

$ui.getUIField(ctn, obj, field).ui.on("change", function(e) { ... })

on aurait aussi

$ui.getUIView(ctn, obj, view).ui.on("change", function(e) { ... })

Je passe le besoin en feature request.

Sinon pour rafraichir un objet, il suffit de reloader la navigation courante.
$ui.getNav().reload(); ou refaire le $ui.displayForm
mais cela peut faire perdre la saisie en cours ou demander de quitter sans sauver…

1 Like

En attendant l’évolution qui sera faite en V5.

En V4, il est toujours possible d’ajouter un handler sur ajout/suppression d’un item de pillbox.
Simplicité émet des events sur les objets créés/modifiés/supprimés.
Il suffit d’ajouter un handler sur le composant qui a besoin d’être notifié d’une mise à jour (comme le modeler par exemple).

Dans le hook front form.onload quand votre formulaire est dessiné, il faut ajouter un listener au div de la vue qui contient la pillbox :

var v = $ui.getUIView(ctn, obj, "<objectNN>;<fkname>");
v && v.div.addClass("js-notify").on("ui.notify", function(e, notif) {
	e && e.stopPropagation();
	if (notif) {
		var o = notif.object, // relation NN créée ou supprimée
			id = notif.rowId, // son row_id
			field = $ui.getUIField(ctn, obj, "myFieldBool"); // champ à modifier
		if (notif.type=="create") {
			field.ui.val("1").change();
		}
		else if (notif.type=="update") {
			// nothing to do
		}
		else if (notif.type=="delete") {
			// TODO count ajax ?
			// local count pillbox <li>
			field.ui.val($("li[data-id]",v.div).length>0 ? "1" : "0").change();
		}
	}
});
1 Like