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 5670b6bae5 ISIS-3085: adds Date/Time Picker Locale (language) support
5670b6bae5 is described below

commit 5670b6bae5dfa348917bdd48e1a4c234fdd0fe7a
Author: andi-huber <[email protected]>
AuthorDate: Fri Jul 22 08:03:41 2022 +0200

    ISIS-3085: adds Date/Time Picker Locale (language) support
---
 .../metamodel/context/HasMetaModelContext.java     |  7 +++
 .../ScalarPanelTextFieldWithTemporalPicker.java    |  4 +-
 .../scalars/datepicker/DateTimeConfig.java         | 68 +++++++---------------
 .../datepicker/TextFieldWithDateTimePicker.java    | 19 +++---
 4 files changed, 41 insertions(+), 57 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java
index 6917a53c08..0ddc758d1b 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java
@@ -21,9 +21,11 @@ package org.apache.isis.core.metamodel.context;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import org.apache.isis.applib.locale.UserLocale;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
+import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.repository.RepositoryService;
@@ -130,6 +132,11 @@ public interface HasMetaModelContext {
         return getMetaModelContext().getWrapperFactory();
     }
 
+    default Optional<UserLocale> currentUserLocale() {
+        return getInteractionProvider().currentInteractionContext()
+                .map(InteractionContext::getLocale);
+    }
+
     // -- ADVANCED SHORTCUTS
 
     default ManagedObject lookupServiceAdapterById(final String serviceId) {
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 b908d4a730..030eb2a22e 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
@@ -48,11 +48,9 @@ extends ScalarPanelTextFieldWithValueSemantics<T>  {
 
     @Override
     protected final TextField<T> createTextField(final String id) {
-
         val scalarModel = scalarModel();
-
         return new TextFieldWithDateTimePicker<T>(
-                getCommonContext(), id, scalarModel, type, 
getConverter(scalarModel));
+                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 aac929a7ed..d0e344fd70 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.Locale;
 import java.util.Map;
 
 import com.fasterxml.jackson.core.JsonGenerator;
@@ -41,6 +42,7 @@ import de.agilecoders.wicket.jquery.IKey;
  * Configuration holder for all {@link TextFieldWithDateTimePicker} 
configurations.
  * Provides settings for <a 
href="https://github.com/tempusdominus/bootstrap-4";>Tempus Dominus Bootstrap 4 
Datetime Picker</a>
  * JavaScript widget
+ * @see DatetimePickerConfig
  */
 public class DateTimeConfig extends AbstractConfig {
     private static final long serialVersionUID = 1L;
@@ -110,15 +112,27 @@ public class DateTimeConfig extends AbstractConfig {
     private static final IKey<String> MaxDate = newKey("maxDate", null);
 
 
+//    /**
+//     * The two-letter code of the language to use for month and day names.
+//     * These will also be used as the input's value (and subsequently sent 
to the
+//     * server in the case of form submissions). Currently ships with English 
('en');
+//     * German ('de'), Brazilian ('br'), and Spanish ('es') translations, but 
others
+//     * can be added (see I18N below). If an unknown language code is given, 
English
+//     * will be used.
+//     */
+//    private static final IKey<String> Language = newKey("language", "en");
+
+    private static final IKey<String> Locale = newKey("locale", null);
+
     /**
-     * The two-letter code of the language to use for month and day names.
-     * These will also be used as the input's value (and subsequently sent to 
the
-     * server in the case of form submissions). Currently ships with English 
('en');
-     * German ('de'), Brazilian ('br'), and Spanish ('es') translations, but 
others
-     * can be added (see I18N below). If an unknown language code is given, 
English
-     * will be used.
+     * @param locale The moment.js locale
+     * @return current instance
      */
-    private static final IKey<String> Language = newKey("language", "en");
+    public DateTimeConfig useLocale(final Locale locale) {
+        put(Locale, locale.getLanguage());
+        return this;
+    }
+
 
     /**
      * The date format, combination of d, dd, m, mm, M, MM, yy, yyyy.
@@ -148,16 +162,6 @@ public class DateTimeConfig extends AbstractConfig {
      */
     private static final IKey<Boolean> ForceParse = newKey("forceParse", true);
 
-    /**
-     * Whether or not to show the clear button.
-     */
-    private static final IKey<Boolean> ClearButton = newKey("clearBtn", false);
-
-    /**
-     * Whether or not to show the close button.
-     */
-    private static final IKey<Boolean> CloseButton = newKey("closeBtn", false);
-
     /**
      * Whether or not to show week numbers to the left of week rows.
      */
@@ -193,20 +197,6 @@ public class DateTimeConfig extends AbstractConfig {
         return getString(Format);
     }
 
-    /**
-     * @return the language to use
-     */
-    public String getLanguage() {
-        return getString(Language);
-    }
-
-    /**
-     * @return true if default language should be used.
-     */
-    public boolean isDefaultLanguageSet() {
-        return Language.isDefaultValue(getLanguage());
-    }
-
     /**
      * Will cause the date picker to stay open after selecting a date.
      *
@@ -267,22 +257,6 @@ public class DateTimeConfig extends AbstractConfig {
         return this;
     }
 
-    /**
-     * The two-letter code of the language to use for month and day names.
-     * These will also be used as the input's value (and subsequently sent to 
the
-     * server in the case of form submissions). Currently ships with English 
('en'),
-     * German ('de'), Brazilian ('br'), and Spanish ('es') translations, but 
others
-     * can be added (see I18N below). If an unknown language code is given, 
English
-     * will be used.
-     *
-     * @param value two letter language code (optional 5 letter code like 
de_DE)
-     * @return this instance for chaining
-     */
-    public DateTimeConfig withLanguage(final String value) {
-        put(Language, value);
-        return this;
-    }
-
     /**
      * The default view to display when the picker is shown.
      * Useful for date-of-birth datepicker.
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 9e081b6f9b..9c3ec070d1 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
@@ -29,7 +29,7 @@ import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.util.convert.IConverter;
 
-import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.applib.locale.UserLocale;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import 
org.apache.isis.viewer.wicket.model.converter.ConverterBasedOnValueSemantics;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
@@ -64,7 +64,6 @@ implements IConverter<T> {
     private final DateTimeConfig config;
 
     public TextFieldWithDateTimePicker(
-            final IsisAppCommonContext commonContext,
             final String id,
             final ScalarModel scalarModel,
             final Class<T> type,
@@ -74,10 +73,9 @@ implements IConverter<T> {
 
         this.converter = converter;
         this.config = createDatePickerConfig(
-                commonContext.getConfiguration(),
+                scalarModel.getCommonContext(),
                 !scalarModel.isRequired());
 
-
         /* debug
                 new IConverter<T>() {
 
@@ -171,13 +169,20 @@ implements IConverter<T> {
 
     // -- HELPER
 
-    private DateTimeConfig createDatePickerConfig(final IsisConfiguration 
isisConfiguration, final boolean isInputNullable) {
+    private DateTimeConfig createDatePickerConfig(
+            final IsisAppCommonContext commonContext,
+            final boolean isInputNullable) {
         val config = new DateTimeConfig();
 
+        config.useLocale(commonContext.currentUserLocale()
+                .map(UserLocale::getLanguageLocale)
+                .orElse(Locale.US));
+
         // 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);
 
@@ -215,8 +220,8 @@ implements IConverter<T> {
         //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());
+        
config.minDate(commonContext.getConfiguration().getViewer().getWicket().getDatePicker().getMinDate());
+        
config.maxDate(commonContext.getConfiguration().getViewer().getWicket().getDatePicker().getMaxDate());
         return config;
     }
 

Reply via email to