Affichage conditionel a partir d'un champ de type Décimal

Bonjour,

J’ai une contrainte qui permet d’afficher ou non les deux champs de droite si le montant est superieur à 0 et les cacher sinon.

Lorsque je saisi 50, le champ est transformé en 50,00; les deux champs de droite restent cachée alors qu’il devraient s’afficher. Si je saisie 50 de nouveau, cette fois il s’affichent bien.
De même que lorsque je saisi 0, il restent affiché, mais si je saisi de nouveau 0, il sont bien cachés.

Est-ce qu’il y a un problème avec le reformatage en décimal ou bien est-ce la méthode de mes impacts qui est mal codée ?

Voila les log en fonction des saisies:
Saisie 1 : 50, log: null
Saisie 2 : 50, log: 50
Saisie 3 : 0, log: 50
Saisie 3 : 0, log: 0

(function(){  
	var montant = [VALUE:namExaMontant];
	console.log("montant "+ montant);
	if(montant > 0){
	return true;
	}else{
	return false;
	}
})()

Bonjour,

Quelle est la version de Simplicité ?

Merci

La version est récente 5.0.29

Votre contrainte fonctionne correctement.
Les 2 attributs Pourcentage sont bien visibles/invisibles au changement de valeur du Montant.
C’est dans le changement de la valeur du Montant que se déclenche la propriété Visible/Non visible des attributs.

D’accord chez moi elle ne fonctionne pas donc voilà quelques élément supplémentaires :

  • La contrainte est de type front-end uniquement avec expression “true”. Le code présenté ci dessus est dans les deux impacts qui concernent ces deux champs.

De ce que j’ai pu constater, à chaque fois que je modifie, il prend l’ancienne valeur et pas la nouvelle

J’ai aussi testé une alternative qui traite les montants null/vides mais sans succès:

(function(){  
	var montant = [VALUE:namExaMontant];
	console.log("montant "+ montant);
	if(montant !== null && montant !== '' && montant > 0){
	return true;
	}else{
	return false;
	}
})()

Pour agir sur le front il faut effectivement

  • soit avoir des contraintes front
  • soit coder le hook p.form.onload dans la ressource SCRIPT de type javascript de votre objet

Le code suivant permet de rendre visible/invisible 2 attributs en fonction de la saisie de la valeur du montant

p.form.onload = function(ctn, obj) {
				var field = ui.getUIField(ctn, obj, "trnMontant");
                 field.ui.on("input change", function() {
                     var f1 = ui.getUIField(ctn, obj, "trnPourcent1");
                     var f2 = ui.getUIField(ctn, obj, "trnPourcent2");
                     var v=field.ui.val(); 
                     f1.ui.visible(v==0 ? Simplicite.VIS_HIDDEN: Simplicite.VIS_BOTH);
                     f2.ui.visible(v==0 ? Simplicite.VIS_HIDDEN: Simplicite.VIS_BOTH);
                    
                 });	
				};

Dans le cas de la contrainte c’est lorsque l’attribut montant perd le focus que les attributs pourcentages sont visibles/invisibles.

Je suis passé par le javascript en supprimant toutes les contraintes, même problème. Le script est déclenché 2 fois pour chaque changement. j’ai saisi 5, puis 0.

// NamExamen front side hook
(function(ui) {
	if (!ui) return;
	var app = ui.getAjax();
	// Hook called by each object instance
	Simplicite.UI.hooks.NamExamen = function(o, cbk) {
		try {
			console.log("NamExamen hooks loading...");
			var p = o.locals.ui;
			if (p && o.isMainInstance()) {
				console.log("Javascript");
				p.form.onload = function(ctn, obj) {
				var f1 = ui.getUIField(ctn, obj, "xx");
                var f2 = ui.getUIField(ctn, obj, "xx");
	             
	             // Hide the fields at loading
				f1.ui.visible(Simplicite.VIS_HIDDEN);
	            f2.ui.visible(Simplicite.VIS_HIDDEN);
	         
				var field = ui.getUIField(ctn, obj, "montant");
				
                 field.ui.on("input change", function() {
                 	 console.log("Change");
                     
                     var v=field.ui.val(); 
                     console.log(v);
                     f1.ui.visible(v==0 ? Simplicite.VIS_HIDDEN: Simplicite.VIS_FORM);
                     f2.ui.visible(v==0 ? Simplicite.VIS_HIDDEN: Simplicite.VIS_FORM);
                    
                 });	
				};
			}
		}
		catch(e) {
			app.error("Error in Simplicite.UI.hooks.NamExamen: " + e.message);
		}
		finally {
			console.log("NamExamen hooks loaded.");
			cbk && cbk(); // final callback
		}
	};
})(window.$ui);

Bonjour,

Avec une version à jour je ne reproduis pas votre problème sur chrome et firefox.

p.form.onload = function(ctn, obj) {
				var field = ui.getUIField(ctn, obj, "trnMontant");
                 field.ui.on("input change", function() {
                     var f1 = ui.getUIField(ctn, obj, "trnPourcent1");
                     var f2 = ui.getUIField(ctn, obj, "trnPourcent2");
                     var v=field.ui.val(); 
                     console.log("val="+v);
                     f1.ui.visible(v==null||v==0 ? Simplicite.VIS_HIDDEN: Simplicite.VIS_BOTH);
                     f2.ui.visible(v==null||v==0 ? Simplicite.VIS_HIDDEN: Simplicite.VIS_BOTH);
                    
                 });	
				};
  • input = trigger à chaque caractère saisi
  • change = quand on sort du champ (enter, tab, blur…)

Donc forcement quand on tape 5 + enter ou tab, ça déclenche 1 “input” et 1 “change”.
C’est le fonctionnement nominal d’un champ input.
Mettez l’un l’autre suivant votre besoin mais pas les 2 évènements.

Une contrainte se déclenche qu’au “change”. Donc si le besoin est de déclencher un trigger à chaque frappe clavier, il faut donc coder comme l’indique @nathalie et utiliser “input” ou “keyup”.

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.