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.