Champs et formulaires
Formulaire
- Champ modifiable :
iResourceController.setEditable("NomSystemeChamp")
- Champ obligatoire :
iResourceController.setMandatory()
- Champ “réactif” (aller-retour serveur) :
iResourceController.setThrowEvents()
Affichage dynamique
Dans un formulaire, il est possible de nommer un élément pour le manipuler grâce à du code : ligne, colonne, section, fragment (ensemble de lignes, de colonnes ou de sections).
Il suffit de lui ajouter un ‘id’ dans la description XML : <text id="bloc001">Ceci est un bloc</text>
On peut alors manipuler ce bloc en JavaScript pour l’afficher / le cacher : show("bloc001",false);
Cette fonction show est présente dans certains contextes (scripts de formulaire). Quand elle n’existe pas, on peut utiliser : iResourceController.showBodyBlock("bloc001",true);
Bloc HTML
Si un bloc est de type HTML (<html id="bloc001"></html>
), il est possible de ‘remplacer’ son contenu (HTML dynamique) : setHtml('bloc001', '<b>Gras</b>');
.
On peut également « évaluer » une variable qui contient du HTML : <html eval="VariableHTML" />
Masquer un bouton
//Masquer un bouton ‘système’
if(iResourceController.getButton( "header", iResourceController.TOP_CONTAINER ) != null) {
iResourceController.getButton( "header", iResourceController.TOP_CONTAINER ).setHidden( true );
}
//Noms des boutons standards
//saveAndClose, save, close, cancel, terminate, previous, next, header, history, abort, reminder, sendinformationmail, delegate_treatment, delegate_task, refuse_delegation, cancel_delegation
//Masquer un bouton d’action
var workflowButton = iResourceController.getButton( "Clôturer", iResourceController.BOTTOM_CONTAINER );
if ( workflowButton != null ) {
workflowButton.setHidden( true );
}
Remarque : pour le bouton d’action, il est mieux d’utiliser le nom système du bouton :
var contextSysadmin=iWorkflowModule.getContextByLogin( "sysadmin" );
var action = iWorkflowModule.getAction( contextSysadmin, iWorkflowInstance.getCurrentTaskInstance(contextSysadmin).getTask(), "NOM_SYSTEME_DU_BOUTON");
var workflowButton = iResourceController.getButton( action.getLabel(), iResourceController.BOTTOM_CONTAINER );
Champs standards
Lecture/écriture de champ
Pour lire le contenu d’un champ : getValue("fieldName");
Pour écrire dans un champ : setValue("fieldName",newValue);
Attention au respect du type de champ ! Certains champs doivent-être “forcés” pour respecter leur nature.
En cas de contexte particulier, préciser la ressource : iWorkflowInstance.getValue();
ou iLinkedResource.setValue(...);
.
Nombres
Pour écrire un nombre : setValue ("NombreDeRetours", new java.lang.Float(5));
Dates
Les dates, dans Process, sont des Timestamp au format java.util.Date
.
Mettre la date du jour
setValue("DateDeCloture", new java.util.Date());
Récupérer de la date de fin de la tâche courante
iTaskInstance.getMaxEndedDate( );
Ajouter 2 jours de délai à une étape
// calcul de 2 jours supplémentaires en millisecondes
var delayMillis = (2) * 24 * 60 * 60 * 1000;
// somme de la date et de l'heure actuelles et du délai de 2 jours puis transformation en type Date
var maxEndedDate = new java.util.Date( java.lang.System.currentTimeMillis() + delayMillis );
// affectation de la date de fin à la tâche courante
iTaskInstance.setMaxEndedDate( maxEndedDate );
Utilisation du Gregorian Calendar
Exemple en ajoutant 3 semaines à une date (attention, cette méthode est plus gourmande en ressources) :
//Création d’un calendar à parti du champ date
var calendar = new Packages.java.util.GregorianCalendar();
calendar.setTime(iTaskInstance.getMaxEndedDate( ));
//Ajout de 3 semaine au calendar
calendar.add(Packages.java.util.Calendar.WEEK_OF_YEAR, 3);
//Mise à jour du champ
setValue("DateTheorique ",new Packages.java.sql.Timestamp( calendar.getTimeInMillis() ));
Choisir le format d’affichage d’une date
//On définie le format d'affichage grâce à l'objet java
var formatdedate = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
if( maDate!=null ) {
return formatdedate.format( maDate );
}
Champs annuaire
Utilisateur
Récupérer les propriétés
//IUser correspond à l'utilisateur connecté
iUser.getEmail();
iUser.getLogin();
IUser.getFullName();
...
Au-delà des attributs, il existe différentes méthodes pour obtenir les propriétés du compte :
- IAttachment getAvatar();
- String getSignature();
- Date getLastPasswordUpdate();
- Date getLastVisitedDate();
- Date getCreatedDate();
- IUser getCreatedBy();
- Collection
getCollaborators(); - Collection
getLeaders(); - boolean isMemberOf( IGroup group, boolean recursive );
- boolean isMemberOf( IOperatorRole role, boolean recursive );
- boolean isSubscriber( IMailingList mailingList );
- Collection
getParents(); - Collection
getAllParents(); - boolean isEnable();
- void enable();
- void disable();
- boolean isConnectionAllowed();
- boolean isLocked();
- void unlock();
Alimentation
Si le champ est multivalué :
var personnes = new Packages.java.util.ArrayList();
personnes.add(iWorkflowModule.getUserByLogin("sysadmin"));
setValue("lst_participants",personnes);
Si le champ est monovalué :
setValue("lst_participants",iWorkflowModule.getUserByLogin("sysadmin"));
Groupe
Récupérer les membres
var membres = null;
var group = iWorkflowModule.getGroupByName("GroupSysName");
if (group!=null) {
membres = group.getAllMembers();
//Renvoi une collection de IUser
}
Appartenance à un groupe
var group = iWorkflowModule.getGroupByName("GroupSysName");
if ((group!=null && iUser.isMemberOf(group, true)) { //Le true permet d'être récursif ou non
alert("OK !");
} else {
alert("KO !");
}
Rôle
Alimentation
Identique à l’alimentation du champ utilisateur (les rôles sont multivalués).
Appartenance à un rôle
var role = iWorkflowModule.getOperatorRole( monContext, "Appli_Name", "Role1")
if ((role!=null && iUser.isMemberOf(role,true)) { //Le true permet d'être récursif ou non
alert("OK !");
} else {
alert("KO !");
}
Calculer un rôle
On utilise une ouverture de code ‘Back-Office’ disponible dans la rubrique développement d’une version de processus, onglet ‘Scripts de routage’ :
function onEvaluateOperators(workflowModule, taskInstance, list) {
//On vérifie que nous sommes à la bonne étape
if (taskInstance.getTask().getName() == "PLANNING") {
var iWorkflowInstance = taskInstance.getWorkflowInstance();
var auditeurs = iWorkflowInstance.getValue("rol_Auditeurs");
var responsable = iWorkflowInstance.getValue("rol_Redacteurs");
//On aliment la liste des opérateurs à partir de 2 champ rôles différents
if(auditeurs != null) {
list.addAll(auditeurs);
}
if(responsable != null) {
list.addAll(responsable);
}
}
}
Organisation
Parcours
//Récupération de l’organisation du créateur
var orga = iWorkflowInstance.getValue("sys_Creator").getOrganization();
//Récupération des organisations filles
var filles = orga.getOrganizations();
//Récupération de l’organisations parente
var parent = orga.getParent();
//Récupération des membres
var parent = orga.getMembers();
Attributs étendus
Récupération
//Alimentation à partir d’un attribut pour un utilisateur
//Idem pour les groupes, Organisations et localisations
var attValue = iUser.getExtendedAttributes().getValue("NomSytemeAttribut");
if(attValue != null) {
iWorkflowInstance.setValue("MonChamp" ,attValue);
}
Tableaux dynamiques
Parcours
//On alimente un champ du document à partir d’une ligne de tableau
var adresses = iWorkflowModule.getLinkedResources(iWorkflowInstance,"tab2_Adresses");
for( var it=adresses.iterator(); it.hasNext(); ) {
var adresse = it.next();
if (adresse.getValue("lst_tab2_Type").equals("Livraison")) {
setValue("txt_VilleLiv",adresse.getValue("txt_tab2_Ville"));
}
}
Création de ligne
//Création d'une liste de lignes
var arrResources = new Packages.java.util.ArrayList();
for ( var j = 0; j < rows.length; j++ ) {
// création d'une ligne, pour le tableau
var childResource = iWorkflowModule.createLinkedResource( iWorkflowInstance, "tab7_AvenantsDansMarche" );
// positionnement des valeurs
childResource.setValue( "txt_tab7_NumDevisCommit", rows[j][2]);
childResource.setValue( "txt_tab7_EtabliPar", rows[j][7]);
childResource.setValue( "txt_tab7_MontantODV", new java.lang.Float(rows[j][4]));
//Récupération d'une valeur du document père
childResource.setValue( "txt_tab7_OdreDeVente", iWorkflowInstance.getValue("txt_OrdreVente"));
// ajout de la ligne à la liste
arrResources.add( childResource );
}
// Ajout des lignes de la liste au tableau
iWorkflowInstance.addLinkedResources( arrResources );
Sous-processus
Accès
- Accéder au document père depuis le document fils (tableau de sous-processus) :
iWorkflowInstance.getParentInstance()
- Accéder au document père depuis le document fils (processus embarqué) :
iWorkflowInstance.getParentContainerWorkflowInstance()
- Accéder au document père depuis le tableau :
iWorkflowInstance.getValue()
( et nongetValue()
).
parcours
var dir = iWorkflowInstance.getValue("Direction");
//Le contexte est important, il permet de récupèrer les droits d'un utilisateur pour manipuler les objets SDK
var cont = iWorkflowModule.getContextByLogin("sysadmin");
//Récupération du réservoir
var cat = iWorkflowModule.getCatalog( cont , "DonneesIndicateurs", 4 );
//Récupération d'une table du réservoir
var tab = iWorkflowModule.getResourceDefinition( cont, cat, "Indicateurs" );
//Récupération des lignes de cette table
var all = iWorkflowModule.getResources( cont, tab );
//Parcour des lignes et création des lignes de tableau
var arrResources = new Packages.java.util.ArrayList();
for( var it=all.iterator(); it.hasNext(); ) {
//d correspond à la ligne courante
var d = it.next();
//On vérifie une valeur de la liste
if(d.getValue("DirectionConcernee").equals(dir)) {
var childResource = iWorkflowModule.createLinkedResource( iWorkflowInstance, "Indicateurs" );
var r = d.getValue("Responsable");
childResource.setValue( "Indicateur",d.getValue("LibelleIndicateur") );
childResource.setValue( "Responsable",r);
arrResources.add( childResource );
}
}
//Ajout des lignes au tableau
iWorkflowInstance.addLinkedResources( arrResources );
Sources :
- https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/RefScriptsChamps
- https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/RefScriptsFormulaires
- https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/RefScriptsDates
- https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/RefScriptsAnnuaire
- https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/RefScriptsPersonnes
- https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/RefScriptsRessources