Methode IsMergeEnable

Methode IsMergeEnable
0
Tags: #<Tag:0x00007fec59268228>

Bonjour,

Je cherche à trouver un moyen d’interagir avec le merge afin de le rendre possible dans certains cas et interdit dans d’autre.
J’ai utilisé la fonction setMergeable(bool, bool) dans le postload mais j’ai besoin de rendre la merge possible ou non selon les lignes sélectionnées.

Avez-vous une idée de comment je peux faire cela car il ne me semble pas qu’il y ait de hook lors de la sélection d’une ligne.
Ou alors il me faudrait un hook isMergeEnable lorsque je clique sur le merge qui exécute mon code afin de vérifier si le merge est possible.

La sélection de ligne sert aussi aux autres actions de masse (suppression, l’export…)
donc on ne peut pas mettre un hook a ce niveau limité au merge.

Vous avez plutôt besoin d’un “initMerge” qui peut bloquer le traitement en fonction des ids à fusionner qu’on lui donne en paramètre avant affichage, mais ça n’existe pas.

Actuellement la seule façon de bloquer est au moment du save ou du delete en regardant le nom de l’instance qui travaille : merge_ajax_<objectname> et les selectedIds de l’objet de la liste.

Ou vous devez créer un objet (ou action qui filtre et active la fusion) qui ne liste que les objets fusionnable avec l’option “Merge”. et la liste générale ne peux pas fusionner.

On peut aussi à la limite surcharger la méthode front elle-même :

var oldDisplayMerge = $ui.displayMerge;
$ui.displayMerge = function(ctn, obj, options, cbk) {
	var p = options || {};
	p.ids = p.ids || obj.selectedIds; // array of ids to merge
	if ( /* ids mergeable... */ )
		oldDisplayMerge(ctn, obj, options, cbk);
	else
		$ui.alert("Pas possible...");
}

On va livrer l’évolution pour ajouter un controle bloquant via un nouveau hook :

boolean isMergeEnable(List<String> ids)

Il sera appelé 2 fois :

  • avant affichage du formulaire de merge par la UI (controle front bloquant mais contournable)
  • et donc aussi de nouveau au niveau du service merge en back (remontant un “access denied”)

Finalement le hook retournera un String (code d’erreur ou texte) au lieu d’un booléen car il faudra afficher un message d’erreur explicatif à l’utilisateur si les ids ne sont pas compatibles, un “access denied” n’était pas très compréhensible.

@Override
public String isMergeEnable(List<String> ids) {
    if ( /* rule1... */ )
       return "ERR_NOT_ALLOWED_RULE1";
    return null; // OK
}

(En V4 la UI du merge est encore en legacy, donc la solution proposée précédemment ne marchait pas).

1 Like