Affichage en vignette pour un faible nombre de ligne

Bonjour,

Je voudrais que l’affichage d’une liste d’un objet soit en vignette dès que le nombre de lignes est inférieur à 10.

Voici ce que je fais :

ImmoProperty = (function(ui) {
    if (!ui) return; // Do nothing on legacy UI
    var app = ui.getAjax();
    Simplicite.UI.hooks.ImmoProperty = function(o, cbk) {
        try {
			o.locals.ui.list.preload = function(ctn, obj) {
				// Paramétrage pour les vignettes :        	
                property = app.getBusinessObject("ImmoProperty"); // Nb de biens total
                var len = property.list.length;
                console.log("preload property.list.length = " + len);
				// Paramétrage pour les vignette :        	
				if (o.isMainInstance()) {
					var p = o.locals.ui; // copy of Globals				
					if (len < 10) {
		                p.list.minified = true; // Afficher en vignette
					} else p.list.minified = false; // Ne pas afficher en vignette
	            } 
			};	

Cela fonctionne seulement si je clique 2 fois sur l’objet dans le menu à gauche. Je m’explique, si je clique sur un statut pour lequel moins de 10 lignes seront affichées, la première fois l’affichage conserve son état précédent, càd avant le select de ce statut, si c’est en liste, ça reste en liste, si c’est en vignette, ça reste en vignette et ceci indépendamment de nombre de ligne dans le statut sélectionné. Si je reclique sur le même statut, cette fois-ci la condition (< 10) s’applique.

Je voudrais que dès qu’on clique sur un statut, et en fonction de nombre de ligne qui vont s’afficher, la condition s’applique directement : Si < 10 => vignette, sinon, liste.

J’ai essayé de mettre le code dans le preload, cela a le même effet.

Un autre besoin, si on est sur une liste > 10 lignes, mais qu’on applique un filtre qui réduit la liste à < 10, je voudrais savoir s’il est possible de basculer directement en vignette.

Merci d’avance pour votre aide.

Abed

Bonjour,

Le preLoad s’exécute après la recherche et avant affichage, donc la taille de la liste est normalement correcte à ce stade. Un hook prend en paramètre l’instance d’objet affiché, donc inutile d’aller le chercher ailleurs via getBusinessObject si c’est lui-même. De plus une liste paginée à 10 lignes n’est pas le total de la requête, il faut regarder le “count”, pas la taille de la page ramenée.

Essayez avec le code suivant :

o.locals.ui.list.preload = function(ctn, obj) {
	var p = obj.locals.ui;
	// Afficher la liste principale en vignette si < 10 
	p.list.minified = obj.isMainInstance() && obj.count < 10; 
};

Merci @Francois.

J’ai essayé le code proposé mais le comportement reste le même, à savoir qu’il faut cliquer 2 fois afin que l’affichage soit cohérant avec le count de l’objet. Un seul clic ne change pas l’affichage.

J’ai fait le test effectivement au niveau du preLoad, c’est trop tard de changer les options de l’objet qui sont devenues des options de la liste qui va s’afficher. Il faut donc changer directement les paramètres d’affichage dans l’objet “params” défini par le controleur en fonction de l’objet en mémoire, des métadata et de l’age du capitaine… pour dire si le minified demandé est possible ou pas (forcé sur un petit écran…) :

	p.list.preload = function(ctn, obj, params) {
		console.log("MyObjectcount = " + obj.count);
		params.minified = obj.isMainInstance() && obj.count < 10; 
	};

Donc c’est à vous de voir sur mobile votre regle est possible ou pas, tester la taille de l’écran, etc.