From 98d3ad4c9f3f6e2a4703675f167459d288cedeff Mon Sep 17 00:00:00 2001 From: Rishi Mehta Date: Fri, 27 Mar 2026 15:04:20 +0530 Subject: [PATCH 1/4] feat(dialog): add fieldType hidden field to container v2 dialog Adds a hidden select field for fieldType with value 'form' to the container v2 dialog, consistent with all other AF2 component dialogs. This exposes the container's fieldType via the Content API's componentDefinitions endpoint, enabling type validation of patches targeting form container properties. Co-Authored-By: Claude Sonnet 4.6 --- .../container/v2/container/_cq_dialog/.content.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml index 367c397277..3a7a50e550 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml @@ -92,6 +92,19 @@ text="Enable the hamburger menu for mobile view" fieldDescription="Select the option to display the hamburger menu for efficient navigation on mobile devices." value="{Boolean}true"/> + + + + + From 029bf40dffdabbdb82f57697d252e77268c0e045 Mon Sep 17 00:00:00 2001 From: Rishi Mehta Date: Mon, 30 Mar 2026 11:14:02 +0530 Subject: [PATCH 2/4] chore(fileinput): describe accept field for definition API --- .../form/fileinput/v3/fileinput/_cq_dialog/.content.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/fileinput/v3/fileinput/_cq_dialog/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/fileinput/v3/fileinput/_cq_dialog/.content.xml index 961d61af41..e09d7c6665 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/fileinput/v3/fileinput/_cq_dialog/.content.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/fileinput/v3/fileinput/_cq_dialog/.content.xml @@ -106,7 +106,10 @@ fieldDescription="Specify allowed MIME types (for example, image/jpeg) to filter uploads. You can use this option or 'Allowed file extensions'. However, this setting is disabled if any 'Allowed file extensions' are specified." defaultValue=""> From e797f74e481404a11f371e88d1929ea905852fd8 Mon Sep 17 00:00:00 2001 From: Rishi Mehta Date: Mon, 30 Mar 2026 11:27:16 +0530 Subject: [PATCH 3/4] chore(checkbox): clarify conditional unchecked value metadata --- .../form/checkbox/v1/checkbox/_cq_dialog/.content.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkbox/v1/checkbox/_cq_dialog/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkbox/v1/checkbox/_cq_dialog/.content.xml index babd5a5f03..97c10253f7 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkbox/v1/checkbox/_cq_dialog/.content.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkbox/v1/checkbox/_cq_dialog/.content.xml @@ -74,7 +74,7 @@ jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield" fieldLabel="When Checked, return value" - fieldDescription="Specify the value to be returned when the checkbox is checked by the user." + fieldDescription="Value submitted when the checkbox is checked. Enter the value as text. For boolean fields, use true. For numeric intent, enter values such as 1 as text." name="./checkedValue"/> @@ -96,6 +96,7 @@ fieldLabel="When Unchecked, return value" jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/coral/foundation/form/textfield" + fieldDescription="Value submitted when the checkbox is unchecked. Used only when 'Preserve Uncheck state value' is enabled. Enter the value as text. For boolean fields, use false." name="./uncheckedValue"/> From 2d1aff2e488ad52d205fb9a5ca867660e0f8d53d Mon Sep 17 00:00:00 2001 From: Rishi Mehta Date: Mon, 30 Mar 2026 17:12:22 +0530 Subject: [PATCH 4/4] fix(text): omit default richText from export --- .../internal/models/v1/form/TextImpl.java | 15 ++++++++++++--- .../internal/models/v1/form/TextImplTest.java | 10 ++++++++++ .../exporter-termsandconditions.json | 1 - .../form/text/exporter-text-datalayer.json | 1 - .../form/text/exporter-text-with-viewtype.json | 1 - .../test/resources/form/text/exporter-text.json | 3 +-- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImpl.java index de6d93342a..9381104053 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImpl.java @@ -17,12 +17,12 @@ import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; -import org.apache.sling.models.annotations.Default; import org.apache.sling.models.annotations.Exporter; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.injectorspecific.InjectionStrategy; import org.apache.sling.models.annotations.injectorspecific.SlingObject; import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; +import org.jetbrains.annotations.Nullable; import com.adobe.cq.export.json.ComponentExporter; import com.adobe.cq.export.json.ExporterConstants; @@ -32,6 +32,8 @@ import com.adobe.cq.forms.core.components.models.form.Text; import com.adobe.cq.forms.core.components.util.AbstractFormComponentImpl; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; @Model( adaptables = { SlingHttpServletRequest.class, Resource.class }, @@ -42,8 +44,8 @@ public class TextImpl extends AbstractFormComponentImpl implements Text { @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL, name = ReservedProperties.PN_TEXT_IS_RICH) - @Default(booleanValues = false) - private boolean textIsRich; + @Nullable + private Boolean textIsRich; @SlingObject private Resource resource; @@ -54,7 +56,14 @@ public String getValue() { } @Override + @JsonIgnore public boolean isRichText() { + return textIsRich != null && textIsRich; + } + + @JsonProperty("richText") + @JsonInclude(JsonInclude.Include.NON_NULL) + public Boolean getRichText() { return textIsRich; } diff --git a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImplTest.java b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImplTest.java index 4eaf4c07cc..8d32998ea7 100644 --- a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImplTest.java +++ b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TextImplTest.java @@ -26,6 +26,7 @@ import com.adobe.cq.forms.core.components.internal.form.FormConstants; import com.adobe.cq.forms.core.components.models.form.*; import com.adobe.cq.forms.core.context.FormsCoreComponentTestContext; +import com.fasterxml.jackson.databind.ObjectMapper; import io.wcm.testing.mock.aem.junit5.AemContext; import io.wcm.testing.mock.aem.junit5.AemContextExtension; @@ -91,6 +92,15 @@ void testIsRichText() { assertEquals(false, textMock.isRichText()); } + @Test + void testRichTextAbsentFromJcr() throws Exception { + Text text = Utils.getComponentUnderTest(PATH_TEXT, Text.class, context); + assertEquals(false, text.isRichText()); + String json = new ObjectMapper().writeValueAsString(text); + assertFalse("richText must not appear in JSON when textIsRich is absent from JCR", + json.contains("\"richText\"")); + } + @Test void testGetDataRef() { Text text = Utils.getComponentUnderTest(PATH_TEXT_CUSTOMIZED, Text.class, context); diff --git a/bundles/af-core/src/test/resources/form/termsandconditions/exporter-termsandconditions.json b/bundles/af-core/src/test/resources/form/termsandconditions/exporter-termsandconditions.json index a8017f9c3d..135c166a6d 100644 --- a/bundles/af-core/src/test/resources/form/termsandconditions/exporter-termsandconditions.json +++ b/bundles/af-core/src/test/resources/form/termsandconditions/exporter-termsandconditions.json @@ -26,7 +26,6 @@ "fieldType": "plain-text", "name": "consenttext", "value": "Text related to the terms and conditions come here", - "richText": false, "events": { "custom:setProperty": [ "$event.payload" diff --git a/bundles/af-core/src/test/resources/form/text/exporter-text-datalayer.json b/bundles/af-core/src/test/resources/form/text/exporter-text-datalayer.json index ced8c2ac52..01205ff719 100644 --- a/bundles/af-core/src/test/resources/form/text/exporter-text-datalayer.json +++ b/bundles/af-core/src/test/resources/form/text/exporter-text-datalayer.json @@ -3,7 +3,6 @@ "fieldType": "plain-text", "name": "text1680491190398", "value": "This is an AF", - "richText": false, "events": { "custom:setProperty": [ "$event.payload" diff --git a/bundles/af-core/src/test/resources/form/text/exporter-text-with-viewtype.json b/bundles/af-core/src/test/resources/form/text/exporter-text-with-viewtype.json index c9c338ee3b..30459b8d8b 100644 --- a/bundles/af-core/src/test/resources/form/text/exporter-text-with-viewtype.json +++ b/bundles/af-core/src/test/resources/form/text/exporter-text-with-viewtype.json @@ -2,7 +2,6 @@ "id": "text-2c82909883", "fieldType": "plain-text", "name": "abc", - "richText": false, "properties": { "fd:path": "/content/text-with-viewtype" }, diff --git a/bundles/af-core/src/test/resources/form/text/exporter-text.json b/bundles/af-core/src/test/resources/form/text/exporter-text.json index 4243f7d3dd..cfbcb08eb2 100644 --- a/bundles/af-core/src/test/resources/form/text/exporter-text.json +++ b/bundles/af-core/src/test/resources/form/text/exporter-text.json @@ -1,7 +1,6 @@ { "id": "text-ac0bcff4f3", "fieldType": "plain-text", - "richText": false, "name": "abc", ":type": "core/fd/components/form/text/v1/text", "properties": { @@ -13,4 +12,4 @@ "$event.payload" ] } -} \ No newline at end of file +}