EN · DE · RU · FR · ES

#2787: FullCalendar.java

projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java Componente Wicket (Clase Principal FullCalendar) · projectforge-wicket/src/main/java/net/ftlines/wicket/fullcalendar/FullCalendar.java 226 líneas · 141 código · 37 comentarios · 48 en blanco
El componente Wicket concreto que renderiza un widget JavaScript FullCalendar en una página y gestiona todo el manejo de eventos del lado del servidor. Este es el centro de orquestación: extiende AbstractFullCalendar (encabezado/recursos) e implementa IRequestListener (obtención de eventos Ajax). En la inicialización, genera UUIDs aleatorios para todas las fuentes de eventos. Antes de cada renderizado, configura cinco comportamientos de callback (obtención de eventos, clic, arrastrar-soltar, redimensionar, cambio de vista, selección de rango de fechas) si no han sido configurados externamente. Renderiza la configuración JSON del calendario en un OnDomReadyHeaderItem y delega las solicitudes de eventos al comportamiento GetEventsCallback. Los métodos plantilla (onEventDropped, onEventResized, etc.) proporcionan implementaciones predeterminadas sin operación que las subclases o instancias anónimas sobrescriben.

Arquitectura

Configuración Perezosa de Callbacks

El método setupCallbacks() está protegido por if (getEvents != null) return; — se ejecuta exactamente una vez por ciclo de vida del componente, en onBeforeRender(). Para cada tipo de callback (eventos, clic, seleccionar, soltar, redimensionar, visualización de vista), verifica el campo de configuración correspondiente: si no se ha establecido externamente, crea un comportamiento Ajax de Wicket e inyecta el script del manejador generado en el modelo de configuración. Este patrón perezoso permite a los llamadores sobrescribir los métodos plantilla (conveniente para subclases anónimas) o proporcionar scripts de callback personalizados a través de la API de configuración (para integración avanzada con JavaScript).

Asignación de UUID a Fuentes de Eventos

En la inicialización, cada fuente de eventos recibe un UUID generado por UUID.randomUUID() con caracteres no alfanuméricos eliminados. Este UUID sirve como identidad de la fuente para los callbacks Ajax — está incrustado en la URL del callback como parte de la función JavaScript, y el servidor lo extrae de la solicitud para enrutar los eventos a la fuente correcta.

Migración a Wicket 8: MicroMap → HashMap

La actualización a Wicket 8 eliminó org.apache.wicket.util.collections.MicroMap (una optimización de mapa pequeño en Wicket anterior). El método setupCallbacks() se actualizó para usar new HashMap<>() en lugar de new MicroMap<>() al pasar la variable de URL de la plantilla. Este fue el único cambio funcional en esta clase más allá de las actualizaciones de derechos de autor.

Métodos Plantilla de Manejo de Eventos

Cinco métodos protegidos proporcionan puntos de enganche: onEventDropped, onEventResized (ambos devuelven un booleano indicando si el cambio fue aceptado), onDateRangeSelected, onEventClicked y onViewDisplayed. Las implementaciones predeterminadas no hacen nada. Las subclases sobrescriben estos para implementar lógica de negocio — por ejemplo, persistir el nuevo horario de un evento arrastrado en la base de datos.

Concurrencia Ajax

getAjaxConcurrency() devuelve AjaxConcurrency.QUEUE, asegurando que múltiples solicitudes Ajax rápidas (por ejemplo, de operaciones de arrastrar y soltar) se procesen secuencialmente en lugar de concurrentemente, evitando condiciones de carrera en las actualizaciones de posición de eventos.

Renderizado de Configuración JSON

El método renderHead() genera la llamada de inicialización de FullCalendar: $("#markupId").fullCalendarExt({...Config serializado...});. Utiliza ToStringUtil.toJsonString(config) con los serializadores Joda-Time personalizados de AbstractFullCalendar. El ID de marcado vincula la invocación de JavaScript al elemento DOM específico.

Historial Git

CommitQué cambió
868d6abb7 hasta 916166996Seis commits: cinco actualizaciones anuales del encabezado de derechos de autor más un cambio funcional. El commit de migración (0d183e5df) reemplazó MicroMap con HashMap en el método setupCallbacks() y añadió las importaciones correspondientes de java.util.HashMap/java.util.Map — una corrección de compatibilidad con la API de Wicket requerida por la actualización a Wicket 8 que eliminó la clase de utilidad MicroMap. Todos los demás commits son incrementos del año de derechos de autor.