EN · DE · RU · FR · ES

#2787: FullCalendar.java

projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java Wicket-Komponente (FullCalendar-Hauptklasse) · projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java 226 Zeilen · 141 Code · 37 Kommentare · 48 Leerzeichen
Die konkrete Wicket-Komponente, die ein FullCalendar-JavaScript-Widget auf einer Seite rendert und die gesamte serverseitige Ereignisbehandlung verdrahtet. Dies ist das Orchestrierungszentrum: Es erweitert AbstractFullCalendar (Header/Assets) und implementiert IRequestListener (Ajax-Ereignisabruf). Bei der Initialisierung werden für alle Ereignisquellen zufällige UUIDs generiert. Vor jedem Rendering werden fünf Callback-Verhalten (Ereignisabruf, Klick, Drag & Drop, Größenänderung, Ansichtswechsel, Datumsbereichsauswahl) eingerichtet, falls sie nicht extern konfiguriert wurden. Es rendert die JSON-Konfiguration des Kalenders in einen OnDomReadyHeaderItem und delegiert Ereignisanfragen an das GetEventsCallback-Verhalten. Vorlagenmethoden (onEventDropped, onEventResized usw.) bieten standardmäßige NoOp-Implementierungen, die von Unterklassen oder anonymen Instanzen überschrieben werden.

Architektur

Lazy-Callback-Einrichtung

Die Methode setupCallbacks() wird durch if (getEvents != null) return; geschützt – sie wird genau einmal pro Komponentenlebenszyklus in onBeforeRender() ausgeführt. Für jeden Callback-Typ (Ereignisse, Klick, Auswahl, Drop, Größenänderung, Ansichtsdarstellung) wird das entsprechende Konfigurationsfeld geprüft: Wenn es nicht bereits extern gesetzt ist, wird ein Wicket-Ajax-Verhalten erstellt und das generierte Handler-Skript in das Konfigurationsmodell eingefügt. Dieses Lazy-Muster ermöglicht es Aufrufern, entweder die Vorlagenmethoden zu überschreiben (praktisch für anonyme Unterklassen) oder benutzerdefinierte Callback-Skripte über die Konfigurations-API bereitzustellen (für fortgeschrittene JavaScript-Integration).

UUID-Zuweisung für Ereignisquellen

Bei der Initialisierung erhält jede Ereignisquelle eine UUID, die durch UUID.randomUUID() generiert wird, wobei nicht-alphanumerische Zeichen entfernt werden. Diese UUID dient als Identität der Quelle für Ajax-Callbacks – sie wird als Teil der JavaScript-Funktion in die Callback-URL eingebettet, und der Server extrahiert sie aus der Anfrage, um Ereignisse an die richtige Quelle weiterzuleiten.

Wicket-8-Migration: MicroMap → HashMap

Das Wicket-8-Upgrade entfernte org.apache.wicket.util.collections.MicroMap (eine Optimierung für kleine Maps in älteren Wicket-Versionen). Die Methode setupCallbacks() wurde aktualisiert, um new HashMap<>() anstelle von new MicroMap<>() zu verwenden, wenn die Vorlagen-URL-Variable übergeben wird. Dies war die einzige funktionale Änderung an dieser Klasse abgesehen von Copyright-Updates.

Vorlagenmethoden für die Ereignisbehandlung

Fünf geschützte Methoden bieten Einstiegspunkte: onEventDropped, onEventResized (beide geben einen booleschen Wert zurück, der angibt, ob die Änderung akzeptiert wurde), onDateRangeSelected, onEventClicked und onViewDisplayed. Standardimplementierungen tun nichts. Unterklassen überschreiben diese, um Geschäftslogik zu implementieren – zum Beispiel das Speichern eines neuen Zeitfensters eines verschobenen Ereignisses in der Datenbank.

Ajax-Gleichzeitigkeit

getAjaxConcurrency() gibt AjaxConcurrency.QUEUE zurück und stellt sicher, dass mehrere schnelle Ajax-Anfragen (z. B. von Drag-and-Drop-Operationen) sequenziell und nicht parallel verarbeitet werden, wodurch Wettlaufsituationen bei Aktualisierungen der Ereignispositionen verhindert werden.

Rendering der JSON-Konfiguration

Die Methode renderHead() generiert den FullCalendar-Initialisierungsaufruf: $("#markupId").fullCalendarExt({...serialisierte Config...});. Sie verwendet ToStringUtil.toJsonString(config) mit den benutzerdefinierten Joda-Time-Serialisierern aus AbstractFullCalendar. Die Markup-ID verknüpft den JavaScript-Aufruf mit dem spezifischen DOM-Element.

Git-Verlauf

CommitWas geändert wurde
868d6abb7 bis 916166996Sechs Commits: fünf jährliche Copyright-Header-Updates plus eine funktionale Änderung. Der Migrations-Commit (0d183e5df) ersetzte MicroMap durch HashMap in der Methode setupCallbacks() und fügte die entsprechenden Importe für java.util.HashMap/java.util.Map hinzu – eine Wicket-API-Kompatibilitätskorrektur, die durch das Wicket-8-Upgrade erforderlich wurde, das die Hilfsklasse MicroMap entfernte. Alle anderen Commits sind Aktualisierungen der Copyright-Jahreszahlen.