Copier non fonctionnel dans un objet qui hérite avec implémentation du getTargetObject

Le bouton “Copier” ne fonctionne pas dans un objet B qui hérite d’un objet A et lorsque l’on implémente la méthode getTargetObject dans l’objet B pour orienter vers l’objet père A.

exemple du code de l’objet B :

public class SuMesLots extends SuLot {
	private static final long serialVersionUID = 1L;
	
	@Override
	public String[] getTargetObject(String rowId, String[] row) {
		
//		ObjectDB obj = getGrant().getMainObject("SuLot");
//		if (row==null && !Tool.isEmpty(rowId)) obj.select(rowId);
		if (isNew() || isCopied()) rowId = "0";
		String target = "SuLot";
	    String[] t = ScriptInterpreter.getStringArray(3);
	    t[0] = target; // target object
	    t[1] = "the_ajax_"+target; // main target instance
	    t[2] = rowId; // target row Id (same in this inheritance case)
	    //AppLog.info(getClass(), "Redirection ", "t = "+ "objet : " + t[0] + "," + rowId, getGrant());

	    return t;
	}
}

Simplicité 4.0 patch level P25 Built on 2021-08-31 22:38

A priori le CopyId n’est pas correctement passé dans le contexte du target object.

Généralement le getTargetObject est positionné sur l’objet parent pour rediriger vers un héritier (sous- typé), et non pas de l’enfant (ici MesLots) vers le parent (Lot).

On doit être dans un cas non géré, on va faire des tests.

Le snippet actuel du getTargetObject force toute création à rester sur l’objet qui le demande, c’est à dire fait un return null si le rowId=“0” : car en général, on crée ou on copie forcement la même nature d’objet où on se trouve = pas de redirect pour aller créer autre chose.

Le cas d’une recopie n’était pas implémenté, c’est donc une feature requests qui peut avoir du sens dans votre design pattern (héritier qui filtre/bannette métier + retour au parent en cas de copy).

  • une petite évolution sera livrée au prochain build pour permettre la copy + redirect
  • il faudra revoir ensuite le code de votre getTargetObject pour propager le CopyId vers l’objet cible :
@Override
public String[] getTargetObject(String rowId, String[] row) {
	if (isCopied())
		rowId = getCopyId(); // propagate the Id to copy, not "0"
	return new String[] {
		"SuLot",
		"the_ajax_SuLot",
		rowId
	}; 
}
1 Like

Sujet clos, c’est fonctionnel. Solution