je me lance dans le développement d’une nouvelle application et j’ai un besoin en terme de processus métier.
L’application doit permettre de préparer l’envoie de sms à une liste de contacts. Pour cela, je souhaiterai que le processus métier soit composé de 5 étapes :
1 - un écran de recherche des contacts selon des critères à saisir par l’utilisateur
2 - Après sélection des contacts répondant aux critères, affichage d’un écran pour la rédaction du message
3 - Après validation du message, l’affichage d’un écran récapitulatif : nb de contacts + message + boutons d’action.
J’ai donc créé un processus métier.
Concernant l’écran de recherche, comment est-il possible de faire une mise en forme plus sympa ?
Concernant l’écran de sélection de contacts, je peux seulement les sélectionner un par un alors que je voudrais pouvoir tout sélectionner d’un seul clique … il peut y en avoir bcp … ça sera ingérable autrement.
Les fonctions avancées de recherche / tri / sélection multiple / paginée sont au niveau d’une liste.
Il est donc à mon sens plus simple :
d’utiliser la liste des contacts avec un bouton d’action de liste
cette action peut afficher un badge qui compte le nombre de lignes sélectionnées (comme un export ou une suppression en masse)
L’action a un écran de confirmation avec un champ texte “crb_texte_sms”
côté serveur il faut récupérer le texte dans la méthode qui implémente l’action
CrbContact.envoyerSMS = function(params) {
var text = params ? params.get("crb_texte_sms") : null;
if (text) {
var ids = this.getSelectedIds();
for (...)
}
}
L’écran de confirmation d’une action peut avoir plusieurs champs simples texte, enum, date… le média et le type de message doivent alors être des enums. On ne peut pas y utiliser un objet métier avec des règles complexes (type contrainte ou hook de validation), mais on pourra l’envisager par la suite si l’UX va dans ce sens.
Au niveau du screenflow, les activités séparent volontairement l’écran de recherche et la liste résultante pour guider pas à pas l’utilisateur :
recherche : à date c’est juste une suite de champs car ils sont sensés être peu nombreux car indexés, on peut regarder l’impact d’avoir un template de recherche sur l’activité, ou juste faire un formulaire générique plus joli dans un premier temps
multi-sélection en liste : c’est vrai que ça manque si la recherche est très prédictive et qu’on veut tout sélectionner d’un coup ou une seule page
Si c’est juste ça qui manque à votre process, on peut prévoir de faire ces évolutions asap.
Concernant mon processus métier, j’ai un soucis avec ma liste de contacts. j’ai les activités suivantes :
begin => type = début
msgCreat => type =créer. ça fonctionne bien. j’affiche le formulaire de saisie du message et ça l’enregistre
ContactSearch => type=rechercher. écran de recherche des contacts
ContactSelect => type=sélectionner multiple. écran de sélection des contacts rechercher. la aussi, pas de pb, les filtres fonctionnent.
mon soucis est après. je voudrais enregistrer la liste de mes contacts sélectionnées dans mon message. pour cela j’ai un objet CrbAleContactMsg pour enregistrer la référence du contact et celle du message.
Je termine juste les évolutions sur les activités, ce sera en master demain.
Recherche : prend en compte la propriété de recherche des champs + ajoute un bouton “étendre” s’il y a trop de champ
Sélection : possibilité de cliquer sur la ligne (et pas que sur le radio/checkbox) + affichage en jaune des lignes sélectionnées
Multiple : affichage d’un badge dans le chemin de fer de l’activité qui compte les lignes sélectionnées entre les pages + bouton pour sélectionner toutes les pages | la page | ou tout desélectioner.
A tester sur votre cas métier.
L’activité contient les row_id sélectionnés à récupérer dans le hook de validation pour en faire ce qu’on veut.
exemple en java
@Override
public void postValidate(ActivityFile context)
{
String step = context.getActivity().getStep();
if ("MyChoiceActivity".equals(step))
{
// All selected row IDs
DataFile df = context.getDataFile("Field","row_id",true);
String[] ids = df!=null ? df.getValues() : null;
for (int i=0; ids!=null && i<ids.length; i++) ...
}
}
exemple en rhino
myProcess.postValidate = function(context)
{
var step = context.getActivity().getStep();
if ("MyChoiceActivity" == step)
{
// All selected row IDs
var df = context.getDataFile("Field","row_id",true);
var ids = df!=null ? df.getValues() : null;
for (var i=0; ids && i<ids.length; i++) ...
}
}
ok, super. je regarde tout ça demain et je te fais un retour.
merci pour l’info de script postValidate. en fouillant dans le trainning j’avais trouvé un peu de code mais pas suffisamment. je vais aussi voir ça demain.
j’ai commencé les tests :
écran de recherche : la présentation est plus sympa, plus ergonomique.
sélection multiple : c’est exactement ce que je voulais. tests à pousser avec une liste très longue. le bagde sur le chemin de fer est très utile.
par contre, le clique dans la case à cocher ne fonctionne pas. il faut cliquer sur la ligne.
j’ai réussi à faire fonctionner l’enregistrement de la sélection multiple. j’ai un problème d’affichage à la fin mais je pense que ça vient de mon processus.
voilà pour mes premières impressions. je ferais des tests plus poussés d’ici ce soir
Merci pour ton retour,
je vais regarder où est passé le filtre visiblement toujours en back mais perdu en front…
Sinon :
il faut retirer le droit “Annuler / Cancel” sur les activités pour retirer le bouton “Passer” si celui-ci n’a pas de sens
le champ énuméré “Type” du premier écran est en “select multiple” pas très pratique / il faudrait le passer en cases à cocher plus ergonomique pour l’utilisateur, sauf s’il peut n’en choisir qu’un seul il faut mettre un select simple dans les propriétés du champ.
Excusez moi de vous déranger une fois de plus, mais comment faites vous pour regrouper vos données en fonction de leur antenne ?
J’aimerai faire pareil dans mon projet
Le regroupement en liste est piloté par l’ordre de regroupement au niveau de l’objet field.
Ex dans le démo (à jour) on regroupe les produits par code founisseur: