J’ai réalisé une librairie Excel à la région pour exporter les données rapidement - apporter une modularité simple et factoriser le code pour le rendre plus lisible. Lorsqu’on utilise une méthode Java pour une publication, j’ai vu qu’on pouvait utiliser la fonction getSelectedIds() pour récupérer les ids des lignes sélectionnés, cela fonctionne très bien pour moi. Maintenant, j’aimerais ajouter un tri côté client - imaginons un simple tri alphabétique sur un champ - dois-je réaliser le tri en dur (en java) à partir des ids - et sélectionner chaque id pour faire mon tri ? ou je peux utiliser quelque chose comme : this.getField(“XXX”).setOrder(10) ?
Voici la fonction jusqu’à ce jour :
Etat du code
//Côté serveur
public List<String> getSelectedIds(ObjectDB obj) {
// Recupération des ids
List<String> ids = new ArrayList<>();
if (Tool.isEmpty(obj.getSelectedIds())) {
List<String[]> rows = new ArrayList<>();
ObjectFieldSearch[] filters = obj.getFilters(); // Keep filters
obj.setFilters(filters);
rows = obj.search(false);
for (String[] row : rows) {
ids.add(row[0].toString());
}
} else {
ids = obj.getSelectedIds();
}
return ids;
}
//Côté client
List<String> ids = excelUtils.getSelectedIds(this);
// Ajout d'un tri ici
De ce que je sais, search/getSelectedIds renvoie une liste triée - en fonction des tris réalisés côté client.
Mais pour le coup, lorsque je récupère la liste de mes ids - j’aimerais changer cela pour effectuer 3 tris alphabétiques (1 par colonne) sur l’export et pour ça, je voulais savoir si je pouvais utiliser une fonction qui va permettre de re-trier ma liste des ids côté back - ou s’il faut le faire manuellement ?
Dans ce cas, vous pouvez implémenter dans le postLoad un mécanisme qui définit les ordres de tri selon une instance particulère :
@Override
public void postLoad() {
if (getInstanceName().contains("MyCustomExcelInstance")) {
resetOrders(); // retirer les tris configurés
getField("fieldToOrder1").setOrder(1);
getField("fieldToOrder2").setOrder(2);
getField("fieldToOrder3").setOrder(3);
}
}
Et adapter votre méthode getSelectedIds
ObjectDB obj = getGrant().getObject("MyCustomExcelInstance", "MyObject");
obj.resetFilters();
if (Tool.isEmpty(getSelectedIds())) {
if (this.isFiltered(true)) { // true dans le cas d'une liste liée (filtre sur le parent id)
this.getFields().stream()
.filter(ObjectField::isFiltered)
// ajouter à l'instance custom les filtres UI
.forEach(f -> obj.getField(f.getName()).setFilter(f.getFilter()));
}
} else {
obj.setFieldFilter("row_id", " in (" + String.join(", ", this.getSelectedIds()) + ")");
}
List<String[]> rows = obj.search(false);
List<String> ids = rows.stream().map(row -> row[0]).toList()
Le problème avec ça, c’est que obj.getFilters() contient aussi les ordres de tri.
Super, je vais tester ça et je reviens vers vous si besoin, je fermerai le ticket quand ça sera bon de mon côté. Merci pour le retour en tout cas, je ne connaissais pas cette utilisation des instances.
J’ai enfin pu revenir sur le sujet ! Pour le coup, la solution fonctionne à merveille, en passant par une instance dédiée, je peux réaliser toutes les actions nécessaires.
En complément, je me permet d’ajouter le lien vers un autre ticket - qui m’a bien aidé dans cette problématique :