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));
- }
}