Filtrer les utilisateurs en fonction d'un tag

30/10/2018

Introduction

Dans l’article suivant, nous allons implémenter un filtre des utilisateurs à l’assignation et un filtre sur un tag de type Utilisateur.

Les scripts utilisent des fonctionnalités disponibles à partir de la version 2.3.8.

Cas d’usage

Dans l’exemple ci-dessous, nous utiliserons le template GEC.

  • Le scope est configuré avec un tag Service destinataire positionné sur les tâches, qui correspond à une équipe.
  • Lors d’une assignation, on récupère le(s) service(s) présent(s) sur les tâches sur lesquelles l’action est effectuée. Les utilisateurs disponibles sont ceux qui possèdent l’ensemble des services dans leurs équipes. Si aucun service n’est récupéré, on ne filtre pas les utilisateurs.
  • Même chose au clic sur la réponse Informer sur une tâche A traiter

Le scope contient 2 utilisateurs avec les équipes suivantes :

  • Sophie Martin appartient aux équipes Commerce et Juridique
  • Max Dupond appartient à l’équipe Commerce


L’objectif est d’arriver aux résultats suivants :

Cas de test Résultats
Assignation d’une tâche du service Juridique Sophie Martin est présente dans la liste des utilisateurs, pas Max Dupond
Assignation d’une tâche du service Commerce Sophie Martin et Max Dupond sont présents dans la liste des utilisateurs
Assignation de 2 tâches, services Commerce et Juridique Sophie Martin est présente dans la liste des utilisateurs, pas Max Dupond

Le script userFilter.js est utilisé pour arriver à ce résultat.

Les variables du template dont on a besoin sont définies en début de script :

var SERVICE_TAG_NAME = "ServiceDestinataire";
var RECEIVER_TAG_NAME = "DestinatairePourInfo";
var INFORM_RESPONSE_ID = "Inform";
var USER_FILTER_PLUGIN_NAME = "UserFilterPlugin";

Service REST

Le service FlowerDocs utilisé dans les deux cas est disponible à l’adresse ./plugins/rest/profiles/<profiles>/users/.

Assignation

On utilise la fonction registerAssigneeProvider décrite dans la documentation.

var userAPI = JSAPI.get().getUserAPI();
userAPI.registerAssigneeProvider(function(tasks, userEntry, callback){
...
}

On récupère dans un premier temps la liste des services présents sur la ou les tâche(s) :

var tasksServices = getTasksService(tasks);

function getTasksService(tasks)
{
    var tasksServices = [];
	tasks.forEach(task => {
        var servicesValue = task.getTagValues(SERVICE_TAG_NAME);
        if(servicesValue !== null){
            tasksServices.push(servicesValue);
        }
    });
    return tasksServices;
}

Si aucun service n’est trouvé, on utilise la fonction na() pour ne pas filtrer les résultats

 var tasksServices = getTasksService(tasks);
    console.debug("Will filter assignee with profiles " + tasksServices);
    //If no services found on tasks, we do not filter assignee
    if(tasksServices.length === 0){
        callback.na();
    }

Si on a récupéré au moins un service sur les tâches, on passe la liste des utilisateurs retournés par le service REST au callback :

else
{
    $.get(buildUserServiceUrl(tasksServices, userEntry), function(data){
        var users = new Array();
        $.each(data, function(key, value) {
            users.push(User.fromJSON(JSON.stringify(value)));
        });
        callback.provide(users);
    });
}
    
function buildUserServiceUrl(profiles, key)
{
    return "./plugins/rest/profiles/" + profiles.toString() + "/users/" + key;
}

Filtre d’un tag utilisateur

On filtre la liste des utilisateurs présents au clic sur la réponse Informer présente sur les tâches au statut A traiter.



Pour filtrer les tags de type utilisateur, nous allons utiliser un lookup de type plugin comme décrit dans la documentation.


On commence par construire un objet de type lookup qui, lorsqu’il est appelé, appelle le service rest avec les profils récupérés sur les tâches. Comme précédemment, les utilisateurs retournés sont passés en entrée du callback.

function buildLookupPlugin(tasks){
    var tasksServices = getTasksService(reasonedAnswerAPI.getTasks());
    var lookupPlugin = new LookupPlugin();
    
    lookupPlugin.setLookupHandler(function(fieldName, fieldValue, callback){
        $.get(buildUserServiceUrl(tasksServices, fieldValue),function(data){
            var users = new Array();
            $.each(data, function(key, value) {
                var user = new LookupResult();
                user.setValue(value.displayName);
                user.setName(value.id.value);
                users.push(user);
            });
            callback.onSuccess(users);
        });	
    });
    
    return lookupPlugin;
}

Puis on enregistre ce plugin et on le bind sur le tag utilisateur présent derrière la réponse Informer.

Cette action est effectuée à chaque fois que l’on clique sur la réponse Informer.

JSAPI.get().registerForReasonedAnswerOpen(function(reasonedAnswerAPI, reasonedAnswerId) {
    if(reasonedAnswerId === INFORM_RESPONSE_ID)
    {
        var lookupAPI = JSAPI.get().getLookupAPI();
        lookupAPI.register(USER_FILTER_PLUGIN_NAME, buildLookupPlugin(reasonedAnswerAPI.getTasks()));
        reasonedAnswerAPI.bindFieldOnLookup(RECEIVER_TAG_NAME, USER_FILTER_PLUGIN_NAME);
    }
});