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/causeway.git
The following commit(s) were added to refs/heads/master by this push:
new 6d0a6f410d CAUSEWAY-3489: on new temporal init zone data from user
session
6d0a6f410d is described below
commit 6d0a6f410d3afd6eedf7b5a91a0697661d7c11b6
Author: Andi Huber <[email protected]>
AuthorDate: Thu Mar 14 21:48:02 2024 +0100
CAUSEWAY-3489: on new temporal init zone data from user session
---
.../causeway/core/metamodel/util/Facets.java | 6 ++--
.../ScalarPanelTextFieldWithTemporalPicker.java | 10 +++---
.../scalars/datepicker/TemporalDecomposition.java | 39 +++++++++++++++++++---
3 files changed, 43 insertions(+), 12 deletions(-)
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
index 9d0b026768..6d81aeb757 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/util/Facets.java
@@ -446,7 +446,7 @@ public final class Facets {
}
@SuppressWarnings("unchecked")
- public Optional<TemporalCharacteristicsProvider>
valueTemporalAndOffsetCharacteristics(
+ public Optional<TemporalCharacteristicsProvider>
valueTemporalCharacteristicsProvider(
final ObjectSpecification objectSpec) {
return objectSpec.valueFacet()
.flatMap(valueFacet->valueFacet.getAllValueSemantics().stream()
@@ -454,9 +454,9 @@ public final class Facets {
.flatMap(valueSemantics->_Casts.castTo(TemporalCharacteristicsProvider.class,
valueSemantics));
}
- public TemporalCharacteristicsProvider
valueTemporalAndOffsetCharacteristicsElseFail(
+ public TemporalCharacteristicsProvider
valueTemporalCharacteristicsProviderElseFail(
final ObjectSpecification objectSpec) {
- return valueTemporalAndOffsetCharacteristics(objectSpec)
+ return valueTemporalCharacteristicsProvider(objectSpec)
.orElseThrow(()->_Exceptions.illegalState("no temporal
characteristics found for %s",
objectSpec));
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
index 0b897d795a..8cb8ee6e0d 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldWithTemporalPicker.java
@@ -93,13 +93,13 @@ extends ScalarPanelTextFieldWithValueSemantics<T> {
case OFFSET:
Wkt.dropDownChoiceWithAjaxUpdateAdd(container, "timeoffset",
new PropertyModel<ZoneOffset>(temporalDecomposition,
"zoneOffset"),
- temporalAndOffsetCharacteristics().getAvailableOffsets())
+ temporalCharacteristicsProvider().getAvailableOffsets())
.setRequired(true);
break;
case ZONED:
Wkt.dropDownChoiceWithAjaxUpdateAdd(container, "timezone",
new PropertyModel<ZoneId>(temporalDecomposition, "zoneId"),
- temporalAndOffsetCharacteristics().getAvailableZoneIds())
+ temporalCharacteristicsProvider().getAvailableZoneIds())
.setRequired(true);
break;
case LOCAL:
@@ -131,12 +131,12 @@ extends ScalarPanelTextFieldWithValueSemantics<T> {
// -- HELPER
- private TemporalCharacteristicsProvider temporalAndOffsetCharacteristics()
{
- return
Facets.valueTemporalAndOffsetCharacteristicsElseFail(scalarModel().getElementType());
+ private TemporalCharacteristicsProvider temporalCharacteristicsProvider() {
+ return
Facets.valueTemporalCharacteristicsProviderElseFail(scalarModel().getElementType());
}
private OffsetCharacteristic offsetCharacteristic() {
- return temporalAndOffsetCharacteristics().getOffsetCharacteristic();
+ return temporalCharacteristicsProvider().getOffsetCharacteristic();
}
private <X> TextField<X> installUpdateNotifier(final TextField<X>
textField) {
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
index f9bde9c49b..b550228a05 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/datepicker/TemporalDecomposition.java
@@ -18,6 +18,7 @@
*/
package org.apache.causeway.viewer.wicket.ui.components.scalars.datepicker;
+import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneId;
@@ -29,7 +30,9 @@ import java.util.Locale;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;
+import org.apache.causeway.applib.services.iactnlayer.InteractionContext;
import
org.apache.causeway.applib.value.semantics.TemporalCharacteristicsProvider.OffsetCharacteristic;
+import org.apache.causeway.applib.value.semantics.ValueSemanticsAbstract;
import org.apache.causeway.commons.internal.assertions._Assert;
import org.apache.causeway.commons.internal.base._Strings;
import org.apache.causeway.commons.internal.base._Temporals;
@@ -68,7 +71,16 @@ public class TemporalDecomposition<T> implements
IConverter<T> {
? stripZoneSuffixFrom(baseEditingPattern)
: baseEditingPattern;
- var tempDecomp = new TemporalDecomposition<>(type,
offsetCharacteristic, fullConverter,
+ var userZoneId = needsDecomposition
+ ?
scalarModel.getInteractionService().currentInteractionContext()
+ .map(InteractionContext::getTimeZone)
+ .orElse(ZoneOffset.UTC)
+ : ZoneOffset.UTC; // not used
+
+ var tempDecomp = new TemporalDecomposition<>(type,
+ offsetCharacteristic,
+ userZoneId,
+ fullConverter,
scalarModel.getViewOrEditMode(),
editingPattern);
@@ -80,14 +92,17 @@ public class TemporalDecomposition<T> implements
IConverter<T> {
private final @NonNull Class<T> type;
private final OffsetCharacteristic offsetCharacteristic;
+ private final @NonNull ZoneId userZoneId;
private final @NonNull ConverterBasedOnValueSemantics<T> fullConverter;
private final @NonNull ViewOrEditMode viewOrEditMode;
@Getter
private final String editingPattern;
+ /**
+ * @implNote only supports zoned types as known at the time of writing
+ */
private void initFrom(final ManagedValue proposedValue) {
- //TODO[CAUSEWAY-3489] handle non java.time.Temporal values also
var temporalValue =
MmUnwrapUtils.single(proposedValue.getValue().getValue());
if(temporalValue instanceof ZonedDateTime) {
var zonedDateTime = (ZonedDateTime) temporalValue;
@@ -98,8 +113,23 @@ public class TemporalDecomposition<T> implements
IConverter<T> {
} else if(temporalValue instanceof OffsetTime) {
var offsetTime = (OffsetTime) temporalValue;
this.zoneOffset = offsetTime.getOffset();
+ } else if(temporalValue instanceof org.joda.time.DateTime) {
+ var jodaDateTime = (org.joda.time.DateTime) temporalValue;
+ this.zoneId = jodaDateTime.getZone().toTimeZone().toZoneId();
+ } else {
+ // either temporalValue is null or unsupported
+ switch (offsetCharacteristic) {
+ case OFFSET:
+ this.zoneOffset =
userZoneId.getRules().getOffset(Instant.now());
+ break;
+ case ZONED:
+ this.zoneId = userZoneId;
+ break;
+ case LOCAL:
+ default:
+ break;
+ }
}
- //TODO[CAUSEWAY-3489] zone/offset info on new temporal value should be
set to current user's info from session
}
// -- CONVERTER
@@ -121,7 +151,7 @@ public class TemporalDecomposition<T> implements
IConverter<T> {
case OFFSET:
return " " + _Temporals.formatZoneId(zoneOffset==null
? ZoneOffset.UTC
- : zoneOffset,
+ : zoneId,
_Temporals.ISO_OFFSET_ONLY_FORMAT);
case ZONED:
return " " + _Temporals.formatZoneId(zoneId==null
@@ -141,6 +171,7 @@ public class TemporalDecomposition<T> implements
IConverter<T> {
/**
* Strips 'XXX' and 'VV' from end of pattern. Does not understand other
zone/offset formats.
+ * @see ValueSemanticsAbstract#getTemporalNoZoneRenderingFormat
*/
private static String stripZoneSuffixFrom(final String pattern) {
if(pattern.endsWith("XXX")) {