diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImpl.java index 53bb242f86..cf732ee197 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImpl.java @@ -49,6 +49,7 @@ import com.adobe.cq.forms.core.components.models.form.ThankYouOption; import com.adobe.cq.forms.core.components.util.AbstractContainerImpl; import com.adobe.cq.forms.core.components.util.ComponentUtils; +import com.day.cq.commons.LanguageUtil; import com.day.cq.wcm.api.Page; import com.day.cq.wcm.api.PageManager; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -269,6 +270,26 @@ public String getLang() { } } + @Override + public String getContainingPageLang() { + // todo: right now it is copy of aem form because app is part of far, and af-apps is not pare of far + if (request != null) { + Page currentPage = getCurrentPage(); + if (!GuideWCMUtils.isForms(currentPage.getPath())) { + String pagePath = currentPage.getPath(), pageLocaleRoot = LanguageUtil.getLanguageRoot(pagePath), locale = ""; + if (StringUtils.isNotBlank(pageLocaleRoot)) { + int localeStartIndex = StringUtils.lastIndexOf(pageLocaleRoot, '/'); + locale = StringUtils.substring(pageLocaleRoot, localeStartIndex + 1); + } + return locale; + } else { + return FormContainer.super.getContainingPageLang(); + } + } else { + return FormContainer.super.getContainingPageLang(); + } + } + @Override public @NotNull Map getProperties() { Map properties = super.getProperties(); diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/FormContainer.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/FormContainer.java index 07f9edd969..e7292e6e84 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/FormContainer.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/FormContainer.java @@ -303,6 +303,17 @@ default String getLang() { return "en-US"; } + /** + * Returns the language of the containing page + * + * @return the language of the containing page + * @since com.adobe.cq.forms.core.components.models.form 4.7.1 + */ + @JsonIgnore + default String getContainingPageLang() { + return getLang(); + } + /** * Returns the redirect url after form submission * diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/package-info.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/package-info.java index fc68ca73a2..e6840120af 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/package-info.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/package-info.java @@ -34,7 +34,8 @@ * version, is bound to this proxy component resource type. *

*/ -@Version("5.2.0") + +@Version("5.2.1") package com.adobe.cq.forms.core.components.models.form; import org.osgi.annotation.versioning.Version; diff --git a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImplTest.java b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImplTest.java index 8132c569dc..82dbebea37 100644 --- a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImplTest.java +++ b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v2/form/FormContainerImplTest.java @@ -70,7 +70,10 @@ public class FormContainerImplTest { private static final String LIB_FORM_CONTAINER = "/libs/core/fd/components/form/container/v2/container"; protected static final String SITES_PATH = "/content/exampleSite"; + protected static final String SITES_LANG_PATH = "/content/th/exampleSite"; protected static final String FORM_CONTAINER_PATH_IN_SITES = SITES_PATH + "/jcr:content/root/sitecontainer/formcontainer"; + protected static final String FORM_CONTAINER_PATH_WITH_LANGUAGE_IN_SITES = SITES_LANG_PATH + + "/jcr:content/root/sitecontainer/formcontainer"; protected static final String AF_PATH = "/content/forms/af/testAf"; @@ -83,7 +86,8 @@ void setUp() { // resource up to find page context.load().json(BASE + "/test-lib-form-container.json", LIB_FORM_CONTAINER); // required since v2 container resource type should // be v1 for localization to work - context.load().json(BASE + "/test-forms-in-sites.json", "/content/exampleSite"); + context.load().json(BASE + "/test-forms-in-sites.json", SITES_PATH); + context.load().json(BASE + "/test-forms-in-sites.json", SITES_LANG_PATH); context.load().json(BASE + "/test-content.json", CONTENT_FORM_WITHOUT_PREFILL_ROOT); context.registerService(SlingModelFilter.class, new SlingModelFilter() { @@ -134,6 +138,13 @@ void testGetIdForSitePage() throws Exception { assertEquals("L2NvbnRlbnQvZXhhbXBsZVNpdGUvamNyOmNvbnRlbnQvcm9vdC9zaXRlY29udGFpbmVyL2Zvcm1jb250YWluZXI=", formContainer.getId()); } + @Test + void testGetPageLangForSitePage() throws Exception { + FormContainer formContainer = Utils.getComponentUnderTest(FORM_CONTAINER_PATH_WITH_LANGUAGE_IN_SITES, FormContainer.class, context); + assertNotNull(formContainer.getContainingPageLang()); + assertEquals("th", formContainer.getContainingPageLang()); + } + @Test void testGetAction() throws Exception { FormContainer formContainer = Utils.getComponentUnderTest(PATH_FORM_1, FormContainer.class, context); diff --git a/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/CustomAFSubmitService.java b/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/CustomAFSubmitService.java index 3be4c2c6f8..cb94ad2202 100644 --- a/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/CustomAFSubmitService.java +++ b/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/CustomAFSubmitService.java @@ -90,7 +90,8 @@ public Map submit(FormSubmitInfo formSubmitInfo) { result.put("fd:redirectParameters", redirectParamMap); } catch (Exception ex) { logger.error("Error while using the AF Submit service", ex); - + // todo: have to fix this + result.put(GuideConstants.FORM_SUBMISSION_ERROR, Boolean.TRUE); } return result; } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/container.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/container.html index 07439acd12..136d621c79 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/container.html +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/container.html @@ -21,6 +21,7 @@ id="${container.id}" data-cmp-is="adaptiveFormContainer" data-cmp-context-path="${request.contextPath}" + data-cmp-page-lang="${container.containingPageLang}" data-cmp-path="${resource.path}" class="cmp-adaptiveform-container cmp-container"> diff --git a/ui.frontend/src/HTTPAPILayer.js b/ui.frontend/src/HTTPAPILayer.js index 2d256c8cd8..e8fead17e3 100644 --- a/ui.frontend/src/HTTPAPILayer.js +++ b/ui.frontend/src/HTTPAPILayer.js @@ -49,9 +49,10 @@ class HTTPAPILayer { /** * Retrieves the form definition for the specified form container path using the json exporter API * @param {string} formContainerPath - The path of the form container. + * @param {string} pageLang - Language of the containing sites page * @returns {Promise} - A Promise that resolves to the form definition. */ - static async getFormDefinition(formContainerPath) { + static async getFormDefinition(formContainerPath, pageLang) { const urlSearchParams = new URLSearchParams(window.location.search); const params = Object.fromEntries(urlSearchParams.entries()); let lang = null; @@ -64,6 +65,10 @@ class HTTPAPILayer { lang = `${parts[parts.length - 2]}`; } } + // If 'afAcceptLang' is not set and URL selector is not present, use sites page language + if (lang === null && pageLang != null) { + lang = pageLang; + } return await this.getJson(`${formContainerPath}.model.${lang !== null ? `${lang}.` : ""}json`); } diff --git a/ui.frontend/src/utils.js b/ui.frontend/src/utils.js index 56f948a19e..2e4bf528b2 100644 --- a/ui.frontend/src/utils.js +++ b/ui.frontend/src/utils.js @@ -293,13 +293,14 @@ class Utils { for (let i = 0; i < elements.length; i++) { const dataset = Utils.readData(elements[i], formContainerClass); const _path = dataset["path"]; + const _pageLang = dataset["pageLang"]; if ('contextPath' in dataset) { Utils.setContextPath(dataset['contextPath']); } if (_path == null) { console.error(`data-${Constants.NS}-${formContainerClass}-path attribute is not present in the HTML element. Form cannot be initialized` ) } else { - const _formJson = await HTTPAPILayer.getFormDefinition(_path); + const _formJson = await HTTPAPILayer.getFormDefinition(_path, _pageLang); console.debug("fetched model json", _formJson); await this.registerCustomFunctions(_formJson.id); const urlSearchParams = new URLSearchParams(window.location.search);