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 7e1ec0a4cf ISIS-3085: Wicket Viewer: also render zone info in value 
titles
7e1ec0a4cf is described below

commit 7e1ec0a4cf752ce5cad1f36649878fe4d1d55731
Author: Andi Huber <[email protected]>
AuthorDate: Fri Jul 15 14:01:46 2022 +0200

    ISIS-3085: Wicket Viewer: also render zone info in value titles
---
 .../value/semantics/TemporalValueSemantics.java    | 11 +++-
 .../value/semantics/ValueSemanticsAbstract.java    | 51 ++++++++++++++---
 .../temporal/TemporalValueSemanticsProvider.java   | 66 +++++++++-------------
 .../temporal/ZonedDateTimeValueSemantics.java      |  2 +-
 4 files changed, 79 insertions(+), 51 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/TemporalValueSemantics.java
 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/TemporalValueSemantics.java
index 09111e8513..737f253c75 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/TemporalValueSemantics.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/TemporalValueSemantics.java
@@ -70,11 +70,18 @@ extends
         LOCAL,
 
         /**
-         * Temporal value type has time-zone data.
+         * Temporal value type has time-zone offset data.
          */
-        OFFSET;
+        OFFSET,
+
+        /**
+         * Temporal value type has time-zone id data.
+         */
+        ZONED;
 
         public boolean isLocal() {return this == LOCAL;}
+        public boolean isOffset() {return this == OFFSET;}
+        public boolean isZoned() {return this == ZONED;}
     }
 
     TemporalCharacteristic getTemporalCharacteristic();
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
index 5b4c6b68e8..1902718c5e 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
@@ -52,6 +52,7 @@ import 
org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.schema.common.v2.ValueWithTypeDto;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -272,30 +273,64 @@ implements
      */
     protected void configureDecimalFormat(final Context context, final 
DecimalFormat format) {}
 
-    // -- TEMPORAL FORMATTING/PARSING
+    // -- TEMPORAL RENDERING
 
-    protected DateTimeFormatter getTemporalRenderingFormat(
+    protected DateTimeFormatter getTemporalNoZoneRenderingFormat(
             final @Nullable ValueSemanticsProvider.Context context,
             final @NonNull TemporalValueSemantics.TemporalCharacteristic 
temporalCharacteristic,
             final @NonNull TemporalValueSemantics.OffsetCharacteristic 
offsetCharacteristic,
             final @NonNull FormatStyle dateFormatStyle,
             final @NonNull FormatStyle timeFormatStyle) {
 
+        final DateTimeFormatter noZoneOutputFormat;
+
         switch (temporalCharacteristic) {
         case DATE_TIME:
-            return DateTimeFormatter.ofLocalizedDateTime(dateFormatStyle, 
timeFormatStyle)
-                    .withLocale(getUserLocale(context).getTimeFormatLocale());
+            noZoneOutputFormat = 
DateTimeFormatter.ofLocalizedDateTime(dateFormatStyle, timeFormatStyle);
+            break;
         case DATE_ONLY:
-            return DateTimeFormatter.ofLocalizedDate(dateFormatStyle)
-                    .withLocale(getUserLocale(context).getTimeFormatLocale());
+            noZoneOutputFormat = 
DateTimeFormatter.ofLocalizedDate(dateFormatStyle);
+            break;
         case TIME_ONLY:
-            return DateTimeFormatter.ofLocalizedTime(timeFormatStyle)
-                    .withLocale(getUserLocale(context).getTimeFormatLocale());
+            noZoneOutputFormat = 
DateTimeFormatter.ofLocalizedTime(timeFormatStyle);
+            break;
         default:
             throw _Exceptions.unmatchedCase(temporalCharacteristic);
         }
+        return noZoneOutputFormat
+                .withLocale(getUserLocale(context).getTimeFormatLocale());
     }
 
+    protected Optional<DateTimeFormatter> getTemporalZoneOnlyRenderingFormat(
+            final @Nullable ValueSemanticsProvider.Context context,
+            final @NonNull TemporalValueSemantics.TemporalCharacteristic 
temporalCharacteristic,
+            final @NonNull TemporalValueSemantics.OffsetCharacteristic 
offsetCharacteristic) {
+
+             switch (offsetCharacteristic) {
+        case LOCAL:
+            return Optional.empty();
+        case OFFSET:
+            return Optional.of(getIsoTimeZoneOffsetFormat());
+        case ZONED:
+            return Optional.of(getLocalizedTimeZoneIdFormat(context));
+        default:
+            throw _Exceptions.unmatchedCase(offsetCharacteristic);
+        }
+    }
+
+    @Getter(lazy = true, value = AccessLevel.PROTECTED)
+    private final DateTimeFormatter isoTimeZoneOffsetFormat = new 
DateTimeFormatterBuilder()
+            .appendOffsetId()
+            .toFormatter(Locale.US); // arbitrarily picking a locale, just in 
case; (this is an ISO format)
+
+    private DateTimeFormatter getLocalizedTimeZoneIdFormat(final 
ValueSemanticsProvider.Context context) {
+        return new DateTimeFormatterBuilder()
+            .appendPattern("VV")
+            .toFormatter(getUserLocale(context).getTimeFormatLocale());
+    }
+
+    // -- TEMPORAL FORMATTING/PARSING
+
     protected DateTimeFormatter getTemporalEditingFormat(
             final @Nullable ValueSemanticsProvider.Context context,
             final @NonNull TemporalValueSemantics.TemporalCharacteristic 
temporalCharacteristic,
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/TemporalValueSemanticsProvider.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/TemporalValueSemanticsProvider.java
index 76d94b03bc..9364fb0248 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/TemporalValueSemanticsProvider.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/TemporalValueSemanticsProvider.java
@@ -20,12 +20,10 @@ package 
org.apache.isis.core.metamodel.valuesemantics.temporal;
 
 import java.time.Duration;
 import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeFormatterBuilder;
 import java.time.format.FormatStyle;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.Temporal;
 import java.time.temporal.TemporalQuery;
-import java.util.Locale;
 import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.Function;
@@ -37,8 +35,6 @@ import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.annotation.TimePrecision;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
-import org.apache.isis.applib.locale.UserLocale;
-import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
 import org.apache.isis.applib.value.semantics.TemporalValueSemantics;
 import org.apache.isis.applib.value.semantics.ValueDecomposition;
@@ -50,9 +46,7 @@ import 
org.apache.isis.core.metamodel.context.MetaModelContext;
 import 
org.apache.isis.core.metamodel.facets.objectvalue.temporalformat.DateFormatStyleFacet;
 import 
org.apache.isis.core.metamodel.facets.objectvalue.temporalformat.TimeFormatPrecisionFacet;
 import 
org.apache.isis.core.metamodel.facets.objectvalue.temporalformat.TimeFormatStyleFacet;
-import org.apache.isis.schema.common.v2.ValueType;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.Value;
@@ -150,46 +144,21 @@ implements TemporalValueSemantics<T> {
     public final String titlePresentation(
             final ValueSemanticsProvider.Context context,
             final T value) {
-        return renderTitle(value, getRenderingFormat(context)::format);
+        return renderTitle(value, getRenderingFormatter(context, 
UnaryOperator.identity()));
     }
 
     @Override
     public final String htmlPresentation(
             final ValueSemanticsProvider.Context context,
             final T value) {
-        return renderHtml(value, withTimeZoneBadge(context, 
getRenderingFormat(context)::format));
-    }
-
-    @Getter(lazy = true, value = AccessLevel.PRIVATE)
-    private final DateTimeFormatter isoTimeZoneFormat = new 
DateTimeFormatterBuilder()
-            .appendOffsetId()
-            .toFormatter(Locale.US); // arbitrarily picking a locale, just in 
case; (this is an ISO format)
-
-    private final DateTimeFormatter getLocalizedTimeZoneFormat(final 
ValueSemanticsProvider.Context context) {
-        return new DateTimeFormatterBuilder()
-            .appendPattern("VVx")
-            .toFormatter(Optional.ofNullable(context.getInteractionContext())
-                    .map(InteractionContext::getLocale)
-                    .map(UserLocale::getTimeFormatLocale)
-                    .orElseGet(Locale::getDefault));
+        return renderHtml(value, getRenderingFormatter(context, 
this::toBootstrapBadge));
     }
 
     /**
-     * Adds a html badge with time-zone information. If this is a local 
temporal,
-     * instead adds the translatable literal 'local' as a html badge.
      * @apiNote Ideally this logic would move to Wicket Viewer, as it depends 
on presence of <i>Bootstrap</i>.
      */
-    private Function<T, String> withTimeZoneBadge(
-            final ValueSemanticsProvider.Context context,
-            final Function<T, String> toString) {
-
-        return value->toString.apply(value)
-                + String.format(" <span class=\"badge 
bg-secondary\">%s</span>",
-                        this.getOffsetCharacteristic().isLocal()
-                        ? translate("local")
-                        : getSchemaValueType()==ValueType.ZONED_DATE_TIME
-                            ? getLocalizedTimeZoneFormat(context).format(value)
-                            : getIsoTimeZoneFormat().format(value));
+    private String toBootstrapBadge(final String text) {
+        return String.format("<span class=\"badge bg-secondary\">%s</span>", 
text);
     }
 
     // -- PARSER
@@ -230,14 +199,31 @@ implements TemporalValueSemantics<T> {
     /**
      * Format for pretty rendering, not used for parsing/editing.
      */
-    protected DateTimeFormatter getRenderingFormat(final 
ValueSemanticsProvider.Context context) {
+    protected Function<T, String> getRenderingFormatter(
+            final ValueSemanticsProvider.Context context,
+            final UnaryOperator<String> timeZoneDecorator) {
 
         val dateAndTimeFormatStyle = DateAndTimeFormatStyle.forContext(mmc, 
context);
 
-        return getTemporalRenderingFormat(
-                context, temporalCharacteristic, offsetCharacteristic,
-                dateAndTimeFormatStyle.getDateFormatStyle(),
-                dateAndTimeFormatStyle.getTimeFormatStyle());
+        return time-> {
+
+                final var sb = new StringBuffer();
+
+                sb.append(
+                    getTemporalNoZoneRenderingFormat(
+                            context, temporalCharacteristic, 
offsetCharacteristic,
+                            dateAndTimeFormatStyle.getDateFormatStyle(),
+                            dateAndTimeFormatStyle.getTimeFormatStyle())
+                    .format(time));
+
+                getTemporalZoneOnlyRenderingFormat(
+                        context, temporalCharacteristic, offsetCharacteristic)
+                .ifPresent(zoneOnlyFormat->{
+                    sb.append(' 
').append(timeZoneDecorator.apply(zoneOnlyFormat.format(time)));
+                });
+
+                return sb.toString();
+        };
     }
 
     /**
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
index 0aad0261af..832d0d9ba9 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
@@ -52,7 +52,7 @@ extends TemporalValueSemanticsProvider<ZonedDateTime> {
     }
 
     public ZonedDateTimeValueSemantics() {
-        super(TemporalCharacteristic.DATE_TIME, OffsetCharacteristic.OFFSET,
+        super(TemporalCharacteristic.DATE_TIME, OffsetCharacteristic.ZONED,
                 TYPICAL_LENGTH, MAX_LENGTH,
                 ZonedDateTime::from,
                 TemporalAdjust::adjustZonedDateTime);

Reply via email to