Cette page présente les principales nouveautés de JPlatform 10 SP1.
1. Nouvelle fonctionnalité
1.1 JPortal
JPortal est le nouveau type de Portail intégré dans JPlatform 10 SP1.
Il propose une interface permettant de concevoir facilement vos portails, via du drag&drop, et de la prévisualisation en direct.Tous les éléments (Blocs et portlets) de ce portail sont personnalisables directement depuis l'interface.
L'outil propose aussi un système de sauvegardes qui permet de visualiser et de travailler sur la conception de votre portail sans le publier. Lorsqu'il est prêt, vous pouvez le publier pour qu'il soit visible de tous. Il est aussi possible de revenir sur une ancienne version grâce à la fonction d'historique.
Une série de vidéos présente plusieurs des fonctionnalités (pas toutes) : Découverte de JPortal
Issue : JCMS-6059
1.2 Recommander un contenu non visible
Il est désormais possible de recommander un contenu même si il n'est pas dans un état visible. On peut par exemple recommander un contenu dans un état brouillon (p. ex. une page Wiki, un article, un savoir, ...)
Issue : JCMS-6318
1.3 Envoyer une alertes aux membres connectés
Dans l'interface Envoyer une alerte, il est désormais possible d'envoyer une alerte à l'ensemble des membres connectés. L'administrateur peut prévenir l'ensemble des membres connectés sur la platforme (p. ex. en cas de maintenance).
Issue : JCMS-5637
1.4 Changement de la langue de navigation
Il est possible de changer de langue depuis la topbar, dans le menu Outil (accès restreint par ACL)
Issue : JCMS-6223
1.5 Requête : Filtrage sur le membre connecté
Dans l'interface de construction d'une requêten dans l'onglet Rédacteur, il est maintenant. possible de choisir l'option "Membre connecté".
Ceci permetde faire une PQF/Portlet Explorer qui liste les documents créés par l'utilisateurs (eg "Mes derniers documents")
Issue : JCMS-6313
1.6 Obtenir l'URL de la page de recherche
La nouvelle page de recherche propose des facette d'affinement. L'ensemble de ces affinement est fait en Ajax. L'URL de la page ne reflete donc pas le filtrage courant.
Pour envoyer l'URL d'une page de recherche en intégrant l'ensemble des affinements par facette, un nouvel item, "Obtenir l'URL de cette page" a été ajouté au menu Action de la navbar.
Issue : JCMS-6371
1.7 Fuseau horaire (Timezone)
Un support préliminaire des fuseaux horaires fait son apparition dans JPlatform pour permettre la saisie et l'affichage des dates et heures dans le fuseaux horaire de l'utilisateur.
Pour activer cette fonctionnalité, positionner la propriété channel.timezone.enabled: true
- Le fuseau horaire par défaut du site peut être renseigné dans les propriétés. Le fuseau horaire Europe/Paris est configuré en standard.
- Les membres peuvent renseigner un fuseau horaire dans leur profil utilisateur. Pour faciliter la migration des utilisateurs, le fuseau horaire de leur profil est automatiquement renseigné à partir du pays indiqué dans leur compte utilisateur. Certain pays s'étalant sur plusieurs fuseaux horaires, ce calcul automatique est approximatif. Le fuseau horaire retenu pour chaque pays est indiqué dans les propriétés
country.{code-pays}.default-timezone
dejcms.prop
, vous pouvez surcharger ces valeurs dans votreplugin.prop
de site ou dans le fichiercustom.prop
- Par la suite :
- Dans les formulaires : Les dates sont saisies dans le fuseau horaire de l'utilisateur.
- Dans les interfaces : Les dates s'affichent dans le fuseau horaire de l'utilisateur.
- Lorsque le module DevTools est installé, il est possible de modifier le fuseau horaire pour la session en cours avec une nouvelle entrée disponible dans le menu outils disponible dans la topbar (nécessite l'ACL d'accès au menu).
Issue : JCMS-4865
1.8 DBMember administrateurs d'espace de travail
Les DBMember peuvent être définis comme administrateurs d'espace de travail.
Évolutions d'API associées à ce changement :
- La méthode
Workspace.getAdministrators()
effectue désormais une ou plusieurs requete en base quand des DBMember ont été spécifiés sur l'espace, - Nouvelle méthode
Workspace.getAdministrators(boolean)
pour récupérer les administrateurs avec ou sans les membres en base.
Point d'attention requis dans le code lors d'une migration (dès lors que la fonctionnalité est utilisé et que des membres en base sont défini comme administrateur d'espace) :
Workspace.getAdministrators()
ne doit pas être invoqué avant l'initialisation de la base de donnée (i.e : lors du chargement du store).Workspace.getAdministrators(false)
peut être utilisé à la place.Workspace.getAdministrators(false)
peut renvoyer une liste contenant des élémentnull
Issue : JCMS-6331
1.9 DBMember synchronisés par LDAP
Les DBMember peuvent être synchronisés avec un annuaire LDAP.
Évolutions associées à ce changement :
- Configuration :
- Une nouvelle option "Type de compte" est disponible dans l'onglet LDAP de l'édition des propriété (dans l'espace d'administration), cette option permet de sélectionner le type de membre à utiliser lors des synchronisation LDAP. La propriété correspondante :
ldap.synchronize.create-dbmbr: false
(par défaut àfalse
) - Avancé : 2 propriétés "kill switch" permettent de désactiver certains traitement s'ils devaient être source de dégradation de performance sur certains environnement. Sauf régression majeur, il n'est pas recommandé de modifié ces paramétrages sans quoi le comportement de synchronisation LDAP ne sera pas celui prévu initialement.
ldap.synchronize.import-all.sync-unprocessed-dbmbr: true
(par défaut àtrue
) : utilisé lors du processus d'import périodique de tous les membres du LDAP; lorsque défini à true, tous les membres LDAP en bases sont itérés les DBMember qui n'ont pas été synchroniser avec le LDAP, et déclencher leur désactivation.ldap.synchronize.sync-child-dbmbr: true
(par défaut àtrue
): utilisé lors de la synchronisation d'un groupe LDAP; lorsque défini à true tous les membres LDAP en base du groupe en cours de synchronisation sont itérés pour être mise à jour avec les nouvelles informations.
- Une nouvelle option "Type de compte" est disponible dans l'onglet LDAP de l'édition des propriété (dans l'espace d'administration), cette option permet de sélectionner le type de membre à utiliser lors des synchronisation LDAP. La propriété correspondante :
- Modèle de données : 2 nouveaux champs supportés par les DBMember (avec leurs colonnes et index correspondant en base) :
Boolean ldapSynchro
: active ou désactive la synchronisation d'un membre avec le LDAP (par défaut à true, y compris pour les précédents DBMember)Date lastLdapSynchro
: date de dernière synchronisation avec le LDAP (null par défaut)
- Le panier des
DBMember
permet d'effectuer les actions LDAP suivantes (déjà disponible pour les membres JStore):- synchroniser les membres avec le LDAP
- désactiver la synchronisation des membres
- détâcher du LDAP les membres (équivalent à la désactivation de la synchro LDAP et la suppression de la date de dernière date de synchro LDAP)
- Actions de synchronisation LDAP en back office : Toutes les actions de synchronisation LDAP disponible dans le back office sont effectives sur les DBMembers.
- Synchronisation LDAP périodique : Lorsqu'elle est activée, la synchronisation périodique avec le LDAP s'applique aussi pour les DBMembers.
Limites :
- le champ Information (
info
) n'est pas supporté pour les DBMembers, il n'est donc pas synchronisé avec le LDAP.
Issue : JCMS-6340
1.10 Panier des publications
- L'onglet Workflow du panier des publications est accessible aux simple contributeurs. JCMS-2917. Note : suite à cette évolution, certains état cibles être proposés dans l'interface, mais refusés lors de l'action de mise à jour, selon les transitions autorisés pour le contributeurs.
- L'onglet Avancé du panier des publications est accessible aux simple contributeurs. JCMS-6427
- Les contributeurs disposant de droits de contributions dans plusieurs espaces peuvent déplacer les contenus d'un espace à un autre depuis le panier (via l'onglet avancé).
Issue : JCMS-5676
1.11 Notifications
Règle de notification : notification sur les contenus publiés suite à une planification
Jusqu'à présent, les 3 types de notification étaient nommées ainsi :
- Création
- Création et modifications majeures
- Création et modifications mineures et majeures
Problème : les contenus planifiés pour être publiés automatiquement n'étaient pas considérés comme des Créations et ne remontaient pas.
Désormais, le terme "Création" a été remplacé par "Publication" :
- Publication
- Publication et modifications majeures
- Publication et modifications mineures et majeures
Les contenus qui ont été publiés dans la période passée, notamment par une planification (état "Planifié" + "Date de publication" dans le futur) seront désormais remontés.
Au niveau API, la constante NotificationManager.MUTATION_CREATE
a été dépréciée et remplacée par NotificationManager.MUTATION_PUBLISH
(sa valeur reste identique à MUTATION_CREATE
et vaut 0
)
Issue : JCMS-5738
Règle de notification : être notifié sur tous les Contenus et Contenus utilisateur
Lorsque l'utilisateur ne filtre sur aucun type, il sera notifié et sur les Contenus (existant) et sur les Contenus utilisateur (nouveau).
Issue: JCMS-5967
Règle de notification : pas de notification sur les contenus qui ne sont pas dans la whitelist
Lorsque l'utilisateur ne filtre sur aucun type, et qu'une whitelistnotification.followed-types
est définie, seuls les contenus compatibles avec la whitelist seront notifiés.
Issue: JCMS-6405
Règle de notification : simplification de l'interface de sélection des types
Tous les types de contenus (compatibles) sont proposés, même ceux qui ne sont pas forcément utilisés, etc...
Améliorations :
- ajout d'une propriété notification.followed-types-off pour définir la liste des types exacts à exclure des choix proposés.
- Note: si un utilisateur ne filtre sur aucun type, il recera tous sauf les types blacklistés
- la liste des types se fait sur 3 colonnes au lieu de 2
- s'il y a plus de 20 types proposés, un champ de recherche permet de filtrer la liste à la volée
Issue : JCMS-5182
2. UX / UI
2.1 Tag <jalios:scrollbar>
Ce tag permet d'insérer une barre de defilement vertical au sein d'un bloc. Pour plus de détail consultez la documentation associée.
Issue : JCMS-6273
2.2 PortletQueryForeach : contribution dans l'espace filtré par la requête
Si la requête de filtrage filtre sur un espace donné (dernier onglet), alors ce sera cet espace qui sera utilisé pour générer le lien de contribution. (doAddIcon.jspf). Le lien de contribution fonctionne ainsi au plus "plus proche" de la façon dont la PQF filtre les résultats.
Issue : JCMS-2530
2.3 Mise à jour du compteur affiché sur le menu des applications
Vous pouvez utiliser la fonctionjQuery.jalios.topbar.refreshApplicationBadges()
pour mettre à jour le badge affiché dans la topbar sur le menu des applications.
Issue : JCMS-6426
3. API
3.1 Ajout du virtual ID loggedMember
Quoi : Le virtual ID loggedMember
permet d'identifier le membre loggué. Il est ainsi possible de construire des requêtes qui référence cet utilisateur dynamique.
Exemple d'usage : cette requête affiche les contenus créé par l'utilisateur loggué : https://intranet-beta.jalios.net/front/query/query.jsp?mids=loggedMember
Issue : JCMS-6313
3.2 Workspace : portail principal
Il est maintenant possible de définir un portail principal sur les espaces de travail. Ce portail sera forcé pour l'affichage de toutes les publications de l'espace (Sauf si le membre connecté n'a pas accès au portail défini).
Issue : JCMS-5062
3.3 Génération de PDF à partir d'un modèle PDF
La classe PDFFormGenerator
permet de générer à la volée des fichiers PDF à partir d'un fichier PDF de type "formulaire" (ie. avec des champs à remplir) et d'une map nim du champ / valeur.
Cas d'usage : génération des certificats et des attestations de suivi dans JLearn 2.1
Exemple de code :
response.setHeader("Content-Disposition", "attachment; filename=myfile.pdf");
Map<String,Object> map = new HashMap<>();
map.put("attendee.name", mbr.getFullName());
map.put("attendee.organization", mbr.getOrganization());
// ...
PDFFormGenerator pdfGenerator = new PDFFormGenerator(templateFile);
pdfGenerator.addFieldMap(map);
pdfGenerator.generatePDF(response.getOutputStream());Markup
Issue : JCMS-6291
3.4 Dépendance sur un module désactivé
Par défaut, si un module A dépend d'un module B, le module A sera désactivé si le module B n'est pas présent ou si il n'est pas actif. Il est maintenant possible d'affiner ce contrôle en permettant a module A de fonctionner si le module B est présent mais désactivé. Pour cela, l'attribut active
peut être ajouté dans la balise <dependency>
du fichier plugin.xml
.
...
<dependencies>
<dependency name="PluginA" active="false"/>
</dependencies>
...
Issue : https://issues.jalios.com/browse/JCMS-6233
3.5 getDataImage()
La méthode Publication.getDataImage()
rattrape désormais sur super.getDataImage()
.
Issue : JCMS-5900
3.6 Virtual ID pour les DBData
Ajout du support des virtual ID pour les DBData
Issue : JCMS-6330
3.7 Possibilité d'ajouter des DBMember dans les droits d'accès
JPlatform 10 SP1 lève une limite sur les DBMember : ils peuvent désormais être déclarées dans les droits d'accès des publications (authorizedMemberSet).
Issue : JCMS-2679
3.8 JcmsUtil.getLanguageMap() et JcmsUtil.getJcmsLanguageMap()
Le comportement de la méthode JcmsUtil.getLanguageMap(propName)
a été revu. Elle retourne une map contenant la localisation pour une propriété donnée uniquement pour les langues ayant une localisation pour cette propriété (avant ca rattrapait sur la langue par défaut et donc la map contenait des valeur erronée.). Cette méthode construit la map à partir des langues déclarées.
La méthode JcmsUtil.getJcmsLanguageMap()
a été ajoutée afin de construire la map avec toutes les langues disponibles dans JPlatform (actuellement 16 langues)
3.9 Token JWT
Intégration d'un nouveau mode d'authentification, par token JWT (plus d'information sur JWT : )
Le handler d'authentification attend le token dans le header Authorization
avec comme préfixe bearer
. Ce token est alors validé en utilisant la liste des clés publiques déclarées dans l'entrepôt de clés déclarées dans les propriétés.
Ainsi il est possible, si la clé publique d'une application externe est présente dans l'entrepôt, d'autoriser un token JWT non généré par la plateforme à condition que le sujet soit un login valide de la plateforme et que le champ issuer du token soit le channel name.
Le handler d'authentification gère aussi les même restrictions que pour les authkey via les claims url
, prefixLength
, methods
et ipMask
.
La page des authKey a été étendue pour générer un token JWT utilisable pour l'authentification, en plus des authKeys.
Enfin l'API interne de gestion des tokens JWT peut générer de token avec des payloads personnalisés, permettant d'être utilisé pour d'autres usages.
Pour plus de détails, consulté la documentation Configuration de l'authentification par JWT.
Note : Issue : JCMS-6336
3.10 SEO : Opengraph et twitter card
Les balises open graph sont maintenant générées dans le header de la page si la propriété seo.opengraph.enabled
est activée (Par défaut elle l'est).
Cela génère les balises suivantes :
og:title
(Le titre du portail / catégorie / publication)og:description
(La description du portail / catégorie / publication)og:image
(L'image de la publication / du JPortal)og:site_name
(Le nom du site channel name)og:url
(L'url canonical de la page)twitter:card
(La description de la page)- Documents :
- Image :
og:image
og:image:type
og:image:width
og:image:height
- Video :
og:video
og:video:type
- Audio
og:audio
og:audio:type
- Image :
Issue : JCMS-6339
3.11 EventSource
Ajout du support de EventSource : JCMS-6303
Il s'agit de pousser de l'information entre le serveur et un client HTTP (JS par exemple) . Une page de debug existe avec un exemple simple d'usage.
Note : il s'agit actuellement de tuyauterie et son utilisation va suivre (exemple du module JDrive)
Pour plus de détails, consultez la documentation EventSource SSE
Information sur la norme associée :
- https://www.w3schools.com/html/html5_serversentevents.asp
- https://developer.mozilla.org/en-US/docs/Web/API/EventSource
- https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events
- https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface
3.12 Aperçus PNG
Les apercus (thumbnail) peuvent être générés au format d'image PNG. Le format JPEG reste le format standard recommandé. Le format PNG peut être spécifié :
- dans un gabarit spécifique dans lequel l'utilisation du format PNG serait pertinent. via l'attribut
format="png"
du tag thumbnail, - globalement pour tous les aperçus générés par le site, avec la propriété
tag.thumbnail.format: png
. Cette configuration, n'est PAS recommandée. En effet, si l'utilisation du format PNG peut être bénéfique pour le rendu de certaines images (e.g. graphiques, illustration), son utilisation en standard alourdirait de façon conséquente le poids d'autres images (notamment les photos).
Cas particulier : les aperçus d'URL (thumbshot) utilisent toujours le format d'image générée par l'outil de thumbshoter configuré dans JCMS (cf propriétés tag.thumbnail.thumbshot.*).
Issue JCMS-4762
3.13 Sécurité - En-têtes HTTP
Les headers HTTP suivants sont désormais positionnés en standard, pour toutes les requêtes prise en charge par JCMS :
X-Content-Type-Options: nosniff
- JCMS-5509 (déjà le cas en 10.0.0, mais uniquement pour les requete de téléchargement de document) https://www.owasp.org/index.php/List_of_useful_HTTP_headers#X-Content-Type-OptionsX-XSS-Protection: 1
- JCMS-6393 https://www.owasp.org/index.php/OWASP_Secure_Headers_Project#xxxsp
Ces headers peuvent être modifiés avec les propriétés suivantes. Une valeur vide permet de désactiver le header.
channel.global-http-header.X-Content-Type-Options:
channel.global-http-header.X-XSS-Protection:.properties
3.14 Exclusion de fichier(s) de la minification
JPlatform minifie les fichiers JS et CSS dans le dossier WEB-INF/jcmswork
.
Problème : certaines librairies livrées par des plugins peuvent ne pas passer la minification et lever des erreurs au 1er démarrage.
Exemple d'erreurs rencontrées :
14:46:34,641 ERROR [JPlatform] [JsPacker] - line 354: offset 20: l'identifiant de propriété est incorrect
[...]
14:46:35,100 ERROR [JPlatform] [JsPacker] - line 1: offset 0: Compilation produced 19 syntax errors.
14:46:52,033 INFO [JPlatform] [JsPacker] - plugins/MomindumPlugin/js/lib/clipboard.js --> WEB-INF/jcmswork/min.js/plugins/MomindumPlugin/js/lib/clipboard.js
14:46:59,999 INFO [JPlatform] [JsPacker] - total : 2 s
Cette évolution permet d'ajouter des règles d'exclusion sur les fichiers à minifier.
Auparavant, il était juste possible de définir une regexp via une propriété unique du coeur (donc non surchargeable par les plugins) : channel.packer.minify-exclusion-regex
Format :
channel.packer.minify-exclusion-regex.{custom-suffix}: {custom-regexp}
Exemples :
# Pour un fichier donné
channel.packer.minify-exclusion-regex.momindum: plugins/MomindumPlugin/js/lib/clipboard.js
# Pour 2 fichiers donnés
channel.packer.minify-exclusion-regex.momindum: plugins/MomindumPlugin/js/lib/clipboard.js|plugins/MomindumPlugin/js/lib/other-lib.js
# Pour un ensemble de fichier "*.js"
channel.packer.minify-exclusion-regex.momindum: plugins/MomindumPlugin/js/\\..*\\.js
Issue JCMS-6329
3.15 Member.canBeReadBy et RightPolicyFilter
Des droits de lectures peuvent être mis en oeuvre sur les membres pour limiter leur visibilité. En raison des implications de performance des modifications associées et de la couverture fonctionelle pour l'instant limitée dans les modules, cette fonctionnalité est désactivée par défaut.
Pour évaluer cette nouvelle fonctionnalité :
Activitez la fonctionnalité avec la propriété member.read-right.enabled: true
Développez votre politique de droit via la nouvelle méthode des RightPolicyFilter
:
public boolean canBeReadBy(boolean isAuthorized, Member mbrToRead, Member mbrReading)
A noter : si une politique de droit spécifique est mis en place, les règles suivantes ne peuvent jamais être surchargées par RPF :
- Un membre peut toujours se voir
- Un admin central peut toujours voir tous les utilisateurs.
Issue : JCMS-4784
3.16 Hooks pour modifier le contenu de la recherche instantanée
Ce hook permet de modifier les items de la recherche instantanée disponible dans la topbar.
Actuellement on a :
- Workspace
- Publications
- Membres
Ces items sont sous formes de propriété :
channel.topbar.search.search-component.workspace: jcore/autocomplete/acTopbarSearch_workspace.jsp
channel.topbar.search.search-component.workspace.index: 1
channel.topbar.search.search-component.publication: jcore/autocomplete/acTopbarSearch_publication.jsp
channel.topbar.search.search-component.publication.index: 2
channel.topbar.search.search-component.member: jcore/autocomplete/acTopbarSearch_member.jsp
channel.topbar.search.search-component.member.index: 3
Il est possible de surcharger une des propriétés, ou vider une des propriétés pour utiliser son propre bloc de résultats.
L'index sert à définir l'ordre d'affichage des colonnes en partant de la gauche.
Le texte recherché est disponible en récupérant le Handler via le request attribute suivant et en appelant la méthode handler.getAutocomplete()
:
TopbarSearchAutocompleteHandler handler = (TopbarSearchAutocompleteHandler) request.getAttribute("jcms.topbar.search.formHandler");
Issue : JCMS-6333
4. Paramétrage
Propriété dbeventlog.query-limit
Afin d'éviter des explosions mémoire lors de la lecture de la table DBEventLog
, le nombre d'enregistrement traité à chaque passe est désormais limités. Le paramétrage est par défaut à 10000 et peut etre paramétré par la propriété dbeventlog.query-limit
.
Issue : JCMS-6374
5. Dépendances
5.1 Back end / server side / Java
Apache HttpComponents 4.x La librairie Apache HttpComponents est inclus dans le coeur à partir de JPlatform 10 SP1 (elle était préalablement fournir par le module Google Drive si celui était installé)
La librairie Apache Commons HttpClient 3.x est encore présente mais sera retirée dès que possible (cf JCMS-6435)
La librairie Google Protobuf a été mise à jour.
Issue : JCMS-6433
5.2 Front end / client side / JavaScript
TinyMCE 4.7.4 https://www.tinymce.com/docs/changelog/
Issue : JCMS-6376
Moment 2.20.1 et Moment Timezone 0.5.14-2017c
Issue : JCMS-6425