Introduction
Installer Kuik
Ajouter la librairie au fichier pom.xml.
<dependencies>
<!-- ... -->
<dependency>
<groupId>fr.kosmos.web.kore</groupId>
<artifactId>kuik</artifactId>
</dependency>
<!-- ... -->
<!-- optionnellement -->
<dependency>
<groupId>fr.kosmos.web.kore</groupId>
<artifactId>kuik-documentation</artifactId>
</dependency>
<!-- ... -->
</dependencies>
Ensuite, il faut intégrer la chaîne de build.
Utilisation
Ajouter la tld
<%@ taglib prefix="kuik" uri="kuik" %>
Ajouter un composant
<kuik:button priority="secondary">Cliquer ici</kuik:button>
Création d'une bibliothèque de composants custom
Il est possible de créer vos propres composants. Il faut créer un fichier tld :
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>projet</short-name>
<uri>projet</uri>
<tag-file>
<name>rich-content</name>
<path>/META-INF/tags/projet/rich-content/rich-content.tag</path>
<description>Composant projet</description>
<display-name></display-name>Organisme</display-name>
</tag-file>
</taglib>
Et un fichier tag :
<%@ tag pageEncoding="UTF-8" trimDirectiveWhitespaces="true" dynamic-attributes="dynattrs" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="classes" value="rich-content"/>
<c:set var="attributes">
<c:forEach items="${dynattrs}" var="a">
<c:choose></c:choose>
<c:when test="${a.key == 'class'}">
<c:set value="${classes} ${a.value}" var="classes"/>
</c:when>
<c:otherwise>${a.key}="${a.value}"</c:otherwise>
</c:choose>
</c:forEach>
</c:set>
<div class="${classes}" ${attributes}>
<jsp:doBody />
</div>
Déclaration d'un script pour un composant custom
Dans le cadre de l'éco-conception, il n'est pas nécessaire d'ajouter un script pour un composant custom s'il n'est pas présent dans la page consultée par l'utilisateur.
Étant donné que, par défaut, le script en question est absent, il est donc nécessaire de l'ajouter dès que le composant est inclus dans la page.
Pour cela, il y a 2 scénarios possibles : l'ajout systématique depuis le composant lui-même ou le repérage du composant dans la page.
Ajout systématique depuis le composant
Depuis le fichier du composant (*.tag), il est possible de faire appel à une balise dédiée à
l'ajout d'un script JS :
<%@ taglib prefix="resources" uri="resources" %>
<resources:addScript src="/static/js/mon-script.js" type="module" />
L'appel à cet élément permet d'indiquer, lors de la génération de la page, que le script en question est requis.
Il sera ajouté plus tard, à la fin de la génération de la page (généralement après le footer) :
<%@ taglib prefix="resources" uri="resources" %>
<resources:getScripts />
L'avantage de cette solution est double :
- Pouvoir n'injecter le script que s'il est nécessaire
- Possibilité d'appeler plusieurs fois le composant sans risquer d'ajouter le script plusieurs fois : l'unicité d'appel est garantie.
Repérage automatique de composants dans la page
L'autre possibilité consiste à repérer automatiquement la présence d'un composant dans la page, côté navigateur, une fois la page générée.
Pour cela, il est nécessaire de déclarer une configuration comme dans le modèle ci-dessous :
import(/* webpackIgnore: true */ `/static/js/autoloader-handler.js?t=${Date.now()}`).then(({ defineConfigurations }) => {
defineConfigurations({
condition: () => !!(document.querySelector('.ckeditor-accordion')),
scripts: [ '/static/js/legacy/ckeditor-accordion.js' ]
});
});
La méthode defineConfigurations est une méthode qui peut prendre (théoriquement) une infinité
d'arguments.
Chaque configuration est composée de deux éléments :
condition: une fonction qui retourne un booléen (truesi le script du composant doit être importé,falsesinon)scripts: un tableau de scripts à importer si le composant est présent dans la page
NOTE : Le script /static/js/autoloader-handler.js est fourni par Kuik. Il doit être
importé de la même façon que l'exemple le montre (avec webpackIgnore: true et un import
dynamique).