Afficher la bonne date dans la vue « Mon Contenu » d’Alfresco Share 3.4d

Je ne sais pas si vous y avez prêté une grande attention, mais la page mon contenu de Share souffre d’un petit défaut :

En standard, les dates de "Mon Contenu" sont assez étonnantes !


Ca fait désordre un document « récemment modifié » en janvier 1970 !

Comment donc faire pour corriger tout cela ?
En suivant ce que j’écris ci-dessous !!! ;-)
Attention tout de même : ça va être long.

On va y aller étape par étape, en suivant le cheminement de ma réflexion.
En premier lieu, je vais chercher le WebScript en charge de la production de la page erronée. La page s’appelle user-content, j’ouvre donc assez naturellement le fichier user-content.get.html.ftl (share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/profile/user-content.get.html.ftl).
Le code affichant la date est visible en ligne 9 :
<span>${msg("label." + type)} <@dateFormat date /></span></p>
dateFormat est une macro FreeMaker (voir la ligne 1 du fichier) pour formater la date dans quelque chose de compréhensible par un humain…
L’objet date possède donc un type Date, mais d’où vient-il ?
En parcourant un peu le fichier, on comprend vite que date est l’attribut createdOn ou modifiedOn des items des listes addedContent et modifiedContent, respectivement.

La suite logique est donc de chercher à en apprendre davantage sur ces listes. Direction user-content.get.js !
Recherche sur « createdOn », atterrissage à la ligne 39 et attention déportée 3 lignes plus bas :
item[dateType] = new Date(item[dateType]);
Nos dates sont donc bien des objets « Date » (jusque là, tout va bien) construits en instanciant la classe « Date » avec la valeur de « item[dateType]« .
Que vaut donc « item[dateType] » ?

Pour répondre à cette question, il faut s’intéresser en premier lieu à « item ».
« item » est construit à partir de « contents » (cf. ligne 36) :
item = contents[i];
lui-même issu de « data » (cf. ligne 30) :
contents = data[type].items
provenant de « result » (cf. ligne 25) :
var data = eval('(' + result + ')');
résultant d’un appel distant à Alfresco :
var result = remote.call("/slingshot/profile/usercontents?user=" + encodeURIComponent(userId) + "&maxResults=" + maxItems);

Facile maintenant de répondre à notre dernière question (que vaut « item[dateType] » ? pour ceux qui ne suivent pas) !
Il suffit d’effectuer le même appel que Share dans notre navigateur préféré et voir ce qui en ressort.
Une exécution de http://localhost:8080/alfresco/s/slingshot/profile/usercontents?user=admin&maxResults=1 plus tard, on se retrouve avec un beau fichier json dans lequel on aperçoit :

"createdOn": "24 août 2011 10:12:49 GMT+0200 (CEST)",
"modifiedOn": "24 août 2011 15:21:28 GMT+0200 (CEST)",

Y’a rien qui vous choque ?
Personnellement, ça m’a surpris de voir une date formattée dans un appel « technique ». D’autant plus que notre moteur JavaScript va essayer d’interpréter « 24 août 2011 10:12:49 GMT+0200 (CEST) » pour en faire un « vrai » objet Date.
Il est costaud JavaScript, mais est-ce qu’il est vraiment capable de faire ça ?
Le « ça », indiqué ci-dessous, résulte tout simplement du code que nous avons identifié plus haut :
item[dateType] = new Date("24 août 2011 10:12:49 GMT+0200 (CEST)");

J’ai voulu le vérifier en me créant un tout bête fichier de test (c’est mon principe de « simplification » sur lequel j’espère bien poster sous peu) :

<html>
<head>
<script language="JavaScript">
function testDate() {
var maDate = new Date("24 août 2011 15:21:28 GMT+0200 (CEST)");
return maDate;
}
</script>
</head>
<body>
Test de création de date
<button onclick="javascript:alert(testDate());">Lancer le test!</button>
</body>
</html>

(c’est pas super beau, mais c’est rapide à écrire et ça marche bien :-))

Le résultat est un beau « Invalid date » :

Firefox ne peut interpréter la date mise en forme par Alfresco


… j’suis pas plus surpris que cela !

Ma première étape de correction consistera donc à faire en sorte que le WebScript côté Alfresco produise une date plus « technique ».
Ce WebScript a été identifié plus tôt, au moment où nous avons identifié l’appel distant, il s’agit de : usercontents.get.
Le fichier usercontents.get.json.ftl (alfresco/WEB-INF/classes/alfresco/templates/webscripts/org/alfresco/slingshot/profile/usercontents.get.json.ftl) nous permet d’apprendre que les dates sont formatées par un appel à dateFormat :
"createdOn": "<@dateFormat item.createdOn />"
et
<#macro dateFormat date>${date?string("dd MMM yyyy HH:mm:ss 'GMT'Z '('zzz')'")}</#macro>
C’est cette macro qui ne me convient pas. Je vais donc la remplacer par quelque chose de plus « traditionnel », par exemple :
<#macro dateFormat date=""><#if date?is_date>${xmldate(date)}</#if></#macro>
(on retrouve ce principe de formattage dans plusieurs WebScripts côté Alfresco).

Pour que nos modifications soient « propres », on ne va bien entendu pas modifier directement le fichier de la webapp Alfresco, mais on va créer notre fichier dans l’arboresnce suivante : /shared/classes/alfresco/extension/templates/webscripts/org/alfresco/slingshot/profile.
Un rechargement des WebScripts Alfresco plus tard, il nous est possible de vérifier que notre flux json a bien changé :
"createdOn": "2011-08-24T10:12:49.844+02:00",
"modifiedOn": "2011-08-24T15:21:28.050+02:00"

Ca me semble beaucoup mieux comme format ! Pour info, il s’agit du format ISO-8601.
Un test avec notre code JavaScript basique permet de vérifier la bonne interprétation de cette chaîne de caractères :

La date est bien valide lorsque le script est interprété par FireFox, ce n’est en revanche pas la cas par Internet Explorer qui ne sait traiter le fomat ISO-8601.
Et par Rhino (le moteur JavaScript utilisé par Alfresco), qu’est ce que ça donne ?

Le changement de format de la date n'est pas suffisant pour corriger l'affichage.


Raté ! Rhino ne sait pas nativement traiter des dates au format ISO-8601.

Il va donc falloir aider Rhino a interpréter notre date. Alfresco nous a mâché le travail : date le fichier activity-list.get.js, il se trouve une fonction fromISO8601(formattedString) qui retourne un objet Date.
On va donc pouvoir recopier cette fonction dans le fichier user-content.get.js et remplacer la ligne
item[dateType] = new Date(item[dateType]);
par
item[dateType] = fromISO8601(item[dateType]);
(bien entendu, on ne modifie pas le fichier directement, mais on place notre personnalisation dans le dossier /shared/classes/alfresco/web-extension/site-webscripts/org/alfresco/components/profile).

Après avoir rechargé les WebScripts de Share, on peut observer un affichage convenable :
Victoire ! La date est correcte !

C’est mieux comme ça, non ?

Et pour les courageux qui sont allés jusqu’au bout de ce billet, voici les modules amp qui permettent de mettre tout ça en application :

Cette entrée a été publiée dans Alfresco, avec comme mot(s)-clef(s) , , . Vous pouvez la mettre en favoris avec ce permalien.

2 réponses à Afficher la bonne date dans la vue « Mon Contenu » d’Alfresco Share 3.4d

  1. Ping : Afficher la bonne date dans la vue « Mon Contenu » d'Alfresco ... | ECM et GED libres, des solutions pour les entreprises | Scoop.it

  2. Ping : Alfresco Community 4.0a est sorti ! | ECM & Co

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam