Recherche

    Pour rechercher des composants via l’API JS, la fonction search des différentes API de services est à disposition ici.

    Les requêtes, filtres et critères

    Objets :

    • SearchRequest
    Fonction Description
    addSelect(field) Ajoute un champ à remonter
    addFilterClause(filterClause) Ajoute un critère supplémentaire
    getFilters() Retourne un tableau contenant l’ensemble des FilterClause
    addOrder(orderClause) Ajoute un champ sur lequel trier les résultats de recherche
    setMax(max) Définit le nombre maximum de résultats à retourner
    setStart(start) Définit le début de la page de recherche
    • AndClause
    Fonction Description
    addCriterion(criterion) Ajoute un critère de recherche
    getCriteria() Retourne un tableau contenant l’ensemble des critères de la clause
    • Criterion
    Fonction Description
    getName() Retourne le nom du critère
    setName(name) Définit le nom du critère
    getOperator() Retourne l’opérateur du critère
    setOperator(operator) Définit l’opérateur du critère. Les valeurs possibles sont : EQUALS_TO, CONTAINS, LESS_THAN, GREATER_THAN, STARTS_WITH, ENDS_WITH, DISPLAY, DIFFERENT, BETWEEN
    getType() Retourne le type du critère
    setType(type) Définit le type du critère. Les valeurs possibles sont : STRING, TIMESTAMP, BOOLEAN, INTEGER, CURRENCY
    getValues() Récupère les valeurs du critère
    addValue(value) Ajoute une valeur au critère
    addValues(values) Ajoute un tableau de valeur au critère

    Les tris

    • OrderClause
    Fonction Description
    setName(name) Définit le nom du champ utilisé
    setType(type) Définit le type du champ : STRING, TIMESTAMP, BOOLEAN, INTEGER, CURRENCY
    setAscending(isAscending) Définit si le tri est ascendant ou descendant

    Construction d’une requête :

    var request = new SearchRequest();
    request.setMax(20);
    request.setStart(0);
    
    var orderClause = new OrderClause();
    orderClause.setName("creationDate");
    orderClause.setType("TIMESTAMP");
    orderClause.setAscending(true);
    
    var filters = new AndClause();
    request.addFilterClause(filters);
    
    var criterion = new Criterion(); 
    criterion.setName("Matricule");
    criterion.setType("STRING");
    criterion.addValue("P0002095");
    filters.addCriterion(criterion);
    
    JSAPI.get().document().search(request, function(results)
    	{
    		// Simple dump of all results
    		console.log("results.length=" + results.length);
    		for (var i = 0; i < results.length; i++) 
    		{
    			var result = results[i];
    			console.log("id=" + result.getId() + ", name=" + result.getFieldValue("name"));
    		}
    		// Jump to first document found
    		if ( results.length > 0 )
    		{
    			var result = results[0];
    			var id = result.getId();
    			JSAPI.get().getNavigationAPI().goToComponentPlace("DOCUMENT", id);
    		}
    	},
    	function(error){
    		console.error("Error on document search: " + error);
    	});
    

    Il est possible d’obtenir les valeurs d’un résultat de recherche de deux façons différentes :

    • getFieldValue(fieldName) : Retourne toutes les valeurs existantes pour ce champ sous forme de chaîne de caractères. Si le champ contient plusieurs valeurs, celles-ci sont séparées par le caractère §.

    • getFieldValues(fieldName) : Retourne toutes les valeurs existantes pour ce champ sous forme d’un tableau de chaîne de caractères.

    Format de date des résultats de recherche

    Le format de date peut être adapté en fonction de vos besoins suivant les tags et les résultats. Pour ceci, il suffit de définir la fonction JS getSearchResultDateFormat pour retourner un format de date souhaité.

    Les paramètres sont :

    • tagClassId : l’identifiant de la classe de tags
    • result : le résultat de recherche

    Un exemple d’utilisation :

    function getSearchResultDateFormat(tagClassId, result){
    	if(tagClassId == "MonTagAModifier"){
    		return 'dd/MM/yyyy';
    	}
        return 'dd MM yyyy HH:mm';
    }
    

    Décorer vos résultats de recherche

    Il est possible de décorer vos résultats de recherche : modifier la valeur affichée d’un champ donné. Pour cela, il suffit de définir un décorateur pour le tag à décorer.

    Dans l’exemple suivant, nous définissons un décorateur pour le champ fieldName qui sera appelé pour résoudre la valeur à afficher pour ce champ.

    function decorate(fieldName){
    	var decorators = JSAPI.get().getHelperFactory().getSearchDecoratorsAPI();
    	decorators.register(fieldName, function(result, callback){		
    		callback.onSuccess("decorated: " + result.getField(fieldName).getValue());
    	});
    }
    
    decorate("Matricule");
    

    Formattage des valeurs de tag

    Pour afficher un tag, FlowerDocs formatte ses valeurs :

    • pour les dates, en fonction du format défini
    • pour les listes de valeur, en fonction des libellés définis

    Il est possible d’utiliser ce mécanisme à travers l’API JS comme indiqué dans l’exemple suivant :

    var formatter = JSAPI.get().getHelperFactory().getFieldFormatter("DOCUMENT");
    formatter.format(result.getField(fieldName), function(formattedValue){
    	console.log("Formatted value: " + formattedValue);
    });
    

    L’abonnement à l’exécution d’une requête de recherche se fait en fonction du template de recherche. Les informations disponibles lors de l’abonnement sont le nom du template, la requête, la réponse et le callback de réponse. Avant d’exécuter le callback, il va être possible de manipuler la réponse.

    Dans l’exemple suivant, une popup de création de composant est affichée si la recherche ne renvoie pas de résultats :

    JSAPI.get().getComponentSearchAPI().registerForExecution("DefaultSearch",function(request, response, callback){
        callback.onProcessed(response);
        if(response.getFound() == 0){
            JSAPI.get().getPopupAPI().buildComponentCreationFromSearchRequest("DOCUMENT", request, null).show();
        }
    });
    

    Manipuler les buckets

    Les buckets (ou résultats d’agrégation) d’une recherche peuvent être organisés en utilisant l’API JS.

    Abonnement

    La première étape, avant de pouvoir manipuler ces buckets, consiste en l’abonnement à la récupération de buckets à partir de FlowerDocs Core :

    • soit par recherche en fournissant searchId l’identifiant de la recherche concernée :

      var bucketAPI = JSAPI.get().getHelperFactory().getBucketAPI();
      bucketAPI.register(searchId, function(buckets, callback){
      	callback.onProcessed(buckets);
      });
      
    • soit pour toutes les recherches :

      var bucketAPI = JSAPI.get().getHelperFactory().getBucketAPI();
      bucketAPI.register(, function(buckets, callback){
      	callback.onProcessed(buckets);
      });
      

    L’abonnement (ou closure) enregistré est appelé avec deux variables :

    • Le tableau buckets contient l’ensemble des buckets d’un même niveau
    • Le callback fourni en entrée de l’abonnement doit être appelé avec un tableau de bucket


    Exemple de tri des buckets

    var orderMap = {};
    orderMap[STATUT_1] = 0;
    orderMap[STATUT_2] = 1;
    
    var bucketAPI = JSAPI.get().getHelperFactory().getBucketAPI();
    bucketAPI.register("searchId", function(buckets, callback){
        var ordered = new Array();
    	for(i in buckets){
    		var bucket = buckets[i];
    		var index = getBucketIndex(bucket);
            ordered[index] = bucket;
        }
    	callback.onProcessed(ordered);
    });
    
    function getBucketIndex(bucket){
    	var request = bucket.getRequest();
        var filter = request.getFilters()[0];
        var statusName = filter.getCriteria()[0].getValues()[0];
    	return orderMap[statusName];
    }
    


    Le fait de supprimer ou d’ajouter des buckets n’est pas supporté. Le nombre total de bucket déterminé doit être égal à celui déterminé par FlowerDocs Core.

    Modification d’un bucket

    L’API JS permet de modifier les buckets résolus par FlowerDocs Core en exposant les méthodes suivantes :

    Fonction Description
    getName() Retourne le nom
    setName(name) Modifie le nom
    getCount() Retourne le nombre de composants contenus dans le bucket (somme des buckets fils)
    setCount(count) Modifie le nombre affiché de composants contenus dans le bucket
    getLevel() Retourne le niveau de bucket
    hasChildren() Détermine si le bucket contient des buckets fils
    getChildren() Récupère les buckets fils
    hasParent() Détermine si le bucket a un bucket parent
    getParents() Récupère les buckets parents (tous les niveaux parents)
    getRequest() Récupère la requête exécutée pour déterminer le contenu du bucket
    setRequest(request) Modifie la requête exécutée pour déterminer le contenu du bucket


    Les buckets fils et parents sont fournis à titre indicatif. Les modifications apportées à ceux-ci ne sont pas prises en compte.

    Masquer un bucket

    La fonction setSkipDisplay(skip) est également exposée sur l’objet Bucket permettant de masquer un bucket et n’afficher que ses fils.


    Exemple : masquer les buckets ayant le même nom

    var bucketAPI = JSAPI.get().getHelperFactory().getBucketAPI();
    bucketAPI.register(function(buckets, callback){
    	var ordered = new Array();
    	for(i in buckets){
    		var bucket = buckets[i];			
    		if(bucket.hasChildren() && bucket.getChildren().length ==1){
    			if(bucket.getName().toUpperCase() == bucket.getChildren()[0].getName().toUpperCase()){
    				bucket.setSkipDisplay(true);
    			}
    		}	
    		ordered.push(bucket);	
    	}
    	callback.onProcessed(ordered);	
    });
    

    Récupération des buckets après résolution

    Il est possible de récupérer les buckets d’une recherche après résolution de la façon suivante :

    var bucketAPI = JSAPI.get().getHelperFactory().getBucketAPI();
    bucketAPI.registerForResolved("searchId", function(buckets){
       for(i in buckets){
           	var bucket = buckets[i];
    		console.info(bucket.getName()+ " has been resolved, count=" +bucket.getCount());
       }
       callback.onProcessed(buckets);
    });
    

    Ceci permet d’obtenir les buckets résolus, notamment les compteurs dans le cas de buckets partiels.