Récupérer la valeur d'un champ ramené en front sans enregistrer

Tags: #<Tag:0x00007fe29428d1f0>

Bonjour,

Je voudrais savoir s’il était possible de récupérer en front la valeur d’un champ ramené avant même de cliquer sur « Enregistrer » ?
En effet, quand je sélectionne un locataire (objet lié) dans l’écran ci-dessous :


je voudrais tout de suite savoir quel est son type de personne pour afficher une valeur personnalisée à la date de fin en fonction justement de son type de personne. Or, je trouve que ma commande :

var tenantTypePerson = ui.getUIField(ctn, obj, "leaseTenantImmoTenantId.tenantTypePerson");
var typePerson = tenantTypePerson.ui.val();

Ne ramène rien, alors que la valeur est bien affichée au niveau du formulaire.

Si j’enregistre le formulaire, au prochain passage le type personne est bien ramené.

Merci d’avance pour votre aide.
Abed.

Bonjour,

Au niveau code, c’est bien comme ça que la UI récupère les valeurs lors du save, donc je doute que ce soit un pb de val().

Est-ce le champ dupliqué suite à votre autre post ?
ou il doit y avoir un pb au niveau du nom complet de votre champ ?
que dit la console ? dans quel contexte est appelé ce code ? est ce le bon container ctn et obj ? vous appelez ce code avant l’affichage du champ ? sur onchange ?

  • au debugger/inspector html : vous pouvez voir le nom du champ dans le <div class="field" data-field="...fullname...">
  • faire du pur JS : vous pouvez aussi accéder au select directement avec l’id du select. Le code sera moins évolutif si vous changez de rendering pour le champ (ex radio buttons).

Merci @francois pour votre retour.

Il n’y a pas de duplication de champs dans cet objet.

Voici le code que j’utilise :

// ImmoLeaseTenant front side hook
(function(ui) {	
	if (!ui) return;
	var app = ui.getAjax();
	// Hook called by each object instance
	Simplicite.UI.hooks.ImmoLeaseTenant = function(o, cbk) {
		try {
			console.log("ImmoLeaseTenant hooks loading...");
			var p = o.locals.ui;
			if (p && o.isMainInstance()) {
				p.form.onload = function(ctn, obj) {
				var leaseTenantImmoTenantId = ui.getUIField(ctn, obj, "leaseTenantImmoTenantId");
                leaseTenantImmoTenantId.ui.on("change", function() {
                	var leaseTenantEndDt = ui.getUIField(ctn, obj, "leaseTenantEndDt");
					var tenantEndDt = leaseTenantEndDt.ui.val();
                	if (tenantEndDt == '') { // Si la date de fin n'est pas encore renseignée :
                		// On récupère la date de fin du bail
						var leaseEndDate = ui.getUIField(ctn, obj, "leaseTenantImmoLeaseId.leaseEndDate");
						var leaseEndDt = leaseEndDate.ui.val();
                		// Quel type de bail ?
						var leaseType = ui.getUIField(ctn, obj, "leaseTenantImmoLeaseId.leaseType");
						var type = leaseType.ui.val();
    					if ((type == "10") || type == "100") {  // 3,6,9  ou Box
    						// on met la date de fin du bail : 
	  						ui.getUIField(ctn, obj, "leaseTenantEndDt").ui.val(leaseEndDt);
    					}
						var loc = leaseTenantImmoTenantId.ui.val();
console.log("RowId du locataire sélectionné = " + loc);   
	                	var tenantTypePerson = ui.getUIField(ctn, obj, "leaseTenantImmoTenantId.tenantTypePerson");
						var typePerson = tenantTypePerson.ui.val();
console.log("typePerson = " + typePerson);
						if (typePerson == 'PM') {
		                	var legEntityFamily = ui.getUIField(ctn, obj, "leaseTenantImmoTenantId.tenantImmoLegEntityid.legEntityFamily");
							var family = legEntityFamily.ui.val();
console.log(" family = " + family);
						}
                	}
                });
				};
			}
		}
		catch(e) {
			app.error("Error in Simplicite.UI.hooks.ImmoLeaseTenant: " + e.message);
		}
		finally {
			console.log("ImmoLeaseTenant hooks loaded.");
			cbk && cbk(); // final callback
		}
	};
})(window.$ui);

Ce code est appelé dans le onchange de la clé technique leaseTenantImmoTenantId, donc à chaque fois qu’on change de locataire.

Dans l’exemple ci-dessous, j’ai sélectionné un locataire :

Avant même de faire un save, je vois déjà dans le formulaire la valeur du type personne associé à ce locataire, or, dans la console, la valeur n’est pas encore connue.

Bizarrement, si je resélectionne le locataire (toujours sans faire de save), cette fois-ci, la variable est alimentée :

Mon pb est là, car c’est avant de faire le save, et dès la sélection d’un locataire, que j’ai besoin de savoir son type.

Je ne sais pas si c’est clair.

Je pense avoir compris, le code ui.val() est appelé trop tôt, le champ n’a pas encore été alimenté au retour du popup de sélection d’une référence.

Chaque change est appelé un à un : l’id est valorisé puis change en premier, puis le code locataire, puis le type de personne… en fonction de l’ordre des champs joints dans votre objet.

A noter : même si un champ ne change pas de valeur au retour du popup (même type par exemple) , tous les change sont tout de même appelés car on change bien “toute” la référence.

La seconde fois il est bien valorisé dans votre code mais avec la valeur de la précédente sélection.

Il faut à mon avis positionner votre change sur le type de personne directement = sur le champ qui change de valeur et pas depuis un autre dont il dépend, ou alors plus simple, sur le dernier champ qui change au retour du popup : tous les champs précédents auront été valorisés.

De notre côté, il faudrait que Simplicité valorise tout, avant de déclencher les trigger change sur chaque champ, actuellement il boucle sur les champs ramenés en faisant un val(v).change() sur chaque champ.
Je passe votre besoin en feature request. ce ne devrait pas être long à livrer.

Merci @francois pour ce retour clair et détaillé.
Juste une question, en attendant que cette évolution soit livrée, comment savoir quel est le dernier champ qui change sur un formulaire ?
Merci encore.

Le dernier dans la liste des champs ramenés dans vos attributs d’objet.
On va livrer aujourd’hui ce petit changement, donc ce sera pas nécessaire.