EN · DE · RU · FR · ES

#2787: FullCalendar.java

projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java Composant Wicket (Classe principale FullCalendar) · projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java 226 lignes · 141 code · 37 commentaires · 48 vides
Le composant Wicket concret qui affiche un widget JavaScript FullCalendar sur une page et gère toute la gestion des événements côté serveur. C'est le centre d'orchestration : il étend AbstractFullCalendar (en-tête/ressources) et implémente IRequestListener (récupération d'événements Ajax). Lors de l'initialisation, il génère des UUID aléatoires pour toutes les sources d'événements. Avant chaque rendu, il met en place cinq comportements de callback (récupération d'événements, clic, glisser-déposer, redimensionnement, changement de vue, sélection de plage de dates) s'ils n'ont pas été configurés en externe. Il rend la configuration JSON du calendrier dans un OnDomReadyHeaderItem et délègue les requêtes d'événements au comportement GetEventsCallback. Les méthodes template (onEventDropped, onEventResized, etc.) fournissent des implémentations par défaut vides que les sous-classes ou les instances anonymes peuvent redéfinir.

Architecture

Configuration paresseuse des callbacks

La méthode setupCallbacks() est protégée par if (getEvents != null) return; — elle s'exécute exactement une fois par cycle de vie du composant, dans onBeforeRender(). Pour chaque type de callback (événements, clic, sélection, dépôt, redimensionnement, affichage de vue), elle vérifie le champ de configuration correspondant : s'il n'est pas déjà défini en externe, elle crée un comportement Ajax Wicket et injecte le script de gestionnaire généré dans le modèle de configuration. Ce modèle paresseux permet aux appelants soit de redéfinir les méthodes template (pratique pour les sous-classes anonymes), soit de fournir des scripts de callback personnalisés via l'API de configuration (pour une intégration JavaScript avancée).

Attribution d'UUID aux sources d'événements

Lors de l'initialisation, chaque source d'événement reçoit un UUID généré par UUID.randomUUID() avec les caractères non alphanumériques supprimés. Cet UUID sert d'identité de la source pour les callbacks Ajax — il est intégré dans l'URL de callback dans le cadre de la fonction JavaScript, et le serveur l'extrait de la requête pour acheminer les événements vers la source correcte.

Migration Wicket 8 : MicroMap → HashMap

La mise à niveau vers Wicket 8 a supprimé org.apache.wicket.util.collections.MicroMap (une optimisation de petite carte dans les anciennes versions de Wicket). La méthode setupCallbacks() a été mise à jour pour utiliser new HashMap<>() au lieu de new MicroMap<>() lors du passage de la variable d'URL template. C'était le seul changement fonctionnel apporté à cette classe en dehors des mises à jour de copyright.

Méthodes template de gestion des événements

Cinq méthodes protégées fournissent des points d'ancrage : onEventDropped, onEventResized (les deux retournent un booléen indiquant si le changement a été accepté), onDateRangeSelected, onEventClicked et onViewDisplayed. Les implémentations par défaut ne font rien. Les sous-classes redéfinissent ces méthodes pour implémenter la logique métier — par exemple, persister le nouveau créneau horaire d'un événement glissé dans la base de données.

Concurrence Ajax

getAjaxConcurrency() retourne AjaxConcurrency.QUEUE, garantissant que plusieurs requêtes Ajax rapides (par exemple, provenant d'opérations de glisser-déposer) sont traitées séquentiellement plutôt que simultanément, évitant ainsi les conditions de concurrence dans les mises à jour de position des événements.

Rendu de la configuration JSON

La méthode renderHead() génère l'appel d'initialisation FullCalendar : $("#markupId").fullCalendarExt({...Config sérialisé...});. Elle utilise ToStringUtil.toJsonString(config) avec les sérialiseurs Joda-Time personnalisés de AbstractFullCalendar. L'ID de balisage lie l'invocation JavaScript à l'élément DOM spécifique.

Historique Git

CommitCe qui a changé
868d6abb7 à 916166996Six commits : cinq mises à jour annuelles de l'en-tête de copyright plus un changement fonctionnel. Le commit de migration (0d183e5df) a remplacé MicroMap par HashMap dans la méthode setupCallbacks() et a ajouté les imports java.util.HashMap/java.util.Map correspondants — un correctif de compatibilité d'API Wicket requis par la mise à niveau vers Wicket 8 qui a supprimé la classe utilitaire MicroMap. Tous les autres commits sont des incréments d'année de copyright.