From 60091136d338c7b2d28536ac64948e6d0fd01cd1 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 19 Nov 2025 11:22:00 -0300 Subject: [PATCH 1/8] ci: upgrade v25 commons-demo to 5.0.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5b0cbd8..d5096a2 100644 --- a/pom.xml +++ b/pom.xml @@ -530,7 +530,7 @@ com.flowingcode.vaadin.addons.demo commons-demo - 4.4.0-SNAPSHOT + 5.0.0-SNAPSHOT test From ba25d0e4d24e24b31dab2cb7b72359aacaa9af60 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 19 Nov 2025 11:58:44 -0300 Subject: [PATCH 2/8] build: set version to 4.6.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d5096a2..2874c42 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.vaadin.addons.flowingcode year-month-calendar - 4.5.3-SNAPSHOT + 4.6.0-SNAPSHOT Year Month Calendar Add-on Year Month Calendar Add-on for Vaadin Flow From a0e25244c2b6ba16d30b0a51914f5ae1b684a22e Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 26 Nov 2025 01:50:03 -0300 Subject: [PATCH 3/8] build: upgrade vaadin version to 24.9.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2874c42..005a8d9 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ Year Month Calendar Add-on for Vaadin Flow - 24.5.0 + 24.9.5 17 17 UTF-8 From c6d502a23eaa372f2507a088377563037a1cea34 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 19 Nov 2025 11:58:09 -0300 Subject: [PATCH 4/8] build: add flowing code snapshot repository --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index 005a8d9..9a84386 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,16 @@ flowing-releases https://maven.flowingcode.com/releases + + FlowingCode Snapshots + https://maven.flowingcode.com/snapshots + + true + + + false + + From 4db552afb64cc93d899c8f5b7d765517c0a2f810 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 19 Nov 2025 11:57:36 -0300 Subject: [PATCH 5/8] feat: add json-migration-helper --- pom.xml | 11 +++++++++++ .../addons/ycalendar/AbstractCalendarComponent.java | 9 ++++++--- .../addons/ycalendar/InlineDatePicker.java | 7 +++++-- .../flowingcode/addons/ycalendar/YearMonthField.java | 5 ++++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 9a84386..6dd8c4b 100644 --- a/pom.xml +++ b/pom.xml @@ -129,6 +129,17 @@ vaadin-core true + + com.flowingcode.vaadin + json-migration-helper + 0.0.1-SNAPSHOT + + + org.projectlombok + lombok + 1.18.42 + provided + org.slf4j slf4j-simple diff --git a/src/main/java/com/flowingcode/addons/ycalendar/AbstractCalendarComponent.java b/src/main/java/com/flowingcode/addons/ycalendar/AbstractCalendarComponent.java index fe8e753..836e528 100644 --- a/src/main/java/com/flowingcode/addons/ycalendar/AbstractCalendarComponent.java +++ b/src/main/java/com/flowingcode/addons/ycalendar/AbstractCalendarComponent.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -19,6 +19,8 @@ */ package com.flowingcode.addons.ycalendar; +import com.flowingcode.vaadin.jsonmigration.JsonMigration; +import com.flowingcode.vaadin.jsonmigration.JsonSerializer; import com.vaadin.flow.component.AttachEvent; import com.vaadin.flow.component.Component; import com.vaadin.flow.component.ComponentEventListener; @@ -26,16 +28,17 @@ import com.vaadin.flow.component.UI; import com.vaadin.flow.component.datepicker.DatePicker.DatePickerI18n; import com.vaadin.flow.function.SerializableConsumer; -import com.vaadin.flow.internal.JsonSerializer; import com.vaadin.flow.shared.Registration; import elemental.json.JsonObject; import java.util.Objects; +import lombok.experimental.ExtensionMethod; /** * A base abstract class for calendar components, with additional methods used for i18n initialization * and listener registration. */ @SuppressWarnings("serial") +@ExtensionMethod(JsonMigration.class) public abstract class AbstractCalendarComponent extends Component { private DatePickerI18n i18n; diff --git a/src/main/java/com/flowingcode/addons/ycalendar/InlineDatePicker.java b/src/main/java/com/flowingcode/addons/ycalendar/InlineDatePicker.java index 3da39ab..cdad075 100644 --- a/src/main/java/com/flowingcode/addons/ycalendar/InlineDatePicker.java +++ b/src/main/java/com/flowingcode/addons/ycalendar/InlineDatePicker.java @@ -19,6 +19,8 @@ */ package com.flowingcode.addons.ycalendar; +import com.flowingcode.vaadin.jsonmigration.JsonMigration; +import com.flowingcode.vaadin.jsonmigration.JsonSerializer; import com.vaadin.flow.component.AbstractSinglePropertyField; import com.vaadin.flow.component.HasSize; import com.vaadin.flow.component.HasTheme; @@ -28,18 +30,19 @@ import com.vaadin.flow.component.dependency.Uses; import com.vaadin.flow.function.SerializableFunction; import com.vaadin.flow.function.ValueProvider; -import com.vaadin.flow.internal.JsonSerializer; import java.time.LocalDate; import java.time.YearMonth; import java.util.Objects; import java.util.Optional; import java.util.stream.IntStream; +import lombok.experimental.ExtensionMethod; @SuppressWarnings("serial") @Tag("fc-inline-date-picker") @JsModule("./fc-inline-date-picker/fc-inline-date-picker.js") @Uses(YearMonthField.class) @Uses(MonthCalendar.class) +@ExtensionMethod(JsonMigration.class) public class InlineDatePicker extends AbstractSinglePropertyField implements HasSize, HasTheme { private static final String VALUE_PROPERTY = "value"; @@ -51,7 +54,7 @@ public class InlineDatePicker extends AbstractSinglePropertyField SerializableFunction map(SerializableFunction f) { return r->Optional.ofNullable(r).map(f).orElse(null); } - + /** Creates a new instance of InlineDatePicker initialized with the current date and with week numbers visible. */ public InlineDatePicker() { super(VALUE_PROPERTY, null, String.class, map(LocalDate::parse), map(LocalDate::toString)); diff --git a/src/main/java/com/flowingcode/addons/ycalendar/YearMonthField.java b/src/main/java/com/flowingcode/addons/ycalendar/YearMonthField.java index dcc1847..2c6a372 100644 --- a/src/main/java/com/flowingcode/addons/ycalendar/YearMonthField.java +++ b/src/main/java/com/flowingcode/addons/ycalendar/YearMonthField.java @@ -19,22 +19,25 @@ */ package com.flowingcode.addons.ycalendar; +import com.flowingcode.vaadin.jsonmigration.JsonMigration; +import com.flowingcode.vaadin.jsonmigration.JsonSerializer; import com.vaadin.flow.component.AbstractSinglePropertyField; import com.vaadin.flow.component.HasTheme; import com.vaadin.flow.component.Tag; import com.vaadin.flow.component.datepicker.DatePicker.DatePickerI18n; import com.vaadin.flow.component.dependency.JsModule; import com.vaadin.flow.function.SerializableFunction; -import com.vaadin.flow.internal.JsonSerializer; import elemental.json.Json; import elemental.json.JsonValue; import java.time.YearMonth; import java.util.Objects; import java.util.Optional; +import lombok.experimental.ExtensionMethod; @SuppressWarnings("serial") @Tag("fc-year-month-field") @JsModule("./fc-year-month-field/fc-year-month-field.js") +@ExtensionMethod(JsonMigration.class) public class YearMonthField extends AbstractSinglePropertyField implements HasTheme { From 367828d97261b334c1d66ea3d9845c795189f369 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:15:24 -0300 Subject: [PATCH 6/8] refactor: refactor month calendar for vaadin 24/25 compatibility --- .../fc-month-calendar/fc-month-calendar.js | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/main/resources/META-INF/frontend/fc-month-calendar/fc-month-calendar.js b/src/main/resources/META-INF/frontend/fc-month-calendar/fc-month-calendar.js index c3325a7..a5717c0 100644 --- a/src/main/resources/META-INF/frontend/fc-month-calendar/fc-month-calendar.js +++ b/src/main/resources/META-INF/frontend/fc-month-calendar/fc-month-calendar.js @@ -113,33 +113,34 @@ export class FcMonthCalendarElement extends MonthCalendarMixin { e.forEach(item => item.removeAttribute('class')); } - ready() { - super.ready(); - let styles = ` - [part='date'][class]::before { - box-shadow: none; - } - - [part='date'][selected] { - color: unset; - } - - [part='date'][selected]::before { - background-color: unset; - border: 1px solid var(--lumo-primary-color); - } - - [part~=month-header] { - display: var(--__month-calendar-header-display, block); - } - `; - - this.$.element.shadowRoot.querySelector("style").innerHTML+=styles; - } - connectedCallback() { super.connectedCallback(); this.addEventListener("selected-date-changed",this._onSelectedDateChanged); + const updateComplete = this.$.element.updateComplete || Promise.resolve(); + updateComplete.then(()=>{ + if (!this.$.element.shadowRoot.querySelectorAll("style[data='fc-component-styles']").length) { + let style = document.createElement("style"); + style.setAttribute("data","fc-component-styles"); + style.innerHTML+=` + [part='date'][class]::before { + box-shadow: none; + } + + [part='date'][selected] { + color: unset; + } + + [part='date'][selected]::before { + background-color: unset; + border: 1px solid var(--lumo-primary-color); + } + + [part~=month-header] { + display: var(--__month-calendar-header-display, block); + }`; + this.$.element.shadowRoot.append(style); + } + }); } disconnectedCallback() { From 6d1c783ed114b47b88bd55cc7b7c428c9a45c130 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Tue, 25 Nov 2025 16:10:23 -0300 Subject: [PATCH 7/8] refactor: isolate vaadin 24 code in ExtendedDatePicker --- .../frontend/fc-date-picker/fc-date-picker.js | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js b/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js index 2bf0332..364406c 100644 --- a/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js +++ b/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js @@ -52,31 +52,32 @@ export class FcDatePicker extends DatePicker { this._styles={}; - this._overlayElement.renderer = e => { - this._boundOverlayRenderer.call(this,e); - - if (!this._overlayContent._monthScroller.__fcWrapped) { - const createElement = this._overlayContent._monthScroller._createElement; - this._overlayContent._monthScroller.__fcWrapped = true; - this._overlayContent._monthScroller._createElement = () => { - var calendar = createElement(); - calendar.addEventListener('dom-change',ev=>{ - if (ev.composedPath()[0].as=='week') { - setTimeout(()=> this._updateMonthStyles(calendar)); - } - }); - return calendar; + if (this._boundOverlayRenderer) { + this._overlayElement.renderer = e => { + this._boundOverlayRenderer.call(this,e); + + if (!this._overlayContent._monthScroller.__fcWrapped) { + const createElement = this._overlayContent._monthScroller._createElement; + this._overlayContent._monthScroller.__fcWrapped = true; + this._overlayContent._monthScroller._createElement = () => { + var calendar = createElement(); + calendar.addEventListener('dom-change',ev=>{ + if (ev.composedPath()[0].as=='week') { + setTimeout(()=> this._updateMonthStyles(calendar)); + } + }); + return calendar; + } } - } - }; - - this.inputElement.addEventListener('focus', ()=>this.__focused=true); + }; + } } refreshAll() { this._styles = {}; - if (this._overlayContent) { - this._overlayContent._monthScroller.querySelectorAll("vaadin-month-calendar").forEach(calendar=>this._updateMonthStyles(calendar)); + const overlayContent = this._overlayContent; + if (overlayContent) { + overlayContent._monthScroller.querySelectorAll("vaadin-month-calendar").forEach(calendar=>this._updateMonthStyles(calendar)); } } From 8ff9403affcdcc8f7e23560afe5e3719000e14e1 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Wed, 26 Nov 2025 12:12:47 -0300 Subject: [PATCH 8/8] refactor: refactor ExtendedDatePicker for vaadin 24/25 compatibility --- .../addons/ycalendar/ExtendedDatePicker.java | 3 ++- .../frontend/fc-date-picker/fc-date-picker.js | 24 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/flowingcode/addons/ycalendar/ExtendedDatePicker.java b/src/main/java/com/flowingcode/addons/ycalendar/ExtendedDatePicker.java index 02db682..cf1e4e7 100644 --- a/src/main/java/com/flowingcode/addons/ycalendar/ExtendedDatePicker.java +++ b/src/main/java/com/flowingcode/addons/ycalendar/ExtendedDatePicker.java @@ -19,6 +19,7 @@ */ package com.flowingcode.addons.ycalendar; +import com.flowingcode.vaadin.jsonmigration.JsonMigration; import com.vaadin.flow.component.ClientCallable; import com.vaadin.flow.component.Tag; import com.vaadin.flow.component.datepicker.DatePicker; @@ -88,7 +89,7 @@ private JsonObject fetchStyles(String minStr, String maxStr) { String key = m.toString(); getStyles(m).ifPresent(styles -> result.put(key, styles)); } - return result; + return JsonMigration.convertToClientCallableResult(result); } private Optional getStyles(YearMonth yearMonth) { diff --git a/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js b/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js index 364406c..f0dbd89 100644 --- a/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js +++ b/src/main/resources/META-INF/frontend/fc-date-picker/fc-date-picker.js @@ -70,12 +70,34 @@ export class FcDatePicker extends DatePicker { } } }; + } else { + this.inputElement.addEventListener('focus', ()=>this.__focused=true); + + const self=this; + this.addEventListener('opened-changed', ev=>{ + if (ev.detail.value && !self._overlayContent._monthScroller.__fcWrapped) { + this._overlayContent._monthScroller.__fcWrapped = true; + const updateElement = self._overlayContent._monthScroller._updateElement; + self._overlayContent._monthScroller._updateElement = (element, index) => { + updateElement(element,index); + if (element instanceof HTMLElement) { + this._updateMonthStyles(element); + } + }; + const createElement = self._overlayContent._monthScroller._createElement; + self._overlayContent._monthScroller._createElement = () => { + var calendar = createElement(); + setTimeout(()=>this._updateMonthStyles(calendar)); + return calendar; + }; + } + }); } } refreshAll() { this._styles = {}; - const overlayContent = this._overlayContent; + const overlayContent = this._overlayContent || this.querySelector("vaadin-date-picker-overlay-content"); if (overlayContent) { overlayContent._monthScroller.querySelectorAll("vaadin-month-calendar").forEach(calendar=>this._updateMonthStyles(calendar)); }