Action de masse sur lignes cochées

Explication sur l’API getSelectedIds d’un objet

  • retourne null pour indiquer qu’il faut agir sur toute la liste (donc pas uniquement sur getCurrentList qui n’est que la page en cours en mémoire, il faut donc faire l’action sur un this.search() non paginé)
  • retourne un vecteur vide = rien de sélectionné
  • retourne un vecteur non vide = une liste d’id des lignes sélectionnées (sur plusieurs pages)

exemple pour boucler sur tous les cas possibles:

var ids = this.getSelectedIds(); var list = ids || this.search(); for (var j=0; list && j<list.size(); j++) { var id = ids ? list.get(j) : list.get(j)[0]; if (this.select(id) && this.getStatus() == "ELIGIBLE" ) { this.setStatus("ACCEPTE"); this.save(); } }

j’ai un soucis avec cette solution : le this.search() récupére tous les objets or je voudrais qu’il ne récupère que ceux affichés.

dans mon cas, j’ai deux recherches dans ma vue : les objets de l’année, l’historique.

list.search() ramène tous les objets, historique compris, alors que je ne veux pas traiter les objets histoque

comment puis-je faire ?

Si rien n’est coché, la mise à jour doit normalement se faire sur toutes les pages donc le search() doit répondre au besoin (votre code doit retirer certains filtres avant ou travailler sur une instance autre que celle affichée), mais vous pouvez faire n’importe quel autre recherche au niveau du code (filters, searchspec…) ou alors changer d’API :

  • this.getCurrentList() = accesseur à la liste affichée
  • this.search(true) = fait la recherche paginée en base (ne ramène que la page active avec les filtres/searchspec de l’objet)
  • this.search() = fait la recherche non paginée en base sur l’instance (avec ses filtres/searchspec courant

les filtres ne sont pas supprimés par mon code
par contre, ils sont définis dans la vue. est-ce-que le pb ne viendrait pas de là ?

Je viens de faire un test et le filtre additionnel d’un item de vue est bien conservé dans l’objet si on sélectionne toute les pages + modifier en masse :

testé en 3.0 sur la vue ViewGrant du socle en n’affichant que les usr_lang='FRA' : si on met à jour toutes les adresses, seuls les utilisateurs de langue Française sont modifiés.

il faudrait ajouter des console.log un peu partout pour vérifier à quel moment le filtre disparaît (en entrée + sortie des hooks implémentés pre/postSearch + pre/postSelect). ou si ce n’est pas la bonne instance d’objet IHM qui travaille mais une instance temporaire ou autre.

exemple
console.log("DEBUG preSearch " + this.getInstanceName() + " filtre = " + this.getField("champ_annee").getFilter())

On peut revoir le code pour “forcer” le filtre en fonction de l’instance d’objet,
exemple de code :

var ids = this.getSelectedIds();
var list = null;

// Force des filtres sur l'instance home
if (!ids && this.getInstanceName()=="home_objetXXX") {
	this.getField("champ_annee").setFilter("2017");
	list = this.search();
}
else list = ids || this.search();

for (var j=0; list && j<list.size(); j++) {
	var id = ids ? list.get(j) : list.get(j)[0];
	if (this.select(id) && this.getStatus() == "ELIGIBLE" ) {
		this.setStatus("ACCEPTE");
		this.save();
	}
}