From 56b4653684e4e19f2cd10753f1264b50b3eb6fb0 Mon Sep 17 00:00:00 2001 From: Rishi Mehta Date: Thu, 7 Aug 2025 10:22:06 +0530 Subject: [PATCH 1/2] [discussion] date server side time zone information --- .../internal/models/v1/form/DateTimeImpl.java | 14 ++++++++++ .../core/components/models/form/DateTime.java | 13 +++++++++- .../models/v1/form/DateTimeImplTest.java | 10 +++++++ .../form/datetime/v1/datetime/README.md | 26 +++++++++++++++++++ .../form/datetime/v1/datetime/datetime.html | 3 ++- 5 files changed, 64 insertions(+), 2 deletions(-) diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImpl.java index 2c9372cc6a..c6ceed9a87 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImpl.java @@ -17,6 +17,7 @@ package com.adobe.cq.forms.core.components.internal.models.v1.form; import java.time.OffsetDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Map; @@ -99,4 +100,17 @@ public Object[] getDefault() { return defaultValue != null ? defaultValue.clone() : null; } + /** + * Returns the server timezone identifier for client-side consumption. + * + * @return server timezone identifier (e.g., "America/New_York", "Asia/Kolkata") + * @since com.adobe.cq.forms.core.components.models.form 5.12.0 + */ + @Override + public String getServerTimezone() { + ZoneId serverZone = ZoneId.systemDefault(); + + return serverZone.getId(); + } + } diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/DateTime.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/DateTime.java index 86466757a0..b83d031521 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/DateTime.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/DateTime.java @@ -19,12 +19,23 @@ import org.osgi.annotation.versioning.ConsumerType; +import com.fasterxml.jackson.annotation.JsonIgnore; + /** - * Interface for {@code Password} Sling Model used for the {@code /apps/core/fd/components/form/password/v1/password} component. + * Interface for {@code DateTime} Sling Model used for the {@code /apps/core/fd/components/form/datetime/v1/datetime} component. * * @since com.adobe.cq.forms.core.components.models.form 5.12.0 */ @ConsumerType public interface DateTime extends Field, DateTimeConstraint { + /** + * Returns the server timezone identifier for client-side consumption. + * + * @return server timezone identifier (e.g., "America/New_York", "Asia/Kolkata") + * @since com.adobe.cq.forms.core.components.models.form 5.12.0 + */ + @JsonIgnore + String getServerTimezone(); + } diff --git a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImplTest.java b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImplTest.java index 367524dcd3..e5a5086e79 100644 --- a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImplTest.java +++ b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/DateTimeImplTest.java @@ -35,6 +35,8 @@ import io.wcm.testing.mock.aem.junit5.AemContextExtension; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; @ExtendWith(AemContextExtension.class) public class DateTimeImplTest { @@ -71,7 +73,15 @@ void testGetLabel() { void testGetName() { DateTime datetime = Utils.getComponentUnderTest(PATH_DATETIME_CUSTOMIZED, DateTime.class, context); assertEquals("abc", datetime.getName()); + } + + @Test + void testGetServerTimezone() { + DateTime dateTime = Utils.getComponentUnderTest(PATH_DATETIME_CUSTOMIZED, DateTime.class, context); + String timezone = dateTime.getServerTimezone(); + assertNotNull(timezone); + assertFalse(timezone.isEmpty()); } @Test diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md index 02319bb482..c2998d8da4 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md @@ -42,6 +42,32 @@ The following properties are written to JCR for this Form Date & Time component 11. './maximumMessage' - defines the maximum date and time message that will come when the selected date and time is after the maximum date and time 12. './default' - defines the default date and time that will be selected when the form is loaded +## Server Timezone Information + +The component exposes server timezone information via data attributes for client-side consumption: + +### Data Attributes Available +- `data-server-timezone-id` - Server timezone identifier (e.g., "America/New_York") + +### Getting Current Date in Server Timezone + +```javascript +// Get server timezone info from the datetime component +const datetimeComponent = document.querySelector('.cmp-adaptiveform-datetime'); +const serverTimezoneId = datetimeComponent.dataset.serverTimezoneId; + +// Get current date in server timezone +function getCurrentDateInServerTimezone() { + const now = new Date(); + const serverDate = new Date(now.toLocaleString("en-US", {timeZone: serverTimezoneId})); + return serverDate.toISOString().slice(0, 16); // Format: YYYY-MM-DDTHH:mm +} + +// Set current date as default value +const currentServerDate = getCurrentDateInServerTimezone(); +document.querySelector('.cmp-adaptiveform-datetime__widget').value = currentServerDate; +``` + ## Client Libraries The component provides a `core.forms.components.datetime.v1.runtime` client library category that contains the Javascript runtime for the component. It should be added to a relevant site client library using the `embed` property. diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/datetime.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/datetime.html index 16d6c9ccba..a3a50cac3b 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/datetime.html +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/datetime.html @@ -30,7 +30,8 @@ data-cmp-readonly="${datetime.readOnly ? 'true' : 'false'}" id="${datetime.id}" data-cmp-adaptiveformcontainer-path="${formstructparser.formContainerPath}" - data-sly-test.widgetId="${datetime.id}-widget"> + data-sly-test.widgetId="${datetime.id}-widget" + data-server-timezone-id="${datetime.serverTimezone}">
From 5eb8dad4045088ba2d1d722b9cda25ebd83f3434 Mon Sep 17 00:00:00 2001 From: Rishi Mehta Date: Thu, 7 Aug 2025 10:23:28 +0530 Subject: [PATCH 2/2] [discussion] date server side time zone information --- .../apps/core/fd/components/form/datetime/v1/datetime/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md index c2998d8da4..462860fa91 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datetime/v1/datetime/README.md @@ -65,7 +65,6 @@ function getCurrentDateInServerTimezone() { // Set current date as default value const currentServerDate = getCurrentDateInServerTimezone(); -document.querySelector('.cmp-adaptiveform-datetime__widget').value = currentServerDate; ``` ## Client Libraries