logo Alfresco
Version Enterprise 4.1

Le premier objectif est de mettre en place deux nouvelles actions qui permettent de positionner et de retirer un flag sur un document (on ne peut positionner un flag que sur un document qui n’en a pas encore et on peut retirer un flag uniquement sur un document qui en a déjà un). On souhaite enregistrer le login de la personne qui a positionné le flag ainsi que la date.

actions
Actions qui permettent de positionner ou de retirer un flag
properties
Propriétés liées au flag

Le second objectif est de pouvoir visualiser facilement les documents qui ont un flag, il faut donc qu’une icône soit positionnée au niveau de la documentlibrary. Il serait également interessant de pouvoir mettre en place un filtre afin d’accéder rapidement aux documents qui ont un flag.

indicateur
L’indicateur représenté par l’icone se positionne à gauche des documents qui ont un flag
filter
Filtre qui affiche tous les documents qui ont un flag

Solution

Créer un nouvel aspect

Créer un nouveau modèle Alfresco : extension/models/flagModel.xml
<aspect name="dkta:flag">
<title>Flag</title>
<properties>
<property name="dkta:flagedBy">
<title>Flaged By</title>
<type>d:text</type>
</property>
<property name="dkta:flagedDate">
<title>Flaged Date</title>
<type>d:date</type>
</property>
</properties>
</aspect>

Définir l’emplacement du nouveau modèle Alfresco : extension/flag-model-context.xml
<bean id="flag.dictionaryBootstrap" parent="dictionaryModelBootstrap" depends-on="dictionaryBootstrap">
<property name="models">
<list>
<value>alfresco/extension/models/flagModel.xml</value>
</list>
</property>
</bean>

Configurer l’affichage des propriétés du nouvel aspect dans Share : web-extension/share-config-custom.xml
<config evaluator="aspect" condition="dkta:flag">
<forms>
<form>
<field-visibility>
<show id="dkta:flagedBy" />
<show id="dkta:flagedDate" />
</field-visibility>
<appearance>
<field id="dkta:flagedBy" label="Flaged By" description="Flaged By" />
<field id="dkta:flagedDate" label="Flaged Date" description="Flaged Date" />
</appearance>
</form>
</forms>
</config>

Créer un nouvel indicateur

Créer un nouvel évaluateur qui évalue la présence de l’aspect flag : web-extension/flag-context.xml
<bean id="evaluator.doclib.action.flagAspect" parent="evaluator.doclib.action.hasAspect">
<property name="aspects">
<list>
<value>dkta:flag</value>
</list>
</property>
</bean>

Créer le nouvel indicateur basé sur l’évaluateur défini ci-dessus : web-extension/share-config-custom.xml
<config evaluator="string-compare" condition="DocumentLibrary">
...
<indicators>
<indicator id="flag" icon="flag-16.png" index="100" label="Flaged">
<evaluator>evaluator.doclib.action.flagAspect</evaluator>
</indicator>
</indicators>
</config>

Ajouter l’icône associée à l’indicateur dans META-INF/components/documentlibrary/indicators
flag-16 flag-16.png

Créer les nouvelles actions

Créer les deux actions Share pour ajouter et retirer le flag : web-extension/share-config-custom.xml
Ces deux actions sont ajoutées aux groupes d’actions de la documentlibrary (document-browse) et de la page de détails (document-details).
<config evaluator="string-compare" condition="DocLibActions">
<actions>
<action id="document-add-flag" type="javascript" icon="add-flag" label="Add Flag">
<param name="function">onActionFlag</param>
<evaluator negate="true">evaluator.doclib.action.flagAspect</evaluator>
</action>
<action id="document-remove-flag" type="javascript" icon="remove-flag" label="Remove Flag">
<param name="function">onActionFlag</param>
<evaluator>evaluator.doclib.action.flagAspect</evaluator>
</action>
</actions>
<actionGroups>
<actionGroup id="document-browse">
<action index="500" id="document-add-flag" />
<action index="510" id="document-remove-flag" />
</actionGroup>
<actionGroup id="document-details">
<action index="500" id="document-add-flag" />
<action index="510" id="document-remove-flag" />
</actionGroup>
</actionGroups>
</config>

Ajouter les icônes associées aux actions dans META-INF/components/documentlibrary/actions
add-flag-16  add-flag-16.png
remove-flag-16 remove-flag-16.png

Définir le fichier de traitement de l’action : web-extension/share-config-custom.xml
<config evaluator="string-compare" condition="DocLibCustom">
<dependencies>
<js src="components/documentlibrary/flag-actions.js" />
</dependencies>
</config>

Implémenter le traitement de l’action : META-INF/components/documentlibrary/flag-action.js
Cette action fait appel au WebScript Alfresco doktapepa/flag
(function() {
YAHOO.Bubbling.fire("registerAction",
{
actionName: "onActionFlag",
fn: function dkta_onActionFlag(record) {
var displayName = record.displayName;
var nodeRef = record.nodeRef;
this.modules.actions.genericAction(
{
success:
{
event:
{
name: "metadataRefresh"
},
message: this.msg("Flag processed successfully on " + displayName)
},
failure:
{
message: this.msg("Failure when processing the flag on " + displayName)
},
webscript:
{
name: "sample/flag?nodeRef={nodeRef}",
stem: Alfresco.constants.PROXY_URI,
method: Alfresco.util.Ajax.POST,
params:
{
nodeRef: nodeRef
}
},
wait:
{
message: this.msg("message.please-wait")
},
config:
{
}
});
}
});
})();

Créer le nouveau WebScript

Créer la description du WebScript : extension/templates/webscripts/doktapepa/flag.post.desc.xml
<webscript>
<shortname>Flag</shortname>
<description>Flag or Unflag a node</description>
<url>/dopktapepa/flag?nodeRef={nodeRef}</url>
<format default="html"/>
<authentication>user</authentication>
</webscript>

Créer le contrôleur du WebScript : extension/templates/webscripts/doktapepa/flag.post.js
C’est ici que l’aspect flag sera ajouté ou retiré et que les propriétés seront mises à jour
var nodeRef = args.nodeRef;
var userName = person.properties.userName;
var node = search.findNode(nodeRef);
var flagAspect = "dkta:flag";
if(node!=null) {
if (node.hasAspect(flagAspect)){
node.removeAspect(flagAspect);
model.message="Flag removed on [" + nodeRef + "]" ;
} else {
node.addAspect(flagAspect);
node.properties["dkta:flagedBy"] = userName;
node.properties["dkta:flagedDate"] = new Date();
node.save();
model.message="Flag added on [" + nodeRef + "]" ;
}
} else {
status.redirect=true;
status.code=500;
status.message="Node [" + nodeRef + "] was not found!";
}

Créer le template du WebScript : extension/templates/webscripts/doktapepa/flag.post.html.ftl
Il est obligatoire de créer ce fichier mais nous ne nous en sevirons pas
${message}

Créer un nouveau filtre

Créer une nouvelle entrée dans le filtres de la documentLibrary : site-webscripts/org/alfresco/components/documentlibrary/filter.get.config.xml
<filters>
<filter id="all" label="link.all" />
<filter id="editingMe" label="link.editingMe" />
<filter id="editingOthers" label="link.editingOthers" />
<filter id="recentlyModified" label="link.recentlyModified" />
<filter id="recentlyAdded" label="link.recentlyAdded" />
<filter id="favourites" label="link.favourites" />
<filter id="synced" label="link.synced" evaluator="syncMode.getValue() != 'OFF'" />
<filter id="syncedErrors" label="link.syncedErrors" evaluator="syncMode.getValue() == 'ON_PREMISE'"/>
<filter id="flaged" label="Flag" />
</filters>

Implémenter le traitement lié à ce nouveau filtre : extension/templates/webscripts/org/alfresco/slingshot/documentlibrary-v2/filters.lib.js
case "flaged":
filterQuery = this.constructPathQuery(parsedArgs);
filterQuery += " +(ASPECT:\"dkta:flag\")";
filterParams.query = filterQuery;
break;

Créer les fichiers de ressource

Je ne l’ai pas fait dans cet exemple mais il est bien entendu possible d’externaliser les labels et les description dans des fichiers de ressouces. Cela permettra également de gérer l’internationalisation.

A vous de jouer !

Publicités