You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/07/21 18:52:18 UTC
[isis] branch master updated: ISIS-3085: purge tempus-dominus fa icon patch
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new a1f1d6dba5 ISIS-3085: purge tempus-dominus fa icon patch
a1f1d6dba5 is described below
commit a1f1d6dba59767daedb03fc18fa8a292bb25d2af
Author: andi-huber <ah...@apache.org>
AuthorDate: Thu Jul 21 20:52:10 2022 +0200
ISIS-3085: purge tempus-dominus fa icon patch
- also fixes date/time picker buttons (today, clear, close) not
appearing
- also fixes date/time picker clear button logic, using
ScalarModel.isRequired()
---
.../apache/isis/core/config/IsisConfiguration.java | 37 +++++--
.../ScalarPanelTextFieldWithTemporalPicker.java | 7 +-
.../scalars/datepicker/DateTimeConfig.java | 54 +++++----
.../datepicker/TextFieldWithDateTimePicker.java | 122 ++++++++++++---------
.../datepicker/css/tempusdominus-fa-patch.css | 4 -
5 files changed, 142 insertions(+), 82 deletions(-)
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index f2bddf4e2c..c1b5471688 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -34,12 +34,6 @@ import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.PARAMETER;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
import javax.activation.DataSource;
import javax.inject.Named;
import javax.validation.Constraint;
@@ -68,6 +62,7 @@ import org.apache.isis.applib.services.userui.UserMenu;
import org.apache.isis.applib.value.semantics.TemporalValueSemantics.TemporalEditingPattern;
import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.core.config.IsisConfiguration.Viewer;
import org.apache.isis.core.config.metamodel.facets.DefaultViewConfiguration;
import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
import org.apache.isis.core.config.metamodel.facets.PublishingPolicies.ActionPublishingPolicy;
@@ -77,6 +72,12 @@ import org.apache.isis.core.config.metamodel.services.ApplicationFeaturesInitCon
import org.apache.isis.core.config.metamodel.specloader.IntrospectionMode;
import org.apache.isis.core.config.viewer.web.DialogMode;
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@@ -2308,16 +2309,17 @@ public class IsisConfiguration {
public boolean isDefined() { return (name != null || image != null) && url != null; }
}
+
private final DatePicker datePicker = new DatePicker();
@Data
public static class DatePicker {
/**
* Defines the first date available in the date picker.
- *
* <p>
* As per http://eonasdan.github.io/bootstrap-datetimepicker/Options/#maxdate, in ISO format (per https://github.com/moment/moment/issues/1407).
- * </p>
+ * <p>
+ * Use time zone 'Z', as the date/time picker UI component is not wired up to support time-zones.
*/
@NotEmpty @NotNull
private String minDate = "1900-01-01T00:00:00.000Z";
@@ -2326,10 +2328,27 @@ public class IsisConfiguration {
* Defines the first date available in the date picker.
* <p>
* As per http://eonasdan.github.io/bootstrap-datetimepicker/Options/#maxdate, in ISO format (per https://github.com/moment/moment/issues/1407).
- * </p>
+ * <p>
+ * Use time zone 'Z', as the date/time picker UI component is not wired up to support time-zones.
*/
@NotEmpty @NotNull
private String maxDate = "2100-01-01T00:00:00.000Z";
+
+//XXX probably needed by TempusDominus 5+
+// public final java.util.Date minDateAsJavaUtilDate() {
+// return asJavaUtilDate(getMinDate());
+// }
+//
+// public final java.util.Date maxDateAsJavaUtilDate() {
+// return asJavaUtilDate(getMaxDate());
+// }
+//
+// private static java.util.Date asJavaUtilDate(final String input) {
+// return new Date(
+// DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(input, OffsetDateTime::from)
+// .toEpochSecond());
+// }
+
}
private final DevelopmentUtilities developmentUtilities = new DevelopmentUtilities();
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
index 65ad6f3913..b908d4a730 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
@@ -27,6 +27,8 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarFragmentFactory.InputFragment;
import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
+import lombok.val;
+
/**
* Panel for rendering scalars representing dates, along with a date picker.
*/
@@ -46,8 +48,11 @@ extends ScalarPanelTextFieldWithValueSemantics<T> {
@Override
protected final TextField<T> createTextField(final String id) {
+
+ val scalarModel = scalarModel();
+
return new TextFieldWithDateTimePicker<T>(
- getCommonContext(), id, unwrappedModel(), type, getConverter(scalarModel()));
+ getCommonContext(), id, scalarModel, type, getConverter(scalarModel));
}
@Override
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/DateTimeConfig.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/DateTimeConfig.java
index a0ba6c9b0a..aac929a7ed 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/DateTimeConfig.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/DateTimeConfig.java
@@ -19,6 +19,7 @@
package org.apache.isis.viewer.wicket.ui.components.scalars.datepicker;
import java.io.IOException;
+import java.util.Map;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
@@ -31,6 +32,8 @@ import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
+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.jquery.AbstractConfig;
import de.agilecoders.wicket.jquery.IKey;
@@ -160,6 +163,8 @@ public class DateTimeConfig extends AbstractConfig {
*/
private static final IKey<Boolean> CalendarWeeks = newKey("calendarWeeks", false);
+ private static final IKey<DatetimePickerIconConfig> Icons = newKey("icons", null);
+
/**
* holds all week days in a specific sort order.
*/
@@ -366,29 +371,11 @@ public class DateTimeConfig extends AbstractConfig {
return this;
}
- /**
- * @param value Whether or not to display a 'clear' button, which allows for clearing the input field.
- * @return this instance for chaining
- */
- public DateTimeConfig clearButton(final boolean value) {
- put(ClearButton, value);
- return this;
- }
-
- /**
- * @param value Whether or not to display a 'clear' button, which allows for clearing the input field.
- * @return this instance for chaining
- */
- public DateTimeConfig closeButton(final boolean value) {
- put(CloseButton, value);
- return this;
- }
-
/**
* @param value Whether or not to show week numbers to the left of week rows.
* @return this instance for chaining
*/
- public DateTimeConfig calendarWeeks(final boolean value) {
+ public DateTimeConfig useCalendarWeeks(final boolean value) {
put(CalendarWeeks, value);
return this;
}
@@ -422,6 +409,35 @@ public class DateTimeConfig extends AbstractConfig {
return this;
}
+
+ /**
+ * Sets buttons.
+ *
+ * @param buttons buttons to show/hide
+ * @return config instance
+ */
+ public DateTimeConfig withButtons(final Map<String, Boolean> buttons) {
+ put(DatetimePickerConfig.newKey("buttons", null), Map.of(
+ DatetimePickerConfig.BTN_SHOW_TODAY,
+ Boolean.TRUE.equals(buttons.get(DatetimePickerConfig.BTN_SHOW_TODAY))
+ , DatetimePickerConfig.BTN_SHOW_CLEAR,
+ Boolean.TRUE.equals(buttons.get(DatetimePickerConfig.BTN_SHOW_CLEAR))
+ , DatetimePickerConfig.BTN_SHOW_CLOSE,
+ Boolean.TRUE.equals(buttons.get(DatetimePickerConfig.BTN_SHOW_CLOSE))));
+ return this;
+ }
+
+ /**
+ * Set icon config.
+ *
+ * @param iconConfig icon config
+ * @return config instance
+ */
+ public DateTimeConfig withIcons(final DatetimePickerIconConfig iconConfig) {
+ put(Icons, iconConfig);
+ return this;
+ }
+
/**
* See <a href="http://bootstrap-datepicker.readthedocs.org/en/latest/options.html#todaybtn">docs</a>.
* Today button could be a boolean or string <em>"linked"</em>:
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
index 2c3790b367..9e081b6f9b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/TextFieldWithDateTimePicker.java
@@ -19,40 +19,42 @@
package org.apache.isis.viewer.wicket.ui.components.scalars.datepicker;
import java.util.Locale;
+import java.util.Map;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.util.convert.IConverter;
+import org.apache.isis.core.config.IsisConfiguration;
import org.apache.isis.core.runtime.context.IsisAppCommonContext;
import org.apache.isis.viewer.wicket.model.converter.ConverterBasedOnValueSemantics;
-import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.DateTimeConfig.TodayButton;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import static de.agilecoders.wicket.jquery.JQuery.$;
import de.agilecoders.wicket.core.util.Attributes;
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;
import de.agilecoders.wicket.extensions.markup.html.bootstrap.references.DatetimePickerCssReference;
import de.agilecoders.wicket.extensions.markup.html.bootstrap.references.DatetimePickerJsReference;
+import de.agilecoders.wicket.jquery.Config;
import lombok.val;
/**
* A text input field that is used as a date or date/time picker.
* It uses <a href="https://github.com/Eonasdan/bootstrap-datetimepicker">Bootstrap Datetime picker</a>
- * JavaScript widget
+ * JavaScript widget.
+ * For options (5.39.0) see <a href="https://getdatepicker.com/5-4/Options/">https://getdatepicker.com/5-4/Options/</a>
*
* @param <T> The type of the date/time
*/
public class TextFieldWithDateTimePicker<T>
extends TextField<T>
-//extends AbstractDateTimePickerWithIcon<T>
implements IConverter<T> {
private static final long serialVersionUID = 1L;
@@ -64,14 +66,17 @@ implements IConverter<T> {
public TextFieldWithDateTimePicker(
final IsisAppCommonContext commonContext,
final String id,
- final IModel<T> model,
+ final ScalarModel scalarModel,
final Class<T> type,
final IConverter<T> converter) {
-
- super(id, model, type);
+ super(id, scalarModel.unwrapped(type), type);
setOutputMarkupId(true);
this.converter = converter;
+ this.config = createDatePickerConfig(
+ commonContext.getConfiguration(),
+ !scalarModel.isRequired());
+
/* debug
new IConverter<T>() {
@@ -98,29 +103,6 @@ implements IConverter<T> {
};
*/
- val cfv5 = new DatetimePickerConfig();
-
- val config = new DateTimeConfig();
-
- // FIXME[ISIS-3085] some of the config options were already broken in TDv5, needs fixes for TDv6
-
- // if this text field is for a LocalDate, then the pattern obtained will just be a simple date format
- // (with no hour/minute components).
- final String dateTimePattern = ((ConverterBasedOnValueSemantics<T>)converter).getEditingPattern();
- config.withFormat(_TimeFormatUtil.convertToMomentJsFormat(dateTimePattern));
- config.calendarWeeks(true);
- config.useCurrent(false);
- config.minDate(commonContext.getConfiguration().getViewer().getWicket().getDatePicker().getMinDate());
- config.maxDate(commonContext.getConfiguration().getViewer().getWicket().getDatePicker().getMaxDate());
- config.readonly(!this.isEnabled());
- config.highlightToday(true);
- config.showTodayButton(TodayButton.TRUE);
- config.clearButton(isInputNullable());
- config.closeButton(true);
- config.allowKeyboardNavigation(true);
-
- this.config = config;
-
//XXX ISIS-2834
//Adding OnChangeAjaxBehavior registers a JavaScript event listener on change event.
//Since OnChangeAjaxBehavior extends AjaxFormComponentUpdatingBehavior the Ajax request
@@ -167,9 +149,8 @@ implements IConverter<T> {
}
checkComponentTag(tag, "input");
- Attributes.set(tag, "type", "text");
-
Attributes.addClass(tag, "datetimepicker-input");
+ Attributes.set(tag, "type", "text");
Attributes.set(tag, "data-toggle", "datetimepicker");
Attributes.set(tag, "data-target", getMarkupId());
Attributes.set(tag, "autocomplete", "off");
@@ -183,29 +164,72 @@ implements IConverter<T> {
return;
}
- config.readonly(false);
-
- //TODO legacy calendar icon customization .. should now be possible via TD config
- response.render(CssHeaderItem.forReference(
- new CssResourceReference(TextFieldWithDateTimePicker.class, "css/tempusdominus-fa-patch.css")));
-
response.render(DatetimePickerCssReference.asHeaderItem());
response.render(DatetimePickerJsReference.asHeaderItem());
-
response.render(OnDomReadyHeaderItem.forScript(createScript(config)));
-
- //TODO using new config in DatetimePickerBehavior (wicket-stuff)
- //response.render($(component).chain("datetimepicker", config).asDomReadyScript());
}
+ // -- HELPER
+
+ private DateTimeConfig createDatePickerConfig(final IsisConfiguration isisConfiguration, final boolean isInputNullable) {
+ val config = new DateTimeConfig();
+
+ // if this text field is for a LocalDate, then the pattern obtained will just be a simple date format
+ // (with no hour/minute components).
+ final String dateTimePattern = ((ConverterBasedOnValueSemantics<T>)converter).getEditingPattern();
+ config.withFormat(_TimeFormatUtil.convertToMomentJsFormat(dateTimePattern));
+ config.useCalendarWeeks(true);
+ config.useCurrent(false);
+
+ config.withButtons(Map.of(
+ DatetimePickerConfig.BTN_SHOW_TODAY, true,
+ DatetimePickerConfig.BTN_SHOW_CLEAR, isInputNullable,
+ DatetimePickerConfig.BTN_SHOW_CLOSE, true));
+
+ //config.highlightToday(true);
+
+ /*
+ time: 'far fa-clock',
+ date: 'far fa-calendar',
+ up: 'far fa-arrow-up',
+ down: 'far fa-arrow-down',
+ previous: 'far fa-chevron-left',
+ next: 'far fa-chevron-right',
+ today: 'far fa-calendar-check-o',
+ clear: 'far fa-trash',
+ close: 'far fa-times'
+ */
+
+ config.withIcons(new DatetimePickerIconConfig()
+ .useTimeIcon(FontAwesome6IconType.clock_r)
+ .useDateIcon(FontAwesome6IconType.calendar_r)
+ .useUpIcon(FontAwesome6IconType.arrow_up_s)
+ .useDownIcon(FontAwesome6IconType.arrow_down_s)
+ .usePreviousIcon(FontAwesome6IconType.chevron_left_s)
+ .useNextIcon(FontAwesome6IconType.chevron_right_s)
+ .useTodayIcon(FontAwesome6IconType.calendar_check_r)
+ .useClearIcon(FontAwesome6IconType.trash_can_r)
+ .useCloseIcon(FontAwesome6IconType.xmark_s)
+ );
+
+ //XXX future extensions might allow to set bounds on a per member basis (via ValueSemantics annotation)
+ //config.withMinDate(commonContext.getConfiguration().getViewer().getWicket().getDatePicker().minDateAsJavaUtilDate());
+ //config.withMaxDate(commonContext.getConfiguration().getViewer().getWicket().getDatePicker().maxDateAsJavaUtilDate());
+ config.minDate(isisConfiguration.getViewer().getWicket().getDatePicker().getMinDate());
+ config.maxDate(isisConfiguration.getViewer().getWicket().getDatePicker().getMaxDate());
+ return config;
+ }
/**
- * creates the initializer script.
- *
- * @return initializer script
+ * Returns the initializer script.
*/
- private CharSequence createScript(final DateTimeConfig config) {
- return $(this).chain("datetimepicker", config).get();
+ private CharSequence createScript(final Config config) {
+
+ val script = $(this).chain("datetimepicker", config).get();
+ //debug
+ //System.err.printf("script: %s%n", script);
+
+ return script;
}
}
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/css/tempusdominus-fa-patch.css b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/css/tempusdominus-fa-patch.css
deleted file mode 100644
index f74e847913..0000000000
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/datepicker/css/tempusdominus-fa-patch.css
+++ /dev/null
@@ -1,4 +0,0 @@
-
-.bootstrap-datetimepicker-widget .fa-clock-o:before {
- content: "\f017"
-}
\ No newline at end of file