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);