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