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..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 @@ -42,6 +42,31 @@ 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(); +``` + ## 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}">