-
Notifications
You must be signed in to change notification settings - Fork 28
Release notes 6.4
Version 6.4.0 represents a significant platform modernization and feature expansion of the FullCalendar addon. This release bridges the gap for Vaadin 24 users who cannot yet migrate to Vaadin 25, while bringing a comprehensive set of v7 features to the v6 codebase.
The addon has been upgraded from Vaadin 14 (LTS) to Vaadin 24.10.x. This is a major platform shift that modernizes the underlying component framework.
- Java version: Requires Java 17+ (upgraded from Java 8)
- Polymer removal: Vaadin 14's Polymer 3 has been replaced with plain HTML Element-based web components (already completed in v6.0)
- Vaadin Flow: Updated to Vaadin Flow 24.10.x with all associated ecosystem updates
Breaking Change: This version requires Vaadin 24.10. Vaadin 14 LTS is no longer supported.
The Entry class now includes several new properties backported from v7:
| Field | Type | Purpose |
|---|---|---|
url |
String | Hyperlink for the entry; integrated into entry rendering |
interactive |
Boolean | Controls whether the entry is interactive (draggable, resizable) |
overlap |
Boolean |
Breaking change — now Boolean (nullable) instead of boolean primitive; use getters carefully |
recurringDuration |
String | For recurring entries, controls the duration of recurrence windows independently of event duration |
Version 6.4 introduces full RFC 5545 recurrence rule support via the new RRule class:
Entry event = new Entry("Team Meeting");
event.setStart(LocalDateTime.of(2025, 3, 24, 10, 0));
event.setEnd(LocalDateTime.of(2025, 3, 24, 11, 0));
// Weekly meetings, Monday and Friday, until end of April
RRule rule = RRule.weekly()
.byWeekday(DayOfWeek.MONDAY, DayOfWeek.FRIDAY)
.until(LocalDate.of(2025, 4, 30));
event.setRRule(rule);
calendar.getEntryProvider().asInMemory().addEntry(event);Key Features:
- Structured form (recommended): Set frequency and properties like
byWeekday,until,count, etc. - Raw RRULE string: For importing from external sources (e.g., iCalendar exports):
RRule.ofRaw("FREQ=WEEKLY;BYDAY=MO,FR") - Exclusions: Use
excludeDates()orexcludeRules()to define exception dates or patterns - Mutually exclusive with legacy recurrence fields (
recurringDaysOfWeek,recurringStartDate, etc.)
The @fullcalendar/rrule npm package is automatically bundled and loaded.
The overlap field's type has changed from boolean to Boolean:
entry.setOverlap(true); // supported
entry.setOverlap(null); // now allowed
Boolean val = entry.getOverlap(); // returns null if not setRecompilation is required. Be careful when reading the value — null is now a distinct state from false.
Version 6.4 introduces the JsCallback wrapper for client-side event handlers, replacing raw string-based callback injection:
// New (6.4+): type-safe wrapper
calendar.setOption(Option.ENTRY_DID_MOUNT,
JsCallback.of("function(info) { info.el.title = info.event.title; }"));
// Clear a callback
calendar.setOption(Option.ENTRY_DID_MOUNT, JsCallback.clearCallback());This replaces the previous setEntryDidMountCallback(String) pattern. The JsCallback.of() factory method wraps a JavaScript function string for safe transport to the client, where it is evaluated via new Function().
The bundled FullCalendar JavaScript library has been upgraded from 6.1.9 to 6.1.20, bringing:
- Bug fixes and performance improvements
- Enhanced compatibility with modern browser APIs
- Better internationalization support
Eleven new event classes have been added to support additional user interactions:
| Event Class | Purpose |
|---|---|
EntryDragStartEvent |
Fired when user begins dragging an entry |
EntryDragStopEvent |
Fired when user completes or cancels a drag operation |
EntryResizeStartEvent |
Fired when user begins resizing an entry |
EntryResizeStopEvent |
Fired when user completes or cancels a resize operation |
DropEvent |
Fired when content is dropped from outside the calendar |
EntryReceiveEvent |
Fired when an entry is received from an external source |
ExternalEntryDroppedEvent |
Fired when an external entry is dropped on the calendar |
ExternalEntryResizedEvent |
Fired when an external entry is resized |
ExternalEntryEvent |
Base class for external entry events |
TimeslotsUnselectEvent |
Fired when a selection is cleared |
EntryTimeChangedEvent |
Fired when an entry's time is changed |
These events integrate native browser DOM events with the FullCalendar backend, allowing precise control over drag, resize, and drop behaviors.
A large number of new Option enum constants have been added for advanced customization. See the Option enum Javadoc for the complete list.
-
Render hooks:
ENTRY_CONTENT,ENTRY_DID_MOUNT,DAY_CELL_CONTENT,SLOT_LABEL_CONTENT, etc. -
Interaction handlers:
SELECT_CONSTRAINT,SELECT_ALLOW,SELECT_OVERLAP, etc. -
Display configuration:
SLOT_LABEL_FORMAT,ENTRY_TIME_FORMAT,BUSINESS_HOURS, etc.
These options map directly to FullCalendar's JavaScript API and allow fine-grained control over rendering and behavior without requiring custom JavaScript.
Three new event source types enable fetching calendar entries from external systems:
| Source Type | Purpose |
|---|---|
| Google Calendar | Load events directly from Google Calendar feeds |
| iCalendar (ICS) | Import .ics files and feed URLs |
| JSON Feed | Load custom event feeds from URLs or APIs |
These are automatically integrated with the @fullcalendar/google-calendar, @fullcalendar/icalendar, and @fullcalendar/core packages.
// Set a global API key (applies to all Google Calendar sources)
calendar.setOption(Option.EXTERNAL_EVENT_SOURCE_GOOGLE_CALENDAR_API_KEY, "AIzaSy...");
// Add a Google Calendar event source
calendar.addClientSideEventSource(new GoogleCalendarEventSource("holidays@group.calendar.google.com")
.withId("holidays")
.withColor("green"));The scheduler component now supports Vaadin components directly in resource area columns:
FullCalendarScheduler scheduler = new FullCalendarScheduler();
ComponentResourceAreaColumn column = new ComponentResourceAreaColumn(
resource -> new Button("Edit " + resource.getTitle(),
e -> editResource(resource))
);
scheduler.setResourceAreaColumns(List.of(column));A new ResourceAreaColumn configuration class provides declarative control over scheduler resource area styling and layout.
New server-side Draggable class for making external Vaadin components draggable onto the calendar,
replacing the previous manual JS initialization approach.
-
new Draggable(component)— wrap any Vaadin component to make it draggable -
new Draggable(component, entry)— include entry data that FC uses to create a calendar entry on drop -
withItemSelector(String)— container mode: only children matching the CSS selector are draggable -
withEventDataCallback(JsCallback)— dynamically create entry data from the dragged element via JS -
calendar.addDraggable(draggable)— register on a calendar; returnsRegistrationfor cleanup -
EntryReceiveEvent.getDraggable()— access the original Draggable from the entry receive listener -
DropEvent.getDraggable()— access the Draggable from the drop listener
The Draggable lifecycle is fully managed: re-initialization on reattach, cleanup of JS listeners
on deregistration and disconnect.
The in-memory entry provider now applies an internal size bound to prevent unbounded memory growth. This is handled automatically and requires no configuration change. No new API was added.
Entry provider refresh operations are now fully thread-safe, allowing background processes to update the calendar without synchronization overhead.
Conversion overhead for Entry serialization has been reduced via reflection-based caching of property accessors, improving responsiveness during calendar interaction.
The following npm packages are now automatically bundled and loaded:
-
@fullcalendar/rrule— RFC 5545 recurrence rules -
@fullcalendar/google-calendar— Google Calendar integration -
@fullcalendar/icalendar— iCalendar (ICS) support -
ical.js— ICS file parsing
These are included in the build automatically; no manual npm installation required.
Approximately 30 convenience methods have been deprecated in favor of the unified setOption() API. Examples:
// Deprecated (still works)
calendar.setFirstDay(DayOfWeek.MONDAY);
// Preferred (v6.4+)
calendar.setOption(Option.FIRST_DAY, DayOfWeek.MONDAY);Deprecated methods remain functional but log warnings if invoked. They will be removed in a future major version.
See the Migration Guide for a complete list of deprecated methods and their replacements.
The following v7 features are not backported to v6.4:
-
Aura Theme variant — The Aura theme (introduced in Vaadin 25) is not available. The Lumo-based
full-calendar-theme-vaadin.cssis included and works with Vaadin 24. -
Jackson JSON — The addon continues to use
elemental.json(Vaadin's built-in JSON library) for compatibility - Java 21+ Language Features — Code remains Java 17-compatible; no records, pattern matching, or sealed classes
| Current Version | Recommended Action |
|---|---|
| v6.3.x | Review Migration Guide, update Maven dependency, recompile |
| v6.2.x or earlier | Review full v6.0 migration guide first, then v6.3→6.4 |
| v5.x or earlier | Not recommended; consider v7.x instead |
- Documentation: See Migration Guide for step-by-step instructions
- Issues: GitHub Issues
- Demo: Clone the repository and run the demo app with Vaadin 24.10
Release date: March 2026 FullCalendar JS Library: 6.1.20 Vaadin: 24.10.x Java: 17+