This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 1a0701ed4 [OPENMEETINGS-2784] switching to the latest tempus-dominus
1a0701ed4 is described below

commit 1a0701ed43c7d25014285ef67481266ae5422d89
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Tue Jul 9 15:32:14 2024 +0700

    [OPENMEETINGS-2784] switching to the latest tempus-dominus
---
 .../common/datetime/AbstractOmDateTimePicker.java  | 106 +++++++++------------
 .../web/common/datetime/AjaxOmDatePicker.java      |  20 +++-
 .../web/common/datetime/OmDateTimePicker.java      |  16 +++-
 .../web/common/datetime/datepicker-functions.js    |  36 ++++---
 .../web/user/calendar/CalendarPanel.java           |   4 +-
 .../apache/openmeetings/web/util/TestDateTime.java |  26 -----
 6 files changed, 97 insertions(+), 111 deletions(-)

diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.java
index 431851fbc..1a99992eb 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.java
@@ -19,12 +19,8 @@
 package org.apache.openmeetings.web.common.datetime;
 
 import java.io.Serializable;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
 
-import org.apache.openmeetings.web.app.WebSession;
-import org.apache.wicket.Session;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
@@ -34,59 +30,70 @@ import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.model.ChainingModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 
-import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.datetime.AbstractDateTimePickerWithIcon;
-import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.datetime.DatetimePickerConfig;
-import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.datetime.DatetimePickerIconConfig;
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusConfig;
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.AbstractTempusDominusWithIcon;
 import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType;
 
 public abstract class AbstractOmDateTimePicker<T extends Serializable> extends 
FormComponentPanel<T> {
        private static final long serialVersionUID = 1L;
-       private static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd";
-       private static final String DEFAULT_DATE_TIME_FORMAT = 
DEFAULT_DATE_FORMAT + " HH:mm:ss";
        private static final ResourceReference FUNCJS = new 
JavaScriptResourceReference(AbstractOmDateTimePicker.class, 
"datepicker-functions.js");
-       private final boolean dateOnly;
        private final HiddenField<T> date;
-       private AbstractDateTimePickerWithIcon<T> picker;
+       private AbstractTempusDominusWithIcon<T> picker;
        private String markupId;
 
-       AbstractOmDateTimePicker(String id, IModel<T> model, boolean dateOnly) {
+       AbstractOmDateTimePicker(String id, IModel<T> model) {
                super(id, model);
-               this.dateOnly = dateOnly;
-               date = newHidden("date", new ChainingModel<>(model));
+               date = newHidden("date");
        }
 
        @Override
        protected void onInitialize() {
                super.onInitialize();
-               final String format = dateOnly ? getDateFormat() : 
getDateTimeFormat();
-               DatetimePickerConfig config = new DatetimePickerConfig()
-                               
.useLocale(WebSession.get().getLocale().toLanguageTag())
-                               .withFormat(patch(format))
-                               .withKeepInvalid(true)
-                               .with(new 
DatetimePickerIconConfig().useDateIcon(FontAwesome6IconType.calendar_s)
-                                               
.useTimeIcon(FontAwesome6IconType.clock_s).useUpIcon(FontAwesome6IconType.arrow_up_s)
-                                               
.useDownIcon(FontAwesome6IconType.arrow_down_s)
-                                               
.usePreviousIcon(FontAwesome6IconType.arrow_left_s)
-                                               
.useNextIcon(FontAwesome6IconType.arrow_right_s)
-                                               
.useTodayIcon(FontAwesome6IconType.calendar_check_s).useClearIcon(FontAwesome6IconType.eraser_s)
-                                               
.useCloseIcon(FontAwesome6IconType.xmark_s));
-               picker = new AbstractDateTimePickerWithIcon<>("picker", new 
Model<>(getModelObject()), config) {
+               TempusDominusConfig config = new TempusDominusConfig()
+                               .withLocalization(cfg -> cfg
+                                               .withDateFormats(null)
+                               )
+                               .withIcons(cfg -> cfg
+                                               
.withDateIcon(FontAwesome6IconType.calendar_s)
+                                               
.withTimeIcon(FontAwesome6IconType.clock_s)
+                                               
.withUpIcon(FontAwesome6IconType.arrow_up_s)
+                                               
.withDownIcon(FontAwesome6IconType.arrow_down_s)
+                                               
.withPreviousIcon(FontAwesome6IconType.arrow_left_s)
+                                               
.withNextIcon(FontAwesome6IconType.arrow_right_s)
+                                               
.withTodayIcon(FontAwesome6IconType.calendar_check_s)
+                                               
.withClearIcon(FontAwesome6IconType.eraser_s)
+                                               
.withCloseIcon(FontAwesome6IconType.xmark_s));
+               picker = new AbstractTempusDominusWithIcon<>("picker", new 
Model<T>(), patch(config)) {
                        private static final long serialVersionUID = 1L;
 
                        @Override
                        protected FormComponent<T> newInput(String wicketId, 
String dateFormat) {
-                               FormComponent<T> input = 
AbstractOmDateTimePicker.this.newInput(wicketId, dateFormat);
-                               markupId = input.getMarkupId();
-                               return input;
+                               return 
AbstractOmDateTimePicker.this.newInput(wicketId, dateFormat);
                        }
                };
+               picker.setOutputMarkupId(true);
+               markupId = picker.getMarkupId();
                date.setOutputMarkupId(true);
+               date.setModel(new ChainingModel<>(getModel()));
                add(date, picker.setRenderBodyOnly(false));
        }
 
+       protected abstract FormComponent<T> newInput(String wicketId, String 
dateFormat);
+
+       protected abstract HiddenField<T> newHidden(String wicketId);
+
+       protected TempusDominusConfig patch(TempusDominusConfig cfg) {
+               return cfg;
+       }
+
+       private CharSequence initScript() {
+               return "omDateTimeInit('" + markupId + "', '" + 
date.getMarkupId() + "');";
+       }
+
        @Override
        public void convertInput() {
                date.convertInput();
@@ -98,15 +105,11 @@ public abstract class AbstractOmDateTimePicker<T extends 
Serializable> extends F
                }
        }
 
-       protected abstract FormComponent<T> newInput(String wicketId, String 
dateFormat);
-
-       protected abstract HiddenField<T> newHidden(String wicketId, IModel<T> 
model);
-
        @Override
        public void renderHead(IHeaderResponse response) {
                super.renderHead(response);
                response.render(JavaScriptHeaderItem.forReference(FUNCJS));
-               response.render(new OnDomReadyHeaderItem("$('#" + markupId + 
"').on('change.datetimepicker', function (e) {omDateTimeInputHasChanged(e, '" + 
date.getMarkupId() + "', " + dateOnly + ");});"));
+               response.render(new OnDomReadyHeaderItem(initScript()));
        }
 
        @Override
@@ -114,16 +117,6 @@ public abstract class AbstractOmDateTimePicker<T extends 
Serializable> extends F
                return false;
        }
 
-       public static String patch(String format) {
-               // in Java free text is escaped with single-quotes
-               // moment.js uses []
-               return format.replaceAll("'([^']*)'", "\\[$1\\]");
-       }
-
-       public static String getDateTimeFormat() {
-               return getDateTimeFormat(WebSession.get().getLocale());
-       }
-
        @Override
        public FormComponent<T> setLabel(IModel<String> labelModel) {
                date.setLabel(labelModel);
@@ -132,22 +125,9 @@ public abstract class AbstractOmDateTimePicker<T extends 
Serializable> extends F
 
        @Override
        protected void onModelChanged() {
-               picker.setModelObject(getModelObject());
-       }
-
-       public static String getDateTimeFormat(Locale loc) {
-               DateFormat fmt = 
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, loc);
-               if (fmt instanceof SimpleDateFormat sfmt) {
-                       return sfmt.toPattern();
-               }
-               return DEFAULT_DATE_TIME_FORMAT;
-       }
-
-       public static String getDateFormat() {
-               DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, 
Session.get().getLocale());
-               if (fmt instanceof SimpleDateFormat sfmt) {
-                       return sfmt.toPattern();
-               }
-               return DEFAULT_DATE_FORMAT;
+               
RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(target -> {
+                       target.add(date);
+                       target.appendJavaScript(initScript());
+               });
        }
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
index 893723ce2..d0e19283d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
@@ -27,19 +27,31 @@ import 
org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import 
org.apache.wicket.extensions.markup.html.form.datetime.LocalDateTextField;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.HiddenField;
-import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.convert.converter.LocalDateConverter;
 
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusConfig;
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusDisplayConfig.ViewModeType;
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusLocalizationConfig.DateFormatType;
+
 public class AjaxOmDatePicker extends AbstractOmDateTimePicker<LocalDate> {
        private static final long serialVersionUID = 1L;
 
        public AjaxOmDatePicker(String id) {
-               super(id, null, true);
+               super(id, null);
        }
 
        @Override
-       protected HiddenField<LocalDate> newHidden(String wicketId, 
IModel<LocalDate> model) {
+       protected TempusDominusConfig patch(TempusDominusConfig config) {
+               return config
+                               .withClass(LocalDate.class)
+                               .withLocalization(cfg -> 
cfg.withFormat(DateFormatType.L.name()))
+                               .withDisplay(cfg -> 
cfg.withViewMode(ViewModeType.YEARS))
+                               .withRestrictions(cfg -> 
cfg.withMaxDate(LocalDate.now().minusYears(1)));
+               }
+
+       @Override
+       protected HiddenField<LocalDate> newHidden(String wicketId) {
                final IConverter<?> converter = new LocalDateConverter() {
                        private static final long serialVersionUID = 1L;
 
@@ -48,7 +60,7 @@ public class AjaxOmDatePicker extends 
AbstractOmDateTimePicker<LocalDate> {
                                return DateTimeFormatter.ISO_LOCAL_DATE;
                        }
                };
-               HiddenField<LocalDate> date = new HiddenField<>(wicketId, 
model, LocalDate.class) {
+               HiddenField<LocalDate> date = new HiddenField<>(wicketId, 
LocalDate.class) {
                        private static final long serialVersionUID = 1L;
 
                        @Override
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
index 5085f90c5..146d051d5 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
@@ -29,15 +29,25 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.convert.converter.LocalDateTimeConverter;
 
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusConfig;
+import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusLocalizationConfig.DateFormatType;
+
 public class OmDateTimePicker extends AbstractOmDateTimePicker<LocalDateTime> {
        private static final long serialVersionUID = 1L;
 
        public OmDateTimePicker(String id, IModel<LocalDateTime> model) {
-               super(id, model, false);
+               super(id, model);
+       }
+
+       @Override
+       protected TempusDominusConfig patch(TempusDominusConfig config) {
+               return config
+                               .withClass(LocalDateTime.class)
+                               .withLocalization(cfg -> 
cfg.withFormat(DateFormatType.LLL.name()));
        }
 
        @Override
-       protected HiddenField<LocalDateTime> newHidden(String wicketId, 
IModel<LocalDateTime> model) {
+       protected HiddenField<LocalDateTime> newHidden(String wicketId) {
                final IConverter<?> converter = new LocalDateTimeConverter() {
                        private static final long serialVersionUID = 1L;
 
@@ -46,7 +56,7 @@ public class OmDateTimePicker extends 
AbstractOmDateTimePicker<LocalDateTime> {
                                return DateTimeFormatter.ISO_LOCAL_DATE_TIME;
                        }
                };
-               return new HiddenField<>(wicketId, model, LocalDateTime.class) {
+               return new HiddenField<>(wicketId, LocalDateTime.class) {
                        private static final long serialVersionUID = 1L;
 
                        @Override
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/datepicker-functions.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/datepicker-functions.js
index c1e8282e1..2a5186674 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/datepicker-functions.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/datepicker-functions.js
@@ -1,16 +1,28 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
-function omDateTimeInputHasChanged(e, hiddenId, dateOnly) {
-       const fmt = dateOnly ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm:ss';
-       let val = e.target.value
-               , date = e.date;
-       if (!date) {
-               const mmnt = $(e.target).datetimepicker('date');
-               if (moment.isMoment(mmnt)) {
-                       date = moment(val, mmnt.creationData().format);
-               }
+function omDateTimeInit(markupId, hiddenId) {
+       const el = document.getElementById(markupId)
+               , hidden = document.getElementById(hiddenId);
+       if (!el) {
+               return;
        }
-       if (date) {
-               val = date.isValid() ? date.clone().locale('en').format(fmt) : 
date.creationData().input;
+       const picker = el.datetimepicker;
+       let val = new tempusDominus.DateTime();
+       try {
+               const strDate = hidden.value;
+               if (strDate) {
+                       val = new tempusDominus.DateTime(strDate);
+               }
+       } catch (e) {
+               // no-op
        }
-       $('#' + hiddenId).val(val).trigger('change');
+       picker.dates.setValue(val);
+
+       picker.subscribe(tempusDominus.Namespace.events.change, (e) => {
+               const pad = (n) => ('' + n).padStart(2, '0');
+               const formatDate = (d) => d.getFullYear() + '-' + 
pad(d.getMonth() + 1) + '-' + pad(d.getDate());
+               const formatDateTime = (d) => formatDate(d) + 'T' + 
pad(d.getHours()) + ':' + pad(d.getMinutes()) + ':' + pad(d.getSeconds());// + 
'Z';
+
+               hidden.value = 
picker.optionsStore.options.display.components.clock ? formatDateTime(e.date) : 
formatDate(e.date);
+               hidden.dispatchEvent(new Event('change'));
+       });
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
index 78e07ba59..43b2a87a6 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/CalendarPanel.java
@@ -132,9 +132,7 @@ public class CalendarPanel extends UserBasePanel {
                                .set("direction", Options.asString(isRtl ? 
"rtl" : "ltr"))
                                .set("height", Options.asString("100%"))
                                .set("customButtons", "{gotoBtn: {text: ' ', 
click: onOmGotoClick}}")
-                               .set("headerToolbar", isRtl
-                                               ? "{right: 
'prevYear,prev,next,nextYear today,gotoBtn', center: 'title', left: 
'dayGridMonth,timeGridWeek,timeGridDay'}"
-                                               : "{left: 
'prevYear,prev,next,nextYear today,gotoBtn', center: 'title', right: 
'dayGridMonth,timeGridWeek,timeGridDay'}")
+                               .set("headerToolbar", "{start: 
'prevYear,prev,next,nextYear today,gotoBtn', center: 'title', end: 
'dayGridMonth,timeGridWeek,timeGridDay'}")
                                .set("allDaySlot", false)
                                .set("nowIndicator", true)
                                .set("defaultTimedEventDuration", 
Options.asString("01:00"))
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
index 12c619f77..028793eaf 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/web/util/TestDateTime.java
@@ -30,7 +30,6 @@ import java.util.Date;
 import java.util.Locale;
 
 import org.apache.openmeetings.web.RegularTest;
-import org.apache.openmeetings.web.common.datetime.AbstractOmDateTimePicker;
 import org.junit.jupiter.api.Test;
 
 @RegularTest
@@ -76,29 +75,4 @@ class TestDateTime {
                                .toFormatter(Locale.ENGLISH);
                assertNotNull(formatter1.parse(jsDateStr));
        }
-
-       @Test
-       void test3() throws Exception {
-               final Locale loc = new Locale.Builder()
-                               .setLanguage("fr")
-                               .setRegion("CA")
-                               .build();
-               final String result = Runtime.version().feature() < 17
-                               ? "yy-MM-dd HH [h] mm" // java 11
-                               : "y-MM-dd HH [h] mm"; // java 17
-               String format = AbstractOmDateTimePicker.getDateTimeFormat(loc);
-               assertEquals(result, AbstractOmDateTimePicker.patch(format));
-               format = 
AbstractOmDateTimePicker.getDateTimeFormat(Locale.ENGLISH);
-               assertEquals(format, AbstractOmDateTimePicker.patch(format));
-       }
-
-       @Test
-       void test4() throws Exception {
-               final Locale loc = new Locale.Builder()
-                               .setLanguage("bg")
-                               .setRegion("BG")
-                               .build();
-               String format = AbstractOmDateTimePicker.getDateTimeFormat(loc);
-               assertEquals("d.MM.yy [г]., H:mm [ч].", 
AbstractOmDateTimePicker.patch(format));
-       }
 }

Reply via email to