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 e79b979e43 ISIS-3109: polishes zoned/offset temporal badge rendering
e79b979e43 is described below

commit e79b979e436cf60e049a300a5bb131f723ccb636
Author: Andi Huber <[email protected]>
AuthorDate: Thu Aug 4 12:08:21 2022 +0200

    ISIS-3109: polishes zoned/offset temporal badge rendering
---
 .../isis/commons/internal/base/_Temporals.java     | 33 +++++++++++++
 .../temporal/TemporalValueSemanticsProvider.java   | 55 +++++++++++++++-------
 .../bootstrap/css/bootstrap-overrides-all-v2.css   |  4 +-
 3 files changed, 75 insertions(+), 17 deletions(-)

diff --git 
a/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java 
b/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java
index cc01da783b..292d001436 100644
--- 
a/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java
+++ 
b/commons/src/main/java/org/apache/isis/commons/internal/base/_Temporals.java
@@ -32,6 +32,7 @@ import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
+import java.time.temporal.Temporal;
 import java.util.Locale;
 import java.util.Optional;
 import java.util.regex.Pattern;
@@ -90,6 +91,38 @@ public final class _Temporals {
                         : Optional.empty();
     }
 
+    // -- ZONE TRANSLATION
+
+    /**
+     * Translates given {@link Temporal} into provided {@link ZoneId} 
preserving the time instant.
+     * If timeZone is absent, acts as a identity operator.
+     * @param temporal - the {@link Temporal} to translate (required)
+     * @param zoneId - target {@link ZoneId} (required)
+     */
+    public ZonedDateTime translateToTimeZone(final @NonNull ZonedDateTime 
temporal, final @NonNull ZoneId zoneId) {
+        return temporal.withZoneSameInstant(zoneId);
+    }
+
+    /**
+     * Translates given {@link Temporal} into provided {@link ZoneId} 
preserving the time instant.
+     * If timeZone is absent, acts as a identity operator.
+     * @param temporal - the {@link Temporal} to translate (required)
+     * @param zoneId - target {@link ZoneId} (required)
+     */
+    public ZonedDateTime translateToTimeZone(final @NonNull OffsetDateTime 
temporal, final @NonNull ZoneId zoneId) {
+        return ZonedDateTime.ofInstant(temporal.toInstant(), zoneId);
+    }
+
+    /**
+     * Translates given {@link Temporal} into provided {@link ZoneId} 
preserving the time instant.
+     * If timeZone is absent, acts as a identity operator.
+     * @param temporal - the {@link Temporal} to translate (required)
+     * @param offset - target {@link ZoneOffset} (required)
+     */
+    public OffsetTime translateToTimeOffset(final @NonNull OffsetTime 
temporal, final @NonNull ZoneOffset offset) {
+        return temporal.withOffsetSameInstant(offset);
+    }
+
     // -- TIME ZONE RENDERING
 
     public final DateTimeFormatter ISO_OFFSET_ONLY_FORMAT = new 
DateTimeFormatterBuilder()
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 13b416698c..23835b8bac 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,7 +20,6 @@ package 
org.apache.isis.core.metamodel.valuesemantics.temporal;
 
 import java.time.Duration;
 import java.time.Instant;
-import java.time.LocalDateTime;
 import java.time.OffsetDateTime;
 import java.time.OffsetTime;
 import java.time.ZonedDateTime;
@@ -47,6 +46,7 @@ import 
org.apache.isis.applib.value.semantics.ValueDecomposition;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.base._Temporals;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import 
org.apache.isis.core.metamodel.facets.objectvalue.temporalformat.DateFormatStyleFacet;
@@ -217,7 +217,7 @@ implements TemporalValueSemantics<T> {
 
                 final var timeZoneTranslation = 
dateAndTimeFormatStyle.getTimeZoneTranslation();
 
-                final var asLocalTime = toLocalTime(context, time);
+                final var asLocalicedTime = 
translateToUserLocalTimeZone(context, time);
 
                 final var sb = new StringBuffer();
 
@@ -228,14 +228,15 @@ implements TemporalValueSemantics<T> {
                         sb.append(temporalNoZoneRenderingFormat.format(time));
                     } else {
                         // start rendering with the (to-local) translated time 
(no offset/zone info)
-                        
sb.append(temporalNoZoneRenderingFormat.format(asLocalTime));
+                        
sb.append(temporalNoZoneRenderingFormat.format(asLocalicedTime));
 
                         // we have offset/zone information, so we append it 
(properly formatted) ...
                         sb.append(' ');
 
                         sb.append(badgeRenderer.render(
-                                "", // no text
-                                ()->"fa-solid fa-user-clock",
+                                // translated local time-zone
+                                
temporalZoneOnlyRenderingFormat.format(asLocalicedTime),
+                                ()->"fa-solid fa-user-clock fontAwesomeIcon",
                                 ()->translate("Instant")
                                     + ": "
                                     + 
temporalNoZoneRenderingFormat.format(time)
@@ -255,10 +256,10 @@ implements TemporalValueSemantics<T> {
 
                         sb.append(badgeRenderer.render(
                                 temporalZoneOnlyRenderingFormat.format(time),
-                                ()->"fa-solid fa-globe",
+                                ()->"fa-solid fa-globe fontAwesomeIcon",
                                 ()->translate("your local time")
                                     + ": "
-                                    + 
temporalNoZoneRenderingFormat.format(asLocalTime)));
+                                    + 
temporalNoZoneRenderingFormat.format(asLocalicedTime)));
                     }
                     break;
                 }
@@ -267,30 +268,52 @@ implements TemporalValueSemantics<T> {
         };
     }
 
+//    /**
+//     * Converts given {@link Temporal} when offset,
+//     * to a temporal that is local to the user's (client's) time-zone.
+//     * In other words, this conversion preserves the time {@link Instant}.
+//     */
+//    private Temporal toLocalTime(final ValueSemanticsProvider.Context 
context, final Temporal t) {
+//        if(t instanceof ZonedDateTime) {
+//            return LocalDateTime.ofInstant(((ZonedDateTime) t).toInstant(),
+//                    context.getInteractionContext().getTimeZone());
+//        }
+//        if(t instanceof OffsetDateTime) {
+//            return LocalDateTime.ofInstant(((OffsetDateTime) t).toInstant(),
+//                    context.getInteractionContext().getTimeZone());
+//        }
+//        if(t instanceof OffsetTime) {
+//            return ((OffsetTime) t)
+//                    // convert to 'user time'
+//                    
.withOffsetSameInstant(context.getInteractionContext().getTimeZoneOffsetNow())
+//                    // remove offset information
+//                    .toLocalTime();
+//        }
+//        return t;
+//    }
+
     /**
      * Converts given {@link Temporal} when offset,
      * to a temporal that is local to the user's (client's) time-zone.
      * In other words, this conversion preserves the time {@link Instant}.
      */
-    private Temporal toLocalTime(final ValueSemanticsProvider.Context context, 
final Temporal t) {
+    private Temporal translateToUserLocalTimeZone(final 
ValueSemanticsProvider.Context context, final Temporal t) {
         if(t instanceof ZonedDateTime) {
-            return LocalDateTime.ofInstant(((ZonedDateTime) t).toInstant(),
+            return _Temporals.translateToTimeZone((ZonedDateTime) t,
                     context.getInteractionContext().getTimeZone());
         }
         if(t instanceof OffsetDateTime) {
-            return LocalDateTime.ofInstant(((OffsetDateTime) t).toInstant(),
+            return _Temporals.translateToTimeZone((OffsetDateTime) t,
                     context.getInteractionContext().getTimeZone());
         }
         if(t instanceof OffsetTime) {
-            return ((OffsetTime) t)
-                    // convert to 'user time'
-                    
.withOffsetSameInstant(context.getInteractionContext().getTimeZoneOffsetNow())
-                    // remove offset information
-                    .toLocalTime();
+            return _Temporals.translateToTimeOffset((OffsetTime) t,
+                    context.getInteractionContext().getTimeZoneOffsetNow());
         }
-        return t;
+        return t; // otherwise acts as identity operator
     }
 
+
     /**
      * Format used for rendering editable text representation.
      */
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
index de3fb3caa0..4a239f007d 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
@@ -149,7 +149,9 @@ footer > .navbar {
     margin: 0;
 }
 
-
+.fontAwesomeIcon {
+       margin-right: 4px;
+}
 
 /* from ActionPromptHeaderPanel */
 

Reply via email to