Envoyer un message à l'utilisateur avant un export de liste

Bonjour,

Je suis dans un cas où j’aimerais lancer un traitement avant l’export d’une liste afin de vérifier que l’utilisateur n’essaie pas d’exporter 30 000 lignes en Excel par exemple. En fonction du résultat de ce traitement j’aimerais autoriser l’export ou le refuser + envoyer un message expliquant à l’utilisateur de réduire le nombre de lignes à exporter.

Afin de faire cela je voulais utiliser le hook preExport() mais celui-ci retourne void et non String, je ne peux donc pas renvoyer de message à l’utilisateur.

Existe-t-il un autre hook ou un autre moyen pour retourner un message à l’utilisateur avant de lancer l’export d’une liste (et de bloquer / ne pas continuer l’export initialement demandé) ?

Merci d’avance,

Florent

Ca n’existe pas, en V4 cela peut poser problème en mémoire mais pas en V5 qui bufferise l’export par paquet.

Effectivement il faudrait que le preExport puisse remonter

  • une erreur bloquante (trop de données)
  • ou un warning (message de confirmation non bloquant)

On va regarder.

D’accord, merci François :slight_smile:

En V4 en maintenance cela va être sensible car changer la signature de la méthode preExport ne pourra pas être compatible ascendant (passer de public void à public String est inenvisageable sur ce hook).

On va donc devoir ajouter une nouvelle méthode qui sera appelée avant l’export proprement dit, car les hooks getExportFileName / preExport / postExport sont déjà dédiés à d’autres traitements.

Voilà une nouvelle méthode qui pourrait répondre au besoin :

public String isExportAllowed(String mode, String media) throws FileSizeException

  • mode = full | list = toutes les données ou celles en liste
  • media = ServletTool.MEDIA_* = CSV | PDF | XLSX…

sur l’instance d’objet qui demande l’export, ce qui permet

  • de faire un getCount()
  • et de retourner le cas échéant un message (de confirmation) ou une exception (message bloquant)

Prévoyez vous de passer en V5, ou faudra-t-il backporter cette évolution en V4 quand elle sera disponible ?

Une autre solution sans évolution (mais sans message UI) serait de limiter la taille des exports à la source via un setSearchLimit(max) dans le preExport. En V5 l’utilisateur peut exporter beaucoup de données car cela ne le bloque pas au niveau UI (l’export s’affiche dans une “toast” d’export en bas à droite de l’écran).

Je comprend pour la signature de preExport(), la nouvelle méthode isExportAllowed() nous convient parfaitement.

Pour le moment il n’est pas prévu de passer en v5, il faudra donc backporter cette évolution en v4 s’il vous plait.

La solution setSeachLimit() ne nous convient pas car nous avons besoin d’informer l’utilisateur que son export est trop volumineux.

On va donc attendre la nouvelle méthode isExportAllowed(), merci ^^

L’évolution sera livrée dans la prochaine révision V5 et backportée en V4 P25.

Exemple de code pour remonter un message bloquant ou une confirmation :

@Override
public String isExportAllowed(String mode, String media, String rowId) {
	// List export by a non-admin user
	if (rowId==null && !getGrant().hasResponsibility("ONE_ADMIN_GROUP")) {
		long max = 5000;
		long n = getCount();
		if (n > max)
			return Message.formatSimpleError("Too many records to export:" + n + " (limited to "+max+")");
		if (n > max/5)
			return Message.formatSimpleWarning("Are you sure to export "+n+" records?");
	}
	return null; // ok
}
1 Like

Super, merci François :slight_smile:

Pouvez-vous nous communiquer la date à laquelle sera disponible la prochaine révision V4 P25 ?
Cette évolution est très attendu de notre côté.

Une révision de la 4.0 maintenance sera poussée ce WE, en même temps que la prochaine révision de la version 5 courante : 5.1.29

A noter :

Si votre liste permet la sélection de ligne pour l’export, il faudra revoir le code car getCount() n’en tient pas compte :

List<String> ids = canSelectRow() ? getSelectedIds() : null;
long n = ids==null ? getCount() : ids.size();