[Action] Map vide sur la version 5.1.39

Bonjour,

Depuis la mise à jour en 5.1.39 on constate que les map des actions avec champs de confirmation nous retourne des map vide.
Sur la version 5.1.30, on ne rencontre pas ce soucis.
Il a-t-il eu une régression sur cette partie ou est-ce que le fonctionnement a changé ?
Merci.

Bonjour,

Je ne reproduis pas sur une instance à jour

Version=5.1.39
BuiltOn=2022-04-13 18:24
Git=release/e929cbae23c2441b4cb0a66b9501de0159ee7c92

Cas testé :

  • Méthode increaseStock sur l’application de Démo Prise de commandes :
public String increaseStock(Map<String, String> params) {
	AppLog.info("PARAM INCREMENT : " + params.get(INCREMENT_FIELDNAME), getGrant());
	
	int q = Tool.parseInt(params.get(INCREMENT_FIELDNAME), DEFAULT_INCREMENT);
	if (q > 0) {
		ObjectField s = getField(STOCK_FIELDNAME);
		s.setValue(s.getInt(0) + q);
		save();
		// Log
		AppLog.info("Stock for " + getFieldValue(REFERENCE_FIELDNAME) + " is now " + s.getValue(), getGrant());
		// User message
		return Message.formatSimpleInfo("DEMO_PRD_STOCK_INCREASED:" + s.getValue());
	} else {
		return Message.formatSimpleError("DEMO_PRD_ERR_INCREMENT:" + q);
	}
}

Bonjour Alistair,

En effet, la map n’est pas vide dans ce cas.

Par contre, si on ajoute le champ demoPrdIncrement utilisé dans la pop-up de confirmation dans le formulaire de DemoProduct, la map passé à la méthode increaseStock() est vide.

D’ailleurs, sans faire de modifications au module de démo, en ajoutant juste un AppLog pour voir le contenu de la map, on constate ce problème sur le champ demoPrdStock utilisé dans le formulaire et dans la pop-up :

Bonjour Florent,

Effectivement dans le cas où le champ est un attribut de l’objet métier, tu peux simplement faire un getFieldValue()

De cette façon ?

getFieldValue() ne me retourne pas la valeur du champ :

Pardon, je t’ai dit une bêtise.

Tu peux en fait passer l’action en paramètre de la méthode appelée par le bouton :

public String increaseStock(Action action){
	String lang = getGrant().getLang();
	AppLog.info("CONFIRM FIELD : " + action.getConfirmField(lang, "myField").getValue(), getGrant());
	return null;
}

Toujours pas ^^ je ne récupère pas les valeurs.

De ton côté ça fonctionne ?

En v.5.1.38 je récupérais bien les valeurs dans la map (pour la version de la méthode avec map en paramétre et non Action). Est-ce que le fonctionnement a changé en v5.1.39 ?

Ca a fonctionné après vidage du cache, oui.

Code :

public String increaseStock(Action action){
	AppLog.info("increaseStock method with Action parameter", getGrant());
	String lang = getGrant().getLang();
	AppLog.info("CONFIRM FIELD : " + action.getConfirmField(lang, INCREMENT_FIELDNAME).getValue(), getGrant());
	return null;
}

Log :

Ok, mais on est toujours dans le même cas qu’au début du post.

Ça fonctionne uniquement quand le champ de confirmation n’est pas utilisé dans le formulaire.
Or, de mon côté le champ est utilisé dans le formulaire et dans la pop-up de confirmation afin de répondre à ce besoin :

Le formulaire est complété successivement par plusieurs personnes, à la fin un valideur ouvre le formulaire, clique sur une action “Transmettre”. Cette action contient plusieurs champs de confirmation qui sont aussi présent dans le formulaire afin qu’il puisse vérifier une dernière fois le contenu et le modifier si besoin (on autorise la modification dans l’initAction). Une fois que le valideur confirm l’action, on a besoin de récupérer les nouvelles valeurs entrées dans la pop-up de confirmation dans la méthode back. En version 5.1.38 on récupérait ces informations dans la Map passée en paramètre de la méthode (fonctionne aussi si on met Action en paramètre). En 5.1.39 je n’arrive plus à récupérer les nouvelles valeurs, que ca soit via la Map ou l’objet Action. Dans cette version, je ne peux récupérer le contenu des champs de confirmation que s’ils ne sont pas utilisés dans le formulaire (ce qui est le cas pour le champ increment dans le module Demo, mais pas pour le champ stock par exemple).

Est-ce que ce comportement serait dû à cette modification indiqué dans la release note de la 5.1.39 : "Reset confirm fields before initAction" ?

Je me permets d’apporter quelques précisions, oui il y a eu une régression qui a été corrigée dans cette version :

  • les champs de confirmation issus de l’objet sont en lecture et ne sont pas des paramètres de l’action
  • seuls les champs propres à l’action sont éditables et postés.

L’idée est de séparer ce qui relève de ce qu’on confirme de ce qu’on précise en plus. Si un champ de l’objet à confirmer donc en lecture est encore modifiable, alors il faudrait reconfirmer ce qu’on a modifié… si on ne confirme pas, on revient sur le formulaire.

Vous êtes dans un cas hybride qui par erreur fonctionnait avant = vouloir contrôler et modifier un champ de l’objet dans l’action.

Votre besoin est donc une feature request = permettre de modifier un champ de l’objet si on le force en écriture dans l’initAction.

Pour vous en sortir à date, il faut créer un champ de confirmation dédié dans l’action, et dans l’initAction, il suffit de forcer sa valeur par défaut (setDefaultValue) avec celle de l’objet. Ce champ sera alors envoyé au back (mais personne n’aura confirmé la modification qui peut s’affranchir du coup des règles du formulaire).

L’évolution sera poussée sur la version 5.1.40 pour laisser passer tous les champs d’action modifiables, donc mêmes ceux de l’objet rendus modifiables dans l’initAction.

En attendant que ce soit livré si c’est urgent, vous pouvez créer un champ comme décrit dans la réponse précédente.

Bonjour François,

D’accord, je comprend mieux, c’est vrai que l’usage que l’on fait de la pop-up de confirmation est détournée de sa fonction première dans certains cas :sweat_smile:

Jusqu’à présent je pensais que le fait de pouvoir rendre les champs modifiables depuis l’initAction et de récupérer les nouvelles valeurs dans la map était “normal” afin de pouvoir surcharger le comportement de cette pop-up de confirmation avec champs d’action.

Je vais attendre la version 5.1.40, merci François.