diff --git a/pom.xml b/pom.xml index 5b0cbd8..6dd8c4b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,12 @@ 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 - 24.5.0 + 24.9.5 17 17 UTF-8 @@ -91,6 +91,16 @@ flowing-releases https://maven.flowingcode.com/releases + + FlowingCode Snapshots + https://maven.flowingcode.com/snapshots + + true + + + false + + @@ -119,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 @@ -530,7 +551,7 @@ com.flowingcode.vaadin.addons.demo commons-demo - 4.4.0-SNAPSHOT + 5.0.0-SNAPSHOT test 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/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/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 { 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..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 @@ -52,31 +52,54 @@ 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; + } } - } - }; + }; + } else { + this.inputElement.addEventListener('focus', ()=>this.__focused=true); - 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 = {}; - if (this._overlayContent) { - this._overlayContent._monthScroller.querySelectorAll("vaadin-month-calendar").forEach(calendar=>this._updateMonthStyles(calendar)); + const overlayContent = this._overlayContent || this.querySelector("vaadin-date-picker-overlay-content"); + if (overlayContent) { + overlayContent._monthScroller.querySelectorAll("vaadin-month-calendar").forEach(calendar=>this._updateMonthStyles(calendar)); } } 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() {