Recherche

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

    Les requêtes, filtres et critères

    Objets :

    • SearchRequest
    Fonctions Description
    addSelect(place) 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éfini le nombre maximum de résultats à retourner
    setStart(start) Défini le début de la page de recherche
    • AndClause
    Fonctions Description
    addCriterion(criterion) Ajoute un critère de recherche
    getCriteria() Retourne un tableau contenant l’ensemble des critères de la clause
    • Criterion
    Fonctions Description
    getName() Retourne le nom du critère
    setName(name) Défini le nom du critère
    getOperator() Retourne l’opérateur du critère
    setOperator(operator) Défini 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éfini 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
    Fonctions Description
    setName(name) Défini le nom du champ utilisé
    setType(type) Défini le type du champ : STRING, TIMESTAMP, BOOLEAN, INTEGER, CURRENCY
    setAscending(isAscending) Défini 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 chaine de caractère. 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 chaine de caractère.

    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 et avec pour retour un format de date.

    Les paramètres sont :

    • tagClassId : l’identifiant de la classe de tag
    • 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();
        }
    });
    

    Organiser les buckets

    Les buckets (ou résultats d’aggrégation) d’une recherche peuvent être organisées en utilisant l’API JS. Pour cela, il faut définir une fonction permettant de les trier :

    • soit par recherche en fournissant l’identifiant de la recherche concernée
    • soit pour toutes les recherches
    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];
    }
    

    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.