This is an automated email from the ASF dual-hosted git repository. solomax pushed a commit to branch tempus-calendar-6 in repository https://gitbox.apache.org/repos/asf/openmeetings.git
commit 4cec26e0e9f523fa091723b50e10b2b7695e1c92 Author: Maxim Solodovnik <[email protected]> AuthorDate: Fri Sep 1 14:32:21 2023 +0700 [OPENMEETINGS-2770] tempus-dominus-6 --- .../common/datetime/AbstractOmDateTimePicker.html | 27 ---- .../common/datetime/AbstractOmDateTimePicker.java | 153 --------------------- .../web/common/datetime/AjaxOmDatePicker.java | 45 +++--- .../web/common/datetime/OmDateTimePicker.java | 52 +++---- .../web/common/datetime/datepicker-functions.js | 16 --- 5 files changed, 41 insertions(+), 252 deletions(-) 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 deleted file mode 100644 index 748e1ada2..000000000 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.html +++ /dev/null @@ -1,27 +0,0 @@ -<?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/dtds.data/wicket-9.xsd"> -<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 deleted file mode 100644 index 431851fbc..000000000 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/AbstractOmDateTimePicker.java +++ /dev/null @@ -1,153 +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.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.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 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(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) { - 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\\]"); - } - - 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 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; - } -} 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..32ed225fd 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 @@ -19,53 +19,46 @@ 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.attributes.AjaxRequestAttributes; 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> { +import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.AbstractTempusDominusWithIcon; +import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusDisplayConfig.ViewModeType; + +public class AjaxOmDatePicker extends AbstractTempusDominusWithIcon<LocalDate> { private static final long serialVersionUID = 1L; public AjaxOmDatePicker(String id) { - super(id, null, true); + super(id, null, OmDateTimePicker.newConfig() + .withClass(LocalDate.class) + .withDisplay(cfg -> cfg.withViewMode(ViewModeType.YEARS))); } @Override - protected HiddenField<LocalDate> newHidden(String wicketId, IModel<LocalDate> model) { - final IConverter<?> converter = new LocalDateConverter() { - private static final long serialVersionUID = 1L; - + protected void onInitialize() { + super.onInitialize(); + add(new OnChangeAjaxBehavior() { @Override - public DateTimeFormatter getDateTimeFormatter(Locale locale) { - return DateTimeFormatter.ISO_LOCAL_DATE; + protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { + super.updateAjaxAttributes(attributes); + attributes.setSerializeRecursively(true); } - }; - HiddenField<LocalDate> date = new HiddenField<>(wicketId, model, LocalDate.class) { - private static final long serialVersionUID = 1L; @Override - protected IConverter<?> createConverter(Class<?> clazz) { - if (LocalDate.class.isAssignableFrom(clazz)) { - return converter; - } - return null; + protected void onUpdate(AjaxRequestTarget target) { + onValueChanged(target); } - }; - date.add(OnChangeAjaxBehavior.onChange(this::onValueChanged)); - return date; + }); } @Override protected FormComponent<LocalDate> newInput(String wicketId, String dateFormat) { - return new LocalDateTextField(wicketId, getModel(), dateFormat); + return new LocalDateTextField(wicketId, dateFormat); } protected void onValueChanged(IPartialPageRequestHandler target) { 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..064bc673a 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 @@ -19,48 +19,40 @@ package org.apache.openmeetings.web.common.datetime; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -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> { +import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.AbstractTempusDominusWithIcon; +import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.tempusdominus.TempusDominusConfig; +import de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome6IconType; + +public class OmDateTimePicker extends AbstractTempusDominusWithIcon<LocalDateTime> { private static final long serialVersionUID = 1L; public OmDateTimePicker(String id, IModel<LocalDateTime> model) { - super(id, model, false); + super(id, model, newConfig().withClass(LocalDateTime.class)); } @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 DateTimeFormatter.ISO_LOCAL_DATE_TIME; - } - }; - return new HiddenField<>(wicketId, model, LocalDateTime.class) { - private static final long serialVersionUID = 1L; - - @Override - protected IConverter<?> createConverter(Class<?> clazz) { - if (LocalDateTime.class.isAssignableFrom(clazz)) { - return converter; - } - return null; - } - }; + protected FormComponent<LocalDateTime> newInput(String wicketId, String dateFormat) { + return new LocalDateTimeTextField(wicketId, dateFormat); } - @Override - protected FormComponent<LocalDateTime> newInput(String wicketId, String dateFormat) { - return new LocalDateTimeTextField(wicketId, getModel(), dateFormat); + static TempusDominusConfig newConfig() { + return new TempusDominusConfig() + .withAllowInputToggle(true) + .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) + ); } } 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 deleted file mode 100644 index c1e8282e1..000000000 --- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/datetime/datepicker-functions.js +++ /dev/null @@ -1,16 +0,0 @@ -/* 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'); -}
