Navigation

Le framework graphique permet aisément de naviguer d’un écran vers un autre, c’est un de ses grands avantages.

Cas concret de navigation WEB : on dispose d’une vue avec une liste d’éléments, des clients. Pour chaque client, il est possible de cliquer dessus pour l’éditer et modifier ses attributs.

Avec Process, la vue se fera sous forme de view et on peut gérer l’édition sous forme d’un form.

Par contre des questions se posent :

  • Comment, quand l’utilisateur cliquera sur une ligne de la vue, transmettre l’ID du client sélectionné au formulaire ?
  • Comment gérer qu’à la clôture du formulaire, l’utilisateur se retrouve automatiquement sur la vue (mise à jour avec les derniers attributs modifiés) ?

Ces problématiques sont gérées par le framework graphique, qui permet de poser un minimum de questions pendant les développements et surtout de conserver une cohérence ergonomique.

Le INavigateContext

Cet élément sert de “transitions” entre deux écrans. Ainsi, quand on souhaite naviguer d’un écran A vers un écran B, il suffit de passer un INavigateContext dans lequel on trouvera :

  • L’identifiant unique de l’écran cible (class et method)
  • D’éventuels paramètres (String ou tout autre objet)

Ainsi quand l’écran B se chargera, au moment de son initialisation, il récupérera cet INavigateContext et pourra s’initialiser en conséquences.

Exemple :

INavigateContext nav = new NavigateContext();
nav.setClassName("server");
nav.setMethodName("browse");
Navigator.getNavigator().navigate(nav);

Cet exemple permet par exemple de naviguer vers l’administration. La notion de Navigator utilisée est détaillée ci-dessous.

Le Navigator

Cet objet est l’image du navigateur client, côté serveur. Il s’agit d’une classe “à la limite” du SDK mais il sera rapidement remplacé par une classe SDK.

Il permet de récupérer des informations sur le contexte d’exécution et de gérer la navigation dans le framework graphique.

Le récupérer

Certaines classes, comme les providers d’écrans, ont une méthode getNavigator() disponible. Sinon, il est possible de le récupérer de n’importe quel endroit par Navigator.getNavigator().

Note

On ne peut récupérer un navigateur que si quelqu’un est présent derrière un poste client ! Si ce code est exécuté dans un agent, il renverra “null”.

Les différents modes de navigation

Sur l’objet Navigator, il est possible de déclencher un navigate vers le prochain écran (en fournissant bien sûr un INavigateContext).

Dans ce cas le système va “empiler” les écrans. Ainsi, on navigue de A vers B et, quand l’écran B se termine, le système renvoie automatiquement sur un rechargement de l’écran A.

Un exemple depuis Process : naviguer vers un écran fictif class = myForm et method = edit depuis un bouton posé en script dans un formulaire (on aurait très bien pu naviguer vers des écrans custom) :

<button labelid="LG_MY_TRANSLATION"><![CDATA[
  var ctx = new Packages.com.axemble.vdp.ui.framework.foundation.NavigateContext();
  ctx.setClassName("myForm");
  ctx.setMethodName("edit");
  navigator.navigate(ctx);
]]></button>

Forward

Sur l’objet Navigator, il est possible de déclencher un forward vers le prochain écran (en fournissant bien sûr un INavigateContext).

Dans ce cas, le système va vider la pile des écrans. Ainsi, si on navigue de A vers B; quand l’écran B se termine, on retourne à l’endroit où la navigation dans le framework a commencé : portail, easysite, …

Autres méthodes sur le Navigator

Méthode Commentaire
getCurrentScreen() Renvoie l’écran courant : CtlForm, CtlSheet, CtlWizard, …
popScreen() Dépile un écran dans la pile de navigation.

Déclenchement d’évènements

Même si on sort un peu ici du sujet de la navigation, il est intéressant de présenter la possibilité de déclencher via l’objet Navigator un évènement WEB utilisateur, par exemple un clic sur un bouton.

Exemple

On souhaite placer dans un formulaire un bouton supplémentaire qui réalise les traitements suivants :

  • Un traitement spécifique
  • Ensuite, le traitement exécuté sur le bouton “Enregistrer et fermer”

Au lieu d’essayer de coder le même comportement que ce bouton, il est possible, depuis le traitement du bouton, de simuler le clic sur le bouton “Enregistrer et fermer”.

Pour cela, il faut utiliser un IResourceController. Voici donc à quoi pourrait ressembler le code d’exécution sur le clic du bouton :

CtlButton buttonSaveAndClose = getResourceController().getTopButton("saveandclose");
getResourceController().execute(buttonSaveAndClose);

Manipulation des paramètres de requête

Il est fréquent de devoir lire la valeur d’un paramètre GET (plus souvent que POST). Il existe un plugin pour intégrer les processus dans les sites web.

Si une classe d’extension doit fonctionner dans les deux cas de figures (Site web et Processus) il faut faire comme suit :

@Override
public boolean onAfterLoad() {
	Navigator.getNavigator().getRootNavigator().getExecutionContext().getContext().getParameterString( key )
}

Sources :