EN · DE · RU · FR · ES

#2787: FullCalendar.java

projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java Компонент Wicket (главный класс FullCalendar) · projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java 226 строк · 141 код · 37 комментариев · 48 пустых
Конкретный компонент Wicket, который отображает JavaScript-виджет FullCalendar на странице и связывает всю обработку событий на стороне сервера. Это центр оркестровки: он расширяет AbstractFullCalendar (заголовок/ресурсы) и реализует IRequestListener (получение Ajax-событий). При инициализации он генерирует случайные UUID для всех источников событий. Перед каждым рендерингом он настраивает пять поведений обратного вызова (получение событий, клик, перетаскивание, изменение размера, смена вида, выбор диапазона дат), если они не были настроены извне. Он рендерит JSON-конфигурацию календаря в OnDomReadyHeaderItem и делегирует запросы событий поведению GetEventsCallback. Шаблонные методы (onEventDropped, onEventResized и т.д.) предоставляют реализации по умолчанию, которые ничего не делают и могут быть переопределены подклассами или анонимными экземплярами.

Архитектура

Ленивая настройка обратных вызовов

Метод setupCallbacks() защищён условием if (getEvents != null) return; — он выполняется ровно один раз за жизненный цикл компонента, в onBeforeRender(). Для каждого типа обратного вызова (события, клик, выбор, перетаскивание, изменение размера, отображение вида) он проверяет соответствующее поле конфигурации: если оно ещё не установлено извне, создаётся поведение Wicket Ajax и в модель конфигурации внедряется сгенерированный скрипт обработчика. Этот ленивый шаблон позволяет вызывающим сторонам либо переопределять шаблонные методы (удобно для анонимных подклассов), либо предоставлять собственные скрипты обратного вызова через API конфигурации (для продвинутой интеграции с JavaScript).

Назначение UUID источникам событий

При инициализации каждый источник событий получает UUID, сгенерированный с помощью UUID.randomUUID() с удалёнными неалфавитно-цифровыми символами. Этот UUID служит идентификатором источника для Ajax-обратных вызовов — он встраивается в URL обратного вызова как часть JavaScript-функции, а сервер извлекает его из запроса для маршрутизации событий к правильному источнику.

Миграция на Wicket 8: MicroMap → HashMap

Обновление до Wicket 8 удалило org.apache.wicket.util.collections.MicroMap (оптимизация для маленьких карт в старых версиях Wicket). Метод setupCallbacks() был обновлён для использования new HashMap<>() вместо new MicroMap<>() при передаче переменной шаблонного URL. Это было единственным функциональным изменением в этом классе, помимо обновлений авторских прав.

Шаблонные методы обработки событий

Пять защищённых методов предоставляют точки подключения: onEventDropped, onEventResized (оба возвращают boolean, указывающий, было ли изменение принято), onDateRangeSelected, onEventClicked и onViewDisplayed. Реализации по умолчанию ничего не делают. Подклассы переопределяют их для реализации бизнес-логики — например, сохранения нового временного слота перетащенного события в базе данных.

Параллельность Ajax

getAjaxConcurrency() возвращает AjaxConcurrency.QUEUE, гарантируя, что множественные быстрые Ajax-запросы (например, от операций перетаскивания) обрабатываются последовательно, а не параллельно, предотвращая состояния гонки при обновлении позиций событий.

Рендеринг JSON-конфигурации

Метод renderHead() генерирует вызов инициализации FullCalendar: $("#markupId").fullCalendarExt({...сериализованный Config...});. Он использует ToStringUtil.toJsonString(config) с пользовательскими сериализаторами Joda-Time из AbstractFullCalendar. Идентификатор разметки связывает вызов JavaScript с конкретным DOM-элементом.

История Git

КоммитЧто изменилось
868d6abb7916166996Шесть коммитов: пять ежегодных обновлений заголовков авторских прав плюс одно функциональное изменение. Миграционный коммит (0d183e5df) заменил MicroMap на HashMap в методе setupCallbacks() и добавил соответствующие импорты java.util.HashMap/java.util.Map — исправление совместимости с API Wicket, необходимое при обновлении до Wicket 8, которое удалило утилитный класс MicroMap. Все остальные коммиты — это увеличение года в авторских правах.