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

solomax pushed a commit to branch OPENMEETINGS-2624-datetime
in repository https://gitbox.apache.org/repos/asf/openmeetings.git

commit 8688850272965d7d9ac7ad37de80abe9b6be7bc8
Author: Maxim Solodovnik <solomax...@gmail.com>
AuthorDate: Tue Jun 15 23:19:52 2021 +0700

    [OPENMEETINGS-2624] datetimes should work with custom locales/formats
---
 .../web/common/AbstractOmDateTimePicker.java       |  89 ------------
 .../openmeetings/web/common/GeneralUserForm.java   |   1 +
 .../openmeetings/web/common/InvitationForm.java    |   1 +
 .../common/datetime/AbstractOmDateTimePicker.html  |  27 ++++
 .../common/datetime/AbstractOmDateTimePicker.java  | 153 +++++++++++++++++++++
 .../common/{ => datetime}/AjaxOmDatePicker.java    |  41 ++++--
 .../common/{ => datetime}/OmDateTimePicker.java    |  32 ++---
 .../web/common/datetime/datepicker-functions.js    |  16 +++
 .../openmeetings/web/user/MessageDialog.java       |   2 +-
 .../web/user/calendar/AppointmentDialog.java       |   2 +-
 .../org/apache/openmeetings/util/TestDateTime.java |   2 +-
 pom.xml                                            |   4 +-
 12 files changed, 248 insertions(+), 122 deletions(-)

diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
deleted file mode 100644
index 2d0bd5a..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AbstractOmDateTimePicker.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.web.common;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-
-import org.apache.openmeetings.web.app.WebSession;
-import org.apache.wicket.model.IModel;
-
-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.icon.FontAwesome5IconType;
-
-public abstract class AbstractOmDateTimePicker<T> extends 
AbstractDateTimePickerWithIcon<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";
-
-       protected AbstractOmDateTimePicker(String id, IModel<T> model) {
-               this(id, model, getDateTimeFormat());
-       }
-
-       protected AbstractOmDateTimePicker(String id, IModel<T> model, String 
format) {
-               super(id, model, new DatetimePickerConfig()
-                               
//.useLocale(WebSession.get().getLocale().toLanguageTag())
-                               .withFormat(patch(format))
-                               .with(new DatetimePickerIconConfig()
-                                               
.useDateIcon(FontAwesome5IconType.calendar_s)
-                                               
.useTimeIcon(FontAwesome5IconType.clock_s)
-                                               
.useUpIcon(FontAwesome5IconType.arrow_up_s)
-                                               
.useDownIcon(FontAwesome5IconType.arrow_down_s)
-                                               
.usePreviousIcon(FontAwesome5IconType.arrow_left_s)
-                                               
.useNextIcon(FontAwesome5IconType.arrow_right_s)
-                                               
.useTodayIcon(FontAwesome5IconType.calendar_check_s)
-                                               
.useClearIcon(FontAwesome5IconType.eraser_s)
-                                               
.useCloseIcon(FontAwesome5IconType.times_s))
-                               );
-               setRenderBodyOnly(false);
-       }
-
-       public static String patch(String format) {
-               // in Java free text is escaped with single-quotes
-               // moment.js uses []
-               return format.replaceAll("[']{1}([^']*)[']{1}", "\\[$1\\]");
-       }
-
-       public static String getDateTimeFormat() {
-               return getDateTimeFormat(WebSession.get().getLocale());
-       }
-
-       public static String getDateTimeFormat(Locale loc) {
-               DateFormat fmt = 
DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, loc);
-               if (fmt instanceof SimpleDateFormat) {
-                       return ((SimpleDateFormat)fmt).toPattern();
-               }
-               return DEFAULT_DATE_TIME_FORMAT;
-       }
-
-       public static String getDateFormat() {
-               return getDateFormat(WebSession.get().getLocale());
-       }
-
-       public static String getDateFormat(Locale loc) {
-               DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, 
loc);
-               if (fmt instanceof SimpleDateFormat) {
-                       return ((SimpleDateFormat)fmt).toPattern();
-               }
-               return DEFAULT_DATE_FORMAT;
-       }
-}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index c8d6488..75c1811 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -33,6 +33,7 @@ import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Salutation;
+import org.apache.openmeetings.web.common.datetime.AjaxOmDatePicker;
 import org.apache.openmeetings.web.util.CountryDropDown;
 import org.apache.openmeetings.web.util.RestrictiveChoiceProvider;
 import 
org.apache.wicket.extensions.validation.validator.RfcCompliantEmailAddressValidator;
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
index fd8bd00..e5c3763 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/InvitationForm.java
@@ -40,6 +40,7 @@ import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.service.room.InvitationManager;
 import org.apache.openmeetings.util.crypt.CryptProvider;
 import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.common.datetime.OmDateTimePicker;
 import org.apache.openmeetings.web.util.UserMultiChoice;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.html
new file mode 100644
index 0000000..5d3d67b
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.html
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+
+-->
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <span wicket:id="picker"></span>
+       <input type="hidden" wicket:id="date" />
+</wicket:panel>
+</html>
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
new file mode 100644
index 0000000..c2c382e
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+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.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+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.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.icon.FontAwesome5IconType;
+
+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 String markupId;
+
+       AbstractOmDateTimePicker(String id, IModel<T> model, boolean dateOnly) {
+               super(id, model);
+               this.dateOnly = dateOnly;
+               date = newHidden("date", new ChainingModel<>(model));
+       }
+
+       @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(FontAwesome5IconType.calendar_s)
+                                               
.useTimeIcon(FontAwesome5IconType.clock_s).useUpIcon(FontAwesome5IconType.arrow_up_s)
+                                               
.useDownIcon(FontAwesome5IconType.arrow_down_s)
+                                               
.usePreviousIcon(FontAwesome5IconType.arrow_left_s)
+                                               
.useNextIcon(FontAwesome5IconType.arrow_right_s)
+                                               
.useTodayIcon(FontAwesome5IconType.calendar_check_s).useClearIcon(FontAwesome5IconType.eraser_s)
+                                               
.useCloseIcon(FontAwesome5IconType.times_s));
+               picker = new AbstractDateTimePickerWithIcon<>("picker", new 
Model<>(getModelObject()), 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;
+                       }
+               };
+               date.setOutputMarkupId(true);
+               add(date, picker.setRenderBodyOnly(false));
+       }
+
+       @Override
+       public void convertInput() {
+               date.convertInput();
+               if (date.isValid()) {
+                       setConvertedInput(date.getConvertedInput());
+               } else {
+                       date.getFeedbackMessages().forEach(msg -> 
getFeedbackMessages().add(msg));
+                       date.getFeedbackMessages().clear();
+               }
+       }
+
+       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 + ");});"));
+       }
+
+       @Override
+       public boolean processChildren() {
+               return false;
+       }
+
+       public static String patch(String format) {
+               // in Java free text is escaped with single-quotes
+               // moment.js uses []
+               return format.replaceAll("[']{1}([^']*)[']{1}", "\\[$1\\]");
+       }
+
+       public static String getDateTimeFormat() {
+               return getDateTimeFormat(WebSession.get().getLocale());
+       }
+
+       @Override
+       public FormComponent<T> setLabel(IModel<String> labelModel) {
+               date.setLabel(labelModel);
+               return this;
+       }
+
+       @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) {
+                       return ((SimpleDateFormat)fmt).toPattern();
+               }
+               return DEFAULT_DATE_TIME_FORMAT;
+       }
+
+       public static String getDateFormat() {
+               DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, 
Session.get().getLocale());
+               if (fmt instanceof SimpleDateFormat) {
+                       return ((SimpleDateFormat)fmt).toPattern();
+               }
+               return DEFAULT_DATE_FORMAT;
+       }
+}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AjaxOmDatePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
similarity index 58%
rename from 
openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AjaxOmDatePicker.java
rename to 
openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
index 0fd162f..893723c 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AjaxOmDatePicker.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AjaxOmDatePicker.java
@@ -16,35 +16,56 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.common;
+package org.apache.openmeetings.web.common.datetime;
 
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
 
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
 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;
 
 public class AjaxOmDatePicker extends AbstractOmDateTimePicker<LocalDate> {
        private static final long serialVersionUID = 1L;
 
        public AjaxOmDatePicker(String id) {
-               super(id, null, getDateFormat());
+               super(id, null, true);
        }
 
        @Override
-       protected FormComponent<LocalDate> newInput(String wicketId, String 
dateFormat) {
-               LocalDateTextField input = new LocalDateTextField(wicketId, 
getModel(), dateFormat);
-               input.add(new OnChangeAjaxBehavior() {
+       protected HiddenField<LocalDate> newHidden(String wicketId, 
IModel<LocalDate> model) {
+               final IConverter<?> converter = new LocalDateConverter() {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public DateTimeFormatter getDateTimeFormatter(Locale 
locale) {
+                               return DateTimeFormatter.ISO_LOCAL_DATE;
+                       }
+               };
+               HiddenField<LocalDate> date = new HiddenField<>(wicketId, 
model, LocalDate.class) {
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       protected void onUpdate(AjaxRequestTarget target) {
-                               onValueChanged(target);
+                       protected IConverter<?> createConverter(Class<?> clazz) 
{
+                               if (LocalDate.class.isAssignableFrom(clazz)) {
+                                       return converter;
+                               }
+                               return null;
                        }
-               });
-               return input;
+               };
+               date.add(OnChangeAjaxBehavior.onChange(this::onValueChanged));
+               return date;
+       }
+
+       @Override
+       protected FormComponent<LocalDate> newInput(String wicketId, String 
dateFormat) {
+               return new LocalDateTextField(wicketId, getModel(), dateFormat);
        }
 
        protected void onValueChanged(IPartialPageRequestHandler target) {
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
similarity index 77%
rename from 
openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java
rename to 
openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
index d1bd393..5085f90 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/OmDateTimePicker.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/OmDateTimePicker.java
@@ -16,46 +16,37 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.common;
+package org.apache.openmeetings.web.common.datetime;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeFormatterBuilder;
 import java.util.Locale;
 
 import 
org.apache.wicket.extensions.markup.html.form.datetime.LocalDateTimeTextField;
 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.LocalDateTimeConverter;
 
 public class OmDateTimePicker extends AbstractOmDateTimePicker<LocalDateTime> {
        private static final long serialVersionUID = 1L;
-       private final LocalDateTimeConverter converter;
 
        public OmDateTimePicker(String id, IModel<LocalDateTime> model) {
-               this(id, model, getDateTimeFormat());
+               super(id, model, false);
        }
 
-       private OmDateTimePicker(String id, IModel<LocalDateTime> model, final 
String pattern) {
-               super(id, model, pattern);
-               this.converter = new LocalDateTimeConverter() {
+       @Override
+       protected HiddenField<LocalDateTime> newHidden(String wicketId, 
IModel<LocalDateTime> model) {
+               final IConverter<?> converter = new LocalDateTimeConverter() {
                        private static final long serialVersionUID = 1L;
 
                        @Override
-                       public DateTimeFormatter getDateTimeFormatter(Locale 
locale)
-                       {
-                               return new DateTimeFormatterBuilder()
-                                               .parseCaseInsensitive()
-                                               .appendPattern(pattern)
-                                               .toFormatter(Locale.ENGLISH);
+                       public DateTimeFormatter getDateTimeFormatter(Locale 
locale) {
+                               return DateTimeFormatter.ISO_LOCAL_DATE_TIME;
                        }
                };
-       }
-
-       @Override
-       protected FormComponent<LocalDateTime> newInput(String wicketId, String 
dateFormat) {
-               return new LocalDateTimeTextField(wicketId, getModel(), 
dateFormat) {
+               return new HiddenField<>(wicketId, model, LocalDateTime.class) {
                        private static final long serialVersionUID = 1L;
 
                        @Override
@@ -67,4 +58,9 @@ public class OmDateTimePicker extends 
AbstractOmDateTimePicker<LocalDateTime> {
                        }
                };
        }
+
+       @Override
+       protected FormComponent<LocalDateTime> newInput(String wicketId, String 
dateFormat) {
+               return new LocalDateTimeTextField(wicketId, getModel(), 
dateFormat);
+       }
 }
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
new file mode 100644
index 0000000..c1e8282
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/datepicker-functions.js
@@ -0,0 +1,16 @@
+/* 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);
+               }
+       }
+       if (date) {
+               val = date.isValid() ? date.clone().locale('en').format(fmt) : 
date.creationData().input;
+       }
+       $('#' + hiddenId).val(val).trigger('change');
+}
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index be37b7b..fd33168 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -53,8 +53,8 @@ import org.apache.openmeetings.db.manager.IInvitationManager;
 import org.apache.openmeetings.util.CalendarHelper;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
-import org.apache.openmeetings.web.common.OmDateTimePicker;
 import org.apache.openmeetings.web.common.OmModalCloseButton;
+import org.apache.openmeetings.web.common.datetime.OmDateTimePicker;
 import org.apache.openmeetings.web.user.calendar.AppointmentDialog;
 import org.apache.openmeetings.web.util.CalendarWebHelper;
 import org.apache.openmeetings.web.util.RoomTypeDropDown;
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index faea5c5..1c661d9 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -51,8 +51,8 @@ import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.openmeetings.service.calendar.caldav.AppointmentManager;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.web.common.GroupChoiceProvider;
-import org.apache.openmeetings.web.common.OmDateTimePicker;
 import org.apache.openmeetings.web.common.OmModalCloseButton;
+import org.apache.openmeetings.web.common.datetime.OmDateTimePicker;
 import org.apache.openmeetings.web.pages.MainPage;
 import org.apache.openmeetings.web.user.OmWysiwygToolbar;
 import org.apache.openmeetings.web.user.rooms.RoomEnterBehavior;
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java 
b/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java
index 8cd53d6..926c59a 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/util/TestDateTime.java
@@ -29,7 +29,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
 
-import org.apache.openmeetings.web.common.AbstractOmDateTimePicker;
+import org.apache.openmeetings.web.common.datetime.AbstractOmDateTimePicker;
 import org.junit.jupiter.api.Test;
 
 class TestDateTime {
diff --git a/pom.xml b/pom.xml
index 08fbb99..f175a8e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,7 +57,7 @@
                
<maven-project-info-reports-plugin.version>3.1.2</maven-project-info-reports-plugin.version>
                <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
                
<maven-assembly-plugin.version>3.3.0</maven-assembly-plugin.version>
-               
<maven-dependency-plugin.version>3.1.2</maven-dependency-plugin.version>
+               
<maven-dependency-plugin.version>3.2.0</maven-dependency-plugin.version>
                <maven-bundle-plugin.version>5.1.1</maven-bundle-plugin.version>
                <maven-war-plugin.version>3.3.1</maven-war-plugin.version>
                <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
@@ -81,7 +81,7 @@
                <wicket.version>9.3.0</wicket.version>
                <wicket-jquery-ui.version>9.3.1</wicket-jquery-ui.version>
                <wicketstuff.version>9.3.0</wicketstuff.version>
-               <wicket-bootstrap.version>5.0.4</wicket-bootstrap.version>
+               
<wicket-bootstrap.version>5.0.5-SNAPSHOT</wicket-bootstrap.version>
                <font-awesome.version>5.15.2</font-awesome.version>
                <spring.version>5.3.8</spring.version>
                <tomcat.version>9.0.46</tomcat.version>

Reply via email to