diff --git a/.circleci/ci/it-tests.js b/.circleci/ci/it-tests.js index c2fd7df59e..22d0b4bf69 100644 --- a/.circleci/ci/it-tests.js +++ b/.circleci/ci/it-tests.js @@ -39,7 +39,7 @@ try { //todo: remove this later, once aem image is released, since sites rotary aem base image has "2.25.4" //let wcmVersion = ci.sh('mvn help:evaluate -Dexpression=core.wcm.components.version -q -DforceStdout', true); - let wcmVersion = "2.26.0"; + let wcmVersion = "2.27.0"; ci.stage("Integration Tests"); ci.dir(qpPath, () => { // Connect to QP diff --git a/.circleci/docker-compose.yml b/.circleci/docker-compose.yml index c09afbe139..2416954443 100644 --- a/.circleci/docker-compose.yml +++ b/.circleci/docker-compose.yml @@ -6,7 +6,7 @@ services: entrypoint: tail -f /dev/null # Keeps the container running circleci-aem-cloudready: - image: docker-adobe-cif-release.dr-uw2.adobeitc.com/circleci-aem-cloudready:17689-rel-openjdk11 + image: docker-adobe-cif-release.dr-uw2.adobeitc.com/circleci-aem-cloudready:9aa621f43a-openjdk11 depends_on: - circleci-qp # Add any additional configurations or environment variables if needed diff --git a/.github/workflows/exporter-validate-pr.yml b/.github/workflows/exporter-validate-pr.yml index 8f3ac2c5b8..0907dd8f64 100644 --- a/.github/workflows/exporter-validate-pr.yml +++ b/.github/workflows/exporter-validate-pr.yml @@ -29,34 +29,39 @@ jobs: # Loop through each changed file for file in $changed_files; do - # Fetch the base and head versions of the file - base_file=$(git show ${{ github.base_ref }}:$file) - head_file=$(git show ${{ github.head_ref }}:$file) + # Check if the file exists in both branches + if git cat-file -e origin/${{ github.base_ref }}:$file 2>/dev/null && git cat-file -e origin/${{ github.head_ref }}:$file 2>/dev/null; then + # Fetch the base and head versions of the file + base_file=$(git show origin/${{ github.base_ref }}:$file) + head_file=$(git show origin/${{ github.head_ref }}:$file) - # Compare the JSON keys - base_keys=$(echo "$base_file" | jq -r 'paths | map(tostring) | join(".")' | sed 's/\./\\./g') - head_keys=$(echo "$head_file" | jq -r 'paths | map(tostring) | join(".")' | sed 's/\./\\./g') + # Compare the JSON keys + base_keys=$(echo "$base_file" | jq -r 'paths | map(tostring) | join(".")' | sed 's/\./\\./g') + head_keys=$(echo "$head_file" | jq -r 'paths | map(tostring) | join(".")' | sed 's/\./\\./g') - # Check for removed keys - removed_keys=$(comm -23 <(echo "$base_keys" | sort) <(echo "$head_keys" | sort)) + # Check for removed keys + removed_keys=$(comm -23 <(echo "$base_keys" | sort) <(echo "$head_keys" | sort)) - if [ -n "$removed_keys" ]; then - echo "Backward incompatibility change detected in $file. The following keys were removed:" - echo "$removed_keys" - exit 1 - fi + if [ -n "$removed_keys" ]; then + echo "Backward incompatibility change detected in $file. The following keys were removed:" + echo "$removed_keys" + exit 1 + fi # Check for changed values for key in $base_keys; do base_value=$(echo "$base_file" | jq -r --arg key "$key" '.[$key]') head_value=$(echo "$head_file" | jq -r --arg key "$key" '.[$key]') - if [ "$base_value" != "$head_value" ]; then - echo "Backward incompatibility change detected in $file. The value of key '$key' was changed from '$base_value' to '$head_value'." - exit 1 - fi - done + if [ "$base_value" != "$head_value" ]; then + echo "Backward incompatibility change detected in $file. The value of key '$key' was changed from '$base_value' to '$head_value'." + exit 1 + fi + done + else + echo "Skipping file $file as it exists in one branch but not the other." + fi done echo "All exporter JSON files have only additions. No backward incompatibility changes detected." - shell: bash \ No newline at end of file + shell: bash diff --git a/.github/workflows/spec-validate-pr.yml b/.github/workflows/spec-validate-pr.yml index e9a9b3fea5..12d5dab8ef 100644 --- a/.github/workflows/spec-validate-pr.yml +++ b/.github/workflows/spec-validate-pr.yml @@ -13,19 +13,34 @@ jobs: - name: Check out code uses: actions/checkout@v2 + - name: Validate branch names + id: validate + run: | + echo "Validating branch names..." + if ! [[ "${{ github.event.pull_request.head.ref }}" =~ ^[a-zA-Z0-9._/-]+$ ]]; then + echo "Invalid characters in head ref" + exit 1 + fi + if ! [[ "${{ github.event.pull_request.base.ref }}" =~ ^[a-zA-Z0-9._/-]+$ ]]; then + echo "Invalid characters in base ref" + exit 1 + fi + echo "::set-output name=head_ref::${{ github.event.pull_request.head.ref }}" + echo "::set-output name=base_ref::${{ github.event.pull_request.base.ref }}" + - name: Fetch Base and Head References run: | - git fetch origin ${{ github.base_ref }}:${{ github.base_ref }} - git fetch origin ${{ github.head_ref }}:${{ github.head_ref }} + git fetch origin ${{ steps.validate.outputs.head_ref }}:${{ steps.validate.outputs.head_ref }} + git fetch origin ${{ steps.validate.outputs.base_ref }}:${{ steps.validate.outputs.base_ref }} if: github.event_name == 'pull_request' - name: Validate Changes and Commit Message run: | # Check for changes in specification files inside the resources folder - changed_files=$(git diff --name-only ${{ github.base_ref }} ${{ github.head_ref }}) + changed_files=$(git diff --name-only ${{ steps.validate.outputs.base_ref }} ${{ steps.validate.outputs.head_ref }}) # Fetch the commit messages from the PR - commit_messages=$(git log --pretty=oneline ${{ github.base_ref }}..${{ github.head_ref }}) + commit_messages=$(git log --pretty=oneline ${{ steps.validate.outputs.base_ref }}..${{ steps.validate.outputs.head_ref }}) # Check if any commit message contains a specific keyword or pattern (e.g., "RTC") if echo "$commit_messages" | grep -q 'RTC' && echo "$changed_files" | grep -E 'resources/schema/.*\.json$'; then @@ -34,4 +49,4 @@ jobs: echo "Either commit message doesn't contain 'RTC' keyword or specification files haven't changed. Build failed. Please check if your changes are working in visual rule editor" exit 1 fi - shell: bash + shell: bash \ No newline at end of file diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/form/FormConstants.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/form/FormConstants.java index 9e9af9feab..2944ee3f6c 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/form/FormConstants.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/form/FormConstants.java @@ -74,7 +74,10 @@ private FormConstants() { /** The resource type for check box group v1 */ public static final String RT_FD_FORM_CHECKBOX_GROUP_V1 = RT_FD_FORM_PREFIX + "checkboxgroup/v1/checkboxgroup"; - /** The resource type for reCaptcha v1 */ + /** The resource type for turnstile v1 */ + public static final String RT_FD_FORM_TURNSTILE_V1 = RT_FD_FORM_PREFIX + "turnstile/v1/turnstile"; + + /** The resource type for hCaptcha v1 */ public static final String RT_FD_FORM_HCAPTCHA_V1 = RT_FD_FORM_PREFIX + "hcaptcha/v1/hcaptcha"; /** The resource type for reCaptcha v1 */ @@ -133,4 +136,10 @@ private FormConstants() { public static final String REQ_ATTR_REFERENCED_PATH = "referencedPage"; public static final String PROP_FRAGMENT_PATH = "fragmentPath"; + + /** The resource type for review v1 */ + public static final String RT_FD_FORM_REVIEW_V1 = RT_FD_FORM_PREFIX + "review/v1/review"; + + /* The resource type for the pre-selected the linked panel */ + public final static String RT_FD_FORM_REVIEW_DATASOURCE_V1 = RT_FD_FORM_PREFIX + "review/v1/datasource"; } diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/HCaptchaImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/HCaptchaImpl.java index 82bc77d889..ad27b1d95f 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/HCaptchaImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/HCaptchaImpl.java @@ -42,7 +42,6 @@ import com.adobe.cq.forms.core.components.internal.form.ReservedProperties; import com.adobe.cq.forms.core.components.models.form.HCaptcha; import com.adobe.cq.forms.core.components.util.AbstractCaptchaImpl; -import com.fasterxml.jackson.annotation.JsonIgnore; @Model( adaptables = { SlingHttpServletRequest.class, Resource.class }, @@ -68,26 +67,23 @@ public class HCaptchaImpl extends AbstractCaptchaImpl implements HCaptcha { private CloudConfigurationProvider cloudConfigurationProvider; @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) - @JsonIgnore @Named(ReservedProperties.PN_CLOUD_SERVICE_PATH) protected String cloudServicePath; @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) - @JsonIgnore @Named(ReservedProperties.PN_SIZE) protected String size; - private static final String SITE_KEY = "siteKey"; - private static final String URI = "uri"; - private static final String SIZE = "size"; - private static final String THEME = "theme"; - private static final String TYPE = "type"; - @Override public String getCloudServicePath() { return cloudServicePath; } + @Override + public String getSize() { + return size; + } + @Override public String getProvider() { return "hcaptcha"; @@ -113,11 +109,11 @@ public Map getCaptchaProperties() throws GuideException { } catch (GuideException e) { LOGGER.error("[AF] [Captcha] [HCAPTCHA] Error while fetching cloud configuration, upgrade to latest release to use hCaptcha."); } - customCaptchaProperties.put(SITE_KEY, siteKey); - customCaptchaProperties.put(URI, uri); - customCaptchaProperties.put(SIZE, this.size); - customCaptchaProperties.put(THEME, "light"); - customCaptchaProperties.put(TYPE, "image"); + customCaptchaProperties.put(CAPTCHA_SITE_KEY, siteKey); + customCaptchaProperties.put(CAPTCHA_URI, uri); + customCaptchaProperties.put(CAPTCHA_SIZE, getSize()); + customCaptchaProperties.put(CAPTCHA_THEME, "light"); + customCaptchaProperties.put(CAPTCHA_TYPE, "image"); return customCaptchaProperties; diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/RecaptchaImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/RecaptchaImpl.java index 1127021c1d..3f93b6f050 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/RecaptchaImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/RecaptchaImpl.java @@ -41,7 +41,6 @@ import com.adobe.cq.forms.core.components.internal.form.ReservedProperties; import com.adobe.cq.forms.core.components.models.form.Captcha; import com.adobe.cq.forms.core.components.util.AbstractCaptchaImpl; -import com.fasterxml.jackson.annotation.JsonIgnore; @Model( adaptables = { SlingHttpServletRequest.class, Resource.class }, @@ -65,33 +64,25 @@ public class RecaptchaImpl extends AbstractCaptchaImpl implements Captcha { private CloudConfigurationProvider cloudConfigurationProvider; @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) - @JsonIgnore @Named(ReservedProperties.PN_RECAPTCHA_CLOUD_SERVICE_PATH) protected String cloudServicePath; @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) - @JsonIgnore @Named(ReservedProperties.PN_RECAPTCHA_SIZE) protected String size; public static final String RECAPTCHA_DEFAULT_DOMAIN = "https://www.recaptcha.net/"; public static final String RECAPTCHA_DEFAULT_URL = RECAPTCHA_DEFAULT_DOMAIN + "recaptcha/api.js"; public static final String RECAPTCHA_ENTERPRISE_DEFAULT_URL = RECAPTCHA_DEFAULT_DOMAIN + "recaptcha/enterprise.js"; - private static final String RECAPTCHA_SITE_KEY = "siteKey"; - private static final String RECAPTCHA_URI = "uri"; - private static final String RECAPTCHA_SIZE = "size"; - private static final String RECAPTCHA_THEME = "theme"; - private static final String RECAPTCHA_TYPE = "type"; - private static final String RECAPTCHA_VERSION = "version"; - private static final String RECAPTCHA_KEYTYPE = "keyType"; + public static final String RECAPTCHA_VERSION = "version"; + public static final String RECAPTCHA_KEYTYPE = "keyType"; @Override - @JsonIgnore public String getCloudServicePath() { return cloudServicePath; } - @JsonIgnore + @Override public String getSize() { return size; } @@ -101,7 +92,6 @@ public String getProvider() { return "recaptcha"; } - @JsonIgnore @Override public Map getCaptchaProperties() throws GuideException { @@ -118,20 +108,19 @@ public Map getCaptchaProperties() throws GuideException { keyType = reCaptchaConfiguration.keyType(); } } - customCaptchaProperties.put(RECAPTCHA_SITE_KEY, siteKey); + customCaptchaProperties.put(CAPTCHA_SITE_KEY, siteKey); if (StringUtils.isNotEmpty(version) && version.equals("enterprise")) { - customCaptchaProperties.put(RECAPTCHA_URI, RECAPTCHA_ENTERPRISE_DEFAULT_URL); + customCaptchaProperties.put(CAPTCHA_URI, RECAPTCHA_ENTERPRISE_DEFAULT_URL); } else { - customCaptchaProperties.put(RECAPTCHA_URI, RECAPTCHA_DEFAULT_URL); + customCaptchaProperties.put(CAPTCHA_URI, RECAPTCHA_DEFAULT_URL); } - customCaptchaProperties.put(RECAPTCHA_SIZE, getSize()); - customCaptchaProperties.put(RECAPTCHA_THEME, "light"); - customCaptchaProperties.put(RECAPTCHA_TYPE, "image"); + customCaptchaProperties.put(CAPTCHA_SIZE, getSize()); + customCaptchaProperties.put(CAPTCHA_THEME, "light"); + customCaptchaProperties.put(CAPTCHA_TYPE, "image"); customCaptchaProperties.put(RECAPTCHA_VERSION, version); customCaptchaProperties.put(RECAPTCHA_KEYTYPE, keyType); return customCaptchaProperties; } - } diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/ReviewImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/ReviewImpl.java new file mode 100644 index 0000000000..362447b4f2 --- /dev/null +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/ReviewImpl.java @@ -0,0 +1,76 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2023 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.internal.models.v1.form; + +import java.util.Arrays; +import java.util.Map; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.resource.Resource; +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.ValueMapValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.adobe.cq.export.json.ComponentExporter; +import com.adobe.cq.export.json.ExporterConstants; +import com.adobe.cq.forms.core.components.internal.form.FormConstants; +import com.adobe.cq.forms.core.components.models.form.FieldType; +import com.adobe.cq.forms.core.components.models.form.Review; +import com.adobe.cq.forms.core.components.util.AbstractBaseImpl; + +@Model( + adaptables = { SlingHttpServletRequest.class, Resource.class }, + adapters = { Review.class, + ComponentExporter.class }, + resourceType = { FormConstants.RT_FD_FORM_REVIEW_V1 }) +@Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION) +public class ReviewImpl extends AbstractBaseImpl implements Review { + + private static final String LINKED_PANEL_PROPERTY = "fd:linkedPanels"; + private static final String EDIT_ACTION_PROPERTY = "fd:editModeAction"; + + @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL, name = "fd:linkedPanels") + @Nullable + private String[] linkedPanels; + + @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL, name = "fd:editModeAction") + @Nullable + private String editModeAction; + + public String[] getLinkedPanels() { + return linkedPanels != null ? Arrays.copyOf(linkedPanels, linkedPanels.length) : new String[] {}; + } + + public String getEditModeAction() { + return editModeAction; + } + + @Override + public String getFieldType() { + return super.getFieldType(FieldType.PLAIN_TEXT); + } + + @Override + public @NotNull Map getProperties() { + Map customProperties = super.getProperties(); + customProperties.put(LINKED_PANEL_PROPERTY, getLinkedPanels()); + customProperties.put(EDIT_ACTION_PROPERTY, getEditModeAction()); + return customProperties; + } +} diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImpl.java new file mode 100644 index 0000000000..d1f3991b9e --- /dev/null +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImpl.java @@ -0,0 +1,156 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +package com.adobe.cq.forms.core.components.internal.models.v1.form; + +import java.util.LinkedHashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +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.OSGiService; +import org.apache.sling.models.annotations.injectorspecific.ValueMapValue; +import org.osgi.service.component.annotations.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.adobe.aemds.guide.model.TurnstileConfiguration; +import com.adobe.aemds.guide.service.CloudConfigurationProvider; +import com.adobe.aemds.guide.service.GuideException; +import com.adobe.cq.export.json.ComponentExporter; +import com.adobe.cq.export.json.ExporterConstants; +import com.adobe.cq.forms.core.components.internal.form.FormConstants; +import com.adobe.cq.forms.core.components.models.form.Turnstile; +import com.adobe.cq.forms.core.components.util.AbstractCaptchaImplV2; + +@Model( + adaptables = { SlingHttpServletRequest.class, Resource.class }, + adapters = { Turnstile.class, + ComponentExporter.class }, + resourceType = { FormConstants.RT_FD_FORM_TURNSTILE_V1 }) +@Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION) +public class TurnstileImpl extends AbstractCaptchaImplV2 implements Turnstile { + private static final Logger LOGGER = LoggerFactory.getLogger(TurnstileImpl.class); + + @Inject + private ResourceResolver resourceResolver; + + private Resource resource; + private String captchaSiteKey; + + @Reference + @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) + private TurnstileConfiguration turnstileConfiguration; + + @OSGiService + @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) + private CloudConfigurationProvider cloudConfigurationProvider; + + @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) + @Named("cloudServicePath") + protected String cloudServicePath; + + @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) + @Named("size") + protected String size; + + @Override + public String getCloudServicePath() { + return cloudServicePath; + } + + @Override + public String getProvider() { + return "turnstile"; + } + + @Override + public String getSize() { + return size; + } + + /** + * Set the turnstileConfiguration, by fetching it from the cloud configurations. + * Also sets the captchaSiteKey. + */ + private void setTurnstileConfiguration() { + LOGGER.debug("[AF] [Captcha] [TURNSTILE] Fetching cloud configuration for turnstile."); + if (cloudConfigurationProvider != null) { + try { + resource = resourceResolver.getResource(this.getPath()); + turnstileConfiguration = cloudConfigurationProvider.getTurnstileCloudConfiguration(resource); + if (turnstileConfiguration != null) { + captchaSiteKey = turnstileConfiguration.getSiteKey(); + } else { + LOGGER.debug("[AF] [Captcha] [TURNSTILE] Cloud configuration for turnstile is not available for " + this.getPath()); + } + } catch (GuideException e) { + LOGGER.error( + "[AF] [Captcha] [TURNSTILE] Error while fetching cloud configuration, upgrade to latest release to use turnstile.", e); + } + } else { + LOGGER.error( + "[AF] [Captcha] [TURNSTILE] Error while fetching cloud configuration, upgrade to latest release to use turnstile."); + } + } + + @PostConstruct + @Override + public Map getCaptchaProperties() { + Map customCaptchaProperties = new LinkedHashMap<>(); + String siteKey = null, uri = null, widgetType = null; + if (turnstileConfiguration == null) { + setTurnstileConfiguration(); + } + if (turnstileConfiguration != null) { + customCaptchaProperties.put(CAPTCHA_URI, turnstileConfiguration.getClientSideJsUrl()); + customCaptchaProperties.put(CAPTCHA_WIDGET_TYPE, turnstileConfiguration.getWidgetType()); + } + customCaptchaProperties.put(CAPTCHA_SIZE, getSize()); + customCaptchaProperties.put(CAPTCHA_THEME, CAPTCHA_THEME_LIGHT); + return customCaptchaProperties; + } + + @PostConstruct + @Override + public String getCaptchaDisplayMode() { + CaptchaDisplayMode captchaDisplayMode = CaptchaDisplayMode.VISIBLE; + if (turnstileConfiguration == null) { + setTurnstileConfiguration(); + } + if (turnstileConfiguration != null && CaptchaDisplayMode.INVISIBLE.getValue().equals(turnstileConfiguration.getWidgetType())) { + captchaDisplayMode = CaptchaDisplayMode.INVISIBLE; + } + return captchaDisplayMode.getValue(); + } + + @PostConstruct + @Override + public String getCaptchaSiteKey() { + if (turnstileConfiguration == null) { + setTurnstileConfiguration(); + } + return this.captchaSiteKey; + } +} 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 bf7eeee41b..26c2ac816a 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 @@ -77,6 +77,8 @@ public class FormContainerImpl extends AbstractContainerImpl implements FormCont private static final String FD_IS_HAMBURGER_MENU_ENABLED = "fd:isHamburgerMenuEnabled"; public static final String FD_FORM_DATA_ENABLED = "fd:formDataEnabled"; public static final String FD_ROLE_ATTRIBUTE = "fd:roleAttribute"; + private static final String FD_CUSTOM_FUNCTIONS_URL = "fd:customFunctionsUrl"; + private static final String FD_DATA_URL = "fd:dataUrl"; @OSGiService(injectionStrategy = InjectionStrategy.OPTIONAL) private CoreComponentCustomPropertiesProvider coreComponentCustomPropertiesProvider; @@ -343,6 +345,9 @@ public String getLanguageDirection() { properties.put(FD_ROLE_ATTRIBUTE, getRoleAttribute()); properties.put(FD_FORM_DATA_ENABLED, formDataEnabled); properties.put(ReservedProperties.FD_AUTO_SAVE_PROPERTY_WRAPPER, this.autoSaveConfig); + properties.put(FD_CUSTOM_FUNCTIONS_URL, getCustomFunctionUrl()); + properties.put(FD_DATA_URL, getDataUrl()); + return properties; } @@ -396,4 +401,9 @@ public String getName() { return FormContainer.super.getName(); } + @Override + public String getCustomFunctionUrl() { + return getContextPath() + ADOBE_GLOBAL_API_ROOT + FORMS_RUNTIME_API_GLOBAL_ROOT + "/customfunctions/" + getId(); + } + } diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/servlets/ReviewDataSourceServlet.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/servlets/ReviewDataSourceServlet.java new file mode 100644 index 0000000000..bd73c36b6d --- /dev/null +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/internal/servlets/ReviewDataSourceServlet.java @@ -0,0 +1,135 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.internal.servlets; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.servlet.Servlet; + +import org.apache.jackrabbit.JcrConstants; +import org.apache.sling.api.SlingHttpServletRequest; +import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.SyntheticResource; +import org.apache.sling.api.resource.ValueMap; +import org.apache.sling.api.wrappers.ValueMapDecorator; +import org.jetbrains.annotations.NotNull; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +import com.adobe.cq.export.json.ComponentExporter; +import com.adobe.cq.forms.core.components.internal.form.FormConstants; +import com.adobe.cq.forms.core.components.models.form.Base; +import com.adobe.cq.forms.core.components.models.form.Container; +import com.adobe.cq.forms.core.components.models.form.FormComponent; +import com.adobe.cq.forms.core.components.models.form.FormContainer; +import com.adobe.cq.forms.core.components.models.form.Label; +import com.adobe.cq.forms.core.components.util.ComponentUtils; +import com.adobe.granite.ui.components.ExpressionResolver; +import com.adobe.granite.ui.components.ds.DataSource; +import com.adobe.granite.ui.components.ds.SimpleDataSource; +import com.adobe.granite.ui.components.ds.ValueMapResource; + +@Component( + service = { Servlet.class }, + property = { + "sling.servlet.resourceTypes=" + FormConstants.RT_FD_FORM_REVIEW_DATASOURCE_V1, + "sling.servlet.methods=GET", + "sling.servlet.extensions=html" + }) +public class ReviewDataSourceServlet extends AbstractDataSourceServlet { + + /** + * Defines the form meta data type. Possible values: {@code submitAction}, + * {@code prefillServiceProvider} + * + * @todo: Add other metadata types here like fragment, actions etc + */ + @Reference + private transient ExpressionResolver expressionResolver; + + @NotNull + @Override + protected ExpressionResolver getExpressionResolver() { + return expressionResolver; + } + + @Override + protected void doGet(@NotNull SlingHttpServletRequest request, @NotNull SlingHttpServletResponse response) { + + ResourceResolver resourceResolver = request.getResourceResolver(); + String componentInstancePath = request.getRequestPathInfo().getSuffix(); + List resources = new ArrayList<>(); + if (resourceResolver != null) { + Resource componentInstance = resourceResolver.getResource(componentInstancePath); + Resource formInstance = ComponentUtils.getFormContainer(componentInstance); + if (formInstance != null) { + FormContainer formContainer = formInstance.adaptTo(FormContainer.class); + List panels = ((List) getMultipleChildPanels(formContainer)) + .stream().filter(x -> "panel".equals(x.getFieldType())).collect(Collectors.toList()); + for (Base panel : panels) { + String name = panel != null ? panel.getName() : ""; + String title = ""; + if (panel != null) { + Label label = panel.getLabel(); + if (label != null) { + String value = label.getValue(); + if (value != null) { + title = value; + } + } + } + if (name != null && title != null) { + resources.add(getResourceForDropdownDisplay(resourceResolver, title, name)); + } + } + } + } + SimpleDataSource actionTypeDataSource = new SimpleDataSource(resources.iterator()); + request.setAttribute(DataSource.class.getName(), actionTypeDataSource); + } + + /** + * Retrieves a list of child panels that have at least two siblings. + * If a panel has fewer than two siblings, it will not be included in the returned list. + * + * @param formContainer the top-level form container + * @return a list of panels with at least two siblings + */ + private List getMultipleChildPanels(FormComponent formContainer) { + while (formContainer instanceof Container && ((Container) formContainer).getItems().size() == 1) { + formContainer = (FormComponent) ((Container) formContainer).getItems().get(0); + } + if (formContainer instanceof Container) { + return ((Container) formContainer).getItems(); + } + return new ArrayList<>(); + } + + private SyntheticResource getResourceForDropdownDisplay(ResourceResolver resourceResolver, String displayValue, + String dataValue) { + Map dropdownMap = new HashMap<>(); + dropdownMap.put("text", displayValue); + dropdownMap.put("value", dataValue); + ValueMap dropdownEntryVm = new ValueMapDecorator(dropdownMap); + return new ValueMapResource(resourceResolver, "", JcrConstants.NT_UNSTRUCTURED, dropdownEntryVm); + } +} diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Captcha.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Captcha.java index 3fcc130f5a..baf2e33847 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Captcha.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Captcha.java @@ -30,15 +30,63 @@ @ConsumerType public interface Captcha extends Field { + /** + * Defines the display mode for captcha. + * Possible values: {@code visible}, {@code invisible} + * + * @since com.adobe.cq.forms.core.components.models.form 5.10.0 + */ + enum CaptchaDisplayMode { + VISIBLE("visible"), + INVISIBLE("invisible"); + + private String displayMode; + + CaptchaDisplayMode(String displayMode) { + this.displayMode = displayMode; + } + + /** + * Returns the string value of this enum constant. + * + * @return the string value of this enum constant + * @since com.adobe.cq.forms.core.components.models.form 5.10.0 + */ + public String getValue() { + return displayMode; + } + } + @JsonIgnore default String getCloudServicePath() { return null; } @JsonIgnore + String getSize(); + String getProvider(); @JsonIgnore Map getCaptchaProperties() throws GuideException; + /** + * Returns the display mode of the captcha component. + * + * @return the string value of the one of the {@link CaptchaDisplayMode} enum + * @since com.adobe.cq.forms.core.components.models.form 5.10.0 + */ + default String getCaptchaDisplayMode() { + return null; + } + + /** + * Returns the site key of the captcha component. + * + * @return the site key + * @since com.adobe.cq.forms.core.components.models.form 5.10.0 + */ + default String getCaptchaSiteKey() { + return null; + } } 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 3244d42a1e..e74933fec9 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 @@ -373,4 +373,16 @@ default void visit(Consumer callback) throws Exception {} default String getParentPagePath() { return null; } + + /** + * Returns the url from where the custom functions should be registered + * + * @return custom function registration url + * @since com.adobe.cq.forms.core.components.models.form 5.9.5 + */ + @JsonIgnore + default String getCustomFunctionUrl() { + return null; + } + } diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Review.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Review.java new file mode 100644 index 0000000000..066a376a7d --- /dev/null +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Review.java @@ -0,0 +1,44 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.models.form; + +import org.osgi.annotation.versioning.ConsumerType; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * Defines the {@code Review} Sling Model used for the {@code /apps/core/fd/components/form/review} component. + * + * @since com.adobe.cq.forms.core.components.models 5.9.6 + */ +@ConsumerType +public interface Review extends Base { + + /** + * @return an array of linked panels to be reviewed on the review page. Each linked panel is the name of a panel that is linked to the + * review page. + * @since com.adobe.cq.forms.core.components.models.form 5.9.6 + */ + @JsonIgnore + String[] getLinkedPanels(); + + /** + * @return the edit mode action, which indicates whether edit button is visible on the review page at field, panel, both, or none + * @since com.adobe.cq.forms.core.components.models.form 5.9.6 + */ + @JsonIgnore + String getEditModeAction(); +} diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Turnstile.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Turnstile.java new file mode 100644 index 0000000000..10d55eeb51 --- /dev/null +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/models/form/Turnstile.java @@ -0,0 +1,28 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +package com.adobe.cq.forms.core.components.models.form; + +import org.osgi.annotation.versioning.ConsumerType; + +/** + * Defines the form {@code Turnstile} Sling Model used for the {@code /apps/core/fd/components/form/turnstile/v1/turnstile} + * component. + * + * @since com.adobe.cq.forms.core.components.models.form 5.10.0 + */ +@ConsumerType +public interface Turnstile extends Captcha {} 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 5151c0b7ea..a659eb1155 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 @@ -35,7 +35,7 @@ *

*/ -@Version("5.7.5") +@Version("5.10.0") package com.adobe.cq.forms.core.components.models.form; import org.osgi.annotation.versioning.Version; diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImpl.java index 0a34746ea6..4b82de8c63 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImpl.java @@ -28,7 +28,17 @@ */ public abstract class AbstractCaptchaImpl extends AbstractFieldImpl implements Captcha { public static final String CUSTOM_RECAPTCHA_PROPERTY_WRAPPER = "fd:captcha"; + protected static final String CAPTCHA_CONFIG = "config"; + protected static final String CAPTCHA_SITE_KEY = "siteKey"; + protected static final String CAPTCHA_URI = "uri"; + protected static final String CAPTCHA_SIZE = "size"; + protected static final String CAPTCHA_THEME = "theme"; + protected static final String CAPTCHA_THEME_LIGHT = "light"; + protected static final String CAPTCHA_TYPE = "type"; + protected static final String CAPTCHA_TYPE_IMAGE = "image"; + protected static final String CAPTCHA_WIDGET_TYPE = "widgetType"; + @Override @JsonIgnore public abstract String getProvider(); @@ -37,6 +47,7 @@ public String getFieldType() { return super.getFieldType(FieldType.CAPTCHA); } + @JsonIgnore public abstract Map getCaptchaProperties(); public Map getProperties() { diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImplV2.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImplV2.java new file mode 100644 index 0000000000..cc1e17c282 --- /dev/null +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractCaptchaImplV2.java @@ -0,0 +1,73 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.util; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.PostConstruct; + +import com.adobe.cq.forms.core.components.models.form.Captcha; +import com.adobe.cq.forms.core.components.models.form.FieldType; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * AbstractCaptchaImplV2 is an updated implementation for handling captcha field types. + * + * This class represents an evolution in the captcha JSON structure where captchaProvider + * is promoted to a top-level property, improving JSON clarity and eliminating redundancy. + * + * Background: + * Previous Implementation (AbstractCaptchaImpl): + * - Captcha provider information was embedded within the fd:captcha custom property + * - This led to redundant data and a less clean JSON structure with the updated forms spec + * + * Current Implementation (AbstractCaptchaImplV2): + * - CaptchaProvider is now a first-class citizen at the root level of the JSON + * - This change results in a cleaner and more efficient JSON structure + * + * Note: AbstractCaptchaImpl is not deprecated yet, as it is still used by + * recaptcha/hcaptcha v1 implementations in core components. Once these are migrated + * to AbstractCaptchaImplV2, the V1 implementation will be deprecated. + */ +public abstract class AbstractCaptchaImplV2 extends AbstractCaptchaImpl implements Captcha { + + @Override + @JsonProperty("captchaProvider") + @JsonIgnore(false) + public abstract String getProvider(); + + @Override + public String getFieldType() { + return super.getFieldType(FieldType.CAPTCHA); + } + + public abstract Map getCaptchaProperties(); + + @PostConstruct + public Map getProperties() { + Map properties = super.getProperties(); + Map captchaConfig = new HashMap<>(); + Map captchaProperties = getCaptchaProperties(); + if (captchaProperties != null && captchaProperties.size() > 0) { + captchaConfig.put(CAPTCHA_CONFIG, captchaProperties); + } + properties.put(CUSTOM_RECAPTCHA_PROPERTY_WRAPPER, captchaConfig); + return properties; + } + +} diff --git a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/ReviewImplTest.java b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/ReviewImplTest.java new file mode 100644 index 0000000000..4b8e902de1 --- /dev/null +++ b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/ReviewImplTest.java @@ -0,0 +1,87 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +package com.adobe.cq.forms.core.components.internal.models.v1.form; + +import java.io.IOException; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import com.adobe.cq.forms.core.Utils; +import com.adobe.cq.forms.core.components.models.form.Review; +import com.adobe.cq.forms.core.context.FormsCoreComponentTestContext; +import io.wcm.testing.mock.aem.junit5.AemContext; +import io.wcm.testing.mock.aem.junit5.AemContextExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(AemContextExtension.class) +public class ReviewImplTest { + + private final AemContext context = FormsCoreComponentTestContext.newAemContext(); + private static final String TEST_BASE = "/form/review"; + private static final String APPS_ROOT = "/apps"; + private static final String PATH_REVIEW = "/apps/formcontainer/wizard/panel2/review"; + + @BeforeEach + void setUp() throws Exception { + context.load().json(TEST_BASE + FormsCoreComponentTestContext.TEST_CONTENT_JSON, APPS_ROOT); + } + + @Test + void testGetEditAction() { + Review review = Utils.getComponentUnderTest(PATH_REVIEW, ReviewImpl.class, context); + assertEquals("field", review.getEditModeAction()); + } + + @Test + public void testGetLinkedPanelsWithNonNullArray() throws IOException { + Review review = Utils.getComponentUnderTest(PATH_REVIEW, ReviewImpl.class, context); + String[] linkedPanels = review.getLinkedPanels(); + String[] expectedLinkedPanels = context.resourceResolver().getResource(PATH_REVIEW).getValueMap().get("fd:linkedPanels", + String[].class); + assertNotNull(expectedLinkedPanels); + assertArrayEquals(expectedLinkedPanels, linkedPanels); + } + + @Test + public void testGetLinkedPanelsWithNullArray() { + Review review = new ReviewImpl(); + String[] linkedPanels = review.getLinkedPanels(); + assertNotNull(linkedPanels); + assertEquals(0, linkedPanels.length); + } + + @Test + void testGetProperties() { + Review review = Utils.getComponentUnderTest(PATH_REVIEW, ReviewImpl.class, context); + Map properties = review.getProperties(); + assertEquals("/apps/formcontainer/wizard/panel2/review", properties.get("fd:path")); + assertEquals("field", properties.get("fd:editModeAction")); + + } + + @Test + public void testGetFieldType() { + Review review = new ReviewImpl(); + String fieldType = review.getFieldType(); + assertEquals("plain-text", fieldType); + } + +} diff --git a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImplTest.java b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImplTest.java new file mode 100644 index 0000000000..d54786385b --- /dev/null +++ b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/form/TurnstileImplTest.java @@ -0,0 +1,155 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.internal.models.v1.form; + +import org.apache.sling.api.resource.Resource; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; + +import com.adobe.aemds.guide.model.HCaptchaConfiguration; +import com.adobe.aemds.guide.model.ReCaptchaConfigurationModel; +import com.adobe.aemds.guide.model.TurnstileConfiguration; +import com.adobe.aemds.guide.service.CloudConfigurationProvider; +import com.adobe.aemds.guide.service.GuideException; +import com.adobe.cq.forms.core.Utils; +import com.adobe.cq.forms.core.components.internal.form.FormConstants; +import com.adobe.cq.forms.core.components.models.form.Captcha; +import com.adobe.cq.forms.core.components.models.form.FieldType; +import com.adobe.cq.forms.core.components.models.form.Turnstile; +import com.adobe.cq.forms.core.context.FormsCoreComponentTestContext; +import io.wcm.testing.mock.aem.junit5.AemContext; +import io.wcm.testing.mock.aem.junit5.AemContextExtension; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@ExtendWith(AemContextExtension.class) +public class TurnstileImplTest { + private static final String BASE = "/form/turnstile"; + private static final String CONTENT_ROOT = "/content"; + private static final String PATH_TURNSTILE = CONTENT_ROOT + "/turnstile"; + + private final AemContext context = FormsCoreComponentTestContext.newAemContext(); + + TurnstileConfiguration turnstileConfig = Mockito.mock(TurnstileConfiguration.class); + + CloudConfigurationProvider cloudConfigurationProvider = new CloudConfigurationProvider() { + @Override + public ReCaptchaConfigurationModel getRecaptchaCloudConfiguration(Resource resource) throws GuideException { + return null; + } + + @Override + public String getCustomFunctionUrl(Resource resource) { + return null; + } + + @Override + public HCaptchaConfiguration getHCaptchaCloudConfiguration(Resource resource) throws GuideException { + return null; + } + + @Override + public TurnstileConfiguration getTurnstileCloudConfiguration(Resource resource) throws GuideException { + return turnstileConfig; + } + + }; + + @BeforeEach + void setUp() throws GuideException { + context.load().json(BASE + FormsCoreComponentTestContext.TEST_CONTENT_JSON, CONTENT_ROOT); + context.registerService(CloudConfigurationProvider.class, cloudConfigurationProvider); + } + + @Test + void testExportedType() { + Captcha turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals(FormConstants.RT_FD_FORM_TURNSTILE_V1, turnstile.getExportedType()); + Turnstile turnstileMock = Mockito.mock(Turnstile.class); + Mockito.when(turnstileMock.getExportedType()).thenCallRealMethod(); + assertEquals("", turnstileMock.getExportedType()); + } + + @Test + void testFieldType() { + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals(FieldType.CAPTCHA.getValue(), turnstile.getFieldType()); + } + + @Test + void testGetName() { + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals("turnstile1715230058257", turnstile.getName()); + Turnstile turnstileMock = Mockito.mock(Turnstile.class); + Mockito.when(turnstileMock.getName()).thenCallRealMethod(); + assertEquals(null, turnstileMock.getName()); + } + + @Test + void testGetTurnstileProvider() { + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals("turnstile", turnstile.getProvider()); + Turnstile turnstileMock = Mockito.mock(Turnstile.class); + Mockito.when(turnstileMock.getName()).thenCallRealMethod(); + assertEquals(null, turnstileMock.getName()); + } + + @Test + void testGetConfigurationPath() { + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals("managed", turnstile.getCloudServicePath()); + Turnstile turnstileMock = Mockito.mock(Turnstile.class); + Mockito.when(turnstileMock.getName()).thenCallRealMethod(); + assertEquals(null, turnstileMock.getName()); + } + + @Test + void testIsVisible() { + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals(true, turnstile.isVisible()); + Turnstile turnstileMock = Mockito.mock(Turnstile.class); + Mockito.when(turnstileMock.isVisible()).thenCallRealMethod(); + assertEquals(null, turnstileMock.isVisible()); + } + + @Test + void testIsEnabled() { + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertEquals(true, turnstile.isEnabled()); + Turnstile turnstileMock = Mockito.mock(Turnstile.class); + Mockito.when(turnstileMock.isEnabled()).thenCallRealMethod(); + assertEquals(null, turnstileMock.isEnabled()); + } + + @Test + void testJSONExport() throws Exception { + Mockito.when(turnstileConfig.getSiteKey()).thenReturn("siteKey"); + Mockito.when(turnstileConfig.getWidgetType()).thenReturn("invisible"); + Mockito.when(turnstileConfig.getClientSideJsUrl()).thenReturn("https://challenges.cloudflare.com/turnstile/v0/api.js"); + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + Utils.testJSONExport(turnstile, Utils.getTestExporterJSONPath(BASE, PATH_TURNSTILE)); + } + + @Test + void turnstileConfigExceptionTest() throws GuideException { + Mockito.when(turnstileConfig.getSiteKey()).thenThrow(new GuideException("Error while fetching site key")); + Turnstile turnstile = Utils.getComponentUnderTest(PATH_TURNSTILE, Turnstile.class, context); + assertNotNull(turnstile.getCaptchaProperties()); + } +} 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 35699fca0f..1b97c1327e 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 @@ -524,4 +524,10 @@ void testGetPropertiesForCoreComponentCustomPropertiesProviderForNull() throws E Mockito.when(coreComponentCustomPropertiesProvider.getProperties()).thenReturn(null); assertEquals("customPropValue", formContainer.getProperties().get("customProp")); } + + @Test + void testCustomFunctionUrl() throws Exception { + FormContainer formContainer = Utils.getComponentUnderTest(PATH_FORM_1, FormContainer.class, context); + assertEquals("/adobe/forms/af/customfunctions/L2NvbnRlbnQvZm9ybXMvYWYvZGVtbw==", formContainer.getCustomFunctionUrl()); + } } diff --git a/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/servlets/ReviewDataSourceServletTest.java b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/servlets/ReviewDataSourceServletTest.java new file mode 100644 index 0000000000..2bcc46b70d --- /dev/null +++ b/bundles/af-core/src/test/java/com/adobe/cq/forms/core/components/internal/servlets/ReviewDataSourceServletTest.java @@ -0,0 +1,132 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.internal.servlets; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.apache.sling.api.resource.Resource; +import org.apache.sling.testing.mock.sling.servlet.MockRequestPathInfo; +import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; +import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.adobe.cq.export.json.SlingModelFilter; +import com.adobe.cq.forms.core.context.FormsCoreComponentTestContext; +import com.adobe.granite.ui.components.ExpressionResolver; +import com.adobe.granite.ui.components.ds.DataSource; +import com.day.cq.wcm.api.NameConstants; +import com.day.cq.wcm.msm.api.MSMNameConstants; +import io.wcm.testing.mock.aem.junit5.AemContext; +import io.wcm.testing.mock.aem.junit5.AemContextExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith({ AemContextExtension.class, MockitoExtension.class }) +public class ReviewDataSourceServletTest { + + public static final String RT_FD_FORM_REVIEW_DATASOURCE_V1 = "core/fd/components/form/review/v1/datasource"; + private static final String TEST_BASE = "/form/review/datasource"; + private static final String APPS_ROOT = "/apps"; + private String componentInstancePath = "/apps/formcontainer/wizard/panel2/review"; + private String componentInstancePath2 = "/apps/formcontainer2/panel2/review"; + + public final AemContext context = FormsCoreComponentTestContext.newAemContext(); + + @BeforeEach + public void setUp() { + context.load().json(TEST_BASE + FormsCoreComponentTestContext.TEST_CONTENT_JSON, APPS_ROOT); + context.registerService(SlingModelFilter.class, new SlingModelFilter() { + + private final Set IGNORED_NODE_NAMES = new HashSet() { + { + add(NameConstants.NN_RESPONSIVE_CONFIG); + add(MSMNameConstants.NT_LIVE_SYNC_CONFIG); + add("cq:annotations"); + } + }; + + @Override + public Map filterProperties(Map map) { + return map; + } + + @Override + public Iterable filterChildResources(Iterable childResources) { + return StreamSupport + .stream(childResources.spliterator(), false) + .filter(r -> !IGNORED_NODE_NAMES.contains(r.getName())) + .collect(Collectors.toList()); + } + }); + } + + @Test + public void testDoGet() { + + context.currentResource("/apps"); + ReviewDataSourceServlet reviewDataSourceServlet = new ReviewDataSourceServlet(); + MockSlingHttpServletRequest request = context.request(); + MockSlingHttpServletResponse response = context.response(); + MockRequestPathInfo mockRequestPathInfo = (MockRequestPathInfo) request.getRequestPathInfo(); + mockRequestPathInfo.setSuffix(componentInstancePath); + reviewDataSourceServlet.doGet(request, response); + DataSource dataSource = (com.adobe.granite.ui.components.ds.DataSource) request.getAttribute(DataSource.class.getName()); + assertNotNull(dataSource); + Resource resource = dataSource.iterator().next(); + assertEquals("Item 1", resource.getValueMap().get("text", String.class)); + assertEquals("item_1", resource.getValueMap().get("value", String.class)); + + } + + @Test + public void testFormContainerNull() { + + context.currentResource("/apps"); + ReviewDataSourceServlet reviewDataSourceServlet = new ReviewDataSourceServlet(); + MockSlingHttpServletRequest request = context.request(); + MockSlingHttpServletResponse response = context.response(); + MockRequestPathInfo mockRequestPathInfo = (MockRequestPathInfo) request.getRequestPathInfo(); + mockRequestPathInfo.setSuffix(componentInstancePath2); + reviewDataSourceServlet.doGet(request, response); + DataSource dataSource = (com.adobe.granite.ui.components.ds.DataSource) request.getAttribute(DataSource.class.getName()); + assertNotNull(dataSource); + assertFalse(dataSource.iterator().hasNext()); + + } + + @Mock + ExpressionResolver expressionResolver; + + @InjectMocks + private ReviewDataSourceServlet reviewDataSourceServlet; + + @Test + public void testGetExpressionResolver() { + context.currentResource("/apps"); + ExpressionResolver expressionResolver = reviewDataSourceServlet.getExpressionResolver(); + assertNotNull(expressionResolver); + } + +} diff --git a/bundles/af-core/src/test/resources/form/formcontainer/exporter-formcontainerv2.json b/bundles/af-core/src/test/resources/form/formcontainer/exporter-formcontainerv2.json index 1469dd47e3..3cd882cce8 100644 --- a/bundles/af-core/src/test/resources/form/formcontainer/exporter-formcontainerv2.json +++ b/bundles/af-core/src/test/resources/form/formcontainer/exporter-formcontainerv2.json @@ -16,7 +16,9 @@ "fd:schemaType": "BASIC", "fd:formDataEnabled": true, "customProp": "customPropValue", - "fd:roleAttribute":"test-role-attribute" + "fd:roleAttribute":"test-role-attribute", + "fd:customFunctionsUrl": "/adobe/forms/af/customfunctions/L2NvbnRlbnQvZm9ybXMvYWYvZGVtbw==", + "fd:dataUrl": "/adobe/forms/af/data/L2NvbnRlbnQvZm9ybXMvYWYvZGVtbw==" }, "events": { "custom:setProperty": [ diff --git a/bundles/af-core/src/test/resources/form/review/datasource/test-content.json b/bundles/af-core/src/test/resources/form/review/datasource/test-content.json new file mode 100644 index 0000000000..54c50522e2 --- /dev/null +++ b/bundles/af-core/src/test/resources/form/review/datasource/test-content.json @@ -0,0 +1,82 @@ +{ + "formcontainer": { + "jcr:primaryType": "nt:unstructured", + "sling:resourceType": "core/fd/components/form/container/v2/container", + "dorType": "none", + "fd:version": "2.1", + "fieldType": "form", + "thankYouOption": "page", + "themeRef": "/libs/fd/af/themes/canvas", + "title": "test-review", + "wizard": { + "jcr:primaryType": "nt:unstructured", + "jcr:createdBy": "admin", + "jcr:title": "Wizard", + "jcr:lastModifiedBy": "admin", + "jcr:created": "Wed Aug 16 2023 11:21:29 GMT+0530", + "name": "wizard1692165089931", + "jcr:lastModified": "Wed Aug 16 2023 11:21:29 GMT+0530", + "sling:resourceType": "core/fd/components/form/wizard/v1/wizard", + "fieldType": "panel", + "panel1": { + "fieldType": "panel", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Item 1", + "layout": "responsiveGrid", + "name": "item_1", + "sling:resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer", + "textinput": { + "fieldType": "text-input", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Text Input", + "name": "textinput1692165103863", + "sling:resourceType": "core/fd/components/form/textinput/v1/textinput" + } + }, + "panel2": { + "fieldType": "panel", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Item 2", + "layout": "responsiveGrid", + "name": "item_2", + "sling:resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer", + "review": { + "fd:editModeAction": "field", + "fieldType": "plain-text", + "hideTitle": "false", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Review", + "name": "textinput1692165103863", + "sling:resourceType": "core/fd/components/form/review/v1/review" + } + } + } + }, + "formcontainer2": { + "jcr:primaryType": "nt:unstructured", + "sling:resourceType": "core/fd/components/form/container/v2/container", + "dorType": "none", + "fd:version": "2.1", + "fieldType": "form", + "thankYouOption": "page", + "themeRef": "/libs/fd/af/themes/canvas", + "title": "test-review", + "panel2": { + "fieldType": "panel", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Item 2", + "layout": "responsiveGrid", + "name": "item_2", + "sling:resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer", + "review": { + "fd:editModeAction": "field", + "fieldType": "plain-text", + "hideTitle": "false", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Review", + "name": "textinput1692165103863", + "sling:resourceType": "core/fd/components/form/review/v1/review" + } + } + } +} \ No newline at end of file diff --git a/bundles/af-core/src/test/resources/form/review/test-content.json b/bundles/af-core/src/test/resources/form/review/test-content.json new file mode 100644 index 0000000000..3dc1d85acb --- /dev/null +++ b/bundles/af-core/src/test/resources/form/review/test-content.json @@ -0,0 +1,68 @@ +{ + "formcontainer": { + "jcr:primaryType": "nt:unstructured", + "sling:resourceType": "core/fd/components/form/container/v2/container", + "dorType": "none", + "fd:version": "2.1", + "fieldType": "form", + "thankYouOption": "page", + "themeRef": "/libs/fd/af/themes/canvas", + "title": "test-review", + "wizard": { + "jcr:primaryType": "nt:unstructured", + "jcr:createdBy": "admin", + "jcr:title": "Wizard", + "jcr:lastModifiedBy": "admin", + "jcr:created": "Wed Aug 16 2023 11:21:29 GMT+0530", + "name": "wizard1692165089931", + "jcr:lastModified": "Wed Aug 16 2023 11:21:29 GMT+0530", + "sling:resourceType": "core/fd/components/form/wizard/v1/wizard", + "fieldType": "panel", + "panel1": { + "fieldType": "panel", + "id": "panel1", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Item 1", + "layout": "responsiveGrid", + "name": "item_1", + "sling:resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer", + "textinput": { + "fieldType": "text-input", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Text Input", + "name": "textinput1692165103863", + "sling:resourceType": "core/fd/components/form/textinput/v1/textinput" + } + }, + "panel2": { + "fieldType": "panel", + "id": "panel2", + "jcr:primaryType": "nt:unstructured", + "jcr:title": "Item 2", + "layout": "responsiveGrid", + "name": "item_2", + "sling:resourceType": "core/fd/components/form/panelcontainer/v1/panelcontainer", + "review" : { + "id": "review-c47310b241", + "jcr:primaryType": "nt:unstructured", + "sling:resourceType" : "core/fd/components/form/review/v1/review", + "name" : "review1691474151104", + "jcr:title" : "Review", + "description" : "test-description", + "fieldType" : "text", + "properties": { + "fd:path": "/apps/formcontainer/wizard/panel2/review", + "fd:linkedPanels": [ + "item_1" + ], + "fd:editModeAction": "field" + }, + "fd:linkedPanels": [ + "item_1" + ], + "fd:editModeAction": "field" + } + } + } + } +} \ No newline at end of file diff --git a/bundles/af-core/src/test/resources/form/turnstile/exporter-turnstile.json b/bundles/af-core/src/test/resources/form/turnstile/exporter-turnstile.json new file mode 100644 index 0000000000..1afda00aa6 --- /dev/null +++ b/bundles/af-core/src/test/resources/form/turnstile/exporter-turnstile.json @@ -0,0 +1,37 @@ +{ + "id": "turnstile-b4c0808e68", + "fieldType": "captcha", + "name": "turnstile1715230058257", + "visible": true, + "type": "string", + "required": true, + "enabled": true, + "readOnly": false, + "properties": { + "fd:dor": { + "dorExclusion": false + }, + "fd:path": "/content/turnstile", + "fd:captcha": { + "config": { + "uri": "https://challenges.cloudflare.com/turnstile/v0/api.js", + "widgetType": "invisible", + "size": "normal", + "theme": "light" + } + } + }, + "captchaProvider": "turnstile", + "captchaDisplayMode": "invisible", + "captchaSiteKey": "siteKey", + "label": { + "visible": true, + "value": "TURNSTILE" + }, + "events": { + "custom:setProperty": [ + "$event.payload" + ] + }, + ":type": "core/fd/components/form/turnstile/v1/turnstile" +} diff --git a/bundles/af-core/src/test/resources/form/turnstile/test-content.json b/bundles/af-core/src/test/resources/form/turnstile/test-content.json new file mode 100644 index 0000000000..17aa78a94e --- /dev/null +++ b/bundles/af-core/src/test/resources/form/turnstile/test-content.json @@ -0,0 +1,22 @@ +{ + "turnstile": { + "jcr:primaryType": "nt:unstructured", + "jcr:createdBy": "admin", + "jcr:title": "TURNSTILE", + "enabled": true, + "jcr:lastModifiedBy": "admin", + "readOnly": false, + "required": true, + "jcr:created": "Thu May 09 2024 10:17:37 GMT+0530", + "name": "turnstile1715230058257", + "size": "normal", + "cloudServicePath": "managed", + "visible": true, + "hideTitle": "false", + "jcr:lastModified": "Thu May 09 2024 10:18:00 GMT+0530", + "sling:resourceType": "core/fd/components/form/turnstile/v1/turnstile", + "fieldType": "captcha", + "textIsRich": "true", + "unboundFormElement": false + } +} diff --git a/bundles/core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/LinkImpl.java b/bundles/core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/LinkImpl.java index 777c0021c6..825784ccfc 100644 --- a/bundles/core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/LinkImpl.java +++ b/bundles/core/src/main/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/LinkImpl.java @@ -102,8 +102,7 @@ public String getAssetPathWithQueryParams() { return "#"; } try { - URIBuilder uriBuilder = null; - uriBuilder = new URIBuilder(url); + URIBuilder uriBuilder = new URIBuilder(url); Map queryParams = getQueryParams(); if (queryParams != null && !uriBuilder.isPathEmpty()) { for (String key : queryParams.keySet()) { @@ -118,7 +117,7 @@ public String getAssetPathWithQueryParams() { } url = uriBuilder.build().toString(); } catch (URISyntaxException e) { - logger.error("[FORMS] Link Component Failed to parse assetPath {}", url, e); + logger.warn("The [Forms] link component failed to process the asset path {}. Parameters will not be added to the URL.", url, e); } return url; } @@ -199,16 +198,28 @@ public Boolean accepts(LinkImpl link) { @Override public String processLink(LinkImpl link, SlingHttpServletRequest request) { String givenPath = link.getAssetPath(); - String builtPath = givenPath + "/" + JcrConstants.JCR_CONTENT; + String encodedPath = encodePath(givenPath); + String builtPath = encodedPath + "/" + JcrConstants.JCR_CONTENT; ResourceResolver resourceResolver = request.getResourceResolver(); - if (resourceResolver.getResource(builtPath) != null) { + if (resourceResolver.getResource(givenPath + "/" + JcrConstants.JCR_CONTENT) != null) { Map params = link.getQueryParams(); if (AssetType.ADAPTIVE_FORM.equals(link.getAssetType()) && !params.containsKey(QP_AF_DEFAULT_MODE_KEY)) { builtPath += "?" + QP_AF_DEFAULT_MODE_KEY + "=" + QP_AF_DEFAULT_MODE_VALUE; } - givenPath = builtPath; + encodedPath = builtPath; + } + return encodedPath; + } + + private String encodePath(String path) { + try { + // Encode path to allow space in asset names using URIBuilder#setPath method + URIBuilder uriBuilder = new URIBuilder().setPath(path); + return uriBuilder.build().toString(); + } catch (URISyntaxException e) { + logger.warn("The [Forms] link component failed to process the asset path {} due to invalid path.", path, e); + return path; } - return givenPath; } @Override diff --git a/bundles/core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/link/LinkImplTest.java b/bundles/core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/link/LinkImplTest.java index 74623ff9c5..113b0500df 100644 --- a/bundles/core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/link/LinkImplTest.java +++ b/bundles/core/src/test/java/com/adobe/cq/forms/core/components/internal/models/v1/formsportal/link/LinkImplTest.java @@ -40,6 +40,8 @@ public class LinkImplTest { private static final String LINK1_PATH = ROOT_PAGE + "/linkcomponent-v1"; private static final String LINK1_PATH_WITH_INVALID_LINK = ROOT_PAGE + "/linkcomponent-v1-invalidref"; + private static final String LINK2_PATH_WITH_SPACE_IN_ASSET_NAME = ROOT_PAGE + "/linkcomponent-v2-with-space-in-asset-name"; + @BeforeEach public void setUp() { context.load().json(TEST_BASE + FormsCoreComponentTestContext.TEST_CONTENT_JSON, CONTENT_ROOT); @@ -82,12 +84,22 @@ public void testLinkComponent() { public void testLinkComponentWithInvalidPath() { Link link = getLinkUnderTest(LINK1_PATH_WITH_INVALID_LINK); Assertions.assertEquals("https://www.adobe.com/", link.getAssetPath()); - Assertions.assertEquals("https://www.adobe.com/?hello", link.getAssetPathWithQueryParams()); + Assertions.assertEquals("/https://www.adobe.com/?hello", link.getAssetPathWithQueryParams()); Assertions.assertEquals("Link Component", link.getTitle()); Assertions.assertEquals("Some Hover Tooltip Text", link.getTooltip()); Assertions.assertEquals(Link.AssetType.ADAPTIVE_FORM, link.getAssetType()); } + @Test + public void testLinkComponentWithSpaceInAssetPath() { + Link link = getLinkUnderTest(LINK2_PATH_WITH_SPACE_IN_ASSET_NAME); + Assertions.assertEquals("/content/dam/formsanddocuments/sample form", link.getAssetPath()); + Assertions.assertEquals("/content/dam/formsanddocuments/sample%20form?hello=world", link.getAssetPathWithQueryParams()); + Assertions.assertEquals("Link Component", link.getTitle()); + Assertions.assertEquals("Some Hover Tooltip Text", link.getTooltip()); + Assertions.assertEquals(Link.AssetType.PDF, link.getAssetType()); + } + @Test public void testMainInterface() { Link linkMock = Mockito.mock(Link.class); diff --git a/bundles/core/src/test/resources/link/test-content.json b/bundles/core/src/test/resources/link/test-content.json index 06ae876ddf..830053e7e2 100644 --- a/bundles/core/src/test/resources/link/test-content.json +++ b/bundles/core/src/test/resources/link/test-content.json @@ -111,6 +111,21 @@ "title" : "Link Component", "sling:resourceType" : "core/fd/components/formsportal/link/v2/link", "assetType" : "Others" + }, + "linkcomponent-v2-with-space-in-asset-name":{ + "tooltip" : "Some Hover Tooltip Text", + "pdfPath" : "/content/dam/formsanddocuments/sample form", + "title" : "Link Component", + "sling:resourceType" : "core/fd/components/formsportal/link/v2/link", + "assetType" : "PDF", + "queryParams":{ + "jcr:primaryType" : "nt:unstructured", + "item0":{ + "jcr:primaryType" : "nt:unstructured", + "key" : "hello", + "value" : "world" + } + } } }, "dam" : { @@ -128,4 +143,4 @@ } } } -} \ No newline at end of file +} diff --git a/examples/ui.apps/src/main/content/jcr_root/apps/forms-components-examples/components/form/review/.content.xml b/examples/ui.apps/src/main/content/jcr_root/apps/forms-components-examples/components/form/review/.content.xml new file mode 100644 index 0000000000..a8d3af2ba6 --- /dev/null +++ b/examples/ui.apps/src/main/content/jcr_root/apps/forms-components-examples/components/form/review/.content.xml @@ -0,0 +1,7 @@ + + diff --git a/examples/ui.apps/src/main/content/jcr_root/apps/forms-components-examples/components/form/review/_cq_template.xml b/examples/ui.apps/src/main/content/jcr_root/apps/forms-components-examples/components/form/review/_cq_template.xml new file mode 100644 index 0000000000..1eed759959 --- /dev/null +++ b/examples/ui.apps/src/main/content/jcr_root/apps/forms-components-examples/components/form/review/_cq_template.xml @@ -0,0 +1,7 @@ + + diff --git a/examples/ui.content/src/main/content/jcr_root/content/core-components-examples/library/adaptive-form/turnstile/.content.xml b/examples/ui.content/src/main/content/jcr_root/content/core-components-examples/library/adaptive-form/turnstile/.content.xml new file mode 100644 index 0000000000..333978ce8e --- /dev/null +++ b/examples/ui.content/src/main/content/jcr_root/content/core-components-examples/library/adaptive-form/turnstile/.content.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/custom-forms-components-runtime-all/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/custom-forms-components-runtime-all/.content.xml index c862537b53..1b446738e2 100644 --- a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/custom-forms-components-runtime-all/.content.xml +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/custom-forms-components-runtime-all/.content.xml @@ -5,4 +5,4 @@ cssProcessor="[default:none,min:none]" jsProcessor="[default:none,min:none]" categories="[core.forms.components.it.runtime.all]" - embed="[core.forms.components.runtime.base,core.forms.components.it.container.v1.runtime,core.forms.components.datePicker.v1.runtime,core.forms.components.textinput.v1.runtime,core.forms.components.numberinput.v1.runtime,core.forms.components.panelcontainer.v1.runtime,core.forms.components.radiobutton.v1.runtime,core.forms.components.text.v1.runtime,core.forms.components.checkboxgroup.v1.runtime,core.forms.components.button.v1.runtime,core.forms.components.image.v1.runtime,core.forms.components.dropdown.v1.runtime,core.forms.components.fileinput.v2.runtime,core.forms.components.accordion.v1.runtime,core.forms.components.tabs.v1.runtime,core.forms.components.wizard.v1.runtime,core.forms.components.verticaltabs.v1.runtime,core.forms.components.recaptcha.v1.runtime,core.forms.components.checkbox.v1.runtime,core.forms.components.fragment.v1.runtime,core.forms.components.switch.v1.runtime,core.forms.components.termsandconditions.v1.runtime, core.forms.components.it.textinput.v1.runtime, core.forms.components.hcaptcha.v1.runtime]"/> + embed="[core.forms.components.runtime.base,core.forms.components.it.container.v1.runtime,core.forms.components.datePicker.v1.runtime,core.forms.components.textinput.v1.runtime,core.forms.components.numberinput.v1.runtime,core.forms.components.panelcontainer.v1.runtime,core.forms.components.radiobutton.v1.runtime,core.forms.components.text.v1.runtime,core.forms.components.checkboxgroup.v1.runtime,core.forms.components.button.v1.runtime,core.forms.components.image.v1.runtime,core.forms.components.dropdown.v1.runtime,core.forms.components.fileinput.v2.runtime,core.forms.components.accordion.v1.runtime,core.forms.components.tabs.v1.runtime,core.forms.components.wizard.v1.runtime,core.forms.components.verticaltabs.v1.runtime,core.forms.components.recaptcha.v1.runtime,core.forms.components.checkbox.v1.runtime,core.forms.components.fragment.v1.runtime,core.forms.components.switch.v1.runtime,core.forms.components.termsandconditions.v1.runtime, core.forms.components.it.textinput.v1.runtime, core.forms.components.hcaptcha.v1.runtime, core.forms.components.turnstile.v1.runtime]"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/.content.xml new file mode 100755 index 0000000000..f9297f711f --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/.content.xml @@ -0,0 +1,5 @@ + + diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/css.txt b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/css.txt new file mode 100755 index 0000000000..d59b7cc13b --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/css.txt @@ -0,0 +1,19 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=styles + +site.css diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/js.txt b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/js.txt new file mode 100755 index 0000000000..f2d5bc8b2e --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/js.txt @@ -0,0 +1,17 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### +#base=js +functions.js diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/js/functions.js b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/js/functions.js new file mode 100755 index 0000000000..ae571c5d16 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/js/functions.js @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + + +(function () { + + let toggleColour = function (element, checked) { + element.setAttribute("fill", checked ? "#bee8f6" : "#ffffff"); + }; + + let handleFormInitialization = function(event) { + let formContainerView = event.detail; + let formElement = formContainerView.getFormElement(); + let svgImageComponents = formElement.querySelectorAll('[data-cmp-is="adaptiveFormSvg"]'); + let handleSvgImage = function(svgImage) { + let svgContainerModelId = svgImage.closest('[data-cmp-is="adaptiveFormPanel"]').getAttribute("id"); + let svgContainerModel = formContainerView.getModel(svgContainerModelId); + let svgSelectorModel = svgContainerModel.parent; + let accessibleContainerModel = svgSelectorModel.items[1]; + accessibleContainerModel.items.forEach((fieldModel) => { + if (fieldModel.properties['svg-linked-checkbox']) { + let fieldName = fieldModel.name; + svgImage.querySelectorAll('[data-svg-af-field="' + fieldName + '"]').forEach((svgPathField) => { + svgPathField.addEventListener("click", (clickEvent) => { + fieldModel.checked = !fieldModel.checked; + }); + fieldModel.subscribe((action) => { + let changes = action.payload.changes; + changes.forEach(change => { + if (change.propertyName === 'checked') { + toggleColour(svgPathField, fieldModel.checked); + } + }); + }); + }); + } + }); + }; + svgImageComponents.forEach(handleSvgImage); + }; + + document.addEventListener("AF_FormContainerInitialised", handleFormInitialization); + +})(); diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/styles/site.css b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/styles/site.css new file mode 100755 index 0000000000..44bda83bb6 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/clientlibs/svg-selector/styles/site.css @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +[data-svg-af-field] { + cursor: pointer; +} \ No newline at end of file diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/.content.xml new file mode 100755 index 0000000000..a0ac99e384 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/.content.xml @@ -0,0 +1,3 @@ + + diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/.content.xml new file mode 100755 index 0000000000..44256e1862 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/.content.xml @@ -0,0 +1,5 @@ + + + + diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/.content.xml new file mode 100755 index 0000000000..3a6b88ae06 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/.content.xml @@ -0,0 +1,7 @@ + + diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/README.md b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/README.md new file mode 100755 index 0000000000..da016b1ebd --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/README.md @@ -0,0 +1,57 @@ + +Adaptive Form Svg (v1) +==== +Image component written in HTL that renders an adaptive image. + +## Features + +### Use Object + + +### Component Policy Configuration Properties +The following configuration properties are used: + +1.`./value` svg paths definition +2.`./height` height of svg +3.`./width` width of svg +4.`./jcr:title` title of svg + + +## BEM Description +``` +BLOCK cmp-svg-image-container + ELEMENT cmp-svg-image +``` + +## Client Libraries + + +## JavaScript Data Attribute Bindings + +The following attributes must be added for the initialization of the image component in the form view: + 1. `data-cmp-is="adaptiveFormSvg"` + + + +## Replace feature: + + +## Information +* **Vendor**: Adobe +* **Version**: v1 +* **Compatibility**: Cloud +* **Status**: production-ready \ No newline at end of file diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_dialog/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_dialog/.content.xml new file mode 100755 index 0000000000..2d02db5e5b --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_dialog/.content.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + <value + granite:class="cmp-adaptiveform-svg_value" + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/textfield" + fieldLabel="Value" + name="./value"/> + <height + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/numberfield" + defaultValue="100" + fieldLabel="Height" + name="./height"/> + <width + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/numberfield" + defaultValue="100" + fieldLabel="Width" + name="./width"/> + </items> + </column> + </items> + </columns> + </items> + <parentConfig + jcr:primaryType="nt:unstructured" + active="{Boolean}true"/> + </basic> + </items> + </tabs> + </items> + </content> +</jcr:root> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_editConfig.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_editConfig.xml new file mode 100755 index 0000000000..7db8f452dc --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_editConfig.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + cq:actions="[edit,-,copymove,delete,-,insert,-]" + cq:dialogMode="floating" + cq:disableTargeting="{Boolean}true" + cq:layout="editbar" + jcr:primaryType="cq:EditConfig"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_template/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_template/.content.xml new file mode 100755 index 0000000000..b8dc61d4fd --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/_cq_template/.content.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="SVG"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/icon.png b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/icon.png new file mode 100755 index 0000000000..436b271a35 Binary files /dev/null and b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/icon.png differ diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/svg.html b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/svg.html new file mode 100755 index 0000000000..94f5edb258 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svg/v1/svg/svg.html @@ -0,0 +1,21 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2022 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> +<div data-cmp-is="adaptiveFormSvg" class="cmp-svg-image-container" > + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" class="cmp-svg-image" title="${resource.jcr:title}" viewBox="0 0 ${resource.width} ${resource.height}"> + ${resource.value @ context='unsafe'} + </svg> +</div> + diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/.content.xml new file mode 100755 index 0000000000..a0ac99e384 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/.content.xml new file mode 100755 index 0000000000..792c7a7e42 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" + jcr:primaryType="nt:unstructured"> + <svgSelector/> +</jcr:root> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/svgSelector/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/svgSelector/.content.xml new file mode 100755 index 0000000000..ace19bb85b --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/svgSelector/.content.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + cq:icon="article" + cq:isContainer="{Boolean}true" + jcr:description="Svg Selector" + jcr:primaryType="cq:Component" + jcr:title="Adaptive Form Svg Selector (v1)" + sling:resourceSuperType="core/fd/components/form/panelcontainer/v1/panelcontainer" + componentGroup=".core-adaptiveform"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/svgSelector/_cq_template/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/svgSelector/_cq_template/.content.xml new file mode 100755 index 0000000000..c0c7063414 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/componentDef/svgSelector/v1/svgSelector/_cq_template/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="Svg Selector" + fieldType="panel"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svg/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svg/.content.xml new file mode 100755 index 0000000000..bc48808e6e --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svg/.content.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + cq:icon="image" + cq:isContainer="{Boolean}true" + jcr:description="Svg" + jcr:primaryType="cq:Component" + jcr:title="Adaptive Form Svg" + sling:resourceSuperType="forms-core-components-it/componentDef/svg/v1/svg" + componentGroup="Core Components Examples - Adaptive Form"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svgSelector/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svgSelector/.content.xml new file mode 100755 index 0000000000..5a30fe1e8e --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svgSelector/.content.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + cq:icon="article" + cq:isContainer="{Boolean}true" + jcr:description="Svg Selector for syncing checkbox selection with svg paths" + jcr:primaryType="cq:Component" + jcr:title="Adaptive Form Svg Selector" + sling:resourceSuperType="forms-core-components-it/componentDef/svgSelector/v1/svgSelector" + componentGroup="Core Components Examples - Adaptive Form"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svgSelector/_cq_template/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svgSelector/_cq_template/.content.xml new file mode 100755 index 0000000000..fe8387b3a5 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/components/svgSelector/_cq_template/.content.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="Svg Selector" + fieldType="panel" + layout="responsiveGrid"> + <imageSelectionPanel + jcr:created="{Date}2024-11-20T17:18:27.996+05:30" + jcr:lastModified="{Date}2024-11-20T17:19:15.452+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Image Selection" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + layout="responsiveGrid" + name="imageSelectionPanel" + readOnly="{Boolean}false" + repeatable="false" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <svg + jcr:created="{Date}2024-11-20T16:26:16.262+05:30" + jcr:lastModified="{Date}2024-11-20T16:26:16.262+05:30" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-core-components-it/components/svg"/> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="6"/> + </cq:responsive> + </imageSelectionPanel> + <accessibleSelectionPanel + jcr:created="{Date}2024-11-20T17:18:27.996+05:30" + jcr:lastModified="{Date}2024-11-20T17:19:15.452+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Accessible Selection" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + layout="responsiveGrid" + name="accessibleSelectionPanel" + readOnly="{Boolean}false" + repeatable="false" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <checkbox + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:28:12.812+05:30" + jcr:lastModified="{Date}2024-11-20T16:28:12.812+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Check Box" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + fieldType="checkbox" + name="checkbox1732100292872" + uncheckedValue="off"/> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="6"/> + </cq:responsive> + </accessibleSelectionPanel> +</jcr:root> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/form/turnstile/.content.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/form/turnstile/.content.xml new file mode 100644 index 0000000000..3431ffc5e5 --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/form/turnstile/.content.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + cq:icon="shield" + jcr:primaryType="cq:Component" + jcr:title="Adaptive Form Cloudflare® Turnstile (v1)" + sling:resourceSuperType="core/fd/components/form/turnstile/v1/turnstile" + componentGroup="Core Components Examples - Adaptive Form"/> diff --git a/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/form/turnstile/_cq_template.xml b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/form/turnstile/_cq_template.xml new file mode 100644 index 0000000000..c55ac31fef --- /dev/null +++ b/it/apps/src/main/content/jcr_root/apps/forms-core-components-it/form/turnstile/_cq_template.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="TURNSTILE" + fieldType="captcha" + required="{Boolean}true" +/> diff --git a/it/config/src/main/content/META-INF/vault/filter.xml b/it/config/src/main/content/META-INF/vault/filter.xml index c1342e11ad..db6833e6df 100644 --- a/it/config/src/main/content/META-INF/vault/filter.xml +++ b/it/config/src/main/content/META-INF/vault/filter.xml @@ -5,4 +5,5 @@ <filter root="/apps/system/config/Guide Localization Service.cfg.json"/> <filter root="/apps/system/config/org.apache.felix.http.cfg.json"/> <filter root="/apps/system/config/com.adobe.granite.webvitals.impl.WebVitalsTransformerFactory.cfg.json"/> + <filter root="/apps/system/config/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~headlessreplication.cfg.json"/> </workspaceFilter> diff --git a/it/config/src/main/content/jcr_root/apps/system/config/com.adobe.granite.toggle.impl.dev.DynamicToggleProviderImpl.cfg.json b/it/config/src/main/content/jcr_root/apps/system/config/com.adobe.granite.toggle.impl.dev.DynamicToggleProviderImpl.cfg.json index 682f52b610..8842ce8f0c 100644 --- a/it/config/src/main/content/jcr_root/apps/system/config/com.adobe.granite.toggle.impl.dev.DynamicToggleProviderImpl.cfg.json +++ b/it/config/src/main/content/jcr_root/apps/system/config/com.adobe.granite.toggle.impl.dev.DynamicToggleProviderImpl.cfg.json @@ -20,6 +20,7 @@ "FT_FORMS-14545", "FT_SITES-19631", "FT_FORMS-14255", - "FT_FORMS-14068" + "FT_FORMS-14068", + "FT_FORMS-16351" ] } diff --git a/it/config/src/main/content/jcr_root/apps/system/config/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~headlessreplication.cfg.json b/it/config/src/main/content/jcr_root/apps/system/config/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~headlessreplication.cfg.json new file mode 100644 index 0000000000..e3585f27f6 --- /dev/null +++ b/it/config/src/main/content/jcr_root/apps/system/config/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended~headlessreplication.cfg.json @@ -0,0 +1,5 @@ +{ + "user.mapping": [ + "com.adobe.aem.core-forms-components-it-tests-core:core-components-it-replication-sub-service=[replication-service]" + ] +} \ No newline at end of file diff --git a/it/content/src/main/content/META-INF/vault/filter.xml b/it/content/src/main/content/META-INF/vault/filter.xml index 3c0ff06e21..c6dfb60772 100644 --- a/it/content/src/main/content/META-INF/vault/filter.xml +++ b/it/content/src/main/content/META-INF/vault/filter.xml @@ -12,4 +12,5 @@ <filter root="/conf/core-components-it" mode="update"/> <filter root="/conf/wknd" mode="update"/> <filter root="/conf/datalayerContainer" mode="update"/> + <filter root="/etc/replication/agents.author/corecomponentsit"/> </workspaceFilter> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entcheckbox/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entcheckbox/.content.xml index 3e2b39c5c2..05aa120ee5 100644 --- a/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entcheckbox/.content.xml +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entcheckbox/.content.xml @@ -12,7 +12,7 @@ sling:resourceType="fd/af/cloudservices/recaptcha/page" enterpriseVerifyUrl="https://recaptchaenterprise.googleapis.com/" keyType="checkbox" - name="entCheckbox" + name="entcheckbox" projectId="aem-forms-internal" secretKey="\{ee8e90ea55c4fbc7675fb8e9ffd7cea858e5536f0789198aabc40a3295f278f59f30e4325aa5ad93124380c962198c4fbf6fe3f86ac979fa64da7d99f47b24fb}" siteKey="6LfaMOkpAAAAAK9ooBLOcnDO84EE7UTTgBKA6e3d" diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entscore/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entscore/.content.xml index cdc833c4cf..f7a36e04b0 100644 --- a/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entscore/.content.xml +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/samples/recaptcha/basic/settings/cloudconfigs/recaptcha/entscore/.content.xml @@ -12,7 +12,7 @@ sling:resourceType="fd/af/cloudservices/recaptcha/page" enterpriseVerifyUrl="https://recaptchaenterprise.googleapis.com/" keyType="score" - name="entScore" + name="entscore" projectId="aem-forms-internal" secretKey="\{ee8e90ea55c4fbc7675fb8e9ffd7cea858e5536f0789198aabc40a3295f278f59f30e4325aa5ad93124380c962198c4fbf6fe3f86ac979fa64da7d99f47b24fb}" siteKey="6LfKIukpAAAAAFabx1W7ve1hWDKXBD92oHtGb9j6" diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/.content.xml new file mode 100644 index 0000000000..a0ac99e384 --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/invisible/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/invisible/.content.xml new file mode 100644 index 0000000000..53c61ce32a --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/invisible/.content.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:lastModified="{Date}2024-05-10T11:53:38.394+05:30" + cq:lastModifiedBy="admin" + jcr:lastModified="{Date}2024-05-10T11:53:38.379+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="cq:PageContent" + jcr:title="invisible" + sling:resourceType="fd/af/cloudservices/turnstile/page" + clientJsUrl="https://challenges.cloudflare.com/turnstile/v0/api.js" + name="invisible" + secretKey="\{d3ae4bdbfd43e7a5ace7f91199af5e5273047c8a3e32a3394ab3150aeaa2c3ea9389f72a22c97eddef7e5781cf803b77e3b8075ef11465ceab5e1c060b1d17df}" + serverValidationUrl="https://challenges.cloudflare.com/turnstile/v0/siteverify" + siteKey="1x00000000000000000000BB" + widgetType="invisible"/> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/managed/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/managed/.content.xml new file mode 100644 index 0000000000..14e72741af --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/cloudconfigs/turnstile/managed/.content.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:lastModified="{Date}2024-05-10T11:53:38.394+05:30" + cq:lastModifiedBy="admin" + jcr:lastModified="{Date}2024-05-10T11:53:38.379+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="cq:PageContent" + jcr:title="managed" + sling:resourceType="fd/af/cloudservices/turnstile/page" + clientJsUrl="https://challenges.cloudflare.com/turnstile/v0/api.js" + name="managed" + secretKey="\{d3ae4bdbfd43e7a5ace7f91199af5e5273047c8a3e32a3394ab3150aeaa2c3ea9389f72a22c97eddef7e5781cf803b77e3b8075ef11465ceab5e1c060b1d17df}" + serverValidationUrl="https://challenges.cloudflare.com/turnstile/v0/siteverify" + siteKey="1x00000000000000000000AA" + widgetType="managed"/> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/policies/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/policies/.content.xml index 952cdfc6ef..4f8efcff26 100755 --- a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/policies/.content.xml +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/policies/.content.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rep="internal" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:rep="internal" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" jcr:mixinTypes="[rep:AccessControllable]" jcr:primaryType="cq:Page"> <rep:policy/> @@ -465,7 +465,7 @@ sling:resourceType="wcm/core/components/policy/policy" ampMode="pairedAmp" appResourcesClientlib="cmp-examples.site" - clientlibs="[forms-it.base,forms-it.custom-locale]" + clientlibs="[forms-it.base,forms-it.custom-locale,svg-selector]" clientlibsAsync="true"> <jcr:content jcr:primaryType="nt:unstructured"/> </default> @@ -543,6 +543,27 @@ <jcr:content jcr:primaryType="nt:unstructured"/> </default> </panelcontainer> + <checkbox jcr:primaryType="nt:unstructured"> + <policy_1732774059492 + jcr:primaryType="nt:unstructured" + jcr:title="svg-selector" + sling:resourceType="wcm/core/components/policy/policy"> + <jcr:content jcr:primaryType="nt:unstructured"/> + <fd:customPropertyGroups jcr:primaryType="nt:unstructured"> + <item0 + fd:customPropertyGroupId="1732774062798" + fd:customPropertyGroupName="svg-selector" + jcr:primaryType="nt:unstructured"> + <fd:customProperties jcr:primaryType="nt:unstructured"> + <item0 + fd:customKey="svg-linked-checkbox" + fd:customValue="true" + jcr:primaryType="nt:unstructured"/> + </fd:customProperties> + </item0> + </fd:customPropertyGroups> + </policy_1732774059492> + </checkbox> </form> </components> </forms-components-examples> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/.content.xml new file mode 100755 index 0000000000..c8b3462873 --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/.content.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="cq:Template"> + <jcr:content + cq:lastModified="{Date}2024-11-28T13:17:15.984+05:30" + cq:lastModifiedBy="admin" + cq:templateType="/conf/core-components-it/settings/wcm/template-types/af-page-v2" + jcr:primaryType="cq:PageContent" + jcr:title="blank" + status="enabled"/> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/initial/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/initial/.content.xml new file mode 100755 index 0000000000..71b92695f2 --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/initial/.content.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:template="/conf/core-components-it/settings/wcm/templates/blank" + jcr:primaryType="cq:PageContent" + sling:resourceType="forms-components-examples/components/page" + guideComponentType="fd/af/templates"> + <guideContainer + fd:version="2.1" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + fieldType="form"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/policies/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/policies/.content.xml new file mode 100755 index 0000000000..149237c63a --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/policies/.content.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:lastModified="{Date}2024-11-28T13:17:14.462+05:30" + cq:lastModifiedBy="admin" + cq:policy="forms-components-examples/components/page/default" + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/core/components/policies/mappings"> + <container1 + cq:policy="wcm/foundation/components/responsivegrid/page-header" + jcr:primaryType="nt:unstructured" + jcr:title="Header" + sling:resourceType="wcm/core/components/policies/mapping" + layout="responsiveGrid"/> + <guideContainer + cq:policy="forms-components-examples/components/form/container/default" + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/core/components/policies/mapping"> + <forms-components-examples jcr:primaryType="nt:unstructured"> + <components jcr:primaryType="nt:unstructured"> + <form jcr:primaryType="nt:unstructured"> + <checkbox + cq:policy="forms-components-examples/components/form/checkbox/policy_1732774059492" + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/core/components/policies/mapping"/> + </form> + </components> + </forms-components-examples> + </guideContainer> + <container2 + cq:policy="wcm/foundation/components/responsivegrid/page-footer" + jcr:primaryType="nt:unstructured" + jcr:title="Footer" + sling:resourceType="wcm/core/components/policies/mapping" + layout="responsiveGrid"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/structure/.content.xml b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/structure/.content.xml new file mode 100755 index 0000000000..9e7bad1001 --- /dev/null +++ b/it/content/src/main/content/jcr_root/conf/core-components-it/settings/wcm/templates/blank/structure/.content.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-11-28T13:17:15.984+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-it/settings/wcm/templates/blank" + jcr:primaryType="cq:PageContent" + sling:resourceType="forms-components-examples/components/page" + guideComponentType="fd/af/templates"> + <container1 + jcr:primaryType="nt:unstructured" + jcr:title="Header" + sling:resourceType="core/wcm/components/container/v1/container" + editable="{Boolean}true" + layout="responsiveGrid"/> + <guideContainer + fd:version="2.1" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + editable="{Boolean}true" + fieldType="form"/> + <container2 + jcr:primaryType="nt:unstructured" + jcr:title="Footer" + sling:resourceType="core/wcm/components/container/v1/container" + editable="{Boolean}true" + layout="responsiveGrid"/> + <cq:responsive jcr:primaryType="nt:unstructured"> + <breakpoints jcr:primaryType="nt:unstructured"> + <smallScreen + jcr:primaryType="nt:unstructured" + title="Smaller Screen" + width="{Decimal}479"/> + <phone + jcr:primaryType="nt:unstructured" + title="Phone" + width="{Decimal}767"/> + <tablet + jcr:primaryType="nt:unstructured" + title="Tablet" + width="{Decimal}991"/> + </breakpoints> + </cq:responsive> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/embed/customactiontesting/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/embed/customactiontesting/.content.xml new file mode 100644 index 0000000000..d7cdfee32c --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/embed/customactiontesting/.content.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-10-28T16:09:25.947+05:30" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + author="admin" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="customactiontesting"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/.content.xml new file mode 100644 index 0000000000..290e53b989 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/.content.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="sling:Folder" + lcFolder="{Long}0" + type="lcFolder"> + <jcr:content + jcr:primaryType="nt:unstructured" + jcr:title="navigate-in-panel"> + <folderThumbnail/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/basic/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/basic/.content.xml new file mode 100644 index 0000000000..73f2fabd0b --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/basic/.content.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-08-20T06:03:38.597Z" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + author="admin" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="basic"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/blank/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/blank/.content.xml new file mode 100644 index 0000000000..fb45b800fa --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/ruleeditor/navigate-in-panel/blank/.content.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-08-20T10:32:12.709Z" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + author="admin" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="blank"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/testsvg/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/testsvg/.content.xml new file mode 100755 index 0000000000..83d6e32776 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/testsvg/.content.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-11-28T13:17:23.620+05:30" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="testSvg"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/.content.xml new file mode 100644 index 0000000000..ea2e55bfa7 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/.content.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="sling:Folder" + lcFolder="{Long}0" + type="lcFolder"> + <jcr:content + jcr:primaryType="nt:unstructured" + jcr:title="turnstile"/> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/basic/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/basic/.content.xml new file mode 100644 index 0000000000..f87b064c12 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/basic/.content.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-04-11T20:32:50.407+05:30" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + cq:conf="/conf/core-components-it" + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + author="admin" + availableInMobileApp="{Boolean}false" + dorTemplateChanged="Boolean" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="basic"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/invisible/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/invisible/.content.xml new file mode 100644 index 0000000000..8af952bdaf --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/invisible/.content.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-04-11T20:32:50.407+05:30" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + cq:conf="/conf/core-components-it" + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + author="admin" + availableInMobileApp="{Boolean}false" + dorTemplateChanged="Boolean" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="invisible"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/managed/.content.xml b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/managed/.content.xml new file mode 100644 index 0000000000..5b6b4741b8 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/dam/formsanddocuments/core-components-it/samples/turnstile/managed/.content.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:dam="http://www.day.com/dam/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="dam:Asset"> + <jcr:content + cq:conf="\0" + jcr:lastModified="{Date}2024-04-11T20:32:50.407+05:30" + jcr:primaryType="dam:AssetContent" + sling:resourceType="fd/fm/af/render" + guide="1" + type="guide"> + <metadata + cq:conf="/conf/core-components-it" + fd:version="2.1" + jcr:language="en" + jcr:primaryType="nt:unstructured" + xmp:CreatorTool="AEM Forms AF Wizard" + allowedRenderFormat="HTML" + author="admin" + availableInMobileApp="{Boolean}false" + dorTemplateChanged="Boolean" + dorType="none" + formmodel="none" + themeRef="/libs/fd/af/themes/canvas" + title="managed"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/button/buttonv1/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/button/buttonv1/basic/.content.xml index c5784e7477..8af2ebd4f2 100644 --- a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/button/buttonv1/basic/.content.xml +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/button/buttonv1/basic/.content.xml @@ -76,6 +76,25 @@ jcr:primaryType="nt:unstructured" click="[navigateTo('https://www.google.com'\, '_newwindow')]"/> </button-5> + <button-6 + jcr:lastModified="{Date}2024-11-05T11:18:53.340+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="change me" + sling:resourceType="core/fd/components/form/button/v1/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="button1730785718091" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1730785718091"\,"type":"AFCOMPONENT|FIELD|BUTTON"\,"name":"button1730785718091"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SET_PROPERTY"\,"items":[{"nodeName":"MEMBER_EXPRESSION"\,"items":[{"nodeName":"PROPERTY_LIST"\,"value":"label.value"}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1730785718091"\,"displayName":"change me"\,"type":"AFCOMPONENT|FIELD|BUTTON"\,"displayPath":"FORM/change me/"\,"name":"button1730785718091"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}]}\,{"nodeName":"to"\,"value":null}\,{"nodeName":"EXTENDED_EXPRESSION"\,"choice":{"nodeName":"STRING_LITERAL"\,"value":"changed"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["{label : {value : 'changed'}}"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[{label : {value : 'changed'}}]"/> + </button-6> </guideContainer> </jcr:content> </jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/checkboxgroup/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/checkboxgroup/basic/.content.xml index 9dc2b02920..2b87557fc7 100755 --- a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/checkboxgroup/basic/.content.xml +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/checkboxgroup/basic/.content.xml @@ -175,6 +175,22 @@ type="number[]" unboundFormElement="{Boolean}false" visible="{Boolean}true"/> + <resetbutton + jcr:created="{Date}2024-11-14T18:03:13.181+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-11-14T18:03:13.181+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Reset" + sling:resourceType="forms-components-examples/components/form/actions/reset" + buttonType="reset" + dorExclusion="true" + fieldType="button" + name="reset1731587593205"> + <fd:events + jcr:primaryType="nt:unstructured" + click="[dispatchEvent('reset')]"/> + </resetbutton> </guideContainer> </jcr:content> </jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/embed/customactiontesting/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/embed/customactiontesting/.content.xml new file mode 100644 index 0000000000..772727aa42 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/embed/customactiontesting/.content.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-10-28T16:09:25.949+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + fd:ignoreTranslationInvalidation="{Boolean}true" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="customactiontesting" + sling:configRef="/conf/forms/core-components-it/samples/embed/customactiontesting/" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:customFunctionAction="/custom-function-path-will-be-set-by-model" + fd:prefillAction="/prefill-path-will-be-set-by-model" + fd:version="2.1" + jcr:lastModified="{Date}2024-10-28T16:09:25.931+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + dorType="none" + fieldType="form" + prefillService="Core Custom Pre-fill Service" + schemaType="none" + specVersion="0.14.2" + textIsRich="true" + thankYouMessage="<p>Thank you for submitting the form.</p> " + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="customactiontesting"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/radiobutton/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/radiobutton/basic/.content.xml index 3908394709..62063519b1 100755 --- a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/radiobutton/basic/.content.xml +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/radiobutton/basic/.content.xml @@ -213,6 +213,22 @@ type="number[]" unboundFormElement="{Boolean}false" visible="{Boolean}true"/> + <resetbutton + jcr:created="{Date}2024-11-14T18:03:13.181+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-11-14T18:03:13.181+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Reset" + sling:resourceType="forms-components-examples/components/form/actions/reset" + buttonType="reset" + dorExclusion="true" + fieldType="button" + name="reset1731587593205"> + <fd:events + jcr:primaryType="nt:unstructured" + click="[dispatchEvent('reset')]"/> + </resetbutton> </guideContainer> </jcr:content> </jcr:root> \ No newline at end of file diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/.content.xml new file mode 100644 index 0000000000..bbf62ed22c --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" + jcr:mixinTypes="[rep:AccessControllable]" + jcr:primaryType="sling:Folder" + hidden="true"/> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/basic/.content.xml new file mode 100644 index 0000000000..529f03f020 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/basic/.content.xml @@ -0,0 +1,402 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-10-16T10:18:26.528+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="review form" + sling:resourceType="forms-components-examples/components/page" + ignoreTranslationInvalidation="{Boolean}true"> + <guideContainer + fd:version="2.1" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + dorType="none" + fieldType="form" + schemaType="none" + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="review form"> + <wizard + jcr:created="{Date}2024-08-23T14:06:41.619+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:07:08.945+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Contact Us form" + sling:resourceType="forms-components-examples/components/form/tabsontop" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="wizard1724402201983" + id="wizard_id" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <panelcontainer + jcr:created="{Date}2024-08-23T14:07:14.608+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-26T11:01:06.550+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Personal Information" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724402234656" + id="tab1_id" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-23T14:07:49.994+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:08:11.924+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="First name" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput1724402270046" + id="first_name_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules jcr:primaryType="nt:unstructured"/> + <fd:events jcr:primaryType="nt:unstructured"/> + </textinput> + <textinput_1682911092 + jcr:created="{Date}2024-08-23T14:08:18.471+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-23T09:48:11.029+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Last name" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput_16829110921724402298524" + id="last_name_id" + readOnly="{Boolean}false" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <textinput_1967841623 + jcr:created="{Date}2024-10-18T12:05:02.879+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-10-18T12:05:26.809+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Full name" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}false" + fieldType="text-input" + hideTitle="false" + name="textinput_19678416231729233302926" + id="full_name_id" + readOnly="{Boolean}false" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:calc="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"CALC_EXPRESSION"\,"items":[{"nodeName":"VALUE_FIELD"\,"value":{"id":"$form.wizard1724402201983.panelcontainer1724402234656.textinput_19678416231729233302926"\,"type":"STRING"\,"name":"textinput_19678416231729233302926"}}\,{"nodeName":"to"\,"value":null}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"BINARY_EXPRESSION"\,"items":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.wizard1724402201983.panelcontainer1724402234656.textinput1724402270046"\,"displayName":"First name"\,"type":"STRING"\,"displayPath":"FORM/Contact Us form/Personal Information/First name/"\,"name":"textinput1724402270046"\,"parent":"$form.wizard1724402201983.panelcontainer1724402234656"}}}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"CONCAT"\,"value":null}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.wizard1724402201983.panelcontainer1724402234656.textinput_16829110921724402298524"\,"displayName":"Last name"\,"type":"STRING"\,"displayPath":"FORM/Contact Us form/Personal Information/Last name/"\,"name":"textinput_16829110921724402298524"\,"parent":"$form.wizard1724402201983.panelcontainer1724402234656"}}}]}}\,{"nodeName":"When"\,"value":null}\,{"nodeName":"CONDITIONORALWAYS"\,"choice":null}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":"(textinput1724402270046.$value & textinput_16829110921724402298524.$value)"\,"eventName":"Calculate"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid" + value="(textinput1724402270046.$value & textinput_16829110921724402298524.$value)"/> + <fd:events jcr:primaryType="nt:unstructured"/> + </textinput_1967841623> + <emailinput + jcr:created="{Date}2024-08-23T14:08:35.886+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:09:09.486+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Email Address" + sling:resourceType="forms-components-examples/components/form/emailinput" + autocomplete="email" + enabled="{Boolean}true" + fieldType="email" + hideTitle="false" + name="emailinput1724402315995" + id="email_id" + pattern="^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <telephoneinput + jcr:created="{Date}2024-08-23T14:08:50.796+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:09:02.762+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Mobile Number" + sling:resourceType="forms-components-examples/components/form/telephoneinput" + autocomplete="tel" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="telephoneinput1724402330900" + id="telephone_id" + pattern="^[+][0-9]{0,14}$" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + validationPatternType="^[+][0-9]{0,14}$" + visible="{Boolean}true"/> + <datepicker + jcr:created="{Date}2024-08-23T14:10:49.125+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:11:01.271+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="DOB" + sling:resourceType="forms-components-examples/components/form/datepicker" + enabled="{Boolean}true" + fieldType="date-input" + hideTitle="false" + name="datepicker1724402449174" + id="date_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <radiobutton + jcr:created="{Date}2024-08-23T14:09:13.655+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:09:53.140+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Gender" + sling:resourceType="forms-components-examples/components/form/radiobutton" + enabled="{Boolean}true" + enum="[0,1,3]" + enumNames="[Male,Female,Other]" + fieldType="radio-group" + hideTitle="false" + name="radiobutton1724402353710" + id="gender_id" + orientation="horizontal" + readOnly="{Boolean}false" + textIsRich="[true,true,true,true,true,true]" + type="number" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <checkboxgroup + jcr:created="{Date}2024-08-23T14:09:59.678+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:10:40.541+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Interest" + sling:resourceType="forms-components-examples/components/form/checkboxgroup" + enabled="{Boolean}true" + enum="[0,1,2]" + enumNames="[Music ,Football ,Cricket]" + fieldType="checkbox-group" + hideTitle="false" + name="checkboxgroup1724402399726" + id="interest_id" + orientation="horizontal" + readOnly="{Boolean}false" + textIsRich="[true,true,true,true,true,true]" + type="number[]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <hidden_input + jcr:created="{Date}2024-08-23T14:08:18.471+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-23T09:48:11.029+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Hidden Field" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="hidden_name" + id="hidden_id" + readOnly="{Boolean}false" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}false"/> + <hidden_button + jcr:created="{Date}2024-08-23T14:18:03.480+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:18:03.480+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="hidden button" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + fieldType="button" + name="hidden_button" /> + </panelcontainer> + <panelcontainer_312223165 + jcr:created="{Date}2024-08-23T14:07:20.289+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-10-18T12:04:40.754+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Address" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + minOccur="1" + name="panelcontainer_3122231651724402240360" + id="tab2_id" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-23T14:11:28.053+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:11:46.385+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Address 1" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput1724402488097" + id="address1_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <textinput_1926569114 + jcr:created="{Date}2024-08-23T14:11:33.929+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:11:54.836+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="City" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput_19265691141724402493991" + id="city_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <dropdown + jcr:created="{Date}2024-08-23T14:12:00.606+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:12:41.355+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="State" + sling:resourceType="forms-components-examples/components/form/dropdown" + enabled="{Boolean}true" + enum="[UP,Delhi]" + enumNames="[UP,Delhi]" + fieldType="drop-down" + hideTitle="false" + name="dropdown1724402520718" + id="state_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + type="string" + typeIndex="0" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <numberinput + jcr:created="{Date}2024-08-23T14:12:48.979+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:13:04.037+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Zip code" + sling:resourceType="forms-components-examples/components/form/numberinput" + enabled="{Boolean}true" + fieldType="number-input" + hideTitle="false" + name="numberinput1724402569060" + id="zip_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + type="number" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + </panelcontainer_312223165> + <panelcontainer_2041789693 + jcr:created="{Date}2024-08-23T14:17:48.658+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:18:17.424+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Summary" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer_20417896931724402868708" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <review + jcr:created="{Date}2024-08-23T14:17:58.033+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-10-18T12:06:32.392+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="review" + sling:resourceType="forms-components-examples/components/form/review" + fd:editModeAction="field" + fieldType="plain-text" + hideTitle="false" + fd:linkedPanels="tab1_id" + name="review1724402878089"/> + <submit + jcr:created="{Date}2024-08-23T14:18:03.480+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:18:03.480+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Submit" + sling:resourceType="forms-components-examples/components/form/actions/submit" + buttonType="submit" + dorExclusion="true" + fieldType="button" + name="submit1724402883527"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1667450213112"\,"type":"BUTTON"\,"name":"button1667450213112"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SUBMIT_FORM"\,"items":[]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["submitForm()"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[submitForm()]"/> + </submit> + </panelcontainer_2041789693> + </wizard> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/repeatability/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/repeatability/.content.xml new file mode 100644 index 0000000000..800fad8ec4 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/review/repeatability/.content.xml @@ -0,0 +1,390 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-10-16T10:18:26.528+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="review form" + sling:resourceType="forms-components-examples/components/page" + ignoreTranslationInvalidation="{Boolean}true"> + <guideContainer + fd:version="2.1" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + dorType="none" + fieldType="form" + schemaType="none" + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="review form"> + <wizard + jcr:created="{Date}2024-08-23T14:06:41.619+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:07:08.945+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Contact Us form" + sling:resourceType="forms-components-examples/components/form/tabsontop" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="wizard1724402201983" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <panelcontainer + jcr:created="{Date}2024-08-23T14:07:14.608+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-26T11:01:06.550+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Personal Information" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724402234656" + id="tab1_id" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-23T14:07:49.994+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:08:11.924+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="First name" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput1724402270046" + id="first_name_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true" /> + <textinput_1682911092 + jcr:created="{Date}2024-08-23T14:08:18.471+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-23T09:48:11.029+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Last name" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput_16829110921724402298524" + id="last_name_id" + readOnly="{Boolean}false" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <emailinput + jcr:created="{Date}2024-08-23T14:08:35.886+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:09:09.486+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Email Address" + sling:resourceType="forms-components-examples/components/form/emailinput" + autocomplete="email" + enabled="{Boolean}true" + fieldType="email" + hideTitle="false" + name="emailinput1724402315995" + id="email_id" + pattern="^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <telephoneinput + jcr:created="{Date}2024-08-23T14:08:50.796+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:09:02.762+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Mobile Number" + sling:resourceType="forms-components-examples/components/form/telephoneinput" + autocomplete="tel" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="telephoneinput1724402330900" + id="telephone_id" + pattern="^[+][0-9]{0,14}$" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + validationPatternType="^[+][0-9]{0,14}$" + visible="{Boolean}true"/> + <datepicker + jcr:created="{Date}2024-08-23T14:10:49.125+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:11:01.271+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="DOB" + sling:resourceType="forms-components-examples/components/form/datepicker" + enabled="{Boolean}true" + fieldType="date-input" + hideTitle="false" + name="datepicker1724402449174" + id="date_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <radiobutton + jcr:created="{Date}2024-08-23T14:09:13.655+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:09:53.140+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Gender" + sling:resourceType="forms-components-examples/components/form/radiobutton" + enabled="{Boolean}true" + enum="[0,1,3]" + enumNames="[Male,Female,Other]" + fieldType="radio-group" + hideTitle="false" + name="radiobutton1724402353710" + id="gender_id" + orientation="horizontal" + readOnly="{Boolean}false" + textIsRich="[true,true,true,true,true,true]" + type="number" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <checkboxgroup + jcr:created="{Date}2024-08-23T14:09:59.678+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:10:40.541+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Interest" + sling:resourceType="forms-components-examples/components/form/checkboxgroup" + enabled="{Boolean}true" + enum="[0,1,2]" + enumNames="[Music ,Football ,Cricket]" + fieldType="checkbox-group" + hideTitle="false" + name="checkboxgroup1724402399726" + id="interest_id" + orientation="horizontal" + readOnly="{Boolean}false" + textIsRich="[true,true,true,true,true,true]" + type="number[]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + </panelcontainer> + <panelcontainer_312223165 + jcr:created="{Date}2024-08-23T14:07:20.289+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-23T12:17:18.884+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="All addres" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="true" + minOccur="1" + name="panelcontainer_3122231651724402240360" + id="tab2_id" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <panelcontainer_15619 + jcr:created="{Date}2024-08-23T14:07:25.971+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-10-16T10:18:26.502+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Address" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + maxOccur="5" + minOccur="1" + name="panelcontainer_15619396581724402246020" + id="address_id" + readOnly="{Boolean}false" + repeatable="true" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-23T14:11:28.053+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:11:46.385+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Address 1" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput1724402488097" + id="address1_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <textinput_1926569114 + jcr:created="{Date}2024-08-23T14:11:33.929+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:11:54.836+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="City" + sling:resourceType="forms-components-examples/components/form/textinput" + enabled="{Boolean}true" + fieldType="text-input" + hideTitle="false" + name="textinput_19265691141724402493991" + id="city_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <dropdown + jcr:created="{Date}2024-08-23T14:12:00.606+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:12:41.355+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="State" + sling:resourceType="forms-components-examples/components/form/dropdown" + enabled="{Boolean}true" + enum="[UP,Delhi]" + enumNames="[UP,Delhi]" + fieldType="drop-down" + hideTitle="false" + name="dropdown1724402520718" + id="state_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + type="string" + typeIndex="0" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <numberinput + jcr:created="{Date}2024-08-23T14:12:48.979+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:13:04.037+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Zip code" + sling:resourceType="forms-components-examples/components/form/numberinput" + enabled="{Boolean}true" + fieldType="number-input" + hideTitle="false" + name="numberinput1724402569060" + id="zip_id" + readOnly="{Boolean}false" + required="true" + textIsRich="[true,true,true]" + type="number" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <button + jcr:created="{Date}2024-08-23T14:14:03.199+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:14:14.760+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Add more address" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="button1724402643257" + id="add_address_id" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.wizard1724402201983.panelcontainer_3122231651724402240360.panelcontainer_15619396581724402246020[length($form.wizard1724402201983.panelcontainer_3122231651724402240360.panelcontainer_15619396581724402246020) - 1].button1724402643257"\,"type":"BUTTON"\,"name":"button1724402643257"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"ADD_INSTANCE"\,"items":[{"nodeName":"of"\,"value":null}\,{"nodeName":"REPEATABLE_COMPONENT"\,"value":{"id":"$form.wizard1724402201983.panelcontainer_3122231651724402240360.panelcontainer_15619396581724402246020"\,"displayName":"Address"\,"type":"PANEL"\,"isDuplicate":true\,"displayPath":"FORM/Contact Us form/Address/Address/"\,"name":"panelcontainer_15619396581724402246020"\,"parent":"$form.wizard1724402201983.panelcontainer_3122231651724402240360"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["addInstance($form.wizard1724402201983.panelcontainer_3122231651724402240360.panelcontainer_15619396581724402246020)"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[addInstance($form.wizard1724402201983.panelcontainer_3122231651724402240360.panelcontainer_15619396581724402246020)]"/> + </button> + </panelcontainer_15619> + </panelcontainer_312223165> + <panelcontainer_2041789693 + jcr:created="{Date}2024-08-23T14:17:48.658+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:18:17.424+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Summary" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer_20417896931724402868708" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <review + jcr:created="{Date}2024-08-23T14:17:58.033+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-09-23T12:51:15.023+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="review" + sling:resourceType="forms-components-examples/components/form/review" + fd:editModeAction="panel" + fieldType="plain-text" + hideTitle="false" + name="review1724402878089"/> + <submit + jcr:created="{Date}2024-08-23T14:18:03.480+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-23T14:18:03.480+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Submit" + sling:resourceType="forms-components-examples/components/form/actions/submit" + buttonType="submit" + dorExclusion="true" + fieldType="button" + name="submit1724402883527"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1667450213112"\,"type":"BUTTON"\,"name":"button1667450213112"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SUBMIT_FORM"\,"items":[]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["submitForm()"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[submitForm()]"/> + </submit> + </panelcontainer_2041789693> + </wizard> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/basic/.content.xml index c4fcf4fd80..94f0869c82 100644 --- a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/basic/.content.xml +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/basic/.content.xml @@ -1,60 +1,106 @@ <?xml version="1.0" encoding="UTF-8"?> <jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" - jcr:primaryType="cq:Page"> + jcr:primaryType="cq:Page"> <jcr:content - cq:deviceGroups="[/etc/mobile/groups/responsive]" - cq:lastModified="{Date}2024-03-01T11:49:33.311Z" - cq:lastModifiedBy="admin" - cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" - jcr:language="en" - jcr:primaryType="cq:PageContent" - jcr:title="basic" - sling:configRef="/conf/forms/core-components-it/samples/ruleeditor/basic/" - sling:resourceType="forms-components-examples/components/page"> + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-10-23T06:16:03.852Z" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="basic" + sling:configRef="/conf/forms/core-components-it/samples/ruleeditor/basic/" + sling:resourceType="forms-components-examples/components/page"> <guideContainer - fd:version="2.1" - jcr:lastModified="{Date}2024-03-01T11:40:51.518Z" - jcr:lastModifiedBy="admin" - jcr:primaryType="nt:unstructured" - sling:resourceType="forms-components-examples/components/form/container" - clientLibRef="corecomponent.it.customfunction,corecomponent.it.customfunction2" - dorType="none" - fieldType="form" - schemaType="none" - textIsRich="true" - thankYouMessage="Thank you for submitting the form." - thankYouOption="page" - themeRef="/libs/fd/af/themes/canvas" - title="basic"> - <textinput - jcr:created="{Date}2024-03-01T11:25:26.612Z" - jcr:createdBy="admin" - jcr:lastModified="{Date}2024-03-01T11:25:26.612Z" + fd:version="2.1" + jcr:lastModified="{Date}2024-03-01T11:40:51.518Z" jcr:lastModifiedBy="admin" jcr:primaryType="nt:unstructured" - jcr:title="Text Input" - sling:resourceType="forms-components-examples/components/form/textinput" - fieldType="text-input" - name="textinput1709292326654"/> + sling:resourceType="forms-components-examples/components/form/container" + clientLibRef="corecomponent.it.customfunction,corecomponent.it.customfunction2" + dorType="none" + fieldType="form" + schemaType="none" + textIsRich="true" + thankYouMessage="Thank you for submitting the form." + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="basic"> + <textinput + jcr:created="{Date}2024-03-01T11:25:26.612Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-03-01T11:25:26.612Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1709292326654"/> <button - jcr:created="{Date}2024-03-01T11:25:31.029Z" - jcr:createdBy="admin" - jcr:lastModified="{Date}2024-03-01T11:25:31.029Z" - jcr:lastModifiedBy="admin" - jcr:primaryType="nt:unstructured" - jcr:title="Button" - sling:resourceType="forms-components-examples/components/form/button" - dorExclusion="true" - fieldType="button" - name="button1709292331100"> - <fd:rules - fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1709292331100"\,"type":"BUTTON"\,"name":"button1709292331100"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"FUNCTION_CALL"\,"parentNodeName":"BLOCK_STATEMENT"\,"functionName":{"id":"testSetProperty"\,"displayName":"testSetProperty"\,"type":"STRING|NUMBER|BOOLEAN|DATE|ARRAY|OBJECT"\,"isDuplicate":false\,"displayPath":""\,"args":[{"type":"STRING"\,"name":"input1"\,"description":"input1"\,"isMandatory":true}\,{"type":"OBJECT|AFCOMPONENT"\,"name":"normalField"\,"description":"normalField"\,"isMandatory":true}]\,"impl":"$0($1\,$2)"}\,"params":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"STRING_LITERAL"\,"value":"abc"}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.textinput1709292326654"\,"displayName":"Text Input"\,"type":"AFCOMPONENT"\,"displayPath":"FORM/Text Input/"\,"name":"textinput1709292326654"\,"parent":"$form"}}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["testSetProperty('abc'\,textinput1709292326654\)"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:created="{Date}2024-03-01T11:25:31.029Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-03-01T11:25:31.029Z" + jcr:lastModifiedBy="admin" jcr:primaryType="nt:unstructured" - validationStatus="valid"/> + jcr:title="Button" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + fieldType="button" + name="button1709292331100"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1709292331100"\,"type":"BUTTON"\,"name":"button1709292331100"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"FUNCTION_CALL"\,"parentNodeName":"BLOCK_STATEMENT"\,"functionName":{"id":"testSetProperty"\,"displayName":"testSetProperty"\,"type":"STRING|NUMBER|BOOLEAN|DATE|ARRAY|OBJECT"\,"isDuplicate":false\,"displayPath":""\,"args":[{"type":"STRING"\,"name":"input1"\,"description":"input1"\,"isMandatory":true}\,{"type":"OBJECT|AFCOMPONENT"\,"name":"normalField"\,"description":"normalField"\,"isMandatory":true}]\,"impl":"$0($1\,$2)"}\,"params":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"STRING_LITERAL"\,"value":"abc"}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.textinput1709292326654"\,"displayName":"Text Input"\,"type":"AFCOMPONENT"\,"displayPath":"FORM/Text Input/"\,"name":"textinput1709292326654"\,"parent":"$form"}}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["testSetProperty('abc'\,textinput1709292326654)"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> <fd:events - jcr:primaryType="nt:unstructured" - click="[testSetProperty('abc'\,textinput1709292326654)]"/> + jcr:primaryType="nt:unstructured" + click="[testSetProperty('abc'\,textinput1709292326654)]"/> </button> + <datepicker + jcr:created="{Date}2024-10-23T06:02:06.965Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-10-23T06:02:22.719Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="startDate" + sling:resourceType="forms-components-examples/components/form/datepicker" + enabled="{Boolean}true" + fieldType="date-input" + hideTitle="false" + name="startDate" + readOnly="{Boolean}false" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + validationExpression="(dateToDaysSinceEpoch($field.$value)<dateToDaysSinceEpoch(today())) && (!(endDate.$value) || (dateToDaysSinceEpoch($field.$value)<dateToDaysSinceEpoch(endDate.$value)))" + visible="{Boolean}true"> + <fd:rules + fd:validate="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"VALIDATE_EXPRESSION"\,"items":[{"nodeName":"AFCOMPONENT"\,"value":{"id":"$form.startDate"\,"type":"AFCOMPONENT"\,"name":"startDate"}}\,{"nodeName":"Using"\,"value":null}\,{"nodeName":"Expression"\,"value":null}\,{"nodeName":"CONDITION"\,"choice":{"nodeName":"BOOLEAN_BINARY_EXPRESSION"\,"items":[{"nodeName":"CONDITION"\,"choice":{"nodeName":"COMPARISON_EXPRESSION"\,"items":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.startDate"\,"displayName":"startDate"\,"type":"DATE"\,"displayPath":"FORM/startDate/"\,"name":"startDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"IS_BEFORE"\,"value":null}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"FUNCTION_CALL"\,"parentNodeName":"EXPRESSION"\,"functionName":{"id":"today"\,"displayName":"Get Current Date"\,"type":"DATE"\,"isDuplicate":false\,"displayPath":""\,"args":[]\,"impl":"$0()"}\,"params":[]}}]}\,"nested":true}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"AND"\,"value":null}}\,{"nodeName":"CONDITION"\,"choice":{"nodeName":"BOOLEAN_BINARY_EXPRESSION"\,"items":[{"nodeName":"CONDITION"\,"choice":{"nodeName":"COMPARISON_EXPRESSION"\,"items":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.endDate"\,"displayName":"endDate"\,"type":"DATE"\,"displayPath":"FORM/endDate/"\,"name":"endDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"IS_EMPTY"\,"value":null}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":null}}]}\,"nested":false}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"OR"\,"value":null}}\,{"nodeName":"CONDITION"\,"choice":{"nodeName":"COMPARISON_EXPRESSION"\,"items":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.startDate"\,"displayName":"startDate"\,"type":"DATE"\,"displayPath":"FORM/startDate/"\,"name":"startDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"IS_BEFORE"\,"value":null}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.endDate"\,"displayName":"endDate"\,"type":"DATE"\,"displayPath":"FORM/endDate/"\,"name":"endDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}]}\,"nested":true}]}\,"nested":true}]}\,"nested":false}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":"(dateToDaysSinceEpoch($field.$value)<dateToDaysSinceEpoch(today())) && (!(endDate.$value) || (dateToDaysSinceEpoch($field.$value)<dateToDaysSinceEpoch(endDate.$value)))"\,"eventName":"Validate"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events jcr:primaryType="nt:unstructured"/> + </datepicker> + <datepicker_32726336 + jcr:created="{Date}2024-10-23T06:02:12.735Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-10-23T06:02:40.957Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="endDate" + sling:resourceType="forms-components-examples/components/form/datepicker" + enabled="{Boolean}true" + fieldType="date-input" + hideTitle="false" + name="endDate" + readOnly="{Boolean}false" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + validationExpression="dateToDaysSinceEpoch($field.$value)>dateToDaysSinceEpoch(startDate.$value) && dateToDaysSinceEpoch($field.$value)>dateToDaysSinceEpoch(today())" + visible="{Boolean}true"> + <fd:rules + fd:validate="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"VALIDATE_EXPRESSION"\,"items":[{"nodeName":"AFCOMPONENT"\,"value":{"id":"$form.endDate"\,"type":"AFCOMPONENT"\,"name":"endDate"}}\,{"nodeName":"Using"\,"value":null}\,{"nodeName":"Expression"\,"value":null}\,{"nodeName":"CONDITION"\,"choice":{"nodeName":"BOOLEAN_BINARY_EXPRESSION"\,"items":[{"nodeName":"CONDITION"\,"choice":{"nodeName":"COMPARISON_EXPRESSION"\,"items":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.endDate"\,"displayName":"endDate"\,"type":"DATE"\,"displayPath":"FORM/endDate/"\,"name":"endDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"IS_AFTER"\,"value":null}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.startDate"\,"displayName":"startDate"\,"type":"DATE"\,"displayPath":"FORM/startDate/"\,"name":"startDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}]}\,"nested":false}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"AND"\,"value":null}}\,{"nodeName":"CONDITION"\,"choice":{"nodeName":"COMPARISON_EXPRESSION"\,"items":[{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"COMPONENT"\,"value":{"id":"$form.endDate"\,"displayName":"endDate"\,"type":"DATE"\,"displayPath":"FORM/endDate/"\,"name":"endDate"\,"parent":"$form"\,"metadata":{"isAncestorRepeatable":false}}}}\,{"nodeName":"OPERATOR"\,"choice":{"nodeName":"IS_AFTER"\,"value":null}}\,{"nodeName":"EXPRESSION"\,"choice":{"nodeName":"FUNCTION_CALL"\,"parentNodeName":"EXPRESSION"\,"functionName":{"id":"today"\,"displayName":"Get Current Date"\,"type":"DATE"\,"isDuplicate":false\,"displayPath":""\,"args":[]\,"impl":"$0()"}\,"params":[]}}]}\,"nested":false}]}\,"nested":false}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":"dateToDaysSinceEpoch($field.$value)>dateToDaysSinceEpoch(startDate.$value) && dateToDaysSinceEpoch($field.$value)>dateToDaysSinceEpoch(today())"\,"eventName":"Validate"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events jcr:primaryType="nt:unstructured"/> + </datepicker_32726336> </guideContainer> </jcr:content> -</jcr:root> +</jcr:root> \ No newline at end of file diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/.content.xml new file mode 100644 index 0000000000..a0ac99e384 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/basic/.content.xml new file mode 100644 index 0000000000..b360bf824e --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/basic/.content.xml @@ -0,0 +1,611 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-08-20T06:03:38.597Z" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="basic" + sling:configRef="/conf/forms/core-components-it/samples/ruleeditor/basic/" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:version="2.1" + jcr:lastModified="{Date}2024-03-01T11:40:51.518Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + clientLibRef="corecomponent.it.customfunction,corecomponent.it.customfunction2" + dorType="none" + fieldType="form" + schemaType="none" + textIsRich="true" + thankYouMessage="Thank you for submitting the form." + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="basic"> + <panelcontainer + jcr:created="{Date}2024-08-20T05:46:41.397Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:46:41.397Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + fieldType="panel" + name="panelcontainer1724132801503"> + <textinput + jcr:created="{Date}2024-08-20T05:46:45.580Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:46:45.580Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132805682"/> + <textinput_592572998 + jcr:created="{Date}2024-08-20T05:46:49.573Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:46:49.573Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_5925729981724132809730"/> + <textinput_276253612 + jcr:created="{Date}2024-08-20T05:47:25.701Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:47:25.701Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_2762536121724132845769"/> + </panelcontainer> + <button_920958555 + jcr:created="{Date}2024-08-20T05:47:41.151Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:48:11.013Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="prevPanelButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="prevPanelButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.prevPanelButton"\,"type":"BUTTON"\,"name":"prevPanelButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"PREVIOUS_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.panelcontainer1724132801503"\,"displayName":"Panel"\,"type":"PANEL"\,"isDuplicate":true\,"displayPath":"FORM/Panel/"\,"name":"panelcontainer1724132801503"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(panelcontainer1724132801503\,'previousItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(panelcontainer1724132801503\,'previousItem')]"/> + </button_920958555> + <button_1360384985 + jcr:created="{Date}2024-08-20T05:48:17.353Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:48:35.971Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="nextPanelButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="nextPanelButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.nextPanelButton"\,"type":"BUTTON"\,"name":"nextPanelButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"NEXT_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.panelcontainer1724132801503"\,"displayName":"Panel"\,"type":"PANEL"\,"isDuplicate":true\,"displayPath":"FORM/Panel/"\,"name":"panelcontainer1724132801503"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(panelcontainer1724132801503\,'nextItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(panelcontainer1724132801503\,'nextItem')]"/> + </button_1360384985> + <wizard + jcr:created="{Date}2024-08-20T05:41:17.766Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:55:10.583Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="wizard" + sling:resourceType="forms-components-examples/components/form/wizard" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="wizard1724132477979" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <panelcontainer + cq:panelTitle="Panel1" + jcr:created="{Date}2024-08-20T05:41:28.489Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:55:37.948Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel1" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132488598" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:43:05.300Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:43:05.300Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132585412"/> + <textinput_1960755314 + jcr:created="{Date}2024-08-20T05:43:10.252Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:43:10.252Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_19607553141724132590339"/> + </panelcontainer> + <panelcontainer_15796169 + cq:panelTitle="Panel2" + jcr:created="{Date}2024-08-20T05:41:35.373Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:56:10.364Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel2" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132495462" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:43:19.104Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:43:19.104Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132599163"/> + <textinput_1899667374 + jcr:created="{Date}2024-08-20T05:43:23.422Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:43:23.422Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_18996673741724132603524"/> + </panelcontainer_15796169> + <panelcontainer_322216064 + cq:panelTitle="Panel3" + jcr:created="{Date}2024-08-20T05:41:53.392Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:56:17.641Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel3" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132513469" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:43:58.661Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:43:58.661Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132638729"/> + <textinput_2114577974 + jcr:created="{Date}2024-08-20T05:44:03.225Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:44:03.225Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_21145779741724132643355"/> + </panelcontainer_322216064> + </wizard> + <button_2090108647 + jcr:created="{Date}2024-08-20T05:48:51.105Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:51:52.786Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="prevWizardButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="prevWizardButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.prevWizardButton"\,"type":"BUTTON"\,"name":"prevWizardButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"PREVIOUS_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.wizard1724132477979"\,"displayName":"wizard"\,"type":"PANEL"\,"displayPath":"FORM/wizard/"\,"name":"wizard1724132477979"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(wizard1724132477979\,'previousItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(wizard1724132477979\,'previousItem')]"/> + </button_2090108647> + <button_2103930695 + jcr:created="{Date}2024-08-20T05:48:59.785Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:52:06.167Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="nextWizardButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="nextWizardButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.nextWizardButton"\,"type":"BUTTON"\,"name":"nextWizardButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"NEXT_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.wizard1724132477979"\,"displayName":"wizard"\,"type":"PANEL"\,"displayPath":"FORM/wizard/"\,"name":"wizard1724132477979"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(wizard1724132477979\,'nextItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(wizard1724132477979\,'nextItem')]"/> + </button_2103930695> + <tabsontop + jcr:created="{Date}2024-08-20T05:44:28.485Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:44:28.485Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Tabs on top" + sling:resourceType="forms-components-examples/components/form/tabsontop" + fieldType="panel" + name="tabsontop1724132668558"> + <panelcontainer_1722670736 + jcr:created="{Date}2024-08-20T05:44:41.934Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:56:45.785Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel1" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132682027" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:44:59.828Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:44:59.828Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132699915"/> + <textinput_68142554 + jcr:created="{Date}2024-08-20T05:45:04.472Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:45:04.472Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_681425541724132704567"/> + </panelcontainer_1722670736> + <panelcontainer + jcr:created="{Date}2024-08-20T05:44:34.668Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:56:50.867Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel2" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132674771" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:45:11.965Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:45:11.965Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132712026"/> + <textinput_1790542498 + jcr:created="{Date}2024-08-20T05:45:16.308Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:45:16.308Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_17905424981724132716399"/> + </panelcontainer> + <panelcontainer_231040443 + jcr:created="{Date}2024-08-20T05:44:53.416Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:56:55.223Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel3" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer_2310404431724132693524" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:45:23.825Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:45:23.825Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132723980"/> + <textinput_1391907407 + jcr:created="{Date}2024-08-20T05:45:27.918Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:45:27.918Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput_13919074071724132728073"/> + </panelcontainer_231040443> + </tabsontop> + <button_1127527511 + jcr:created="{Date}2024-08-20T05:49:39.522Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:52:34.676Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="prevHorizontalTabButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="prevHorizontalTabButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.prevHorizontalTabButton"\,"type":"BUTTON"\,"name":"prevHorizontalTabButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"PREVIOUS_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.tabsontop1724132668558"\,"displayName":"Tabs on top"\,"type":"PANEL"\,"displayPath":"FORM/Tabs on top/"\,"name":"tabsontop1724132668558"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(tabsontop1724132668558\,'previousItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(tabsontop1724132668558\,'previousItem')]"/> + </button_1127527511> + <button_2033971630 + jcr:created="{Date}2024-08-20T05:49:45.075Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:52:42.121Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="nextHorizontalTabButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="nextHorizontalTabButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.nextHorizontalTabButton"\,"type":"BUTTON"\,"name":"nextHorizontalTabButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"NEXT_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.tabsontop1724132668558"\,"displayName":"Tabs on top"\,"type":"PANEL"\,"displayPath":"FORM/Tabs on top/"\,"name":"tabsontop1724132668558"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(tabsontop1724132668558\,'nextItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(tabsontop1724132668558\,'nextItem')]"/> + </button_2033971630> + <verticaltabs + jcr:created="{Date}2024-08-20T05:45:39.516Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:45:39.516Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Vertical Tabs" + sling:resourceType="forms-components-examples/components/form/verticaltabs" + fieldType="panel" + name="verticaltabs1724132739699"> + <panelcontainer_1803535858 + jcr:created="{Date}2024-08-20T05:45:53.154Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:57:02.736Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel1" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132753267" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:46:12.137Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:46:12.137Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724132772204"/> + </panelcontainer_1803535858> + <panelcontainer + jcr:created="{Date}2024-08-20T05:45:46.624Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:57:08.233Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel2" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer1724132746707" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:58:02.142Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:58:02.142Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724133482273"/> + </panelcontainer> + <panelcontainer_1913220440 + jcr:created="{Date}2024-08-20T05:46:06.760Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:57:12.907Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Panel3" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + name="panelcontainer_19132204401724132766820" + readOnly="{Boolean}false" + repeatable="false" + textIsRich="[true,true,true]" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <textinput + jcr:created="{Date}2024-08-20T05:58:10.720Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:58:10.720Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Text Input" + sling:resourceType="forms-components-examples/components/form/textinput" + fieldType="text-input" + name="textinput1724133490828"/> + </panelcontainer_1913220440> + </verticaltabs> + <button_1298511544 + jcr:created="{Date}2024-08-20T05:50:12.695Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:52:56.512Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="prevVerticalTabButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="prevVerticalTabButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.prevVerticalTabButton"\,"type":"BUTTON"\,"name":"prevVerticalTabButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"PREVIOUS_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.verticaltabs1724132739699"\,"displayName":"Vertical Tabs"\,"type":"PANEL"\,"displayPath":"FORM/Vertical Tabs/"\,"name":"verticaltabs1724132739699"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(verticaltabs1724132739699\,'previousItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(verticaltabs1724132739699\,'previousItem')]"/> + </button_1298511544> + <button_1703499281 + jcr:created="{Date}2024-08-20T05:50:17.798Z" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-08-20T05:53:05.344Z" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="nextVerticalTabButton" + sling:resourceType="forms-components-examples/components/form/button" + dorExclusion="true" + enabled="{Boolean}true" + fieldType="button" + name="nextVerticalTabButton" + textIsRich="[true,true,true]" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.nextVerticalTabButton"\,"type":"BUTTON"\,"name":"nextVerticalTabButton"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"NAVIGATE_IN_PANEL"\,"items":[{"nodeName":"focus"\,"value":null}\,{"nodeName":"PANEL_FOCUS_OPTION"\,"choice":{"nodeName":"NEXT_ITEM"\,"items":[]}}\,{"nodeName":"of"\,"value":null}\,{"nodeName":"PANEL"\,"value":{"id":"$form.verticaltabs1724132739699"\,"displayName":"Vertical Tabs"\,"type":"PANEL"\,"displayPath":"FORM/Vertical Tabs/"\,"name":"verticaltabs1724132739699"\,"parent":"$form"}}]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["setFocus(verticaltabs1724132739699\,'nextItem')"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured" + validationStatus="valid"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[setFocus(verticaltabs1724132739699\,'nextItem')]"/> + </button_1703499281> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/blank/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/blank/.content.xml new file mode 100644 index 0000000000..79292d6e30 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/blank/.content.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-08-20T10:32:12.710Z" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="blank" + sling:configRef="/conf/forms/core-components-it/samples/ruleeditor/navigate-in-panel/blank/" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:version="2.1" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + dorType="none" + fieldType="form" + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="blank"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/testsvg/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/testsvg/.content.xml new file mode 100755 index 0000000000..8b9b24a8ec --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/testsvg/.content.xml @@ -0,0 +1,489 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-11-28T13:17:23.620+05:30" + cq:template="/conf/core-components-it/settings/wcm/templates/blank" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="testSvg" + sling:configRef="/conf/forms/core-components-it/samples/testsvg" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:version="2.1" + jcr:lastModified="{Date}2024-11-28T13:17:23.618+05:30" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + dorType="none" + fieldType="form" + schemaType="none" + specVersion="0.14.2" + thankYouMessage="<p>Thank you for submitting the form.</p> " + thankYouOption="page" + themeRef="/libs/fd/af/themes/canvas" + title="testSvg"> + <text + jcr:created="{Date}2024-11-20T15:40:37.758+05:30" + jcr:lastModified="{Date}2024-11-20T15:40:37.758+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Text" + sling:resourceType="forms-components-examples/components/form/text" + fieldType="plain-text" + name="text1732097437796"/> + <svgselector + jcr:created="{Date}2024-11-20T16:33:22.473+05:30" + jcr:lastModified="{Date}2024-11-20T16:50:48.635+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Configrator" + sling:resourceType="forms-core-components-it/components/svgSelector" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + layout="responsiveGrid" + name="svgselector1732100602505" + readOnly="{Boolean}false" + repeatable="false" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <imageSelectionPanel + jcr:created="{Date}2024-11-20T17:18:27.996+05:30" + jcr:lastModified="{Date}2024-11-20T17:19:15.452+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Image Selection" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + layout="responsiveGrid" + name="imageSelectionPanel" + readOnly="{Boolean}false" + repeatable="false" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <svg + jcr:created="{Date}2024-11-20T16:26:16.262+05:30" + jcr:lastModified="{Date}2024-11-28T13:15:33.450+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Configrator" + sling:resourceType="forms-core-components-it/components/svg" + height="1794" + value="<path d="M0 0 C0.66 1.65 1.32 3.3 2 5 C-1.39512258 7.92357778 -5.07969082 9.24908054 -9.25 10.6875 C-17.86533392 13.79645165 -25.93021911 17.68513756 -34 22 C-34.60585937 22.32226562 -35.21171875 22.64453125 -35.8359375 22.9765625 C-61.57568928 36.80184402 -85.21131671 57.05787775 -102 81 C-102.39171387 81.54205078 -102.78342773 82.08410156 -103.18701172 82.64257812 C-119.72654656 105.5812982 -131.60494464 132.23244235 -137 160 C-136.23816406 159.16597656 -135.47632813 158.33195313 -134.69140625 157.47265625 C-131.9889162 154.52156528 -129.27027915 151.58590764 -126.54248047 148.65820312 C-125.25315452 147.27214712 -123.97134869 145.87910078 -122.69140625 144.484375 C-108.94448697 130.03581712 -89.23449751 118.28114137 -69 117 C-68.21496094 116.93554688 -67.42992187 116.87109375 -66.62109375 116.8046875 C-54.53821301 116.26446929 -39.89136819 119.8453033 -30 127 C-29.05859375 129.0625 -29.05859375 129.0625 -29 131 C-32.0082196 134.0082196 -35.45797506 133.3401736 -39.5 133.4375 C-64.61370041 134.45861435 -88.4077585 140.56650764 -108 157 C-109.010625 157.763125 -110.02125 158.52625 -111.0625 159.3125 C-116.65621801 164.43015691 -121.21681409 170.44091606 -125 177 C-124.01644531 176.7834375 -123.03289062 176.566875 -122.01953125 176.34375 C-99.32323852 171.66461702 -75.32289609 172.14182372 -55.1875 184.875 C-42.87749486 193.65835502 -36.60144747 205.43847186 -33 220 C-32.81308594 220.73734375 -32.62617187 221.4746875 -32.43359375 222.234375 C-31.80903353 225.31115586 -31.82027413 226.69524744 -33.4375 229.4375 C-33.953125 229.953125 -34.46875 230.46875 -35 231 C-40.38262994 229.51046719 -44.58722729 226.96120902 -49.25 224 C-57.58987506 218.80863514 -66.05747715 213.93128068 -74.69384766 209.25146484 C-76.25858895 208.40233676 -77.82068883 207.54832654 -79.38037109 206.68994141 C-89.98966656 200.85600986 -100.52778603 195.89264088 -112 192 C-112 192.99 -112 193.98 -112 195 C-110.97261719 195.54527344 -109.94523437 196.09054688 -108.88671875 196.65234375 C-91.40196609 206.09195183 -77.37301508 217.16305196 -71.42578125 236.90625 C-69.01224233 248.77466159 -72.13861621 259.5969917 -78.25 269.75 C-87.88661355 283.99009136 -100.59867915 290.29933957 -116 298 C-2.81 298.33 110.38 298.66 227 299 C227 238.94 227 178.88 227 117 C225.02 117 223.04 117 221 117 C221.875 111.25 221.875 111.25 223 109 C577.42 109 931.84 109 1297 109 C1297 104.38 1297 99.76 1297 95 C1299.3061022 99.61220441 1299.66359139 103.69180478 1300.12304688 108.71679688 C1300.51778169 112.44010637 1301.18115877 115.67105721 1302.5181883 119.1764006 C1304.16223765 124.01192352 1304.41733613 128.34121682 1304.36914349 133.41587162 C1304.37260502 134.32447102 1304.37606655 135.23307042 1304.37963298 136.16920313 C1304.3875575 139.20599287 1304.37412852 142.24230294 1304.36076355 145.27906799 C1304.36207217 147.48123042 1304.36469964 149.68339239 1304.36853105 151.88555187 C1304.37523671 157.93091492 1304.36324207 163.97611841 1304.34819686 170.02146113 C1304.33657282 175.87292682 1304.33907883 181.72437501 1304.34124239 187.57584935 C1304.34517998 199.54252147 1304.33517553 211.50914382 1304.31719017 223.47580147 C1304.29943138 235.32211109 1304.28789077 247.16839998 1304.28463173 259.01472282 C1304.28442551 259.75164065 1304.28421929 260.48855848 1304.28400682 261.24780716 C1304.28299181 264.99033041 1304.28208766 268.73285367 1304.2812262 272.47537696 C1304.27492709 298.97489106 1304.25472097 325.47437809 1304.22631836 351.97387695 C1304.19875967 377.71573747 1304.17751147 403.45759058 1304.16479492 429.19946289 C1304.16440034 429.9931169 1304.16400576 430.78677091 1304.16359923 431.60447504 C1304.15964363 439.57476717 1304.15581619 447.54505935 1304.15208265 455.51535159 C1304.14447427 471.75135926 1304.13601052 487.98736645 1304.12702942 504.22337341 C1304.12661755 504.96985791 1304.12620568 505.71634241 1304.12578133 506.48544765 C1304.09818526 556.32364326 1304.0505879 606.161823 1304 656 C1306.31 656 1308.62 656 1311 656 C1310.01 658.31 1309.02 660.62 1308 663 C1303.38 663 1298.76 663 1294 663 C1294 827.34 1294 991.68 1294 1161 C1294.99 1161 1295.98 1161 1297 1161 C1297 1156.38 1297 1151.76 1297 1147 C1297.33 1147 1297.66 1147 1298 1147 C1298.26554687 1147.96421875 1298.53109375 1148.9284375 1298.8046875 1149.921875 C1299.15789063 1151.18515625 1299.51109375 1152.4484375 1299.875 1153.75 C1300.39707031 1155.62945313 1300.39707031 1155.62945313 1300.9296875 1157.546875 C1301.82624874 1160.82367521 1301.82624874 1160.82367521 1303.05096897 1162.96796395 C1304.66741274 1166.42904362 1304.27768604 1170.18854771 1304.26171303 1173.94118881 C1304.26570909 1174.85921435 1304.26970515 1175.77723989 1304.27382231 1176.72308439 C1304.28485538 1179.82193334 1304.28158702 1182.92060547 1304.2784729 1186.01947021 C1304.28347242 1188.2544415 1304.2893472 1190.48941097 1304.29602563 1192.72437787 C1304.3118812 1198.88360109 1304.31525936 1205.04277877 1304.31667423 1211.20201993 C1304.31998054 1217.15646677 1304.33262886 1223.11089152 1304.3450741 1229.06532462 C1304.37021301 1241.24818248 1304.38606601 1253.431036 1304.39665604 1265.61391449 C1304.40717415 1277.67927742 1304.42180155 1289.7446238 1304.44193649 1301.80997467 C1304.44318536 1302.55971332 1304.44443423 1303.30945197 1304.44572094 1304.08190997 C1304.45208455 1307.88933854 1304.45852177 1311.69676697 1304.46498732 1315.50419536 C1304.51066943 1342.48341979 1304.54710875 1369.46264959 1304.578125 1396.44189453 C1304.60828098 1422.65446764 1304.6426158 1448.86702983 1304.68261719 1475.07958984 C1304.68384819 1475.88734799 1304.68507919 1476.69510613 1304.6863475 1477.52734179 C1304.69871419 1485.63906279 1304.71116592 1493.75078366 1304.72367998 1501.86250443 C1304.74917141 1518.38752256 1304.77409509 1534.91254153 1304.79867554 1551.43756104 C1304.79980645 1552.19738138 1304.80093736 1552.95720173 1304.80210253 1553.74004694 C1304.87757816 1604.49335201 1304.93977685 1655.2466748 1305 1706 C1304.28769191 1706.00022806 1303.57538382 1706.00045612 1302.84149063 1706.00069109 C1242.34834713 1706.02006751 1181.85520379 1706.03989818 1121.36206055 1706.06005859 C1119.56541562 1706.0606573 1119.56541562 1706.0606573 1117.73247484 1706.0612681 C1031.4953578 1706.09001358 945.25824062 1706.11891363 734.95208353 1706.20046684 C732.81774432 1706.20132518 730.6834051 1706.2021831 728.54906589 1706.20304088 C668.07309458 1706.22734665 607.59712344 1706.25203997 547.1211525 1706.27725234 C544.88292605 1706.27818545 542.64469959 1706.27911854 540.40647314 1706.28005161 C539.66722624 1706.28035979 538.92797933 1706.28066798 538.166331 1706.2809855 C510.3692843 1706.29257271 482.57223757 1706.30407135 454.77519081 1706.31551713 C451.75496548 1706.31676083 448.73474014 1706.31800554 445.71451481 1706.31925117 C374.40753711 1706.34865945 303.1005593 1706.37647365 231.7935791 1706.39910889 C230.6674151 1706.39946654 230.6674151 1706.39946654 229.5185003 1706.39983141 C204.55120418 1706.40775808 179.58390801 1706.41553025 154.61661183 1706.42328111 C132.0578752 1706.43028473 109.49913859 1706.43734381 86.94040203 1706.4445858 C86.19935878 1706.44482367 85.45831553 1706.44506155 84.69481642 1706.44530663 C38.2994745 1706.46021391 -8.09586606 1706.47752305 -54.49120617 1706.49726295 C-55.20756046 1706.49756743 -55.92391475 1706.4978719 -56.66197674 1706.49818559 C-88.11966618 1706.51155791 -119.57735539 1706.52543154 -151.03504436 1706.53987876 C-163.68985652 1706.54568828 -176.34466871 1706.5514235 -188.99948093 1706.55711805 C-191.09777763 1706.55806288 -193.19607433 1706.55901012 -195.29437103 1706.55995762 C-227.40814815 1706.57444159 -259.52192484 1706.58726379 -291.63570428 1706.59528303 C-292.32878066 1706.59545613 -293.02185705 1706.59562922 -293.73593574 1706.59580756 C-304.88576383 1706.59858209 -316.03559194 1706.60121859 -327.18542006 1706.60383128 C-372.83695901 1706.6145287 -418.48849081 1706.63123765 -464.14002428 1706.65705032 C-470.34381234 1706.66055656 -476.54760043 1706.6639914 -482.75138855 1706.66738319 C-484.57567031 1706.66838445 -484.57567031 1706.66838445 -486.43680626 1706.66940594 C-505.74439029 1706.67981755 -525.05196956 1706.68348349 -544.35955613 1706.68437787 C-563.31518589 1706.68539315 -582.27080153 1706.69345186 -601.22642493 1706.70915592 C-612.35889598 1706.71816234 -623.49133636 1706.72161238 -634.62381032 1706.71708247 C-641.99959521 1706.71461966 -649.37535239 1706.71928712 -656.75112993 1706.72997108 C-660.94365489 1706.73583777 -665.13611597 1706.73847718 -669.32864207 1706.73239125 C-673.12512125 1706.72693717 -676.92147569 1706.73051441 -680.71794163 1706.74159838 C-682.73582666 1706.74508538 -684.75372123 1706.73868869 -686.77159814 1706.7319834 C-688.5488442 1706.73992498 -688.5488442 1706.73992498 -690.36199423 1706.74802699 C-691.38641955 1706.74841103 -692.41084487 1706.74879507 -693.46631338 1706.74919075 C-696.24492604 1706.8238119 -696.24492604 1706.8238119 -699 1709 C-702.0625 1709.25 -702.0625 1709.25 -705 1709 C-705.66 1708.34 -706.32 1707.68 -707 1707 C-709.85199673 1706.79931247 -712.60733021 1706.72586868 -715.4608326 1706.73828697 C-716.35122484 1706.73429091 -717.24161709 1706.73029485 -718.15899092 1706.72617769 C-721.17588308 1706.71511163 -724.19259462 1706.71841753 -727.20950317 1706.7215271 C-729.38087641 1706.71652943 -731.55224777 1706.71065521 -733.72361648 1706.70397437 C-739.71633503 1706.68809626 -745.7090068 1706.68473941 -751.70174384 1706.68332577 C-758.15440708 1706.67964528 -764.60704425 1706.66449667 -771.05969238 1706.65071106 C-782.24796294 1706.62804613 -793.43622693 1706.61333724 -804.62451553 1706.60334396 C-816.36218354 1706.59282973 -828.0998345 1706.57820665 -839.83749008 1706.55806351 C-840.56657101 1706.55681464 -841.29565194 1706.55556577 -842.04682622 1706.55427906 C-845.74927203 1706.54791554 -849.45171771 1706.54147831 -853.15416335 1706.53501268 C-879.39687475 1706.48931742 -905.63959169 1706.45288375 -931.88232422 1706.421875 C-957.38103038 1706.39172426 -982.87972529 1706.35739189 -1008.37841797 1706.31738281 C-1009.16402833 1706.31615181 -1009.94963868 1706.31492081 -1010.75905542 1706.3136525 C-1018.64828466 1706.30128593 -1026.53751377 1706.28883418 -1034.42674278 1706.27632002 C-1050.49883972 1706.25082785 -1066.57093753 1706.22590431 -1082.64303589 1706.20132446 C-1083.38204848 1706.20019355 -1084.12106108 1706.19906264 -1084.88246799 1706.19789747 C-1134.25496569 1706.12240806 -1183.62748157 1706.06021652 -1233 1706 C-1233 1703.69 -1233 1701.38 -1233 1699 C-1232.01 1699 -1231.02 1699 -1230 1699 C-1230 1239.64 -1230 780.28 -1230 307 C-1230.66 307 -1231.32 307 -1232 307 C-1232 304.36 -1232 301.72 -1232 299 C-1093.4 298.505 -1093.4 298.505 -952 298 C-959.92 294.04 -959.92 294.04 -968 290 C-978.99345014 283.09713596 -988.20784721 274.77546574 -994 263 C-994.33902344 262.3296875 -994.67804688 261.659375 -995.02734375 260.96875 C-998.69407278 252.18211822 -998.41194257 240.13260903 -995.5 231.125 C-990.79374401 220.18253907 -982.40605509 211.12579931 -973 204 C-973.969375 203.38125 -974.93875 202.7625 -975.9375 202.125 C-979 200 -979 200 -980 198 C-986.62366442 197.74193515 -992.59347255 198.68031491 -999.0625 200.0625 C-1000.09802002 200.2785791 -1001.13354004 200.4946582 -1002.20043945 200.71728516 C-1010.83149906 202.59005609 -1019.22847323 205.04403629 -1027.59985352 207.85180664 C-1028.49889404 208.14563232 -1029.39793457 208.43945801 -1030.32421875 208.7421875 C-1031.10885498 209.0088623 -1031.89349121 209.27553711 -1032.7019043 209.55029297 C-1035.45874268 210.08976989 -1037.32552973 209.82497231 -1040 209 C-1042.36194127 205.45708809 -1042.22699677 202.12032729 -1041.51953125 197.984375 C-1040.42304625 193.79629695 -1038.60551298 191.14632975 -1035.07421875 188.625 C-1015.45454714 177.54565603 -988.51126955 181.22152549 -967 183 C-972.86200764 176.95399286 -978.77646069 171.39960124 -985.359375 166.140625 C-987.75102322 164.20183325 -990.03735028 162.19791419 -992.3125 160.125 C-997.65940519 155.32601089 -1003.32633097 150.950133 -1009.00195312 146.55224609 C-1011.08509895 144.93388818 -1013.16030155 143.30574678 -1015.234375 141.67578125 C-1023.8903362 134.88780636 -1032.6338473 128.24598267 -1041.54370117 121.79370117 C-1046.22279108 118.38735623 -1050.65330243 114.82279098 -1055 111 C-1054.67 109.35 -1054.34 107.7 -1054 106 C-1035.10807724 104.37138597 -1016.36691875 118.05759074 -1002 129 C-1001.40268066 129.45310547 -1000.80536133 129.90621094 -1000.18994141 130.37304688 C-992.47628544 136.25365281 -985.09480654 142.37927039 -978 149 C-982.66834838 139.52906959 -987.47105471 130.13094618 -992.33499146 120.75909424 C-1002.64430927 100.88844821 -1012.61469495 80.915782 -1021.95703125 60.5703125 C-1023.8017041 56.56015413 -1025.68078353 52.57424705 -1027.63671875 48.6171875 C-1028.02061768 47.83384033 -1028.4045166 47.05049316 -1028.80004883 46.2434082 C-1029.49028557 44.84302554 -1030.19109077 43.447775 -1030.9050293 42.05932617 C-1032.30704364 39.1970863 -1033.02796546 37.33242816 -1032.7578125 34.12109375 C-1032 32 -1032 32 -1031 31 C-1010.29501204 29.23208641 -989.41663573 36.08646795 -973.3828125 49.12890625 C-957.17870398 63.28903148 -946.89010876 80.16935805 -939 100 C-938.93006836 99.14994385 -938.86013672 98.2998877 -938.78808594 97.42407227 C-936.14177098 65.98950951 -931.61013754 36.52436771 -910 12 C-909.16082031 11.01966797 -909.16082031 11.01966797 -908.3046875 10.01953125 C-906.75 8.3125 -906.75 8.3125 -904 6 C-900.51612903 6.48387097 -900.51612903 6.48387097 -899 8 C-899.08416843 17.63094368 -901.03851749 27.30806892 -902.52603149 36.80172729 C-904.8208369 51.50172347 -906.96858864 66.14904705 -908 81 C-908.11043646 82.39324826 -908.22111107 83.78647767 -908.33203125 85.1796875 C-910.28595241 111.47388365 -910.90826933 139.47970227 -900 164 C-898.46683333 161.11572243 -897.39034462 158.29096967 -896.44140625 155.16796875 C-886.16127518 122.28212443 -869.79058873 88.02685341 -838.5703125 70.30859375 C-816.73463545 59.19164571 -794.47256382 58.91774508 -771.3125 66.1875 C-751.86334746 73.13665254 -751.86334746 73.13665254 -746 79 C-746.375 81.625 -746.375 81.625 -747 84 C-748.57807409 84.28803947 -750.15621357 84.57572069 -751.734375 84.86328125 C-752.74306641 85.04713379 -753.75175781 85.23098633 -754.79101562 85.42041016 C-756.8512721 85.79252282 -758.9124099 86.15980653 -760.97460938 86.52099609 C-797.0114583 92.83630618 -840.82342427 104.55905773 -863.375 136.25390625 C-869.38109812 145.07429035 -874.4901756 154.30541051 -876 165 C-875.51345947 164.72849121 -875.02691895 164.45698242 -874.52563477 164.17724609 C-852.90108596 152.20610663 -828.84700908 141.69256727 -803.625 147.125 C-792.28356491 150.43995261 -782.52072109 157.55990814 -776.6953125 167.92578125 C-773.57778941 173.84376813 -770.75418289 179.26472779 -770 186 C-773.93290478 188.62193652 -777.31115678 188.30736166 -781.87768555 188.31884766 C-782.78520569 188.32889328 -783.69272583 188.3389389 -784.62774658 188.34928894 C-787.63073079 188.38020702 -790.63362551 188.39718006 -793.63671875 188.4140625 C-795.71752192 188.43276721 -797.79831745 188.45234009 -799.87910461 188.4727478 C-805.35844424 188.52414865 -810.83780849 188.56373182 -816.31726074 188.60089111 C-821.90753304 188.64088093 -827.49770225 188.69199615 -833.08789062 188.7421875 C-844.05852142 188.83904095 -855.02921031 188.92341558 -866 189 C-864.97324661 189.33569504 -863.94649323 189.67139008 -862.8886261 190.01725769 C-861.52637285 190.46603918 -860.16416731 190.9149655 -858.80200195 191.36401367 C-857.78958813 191.69438251 -857.78958813 191.69438251 -856.7567215 192.03142548 C-851.63927265 193.72314652 -846.89930143 195.71260158 -842.1875 198.3125 C-841.4773877 198.69712402 -840.76727539 199.08174805 -840.03564453 199.47802734 C-834.17249004 202.73652392 -828.96420887 206.4768456 -824 211 C-823.36964844 211.53882813 -822.73929688 212.07765625 -822.08984375 212.6328125 C-813.31921732 220.61311875 -808.35983143 231.31394861 -807 243 C-806.49971541 255.27260644 -811.16042332 265.76588324 -819 275 C-819.75410156 275.96292969 -820.50820313 276.92585938 -821.28515625 277.91796875 C-823.95546831 281.11118787 -827.04260351 283.55368379 -830.4375 285.9375 C-830.96537109 286.32873047 -831.49324219 286.71996094 -832.03710938 287.12304688 C-838.38290624 291.64125424 -844.81808648 294.40904324 -852 298 C-642.12 298 -432.24 298 -216 298 C-221.28 295.36 -226.56 292.72 -232 290 C-245.81504677 280.3952532 -257.03172266 270.0100877 -261 253 C-262.60278972 238.82021743 -258.67607815 228.04409031 -250 217 C-249.278125 215.989375 -248.55625 214.97875 -247.8125 213.9375 C-239.90136786 204.84865887 -228.58948037 199.30920669 -218 194 C-221.78317807 191.35187741 -224.02608361 190.66088874 -228.61181641 191.07080078 C-229.72085327 191.16152863 -230.82989014 191.25225647 -231.97253418 191.34573364 C-233.17011353 191.46109467 -234.36769287 191.57645569 -235.6015625 191.6953125 C-236.8553772 191.80269745 -238.10919189 191.9100824 -239.40100098 192.02072144 C-242.08687054 192.25312936 -244.77134668 192.49153853 -247.45562744 192.74072266 C-251.6263058 193.12770086 -255.79894016 193.48938557 -259.97216797 193.84765625 C-271.0092579 194.80087439 -282.04157295 195.80372352 -293.06900024 196.86325073 C-296.35522457 197.17818356 -299.64226986 197.48398817 -302.92938232 197.78948975 C-305.08295168 197.99596851 -307.23384896 198.22192305 -309.38525391 198.44970703 C-310.64257324 198.56942871 -311.89989258 198.68915039 -313.1953125 198.8125 C-314.25766113 198.92207031 -315.32000977 199.03164062 -316.41455078 199.14453125 C-319 199 -319 199 -320.86279297 197.6953125 C-322.37395133 195.44252511 -322.14842289 193.81738199 -321.63671875 191.21484375 C-317.76410821 177.74386106 -310.74066329 165.53798173 -298.29296875 158.4609375 C-289.69867662 154.35010126 -281.3705626 152.61819655 -271.875 152.6875 C-271.0487915 152.69313965 -270.22258301 152.6987793 -269.37133789 152.70458984 C-251.58017819 153.05118202 -233.84258995 159.1136006 -218 167 C-221.27671377 155.8955811 -226.15961902 147.3320761 -234.2421875 138.99609375 C-236 137 -236 137 -236 135 C-236.57234375 134.74347656 -237.1446875 134.48695313 -237.734375 134.22265625 C-240.2279162 132.87700384 -242.1080004 131.2911535 -244.25 129.4375 C-271.97850415 107.11746682 -309.63761167 100.67555491 -344.18969727 98.73364258 C-345.30401123 98.66556396 -346.4183252 98.59748535 -347.56640625 98.52734375 C-348.56615479 98.47312256 -349.56590332 98.41890137 -350.59594727 98.36303711 C-353 98 -353 98 -355 96 C-354.98828125 93.62109375 -354.98828125 93.62109375 -354 91 C-351.48046875 88.97265625 -351.48046875 88.97265625 -348.1875 87.0625 C-347.60145996 86.72114014 -347.01541992 86.37978027 -346.41162109 86.02807617 C-344.61912764 84.996729 -342.81304764 83.99468948 -341 83 C-340.00871094 82.44828125 -339.01742187 81.8965625 -337.99609375 81.328125 C-330.29890169 77.26484538 -322.31863808 74.45756866 -314 72 C-313.18402344 71.75121094 -312.36804687 71.50242187 -311.52734375 71.24609375 C-291.74164663 66.25605021 -271.09156643 70.92437691 -253.77636719 80.91015625 C-249.07309125 83.79572851 -245.02585856 87.24757403 -241 91 C-240.24106445 91.68956787 -240.24106445 91.68956787 -239.46679688 92.39306641 C-219.33811785 110.80359269 -204.97363011 136.39774278 -196 162 C-196 162.99 -196 163.98 -196 165 C-195.34 165 -194.68 165 -194 165 C-193.71125 163.72125 -193.4225 162.4425 -193.125 161.125 C-192.96257812 160.40570313 -192.80015625 159.68640625 -192.6328125 158.9453125 C-192.42398437 157.97335938 -192.21515625 157.00140625 -192 156 C-191.83822266 155.26740967 -191.67644531 154.53481934 -191.50976562 153.7800293 C-183.8625895 117.77457504 -193.05364496 78.39436986 -201.125 43.125 C-201.28881165 42.40900635 -201.45262329 41.6930127 -201.62139893 40.95532227 C-203.56162402 32.54208176 -205.72756843 24.24044423 -208.26123047 15.98388672 C-208.96472414 13.14247902 -209.30595132 10.90621949 -209 8 C-208.34 7.34 -207.68 6.68 -207 6 C-199.80359826 6.71369273 -193.57072808 15.09776465 -189.13671875 20.24609375 C-162.20926972 54.95148967 -159.55160676 98.80893785 -162 141 C-161.68289063 139.8346875 -161.36578125 138.669375 -161.0390625 137.46875 C-147.66885315 89.89796834 -120.90887205 44.81805811 -77 20 C-76.36368652 19.63922363 -75.72737305 19.27844727 -75.07177734 18.90673828 C-52.49853128 6.34932081 -25.84500548 -0.48764161 0 0 Z M611 160 C611 230.29 611 300.58 611 373 C824.18 373 1037.36 373 1257 373 C1257 302.71 1257 232.42 1257 160 C1043.82 160 830.64 160 611 160 Z M-1183 345 C-1183 434.43 -1183 523.86 -1183 616 C-1115.68 616 -1048.36 616 -979 616 C-980.32 614.35 -981.64 612.7 -983 611 C-983.66 611 -984.32 611 -985 611 C-985.26941406 610.42636719 -985.53882813 609.85273437 -985.81640625 609.26171875 C-987.0267408 606.94890124 -988.41906892 604.93366709 -989.9375 602.8125 C-996.87803153 592.46941521 -997.1509887 581.36535339 -997.14526367 569.25463867 C-997.14862228 568.21921432 -997.1519809 567.18378998 -997.15544128 566.11698914 C-997.16488696 562.71730324 -997.16689113 559.31766693 -997.16796875 555.91796875 C-997.17118561 553.53819255 -997.17455 551.15841654 -997.17805481 548.77864075 C-997.18403001 543.79830466 -997.18589635 538.8179859 -997.18530273 533.83764648 C-997.18520117 527.47959201 -997.1988549 521.12164934 -997.21607494 514.76362133 C-997.22723377 509.85032142 -997.22922075 504.93704823 -997.22869301 500.02373695 C-997.22986721 497.68076505 -997.23425729 495.33779232 -997.24202538 492.99483299 C-997.25190451 489.70765891 -997.24891619 486.42072346 -997.24291992 483.13354492 C-997.24853943 482.18094788 -997.25415894 481.22835083 -997.25994873 480.24688721 C-997.19199203 465.46765118 -994.39754796 451.98688266 -984 441 C-978.8585509 436.52322493 -973.13591842 432.95433109 -967 430 C-967.33 429.34 -967.66 428.68 -968 428 C-968.41067154 423.37994513 -967.93664706 420.6454929 -965 417 C-961.34867341 415.18307253 -958.36347085 414.74438657 -954.31103516 414.7253418 C-953.19282379 414.71580978 -952.07461243 414.70627777 -950.92251587 414.69645691 C-949.72347626 414.69736832 -948.52443665 414.69827972 -947.2890625 414.69921875 C-945.42681534 414.69279106 -945.42681534 414.69279106 -943.52694702 414.68623352 C-940.23178967 414.67902722 -936.93681535 414.68210923 -933.6416626 414.68780518 C-931.6298088 414.68750073 -929.61825006 414.67746996 -927.60644531 414.66381836 C-923.7296778 414.63928487 -919.85339807 414.63516446 -915.9765625 414.63671875 C-914.78157135 414.627509 -913.5865802 414.61829926 -912.3553772 414.60881042 C-906.14961873 414.64318466 -901.43435915 414.88149481 -896 418 C-894.22093078 420.30232487 -893.99469311 421.46577265 -894.0234375 424.359375 C-894.13945313 425.14828125 -894.25546875 425.9371875 -894.375 426.75 C-894.48585938 427.54921875 -894.59671875 428.3484375 -894.7109375 429.171875 C-894.85402344 430.07679688 -894.85402344 430.07679688 -895 431 C-893.83984375 431.52787109 -893.83984375 431.52787109 -892.65625 432.06640625 C-880.24089212 437.95140881 -872.34919947 444.829198 -867.44248962 457.90615845 C-865.55049053 463.69735936 -865.57162745 469.27536553 -865.59594727 475.32177734 C-865.58565239 477.12603935 -865.58565239 477.12603935 -865.57514954 478.9667511 C-865.56006245 482.24175914 -865.55836611 485.51640705 -865.56409192 488.79143476 C-865.56720001 491.5371565 -865.56107332 494.28282766 -865.55505317 497.02854216 C-865.54104441 503.51256116 -865.54253819 509.99644831 -865.55395508 516.48046875 C-865.56542809 523.14309837 -865.55136638 529.80532505 -865.5245586 536.46790159 C-865.50231964 542.21260971 -865.4957827 547.95719212 -865.50163502 553.70194018 C-865.50498689 557.12224716 -865.50270906 560.54229609 -865.48538399 563.96256638 C-865.47042983 567.78182282 -865.48118544 571.60020367 -865.49829102 575.41943359 C-865.48862305 576.53458847 -865.47895508 577.64974335 -865.46899414 578.7986908 C-865.56206755 588.77298666 -868.25591181 596.99518207 -873.8515625 605.24609375 C-875.0680933 607.01714676 -875.0680933 607.01714676 -876.0234375 609.15625 C-877.27932289 611.52736162 -878.61629181 611.88263679 -881 613 C-881.66 613.99 -882.32 614.98 -883 616 C-854.62 616 -826.24 616 -797 616 C-798.65 614.35 -800.3 612.7 -802 611 C-812.60837231 599.2903348 -815.14454086 587.13908414 -815.16113281 571.85498047 C-815.16609772 570.75317947 -815.17106262 569.65137848 -815.17617798 568.51618958 C-815.19074217 564.88318244 -815.19759257 561.25021899 -815.203125 557.6171875 C-815.20888182 555.08000692 -815.21463948 552.54282633 -815.22039795 550.00564575 C-815.22955304 545.3665229 -815.23585951 540.72741302 -815.2388947 536.08828342 C-815.24336646 529.29373499 -815.26088185 522.49938863 -815.2898953 515.70490158 C-815.31425983 509.79052376 -815.32184595 503.87619532 -815.32357025 497.96176529 C-815.3265825 495.46052069 -815.3345623 492.95927665 -815.34775543 490.45806503 C-815.5075775 457.8253259 -815.5075775 457.8253259 -806 445 C-805.1646875 444.18402344 -805.1646875 444.18402344 -804.3125 443.3515625 C-802.76777875 442.07486392 -802.76777875 442.07486392 -803 440 C-802.44441406 439.73316406 -801.88882812 439.46632813 -801.31640625 439.19140625 C-797.87945263 437.42366451 -794.63052515 435.36373652 -791.33984375 433.33984375 C-789 432 -789 432 -786 431 C-786.04640625 430.33613281 -786.0928125 429.67226563 -786.140625 428.98828125 C-786.4359673 421.76294278 -786.4359673 421.76294278 -784.25 417.9375 C-780.57552164 414.77336586 -777.15670111 414.87309365 -772.42456055 414.85473633 C-771.30627365 414.84835648 -770.18798676 414.84197662 -769.03581238 414.83540344 C-767.83161148 414.83429062 -766.62741058 414.8331778 -765.38671875 414.83203125 C-764.14380569 414.82870285 -762.90089264 414.82537445 -761.62031555 414.82194519 C-758.99012624 414.81688184 -756.35993051 414.81453668 -753.72973633 414.81469727 C-751.04021484 414.81477855 -748.35086355 414.80783379 -745.66137695 414.79418945 C-741.77810471 414.77584629 -737.89503003 414.7709596 -734.01171875 414.76953125 C-732.81359055 414.76234573 -731.61546234 414.75516022 -730.38102722 414.74775696 C-724.53159784 414.76371496 -719.51203905 414.97800076 -714 417 C-712.4507399 422.28571094 -711.87664941 425.51679222 -713 431 C-712.20335937 431.37511719 -711.40671875 431.75023437 -710.5859375 432.13671875 C-697.73195647 438.34478501 -690.96531571 445.20348855 -685.76171875 458.640625 C-684.42254074 462.78864304 -683.87465808 466.68613525 -683.85955811 471.03822327 C-683.85384796 472.029039 -683.84813782 473.01985474 -683.84225464 474.04069519 C-683.84113678 475.11660416 -683.84001892 476.19251312 -683.83886719 477.30102539 C-683.83390228 478.44315491 -683.82893738 479.58528442 -683.82382202 480.76202393 C-683.80921829 484.54057418 -683.80240029 488.31908241 -683.796875 492.09765625 C-683.79112079 494.72977194 -683.78536309 497.36188762 -683.77960205 499.9940033 C-683.77003714 504.81067047 -683.76413686 509.62732862 -683.7611053 514.44400412 C-683.75663468 521.50629174 -683.73912997 528.56838485 -683.7101047 535.63061339 C-683.6857621 541.76925573 -683.67815502 547.90781867 -683.67642975 554.04650688 C-683.67341375 556.64626561 -683.66542105 559.24602373 -683.65224457 561.84575081 C-683.63507313 565.49505194 -683.63709193 569.14388708 -683.64355469 572.79321289 C-683.6343399 573.85495224 -683.62512512 574.91669159 -683.6156311 576.01060486 C-683.68241548 588.12901035 -686.37903184 598.44378599 -694 608 C-696.08446804 610.05895882 -698.20165289 611.93793341 -700.49609375 613.7578125 C-700.99238281 614.16773438 -701.48867188 614.57765625 -702 615 C-702 615.33 -702 615.66 -702 616 C-686.82 616 -671.64 616 -656 616 C-657.65 614.35 -659.3 612.7 -661 611 C-671.57358389 599.32873474 -674.14441174 587.20232368 -674.16113281 571.96264648 C-674.16609772 570.87220535 -674.17106262 569.78176422 -674.17617798 568.65827942 C-674.19074226 565.06254435 -674.19759295 561.46685343 -674.203125 557.87109375 C-674.20888225 555.35872904 -674.21463991 552.84636434 -674.22039795 550.33399963 C-674.22955337 545.73959534 -674.23585951 541.14520358 -674.2388947 536.5507912 C-674.24292046 530.49301995 -674.25515692 524.43540425 -674.28125 518.37768555 C-674.30891267 511.85325181 -674.32165045 505.32895125 -674.32357025 498.80446053 C-674.32658007 496.32916211 -674.33455147 493.8538642 -674.34775543 491.37859917 C-674.52672652 455.24150739 -674.52672652 455.24150739 -661.375 440.75 C-656.63352859 436.21147095 -650.95534122 433.62035014 -645 431 C-645.05800781 430.33613281 -645.11601563 429.67226563 -645.17578125 428.98828125 C-645.54693274 421.72431633 -645.54693274 421.72431633 -642.6875 417.9375 C-638.85861148 415.17713851 -636.13738547 414.8725381 -631.53808594 414.85473633 C-630.41972351 414.84835648 -629.30136108 414.84197662 -628.14910889 414.83540344 C-626.33506561 414.83373421 -626.33506561 414.83373421 -624.484375 414.83203125 C-623.240047 414.82870285 -621.99571899 414.82537445 -620.71368408 414.82194519 C-618.07747836 414.81687739 -615.44137568 414.81410476 -612.80517578 414.81469727 C-610.10881843 414.81477849 -607.41263107 414.80784565 -604.71630859 414.79418945 C-600.82644464 414.77584329 -596.93677794 414.77095931 -593.046875 414.76953125 C-591.84560974 414.76234573 -590.64434448 414.75516022 -589.40667725 414.74775696 C-583.54920421 414.7636913 -578.51932583 414.97367058 -573 417 C-572.63291604 418.39249204 -572.28193437 419.78923333 -571.9375 421.1875 C-571.74027344 421.96480469 -571.54304687 422.74210937 -571.33984375 423.54296875 C-570.96083703 426.28314378 -571.32295366 428.33442595 -572 431 C-571.20335937 431.37511719 -570.40671875 431.75023437 -569.5859375 432.13671875 C-557.58967376 437.93053469 -550.31515532 444.509385 -545 457 C-542.94462262 463.6811748 -542.70364098 469.84601659 -542.70947266 476.80932617 C-542.69939682 478.55002884 -542.69939682 478.55002884 -542.68911743 480.32589722 C-542.67017754 484.14829841 -542.66621502 487.97052359 -542.6640625 491.79296875 C-542.65925833 493.78763997 -542.65445025 495.78231123 -542.64914167 497.77698117 C-542.63289727 504.04672757 -542.62796895 510.31641661 -542.62939453 516.58618164 C-542.63059386 523.02209223 -542.6095249 529.45766636 -542.5779072 535.89349192 C-542.55161864 541.44541863 -542.54103252 546.99723633 -542.54230535 552.54922467 C-542.54281148 555.85339529 -542.53543931 559.1572025 -542.51594925 562.46132469 C-542.49619954 566.15572829 -542.50216374 569.84928183 -542.51416016 573.54370117 C-542.50292114 574.61583359 -542.49168213 575.687966 -542.48010254 576.79258728 C-542.57973716 588.95949305 -545.95288096 599.75082169 -554 609 C-556.25156707 611.14643553 -558.5624163 613.05988236 -561 615 C-561 615.33 -561 615.66 -561 616 C-494.01 616 -427.02 616 -358 616 C-358 614.68 -358 613.36 -358 612 C-359.98 612 -361.96 612 -364 612 C-363.83734146 611.06965439 -363.67468292 610.13930878 -363.50709534 609.18077087 C-362.79592136 604.16374652 -362.8683513 599.16574423 -362.88647461 594.10766602 C-362.88625557 592.49679359 -362.88625557 592.49679359 -362.8860321 590.8533783 C-362.88672618 587.32020007 -362.8944949 583.78707522 -362.90234375 580.25390625 C-362.90420972 577.79768401 -362.90563278 575.34146139 -362.90663147 572.88523865 C-362.91044251 566.43265753 -362.92026073 559.98009905 -362.93133545 553.52752686 C-362.94157996 546.93827623 -362.9461356 540.34902193 -362.95117188 533.75976562 C-362.96188427 520.83983411 -362.97875043 507.91991826 -363 495 C-363.99 495 -364.98 495 -366 495 C-366 492.69 -366 490.38 -366 488 C-344.55 488 -323.1 488 -301 488 C-301.33 490.31 -301.66 492.62 -302 495 C-302.08138585 496.65544225 -302.12619823 498.31326169 -302.12698364 499.97070312 C-302.12980347 500.8957666 -302.13262329 501.82083008 -302.13552856 502.77392578 C-302.13350433 503.76634277 -302.1314801 504.75875977 -302.12939453 505.78125 C-302.13114685 506.8439209 -302.13289917 507.9065918 -302.13470459 509.00146484 C-302.13909226 512.50099336 -302.13619596 516.000471 -302.1328125 519.5 C-302.13348642 521.93945322 -302.13445719 524.37890638 -302.13571167 526.81835938 C-302.13718446 531.92578777 -302.1350475 537.03319865 -302.13037109 542.140625 C-302.12467408 548.68080032 -302.12795531 555.22093459 -302.13394356 561.7611084 C-302.13756044 566.79687813 -302.13640539 571.83263817 -302.13381577 576.8684082 C-302.13314962 579.27970383 -302.133964 581.69100033 -302.13629532 584.10229492 C-302.1388403 587.47447028 -302.13495516 590.84657955 -302.12939453 594.21875 C-302.13141876 595.21116699 -302.13344299 596.20358398 -302.13552856 597.22607422 C-302.12018435 602.25985477 -301.86358249 607.03848579 -301 612 C-303.64 612 -306.28 612 -309 612 C-309 613.32 -309 614.64 -309 616 C-291.51 616 -274.02 616 -256 616 C-256 614.68 -256 613.36 -256 612 C-258.31 612 -260.62 612 -263 612 C-263 609.69 -263 607.38 -263 605 C-262.34 605 -261.68 605 -261 605 C-261 569.03 -261 533.06 -261 496 C-262.32 495.67 -263.64 495.34 -265 495 C-265 492.69 -265 490.38 -265 488 C-243.55 488 -222.1 488 -200 488 C-200.33 490.31 -200.66 492.62 -201 495 C-201.08138585 496.65544225 -201.12619823 498.31326169 -201.12698364 499.97070312 C-201.12980347 500.8957666 -201.13262329 501.82083008 -201.13552856 502.77392578 C-201.13350433 503.76634277 -201.1314801 504.75875977 -201.12939453 505.78125 C-201.13114685 506.8439209 -201.13289917 507.9065918 -201.13470459 509.00146484 C-201.13909226 512.50099336 -201.13619596 516.000471 -201.1328125 519.5 C-201.13348642 521.93945322 -201.13445719 524.37890638 -201.13571167 526.81835938 C-201.13718446 531.92578777 -201.1350475 537.03319865 -201.13037109 542.140625 C-201.12467408 548.68080032 -201.12795531 555.22093459 -201.13394356 561.7611084 C-201.13756044 566.79687813 -201.13640539 571.83263817 -201.13381577 576.8684082 C-201.13314962 579.27970383 -201.133964 581.69100033 -201.13629532 584.10229492 C-201.1388403 587.47447028 -201.13495516 590.84657955 -201.12939453 594.21875 C-201.13141876 595.21116699 -201.13344299 596.20358398 -201.13552856 597.22607422 C-201.12018435 602.25985477 -200.86358249 607.03848579 -200 612 C-202.31 612 -204.62 612 -207 612 C-207 613.32 -207 614.64 -207 616 C-189.18 616 -171.36 616 -153 616 C-153 614.68 -153 613.36 -153 612 C-155.31 612 -157.62 612 -160 612 C-159.83734146 611.06965439 -159.67468292 610.13930878 -159.50709534 609.18077087 C-158.79592136 604.16374652 -158.8683513 599.16574423 -158.88647461 594.10766602 C-158.88632858 593.03375107 -158.88618256 591.95983612 -158.8860321 590.8533783 C-158.88672618 587.32020007 -158.8944949 583.78707522 -158.90234375 580.25390625 C-158.90420972 577.79768401 -158.90563278 575.34146139 -158.90663147 572.88523865 C-158.91044251 566.43265753 -158.92026073 559.98009905 -158.93133545 553.52752686 C-158.94157996 546.93827623 -158.9461356 540.34902193 -158.95117188 533.75976562 C-158.96188427 520.83983411 -158.97875043 507.91991826 -159 495 C-159.99 495 -160.98 495 -162 495 C-162 492.69 -162 490.38 -162 488 C-140.55 488 -119.1 488 -97 488 C-97.33 490.31 -97.66 492.62 -98 495 C-98.08138585 496.65544225 -98.12619823 498.31326169 -98.12698364 499.97070312 C-98.12980347 500.8957666 -98.13262329 501.82083008 -98.13552856 502.77392578 C-98.13249222 504.26255127 -98.13249222 504.26255127 -98.12939453 505.78125 C-98.13202301 507.37525635 -98.13202301 507.37525635 -98.13470459 509.00146484 C-98.13909226 512.50099336 -98.13619596 516.000471 -98.1328125 519.5 C-98.13348642 521.93945322 -98.13445719 524.37890638 -98.13571167 526.81835938 C-98.13718446 531.92578777 -98.1350475 537.03319865 -98.13037109 542.140625 C-98.12467408 548.68080032 -98.12795531 555.22093459 -98.13394356 561.7611084 C-98.13756044 566.79687813 -98.13640539 571.83263817 -98.13381577 576.8684082 C-98.13314962 579.27970383 -98.133964 581.69100033 -98.13629532 584.10229492 C-98.1388403 587.47447028 -98.13495516 590.84657955 -98.12939453 594.21875 C-98.13141876 595.21116699 -98.13344299 596.20358398 -98.13552856 597.22607422 C-98.12018435 602.25985477 -97.86358249 607.03848579 -97 612 C-99.31 612 -101.62 612 -104 612 C-104 613.32 -104 614.64 -104 616 C-84.86 616 -65.72 616 -46 616 C-46 614.68 -46 613.36 -46 612 C-47.98 612 -49.96 612 -52 612 C-51.83734146 611.06965439 -51.67468292 610.13930878 -51.50709534 609.18077087 C-50.79592136 604.16374652 -50.8683513 599.16574423 -50.88647461 594.10766602 C-50.88632858 593.03375107 -50.88618256 591.95983612 -50.8860321 590.8533783 C-50.88672618 587.32020007 -50.8944949 583.78707522 -50.90234375 580.25390625 C-50.90420972 577.79768401 -50.90563278 575.34146139 -50.90663147 572.88523865 C-50.91044251 566.43265753 -50.92026073 559.98009905 -50.93133545 553.52752686 C-50.94157996 546.93827623 -50.9461356 540.34902193 -50.95117188 533.75976562 C-50.96188427 520.83983411 -50.97875043 507.91991826 -51 495 C-51.99 495 -52.98 495 -54 495 C-54 492.69 -54 490.38 -54 488 C-32.55 488 -11.1 488 11 488 C10.67 490.31 10.34 492.62 10 495 C9.91861415 496.65544225 9.87380177 498.31326169 9.87301636 499.97070312 C9.87019653 500.8957666 9.86737671 501.82083008 9.86447144 502.77392578 C9.86750778 504.26255127 9.86750778 504.26255127 9.87060547 505.78125 C9.86797699 507.37525635 9.86797699 507.37525635 9.86529541 509.00146484 C9.86090774 512.50099336 9.86380404 516.000471 9.8671875 519.5 C9.86651358 521.93945322 9.86554281 524.37890638 9.86428833 526.81835938 C9.86281554 531.92578777 9.8649525 537.03319865 9.86962891 542.140625 C9.87532592 548.68080032 9.87204469 555.22093459 9.86605644 561.7611084 C9.86243956 566.79687813 9.86359461 571.83263817 9.86618423 576.8684082 C9.86685038 579.27970383 9.866036 581.69100033 9.86370468 584.10229492 C9.8611597 587.47447028 9.86504484 590.84657955 9.87060547 594.21875 C9.86858124 595.21116699 9.86655701 596.20358398 9.86447144 597.22607422 C9.87981565 602.25985477 10.13641751 607.03848579 11 612 C8.36 612 5.72 612 3 612 C3 613.32 3 614.64 3 616 C63.39 616 123.78 616 186 616 C186 526.57 186 437.14 186 345 C-265.77 345 -717.54 345 -1183 345 Z M611 401 C611 471.62 611 542.24 611 615 C614.37070226 616.68535113 618.18934376 616.13250637 621.89627075 616.12025452 C622.82902954 616.12110894 623.76178833 616.12196337 624.72281253 616.12284368 C627.86747361 616.12449883 631.01208207 616.11897652 634.15673828 616.11352539 C636.40331013 616.1132435 638.64988207 616.11340129 640.89645386 616.1139679 C647.01185089 616.1142558 653.12722845 616.10836022 659.24262094 616.10139394 C665.62747506 616.09515922 672.01232959 616.09455651 678.39718628 616.09336853 C689.11912437 616.09060965 699.84105392 616.08435573 710.56298828 616.07543945 C721.60790979 616.06626412 732.65282936 616.05918388 743.69775391 616.05493164 C744.37826345 616.05466892 745.058773 616.05440619 745.75990404 616.05413551 C749.17373101 616.0528305 752.58755799 616.05156678 756.00138497 616.05032361 C784.33426159 616.03995247 812.66713041 616.02226123 841 616 C841 615.67 841 615.34 841 615 C839.98164063 614.731875 838.96328125 614.46375 837.9140625 614.1875 C804.64176747 605.10817839 777.70575822 585.52408334 753 562 C752.16009521 561.20311768 752.16009521 561.20311768 751.30322266 560.39013672 C749.64989894 558.81228978 748.01024001 557.22156285 746.375 555.625 C745.87814697 555.14957764 745.38129395 554.67415527 744.86938477 554.18432617 C741.73956768 551.08380534 739.62889114 548.1011089 738 544 C738.33 543.34 738.66 542.68 739 542 C861.1 542 983.2 542 1109 542 C1109.33 542.99 1109.66 543.98 1110 545 C1106.09105446 551.82888076 1100.38436146 557.32766675 1095 563 C1094.10667969 563.94746094 1093.21335937 564.89492188 1092.29296875 565.87109375 C1067.56447275 591.39611524 1034.14244651 606.78612983 1000 615 C1000 615.33 1000 615.66 1000 616 C1084.81 616 1169.62 616 1257 616 C1257 545.05 1257 474.1 1257 401 C1043.82 401 830.64 401 611 401 Z M-1183 663 C-1183 1004.88 -1183 1346.76 -1183 1699 C-1026.25 1699 -869.5 1699 -708 1699 C-706.29413605 1674.27981428 -706.29413605 1674.27981428 -705.75390434 1649.59749031 C-705.75241641 1647.84686388 -705.75005019 1646.09623803 -705.74691135 1644.34561378 C-705.74089781 1639.62476785 -705.74701664 1634.90401097 -705.75546761 1630.18317183 C-705.76244143 1625.01357655 -705.75757472 1619.84398874 -705.75431263 1614.67439163 C-705.75019614 1605.6443083 -705.75339916 1596.61425152 -705.76158905 1587.5841713 C-705.7737327 1574.15708486 -705.77425387 1560.73001493 -705.77250507 1547.30292401 C-705.76988602 1524.70894356 -705.77651205 1502.1149761 -705.78853989 1479.52099991 C-705.80041145 1457.16686064 -705.80809538 1434.81272623 -705.81024551 1412.45858383 C-705.81031434 1411.76265246 -705.81038316 1411.06672108 -705.81045407 1410.34970087 C-705.81108053 1403.99282302 -705.8116559 1397.63594516 -705.81217002 1391.27906729 C-705.81344831 1375.48124577 -705.81536664 1359.68342435 -705.81772041 1343.88560295 C-705.81782705 1343.16644885 -705.81793368 1342.44729475 -705.81804355 1341.7063481 C-705.82327824 1306.77997895 -705.83588991 1271.85361298 -705.84912109 1236.92724609 C-705.85370469 1224.81705732 -705.85825554 1212.70686853 -705.8626709 1200.59667969 C-705.8629448 1199.8455368 -705.8632187 1199.09439391 -705.86350089 1198.32048912 C-705.87620329 1163.36208921 -705.88362324 1128.40368876 -705.88973654 1093.44528714 C-705.89013767 1091.15618047 -705.89054227 1088.8670738 -705.89094801 1086.57796712 C-705.89517522 1062.72009885 -705.89914926 1038.86223053 -705.90301356 1015.0043622 C-705.9031792 1013.98186581 -705.9031792 1013.98186581 -705.90334819 1012.93871293 C-705.90364516 1011.10405087 -705.90394156 1009.26938882 -705.90423791 1007.43472676 C-705.92299392 892.62314512 -705.96313972 777.81158016 -706 663 C-863.41 663 -1020.82 663 -1183 663 Z M-659 663 C-659 827.34 -659 991.68 -659 1161 C-625.67 1161 -592.34 1161 -558 1161 C-555.11181982 1155.60596127 -555.11181982 1155.60596127 -554.63085651 1150.29490089 C-554.62488337 1149.39817213 -554.61891022 1148.50144336 -554.61275607 1147.57754099 C-554.6214946 1146.60671718 -554.63023312 1145.63589336 -554.63923645 1144.63565063 C-554.63667318 1143.59330179 -554.6341099 1142.55095294 -554.63146895 1141.47701776 C-554.62652873 1137.98533481 -554.64302841 1134.49408451 -554.65942383 1131.00244141 C-554.66027005 1128.49912527 -554.65979506 1125.99580838 -554.65809631 1123.49249268 C-554.65741322 1118.10355698 -554.66592071 1112.71475588 -554.68280983 1107.32585526 C-554.70721254 1099.53447622 -554.71500639 1091.74314984 -554.7187738 1083.95173673 C-554.7253363 1071.31007974 -554.74529197 1058.6684809 -554.77368164 1046.02685547 C-554.80122744 1033.74821259 -554.82245847 1021.46958552 -554.83520508 1009.19091797 C-554.83599325 1008.43379743 -554.83678142 1007.6766769 -554.83759347 1006.89661331 C-554.84150865 1003.09828312 -554.84529975 999.29995282 -554.84902918 995.50162244 C-554.8801188 964.00103935 -554.93317242 932.50052851 -555 901 C-554.44827399 901.00037972 -553.89654798 901.00075944 -553.32810301 901.00115067 C-520.62730417 901.02352944 -487.92650726 901.04068692 -455.22570249 901.05106533 C-451.29914995 901.05231603 -447.37259743 901.05361036 -443.44604492 901.05493164 C-442.66434002 901.05519395 -441.88263513 901.05545626 -441.0772422 901.05572652 C-428.42050995 901.06007765 -415.76378224 901.06796215 -403.10705268 901.0771528 C-390.11978664 901.08650479 -377.13252298 901.09205889 -364.14525372 901.09408849 C-356.13163347 901.0954605 -348.11802606 901.09979371 -340.10440976 901.10791647 C-333.95924805 901.11382798 -327.81409613 901.11445503 -321.66893196 901.11310768 C-319.14821926 901.11338307 -316.62750607 901.1153758 -314.10679626 901.11920547 C-310.6672845 901.12417528 -307.22782784 901.12298607 -303.78831482 901.12025452 C-302.78927626 901.12316736 -301.79023769 901.1260802 -300.76092523 901.12908131 C-295.73038044 901.11827168 -290.95820558 900.86414381 -286 900 C-285.34 902.97 -284.68 905.94 -284 909 C-284.66 909 -285.32 909 -286 909 C-286 940.35 -286 971.7 -286 1004 C-280.06 1004 -274.12 1004 -268 1004 C-268 1002.02 -268 1000.04 -268 998 C-265.69 998 -263.38 998 -261 998 C-261 1007.57 -261 1017.14 -261 1027 C-263.31 1027 -265.62 1027 -268 1027 C-268 1026.01 -268 1025.02 -268 1024 C-273.94 1024 -279.88 1024 -286 1024 C-286 1057.66 -286 1091.32 -286 1126 C-285.34 1126.33 -284.68 1126.66 -284 1127 C-284 1128.65 -284 1130.3 -284 1132 C-284.66 1132.33 -285.32 1132.66 -286 1133 C-286.08706892 1136.27066566 -286.14041241 1139.54103365 -286.1875 1142.8125 C-286.21263672 1143.74126953 -286.23777344 1144.67003906 -286.26367188 1145.62695312 C-286.27333984 1146.51962891 -286.28300781 1147.41230469 -286.29296875 1148.33203125 C-286.3086792 1149.15421143 -286.32438965 1149.9763916 -286.34057617 1150.82348633 C-285.91646101 1153.53387105 -284.91382399 1154.11522377 -283 1156 C-282.67 1157.65 -282.34 1159.3 -282 1161 C-182.34 1161 -82.68 1161 20 1161 C20 1160.01 20 1159.02 20 1158 C22.31 1158 24.62 1158 27 1158 C27 1158.99 27 1159.98 27 1161 C60.99 1161 94.98 1161 130 1161 C130 1159.35 130 1157.7 130 1156 C128.02 1156 126.04 1156 124 1156 C124 1153.69 124 1151.38 124 1149 C143.47 1149 162.94 1149 183 1149 C182.67 1143.72 182.34 1138.44 182 1133 C193.22 1133 204.44 1133 216 1133 C216 1135.64 216 1138.28 216 1141 C207.42 1141 198.84 1141 190 1141 C190 1143.64 190 1146.28 190 1149 C223.66 1149 257.32 1149 292 1149 C295.1490712 1143.81989159 295.1490712 1143.81989159 295 1141 C285.43 1141 275.86 1141 266 1141 C266 1138.36 266 1135.72 266 1133 C275.57 1133 285.14 1133 295 1133 C295 1131.68 295 1130.36 295 1129 C297.31 1129 299.62 1129 302 1129 C302 1130.32 302 1131.64 302 1133 C304.64 1133 307.28 1133 310 1133 C310 1135.64 310 1138.28 310 1141 C307.36 1141 304.72 1141 302 1141 C302.9590625 1142.1446875 302.9590625 1142.1446875 303.9375 1143.3125 C306 1146 306 1146 307 1149 C339.67 1149 372.34 1149 406 1149 C406 1146.69 406 1144.38 406 1142 C405.01 1142 404.02 1142 403 1142 C403 1139.69 403 1137.38 403 1135 C403.99 1135 404.98 1135 406 1135 C406 1134.34 406 1133.68 406 1133 C408.31 1133 410.62 1133 413 1133 C413 1133.66 413 1134.32 413 1135 C425.21 1135 437.42 1135 450 1135 C450 1137.31 450 1139.62 450 1142 C437.79 1142 425.58 1142 413 1142 C413 1144.31 413 1146.62 413 1149 C450.62 1149 488.24 1149 527 1149 C527 1146.69 527 1144.38 527 1142 C514.46 1142 501.92 1142 489 1142 C489 1139.69 489 1137.38 489 1135 C501.54 1135 514.08 1135 527 1135 C527 1134.34 527 1133.68 527 1133 C529.31 1133 531.62 1133 534 1133 C534 1138.28 534 1143.56 534 1149 C562.05 1149 590.1 1149 619 1149 C619 1147.35 619 1145.7 619 1144 C618.01 1144 617.02 1144 616 1144 C616 1141.36 616 1138.72 616 1136 C624.91 1136 633.82 1136 643 1136 C643 1134.02 643 1132.04 643 1130 C649.6 1130 656.2 1130 663 1130 C663 1129.01 663 1128.02 663 1127 C665.31 1127 667.62 1127 670 1127 C670 1134.26 670 1141.52 670 1149 C670.99 1149 671.98 1149 673 1149 C673 1148.34 673 1147.68 673 1147 C675.64 1147 678.28 1147 681 1147 C681 1151.62 681 1156.24 681 1161 C715.32 1161 749.64 1161 785 1161 C785 1160.01 785 1159.02 785 1158 C787.31 1158.33 789.62 1158.66 792 1159 C792 1159.66 792 1160.32 792 1161 C924.66 1161 1057.32 1161 1194 1161 C1194.061875 1126.618125 1194.12375 1092.23625 1194.1875 1056.8125 C1194.22846802 1040.57575073 1194.22846802 1040.57575073 1194.27026367 1024.01098633 C1194.28030186 1014.24099111 1194.28030186 1014.24099111 1194.28633118 1004.47099304 C1194.28910693 1000.14603483 1194.30027209 995.821189 1194.31672668 991.4962616 C1194.33752604 985.95470134 1194.34343299 980.41330108 1194.33921683 974.87170541 C1194.34009656 972.85347861 1194.34591257 970.83524537 1194.35764539 968.81705248 C1194.51478005 940.43608368 1191.03725877 908.72023841 1171.62109375 886.41015625 C1161.17860855 876.80804988 1149.72020601 873.48510171 1135.765625 873.6796875 C1127.97137074 874.34268423 1121.1538682 877.18392923 1115 882 C1114.00613281 882.76183594 1114.00613281 882.76183594 1112.9921875 883.5390625 C1095.52253548 897.8434814 1087.38442901 920.04405066 1081 941 C1081.99 941.33 1082.98 941.66 1084 942 C1084 944.64 1084 947.28 1084 950 C1083.34370605 949.87447754 1082.68741211 949.74895508 1082.01123047 949.61962891 C1075.07149599 948.32125855 1068.12666169 947.27547618 1061.125 946.375 C1060.11953125 946.2409375 1059.1140625 946.106875 1058.078125 945.96875 C1057.10617187 945.84242188 1056.13421875 945.71609375 1055.1328125 945.5859375 C1054.26543457 945.4729834 1053.39805664 945.3600293 1052.50439453 945.24365234 C1049.98584777 944.99862313 1047.52870676 944.95750549 1045 945 C1045 942.69 1045 940.38 1045 938 C1046.65 938 1048.3 938 1050 938 C1050.32871094 936.72769531 1050.65742188 935.45539063 1050.99609375 934.14453125 C1059.20959922 903.3689809 1073.15914336 872.99311302 1101.484375 855.97265625 C1119.64288264 845.53895637 1140.59942062 842.45074188 1161 847 C1170.15469839 849.55572823 1177.58994179 853.06125298 1185 859 C1185.61101562 859.44859375 1186.22203125 859.8971875 1186.8515625 860.359375 C1210.27838835 878.54458228 1217.794482 913.18680004 1221.51026917 940.79069519 C1222.21232287 947.2017296 1222.17669723 953.61392213 1222.20532227 960.05688477 C1222.21491907 961.45721209 1222.22493016 962.85753662 1222.23532104 964.25785828 C1222.26218112 968.03404643 1222.28329205 971.81024684 1222.30332303 975.58647656 C1222.32530022 979.54228738 1222.35263111 983.49806125 1222.37937927 987.45384216 C1222.42914843 994.93337444 1222.4741453 1002.4129274 1222.51740164 1009.89249986 C1222.56690948 1018.41252251 1222.62177705 1026.93250805 1222.67708123 1035.45249474 C1222.79065885 1052.96829547 1222.89754993 1070.48413073 1223 1088 C1225.64 1088 1228.28 1088 1231 1088 C1232.50400173 1084.99199655 1232.58750568 1081.77307655 1232.95556641 1078.46777344 C1233.04510086 1077.6901767 1233.13463531 1076.91257996 1233.22688293 1076.11141968 C1233.52287335 1073.52788683 1233.81274446 1070.94371898 1234.1015625 1068.359375 C1234.25099871 1067.03133221 1234.25099871 1067.03133221 1234.40345383 1065.67646027 C1234.93184428 1060.97944427 1235.45560343 1056.28193834 1235.97558594 1051.58398438 C1236.51021451 1046.76153175 1237.0600149 1041.94094234 1237.6135807 1037.12063217 C1238.03904493 1033.39113671 1238.45307702 1029.66043237 1238.8641777 1025.92932892 C1239.06171581 1024.1541269 1239.263398 1022.37938036 1239.46953201 1020.60515594 C1240.68201081 1010.1288972 1241.11674024 1000.53230633 1240 990 C1244.62 990 1249.24 990 1254 990 C1254 991.32 1254 992.64 1254 994 C1254.66 994 1255.32 994 1256 994 C1255.87471924 995.11864441 1255.74943848 996.23728882 1255.62036133 997.38983154 C1254.44077249 1007.92509171 1253.26349429 1018.46060784 1252.08848572 1028.99637985 C1251.4843092 1034.41308221 1250.87931512 1039.82969067 1250.27246094 1045.24609375 C1249.68699309 1050.47188618 1249.10366196 1055.69791307 1248.52182007 1060.92411041 C1248.29930927 1062.91930922 1248.07602487 1064.91442192 1247.85195923 1066.90944672 C1247.53858899 1069.70080127 1247.22795494 1072.4924476 1246.91796875 1075.28417969 C1246.82446136 1076.11136505 1246.73095398 1076.93855042 1246.63461304 1077.790802 C1246.25577316 1081.22511812 1246 1084.53985312 1246 1088 C1248.64 1088 1251.28 1088 1254 1088 C1254 1090.64 1254 1093.28 1254 1096 C1252.35 1096 1250.7 1096 1249 1096 C1249 1117.45 1249 1138.9 1249 1161 C1261.54 1161 1274.08 1161 1287 1161 C1287 996.66 1287 832.32 1287 663 C1095.6 663 904.2 663 707 663 C706.67 679.83 706.34 696.66 706 714 C704.02 713.67 702.04 713.34 700 713 C698.45839087 712.91761583 696.91407883 712.87478938 695.37026995 712.87465084 C694.4883916 712.87214732 693.60651324 712.8696438 692.69791129 712.86706442 C691.74172588 712.86940558 690.78554048 712.87174675 689.80037975 712.87415886 C688.25571287 712.8719787 688.25571287 712.8719787 686.67984059 712.86975449 C683.21291184 712.86609139 679.74602697 712.86958238 676.27909851 712.87301636 C673.77500362 712.87186467 671.2709089 712.87027683 668.76681453 712.86828911 C663.31411381 712.8649777 657.86142663 712.8647881 652.40872574 712.86733627 C644.30070052 712.87111508 636.19268367 712.86918696 628.08465851 712.86612797 C613.60607422 712.86085891 599.12749434 712.86131985 584.64890962 712.86420688 C571.98173225 712.86672039 559.31455649 712.86738008 546.64737892 712.86618423 C545.80781034 712.86610785 544.96824175 712.86603146 544.10323169 712.86595276 C540.69538076 712.86564144 537.28752983 712.86532304 533.87967891 712.864993 C501.90366051 712.86193308 469.92764493 712.86470918 437.95162697 712.8700899 C409.52007728 712.87483777 381.08853207 712.87440917 352.65698242 712.86962891 C320.73266669 712.86427937 288.80835344 712.8621479 256.88403732 712.86524117 C253.48387229 712.8655619 250.08370727 712.86587474 246.68354225 712.86618423 C245.4276781 712.86630285 245.4276781 712.86630285 244.14644296 712.86642386 C231.48131721 712.86756323 218.81619324 712.86622759 206.15106773 712.86370468 C191.75988614 712.86085228 177.36870966 712.86154566 162.97752871 712.86698543 C154.91484683 712.86993219 146.852176 712.87009834 138.78949439 712.86633925 C132.78607848 712.86384791 126.78267707 712.86652941 120.77926204 712.87131383 C118.33798634 712.87243921 115.89670918 712.87184419 113.4554344 712.86943804 C110.16040598 712.86643727 106.86543961 712.86947517 103.57041454 712.87415886 C102.6025233 712.87181769 101.63463207 712.86947653 100.63741079 712.86706442 C99.76805002 712.86956793 98.89868926 712.87207145 98.00298423 712.87465084 C96.87094075 712.87475247 96.87094075 712.87475247 95.71602772 712.87485617 C93.96769488 712.81437054 93.96769488 712.81437054 93 714 C91.02 714 89.04 714 87 714 C87 697.17 87 680.34 87 663 C-159.18 663 -405.36 663 -659 663 Z " fill="#615F5C" transform="translate(1380,40)"/> <path d="M0 0 C1.53653418 -0.0034651 3.07306586 -0.00823534 4.60959244 -0.01418173 C8.79238744 -0.02660448 12.9749748 -0.02056155 17.15777016 -0.01122308 C21.6840919 -0.00439681 26.21037952 -0.01493144 30.73669434 -0.02316284 C39.5881698 -0.03646441 48.4395687 -0.03363843 57.2910471 -0.02492492 C64.48834928 -0.01813466 71.6856301 -0.01723745 78.88293457 -0.02049637 C79.90942997 -0.02095607 80.93592537 -0.02141577 81.9935267 -0.0218894 C84.07918899 -0.02284862 86.16485127 -0.02382127 88.25051355 -0.02480717 C107.78264591 -0.03335059 127.31473595 -0.0235434 146.84686136 -0.00740607 C163.58640532 0.00599615 180.32588685 0.00366776 197.06542969 -0.01016235 C216.5302877 -0.0262367 235.99510866 -0.03252671 255.45997238 -0.02332556 C257.53772735 -0.02236997 259.61548232 -0.02142686 261.6932373 -0.02049637 C262.71538653 -0.02003354 263.73753575 -0.01957072 264.79065919 -0.01909386 C271.97474705 -0.01650954 279.1588113 -0.02086292 286.34289551 -0.02793503 C295.1044315 -0.03637086 303.86588692 -0.03402621 312.62741375 -0.0180928 C317.0929781 -0.01023806 321.55840837 -0.00707047 326.02397156 -0.01704025 C330.11984164 -0.02604599 334.21545462 -0.02095863 338.31130171 -0.0051076 C339.78487507 -0.00178448 341.2584706 -0.00339746 342.73202944 -0.01073496 C358.29895148 -0.08224165 372.75682578 1.78407389 384.59667969 12.60751343 C396.66620925 25.26240124 397.88608219 39.48465395 397.75805664 56.07943726 C397.75856644 57.93042117 397.76082857 59.7814053 397.76469421 61.63238525 C397.77007789 66.62181074 397.75079959 71.61085985 397.72659326 76.60021806 C397.70518152 81.83747534 397.70588737 87.07473289 397.7039032 92.31202698 C397.69747235 101.09865737 397.67628567 109.88514769 397.64477539 118.67172241 C397.60442551 129.93777014 397.58707436 141.20372691 397.57746601 152.46983814 C397.56915558 162.17885377 397.55192879 171.88785031 397.5324285 181.5968492 C397.52838491 183.67566934 397.52464453 185.75449009 397.52120614 187.83331132 C397.51139614 193.75691367 397.49685492 199.68046216 397.47436714 205.60403061 C397.46826785 207.39545264 397.46380491 209.18688113 397.46112442 210.97831154 C397.45711394 213.42932342 397.44696851 215.880237 397.43525696 218.33122253 C397.43544132 219.03444147 397.43562568 219.73766041 397.43581563 220.46218902 C397.4041896 225.18904258 396.92052914 229.70699053 396.28808594 234.38095093 C396.20562115 236.34421142 396.16034182 238.30951465 396.15869141 240.27450562 C396.15553925 241.36213196 396.15238708 242.4497583 396.1491394 243.57034302 C396.15116364 244.71956238 396.15318787 245.86878174 396.15527344 247.05282593 C396.15431671 248.25280212 396.15335999 249.45277832 396.15237427 250.68911743 C396.15169632 253.21383721 396.15352364 255.73855876 396.15771484 258.26327515 C396.16308735 262.13196702 396.15774711 266.0005438 396.15136719 269.86923218 C396.15202767 272.32626368 396.15330821 274.78329512 396.15527344 277.24032593 C396.15223709 278.97630035 396.15223709 278.97630035 396.1491394 280.74734497 C396.15229156 281.82236267 396.15544373 282.89738037 396.15869141 284.00497437 C396.159487 284.94903137 396.16028259 285.89308838 396.16110229 286.86575317 C396.19521711 289.29592779 396.19521711 289.29592779 396.78797234 291.2391316 C397.34318161 293.61690729 397.41472329 295.72387673 397.4168871 298.16525787 C397.4201593 299.13273906 397.42343149 300.10022025 397.42680284 301.09701905 C397.42531922 302.15931077 397.4238356 303.22160248 397.42230701 304.31608486 C397.42465924 305.44970423 397.42701147 306.58332359 397.42943498 307.75129506 C397.43613889 311.58362126 397.43566634 315.41591366 397.43525696 319.24824524 C397.43800605 322.01017501 397.44224224 324.77210206 397.44639844 327.53403002 C397.45573158 334.35042004 397.45964769 341.16680357 397.4619174 347.98319919 C397.46487765 356.14545356 397.47357405 364.3076993 397.48233168 372.46994915 C397.50318513 392.20085883 397.51364756 411.93177002 397.52246129 431.66268816 C397.52666679 440.9959819 397.53188893 450.329275 397.53714582 459.66256819 C397.55503739 491.60788617 397.57003338 523.55320433 397.57746601 555.49852657 C397.57794077 557.50444209 397.57841666 559.5103576 397.57889367 561.51627311 C397.57913005 562.51103401 397.57936643 563.50579491 397.57960996 564.53070008 C397.58081117 569.57070883 397.58202662 574.61071758 397.58325195 579.65072632 C397.5834921 580.65093435 397.58373225 581.65114239 397.58397968 582.68165976 C397.59187212 615.10879207 397.61530212 647.5358878 397.6478079 679.96300414 C397.68210712 714.24179372 397.70181727 748.5205619 397.70511025 782.79936892 C397.70552779 786.56263738 397.70600736 790.32590582 397.70653343 794.08917427 C397.70665662 795.01580574 397.70677982 795.94243721 397.70690674 796.89714843 C397.70923873 811.8089038 397.72489874 826.72061669 397.74537528 841.63235693 C397.76563311 856.62272315 397.77111079 871.61303835 397.76160464 886.60341572 C397.75638941 895.50790341 397.76226819 904.41222122 397.78413932 913.31668445 C397.79765287 919.26861231 397.79656552 925.22042331 397.78373736 931.17235234 C397.7768442 934.56125899 397.77838068 937.94957734 397.79329745 941.33849715 C397.92968783 974.37208358 397.92968783 974.37208358 385.28808594 988.38095093 C372.5231184 1000.5348296 357.86095361 1001.68927649 340.93693542 1001.64164734 C339.40299189 1001.64467275 337.86904987 1001.64856418 336.33511049 1001.65323991 C332.14558017 1001.66347843 327.95613582 1001.66134871 323.76659858 1001.65705931 C319.23818353 1001.65458452 314.70978877 1001.6636156 310.18138123 1001.6710968 C301.31948507 1001.68382504 292.45761924 1001.68563982 283.59571549 1001.68329654 C276.38976324 1001.68151108 269.18382018 1001.68326791 261.97786903 1001.68752098 C260.43751623 1001.68841376 260.43751623 1001.68841376 258.86604518 1001.68932458 C256.77965829 1001.69053638 254.6932714 1001.69175051 252.60688452 1001.69296696 C233.0547469 1001.70383533 213.50262654 1001.70168337 193.95048795 1001.69558211 C176.08067776 1001.6904139 158.21092211 1001.70166714 140.34112271 1001.72068033 C121.97348015 1001.74007275 103.60586336 1001.74831225 85.2382105 1001.74455708 C74.93377946 1001.74264713 64.62939482 1001.7451125 54.32497215 1001.75927162 C45.55238938 1001.7712043 36.77988156 1001.77256918 28.00729772 1001.76048145 C23.53567476 1001.75460595 19.06418879 1001.75345642 14.59257507 1001.76548386 C10.49104 1001.77638723 6.38975557 1001.77318681 2.28823201 1001.75922217 C0.8125477 1001.75658744 -0.66315654 1001.75890288 -2.13882122 1001.76695804 C-18.66628218 1001.85084089 -32.09980393 999.54358212 -44.52441406 988.06845093 C-58.61343359 972.79689979 -57.14649595 953.74426605 -57.08613586 934.28471375 C-57.08887852 931.61996371 -57.09280871 928.95523919 -57.09817952 926.29049557 C-57.10743986 920.5112924 -57.10564682 914.73217639 -57.09644699 908.95297432 C-57.08280424 900.3590582 -57.08642668 891.76520856 -57.09340559 883.17128753 C-57.10531409 867.82061564 -57.10026062 852.46998489 -57.08812732 837.11931528 C-57.0775831 823.68740651 -57.07305286 810.25551174 -57.07442284 796.82359886 C-57.07450687 795.93196392 -57.0745909 795.04032897 -57.07467747 794.12167478 C-57.07502973 790.50209582 -57.07541375 786.88251687 -57.07584305 783.26293792 C-57.07980603 749.32526068 -57.06709946 715.3876082 -57.04631649 681.44993804 C-57.02794299 651.30510992 -57.02213562 621.16030553 -57.02758789 591.01547241 C-57.02793432 589.07939707 -57.02828042 587.14332174 -57.02862618 585.2072464 C-57.02879718 584.25008182 -57.02896817 583.29291724 -57.02914435 582.30674767 C-57.02999791 577.48839744 -57.03082169 572.67004721 -57.03161335 567.85169697 C-57.03177043 566.90108638 -57.03192751 565.9504758 -57.03208935 564.97105884 C-57.03607981 539.77163659 -57.03060339 514.57221662 -57.02210206 489.37279576 C-57.02119503 486.66122563 -57.02028938 483.9496555 -57.01938683 481.23808537 C-57.01878572 479.43935285 -57.0181771 477.64062033 -57.01756092 475.84188781 C-57.0133409 463.30632628 -57.01276071 450.77076923 -57.01466641 438.23520721 C-57.01710982 422.08238326 -57.01303375 405.92958336 -56.99745641 389.77676598 C-56.98940982 381.2362315 -56.98680196 372.69573706 -56.99209877 364.1552002 C-56.99507805 358.44876971 -56.99076658 352.74237457 -56.98055019 347.03595253 C-56.97493011 343.78594526 -56.97350826 340.53603548 -56.97871677 337.28602508 C-56.9838256 333.78012641 -56.97663252 330.27445737 -56.96638966 326.76857471 C-56.97078614 325.76667092 -56.97518263 324.76476713 -56.97971234 323.73250261 C-56.93836891 316.30403856 -56.48388007 308.716334 -53.6455253 301.77186938 C-52.34223326 298.43422211 -52.68616894 295.75273992 -52.96191406 292.19345093 C-53.01275146 291.4891394 -53.06358887 290.78482788 -53.1159668 290.05917358 C-53.39068677 286.48584326 -53.75164729 282.93641515 -54.23144531 279.38485718 C-55.56537792 269.37015703 -55.90522946 259.47319233 -55.89941406 249.38095093 C-55.9002298 248.70240051 -55.90104553 248.0238501 -55.90188599 247.32473755 C-55.900309 235.75774081 -55.900309 235.75774081 -54.71191406 233.38095093 C-54.96479232 231.86351704 -55.28423286 230.35704503 -55.63224792 228.85856628 C-57.17496244 220.85320556 -56.9998965 212.85486483 -56.98657227 204.73910522 C-56.99092692 202.97696722 -56.99611257 201.2148311 -57.00205994 199.45269775 C-57.01538088 194.69427485 -57.01603628 189.93593171 -57.01349664 185.17749381 C-57.01242211 181.19178856 -57.01732262 177.20609913 -57.02210206 173.22039729 C-57.03317362 163.80979165 -57.03364807 154.39922594 -57.02758789 144.98861694 C-57.02155113 135.31095889 -57.033857 125.63344634 -57.05515796 115.95581311 C-57.07282632 107.6191264 -57.07876704 99.28248578 -57.07552022 90.94578105 C-57.07371537 85.97895236 -57.07626313 81.01222745 -57.09023476 76.04541588 C-57.10289381 71.37083198 -57.10079334 66.69647335 -57.08782387 62.02189255 C-57.08547593 60.31683968 -57.08812795 58.61177056 -57.09644699 56.90673637 C-57.17336458 39.90166195 -55.46409088 25.63138706 -43.39941406 12.56845093 C-30.98085861 1.11150928 -16.27788266 -0.08105472 0 0 Z " fill="#FEFEFE" transform="translate(265.7119140625,728.6190490722656)" data-svg-af-field="kitchenRefrigerator"/> <path d="M0 0 C177.21 0 354.42 0 537 0 C537 147.84 537 295.68 537 448 C359.79 448 182.58 448 0 448 C0 300.16 0 152.32 0 0 Z " fill="#FEFEFE" transform="translate(1517,1208)" data-svg-af-field="kitchenOtg"/> <path d="M0 0 C130.02 0 260.04 0 394 0 C394 172.59 394 345.18 394 523 C268.6 523 143.2 523 14 523 C14 512.77 14 502.54 14 492 C9.38 492 4.76 492 0 492 C0 329.64 0 167.28 0 0 Z " fill="#FEFEFE" transform="translate(2278,1212)" data-svg-af-field="kitchenSink"/> <path d="M0 0 C107.25 0 214.5 0 325 0 C325 178.53 325 357.06 325 541 C217.75 541 110.5 541 0 541 C0 362.47 0 183.94 0 0 Z " fill="#FEFEFE" transform="translate(1613,156)" data-svg-af-field="kitchenChimney"/> <path d="M0 0 C1.53653418 -0.0034651 3.07306586 -0.00823534 4.60959244 -0.01418173 C8.79238744 -0.02660448 12.9749748 -0.02056155 17.15777016 -0.01122308 C21.6840919 -0.00439681 26.21037952 -0.01493144 30.73669434 -0.02316284 C39.5881698 -0.03646441 48.4395687 -0.03363843 57.2910471 -0.02492492 C64.48834928 -0.01813466 71.6856301 -0.01723745 78.88293457 -0.02049637 C79.90942997 -0.02095607 80.93592537 -0.02141577 81.9935267 -0.0218894 C84.07918899 -0.02284862 86.16485127 -0.02382127 88.25051355 -0.02480717 C107.78264591 -0.03335059 127.31473595 -0.0235434 146.84686136 -0.00740607 C163.58640532 0.00599615 180.32588685 0.00366776 197.06542969 -0.01016235 C216.5302877 -0.0262367 235.99510866 -0.03252671 255.45997238 -0.02332556 C257.53772735 -0.02236997 259.61548232 -0.02142686 261.6932373 -0.02049637 C262.71538653 -0.02003354 263.73753575 -0.01957072 264.79065919 -0.01909386 C271.97474705 -0.01650954 279.1588113 -0.02086292 286.34289551 -0.02793503 C295.1044315 -0.03637086 303.86588692 -0.03402621 312.62741375 -0.0180928 C317.0929781 -0.01023806 321.55840837 -0.00707047 326.02397156 -0.01704025 C330.11984164 -0.02604599 334.21545462 -0.02095863 338.31130171 -0.0051076 C339.78487507 -0.00178448 341.2584706 -0.00339746 342.73202944 -0.01073496 C358.29895148 -0.08224165 372.75682578 1.78407389 384.59667969 12.60751343 C396.66620925 25.26240124 397.88608219 39.48465395 397.75805664 56.07943726 C397.75856644 57.93042117 397.76082857 59.7814053 397.76469421 61.63238525 C397.77007789 66.62181074 397.75079959 71.61085985 397.72659326 76.60021806 C397.70518152 81.83747534 397.70588737 87.07473289 397.7039032 92.31202698 C397.69747235 101.09865737 397.67628567 109.88514769 397.64477539 118.67172241 C397.60442551 129.93777014 397.58707436 141.20372691 397.57746601 152.46983814 C397.56915558 162.17885377 397.55192879 171.88785031 397.5324285 181.5968492 C397.52838491 183.67566934 397.52464453 185.75449009 397.52120614 187.83331132 C397.51139614 193.75691367 397.49685492 199.68046216 397.47436714 205.60403061 C397.46826785 207.39545264 397.46380491 209.18688113 397.46112442 210.97831154 C397.45711394 213.42932342 397.44696851 215.880237 397.43525696 218.33122253 C397.43544132 219.03444147 397.43562568 219.73766041 397.43581563 220.46218902 C397.4041896 225.18904258 396.92052914 229.70699053 396.28808594 234.38095093 C396.20562115 236.34421142 396.16034182 238.30951465 396.15869141 240.27450562 C396.15553925 241.36213196 396.15238708 242.4497583 396.1491394 243.57034302 C396.15116364 244.71956238 396.15318787 245.86878174 396.15527344 247.05282593 C396.15431671 248.25280212 396.15335999 249.45277832 396.15237427 250.68911743 C396.15169632 253.21383721 396.15352364 255.73855876 396.15771484 258.26327515 C396.16308735 262.13196702 396.15774711 266.0005438 396.15136719 269.86923218 C396.15202767 272.32626368 396.15330821 274.78329512 396.15527344 277.24032593 C396.15223709 278.97630035 396.15223709 278.97630035 396.1491394 280.74734497 C396.15229156 281.82236267 396.15544373 282.89738037 396.15869141 284.00497437 C396.159487 284.94903137 396.16028259 285.89308838 396.16110229 286.86575317 C396.19521711 289.29592779 396.19521711 289.29592779 396.78797234 291.2391316 C397.34318161 293.61690729 397.41472329 295.72387673 397.4168871 298.16525787 C397.4201593 299.13273906 397.42343149 300.10022025 397.42680284 301.09701905 C397.42531922 302.15931077 397.4238356 303.22160248 397.42230701 304.31608486 C397.42465924 305.44970423 397.42701147 306.58332359 397.42943498 307.75129506 C397.43613889 311.58362126 397.43566634 315.41591366 397.43525696 319.24824524 C397.43800605 322.01017501 397.44224224 324.77210206 397.44639844 327.53403002 C397.45573158 334.35042004 397.45964769 341.16680357 397.4619174 347.98319919 C397.46487765 356.14545356 397.47357405 364.3076993 397.48233168 372.46994915 C397.50318513 392.20085883 397.51364756 411.93177002 397.52246129 431.66268816 C397.52666679 440.9959819 397.53188893 450.329275 397.53714582 459.66256819 C397.55503739 491.60788617 397.57003338 523.55320433 397.57746601 555.49852657 C397.57794077 557.50444209 397.57841666 559.5103576 397.57889367 561.51627311 C397.57913005 562.51103401 397.57936643 563.50579491 397.57960996 564.53070008 C397.58081117 569.57070883 397.58202662 574.61071758 397.58325195 579.65072632 C397.5834921 580.65093435 397.58373225 581.65114239 397.58397968 582.68165976 C397.59187212 615.10879207 397.61530212 647.5358878 397.6478079 679.96300414 C397.68210712 714.24179372 397.70181727 748.5205619 397.70511025 782.79936892 C397.70552779 786.56263738 397.70600736 790.32590582 397.70653343 794.08917427 C397.70665662 795.01580574 397.70677982 795.94243721 397.70690674 796.89714843 C397.70923873 811.8089038 397.72489874 826.72061669 397.74537528 841.63235693 C397.76563311 856.62272315 397.77111079 871.61303835 397.76160464 886.60341572 C397.75638941 895.50790341 397.76226819 904.41222122 397.78413932 913.31668445 C397.79765287 919.26861231 397.79656552 925.22042331 397.78373736 931.17235234 C397.7768442 934.56125899 397.77838068 937.94957734 397.79329745 941.33849715 C397.92968783 974.37208358 397.92968783 974.37208358 385.28808594 988.38095093 C372.5231184 1000.5348296 357.86095361 1001.68927649 340.93693542 1001.64164734 C339.40299189 1001.64467275 337.86904987 1001.64856418 336.33511049 1001.65323991 C332.14558017 1001.66347843 327.95613582 1001.66134871 323.76659858 1001.65705931 C319.23818353 1001.65458452 314.70978877 1001.6636156 310.18138123 1001.6710968 C301.31948507 1001.68382504 292.45761924 1001.68563982 283.59571549 1001.68329654 C276.38976324 1001.68151108 269.18382018 1001.68326791 261.97786903 1001.68752098 C260.43751623 1001.68841376 260.43751623 1001.68841376 258.86604518 1001.68932458 C256.77965829 1001.69053638 254.6932714 1001.69175051 252.60688452 1001.69296696 C233.0547469 1001.70383533 213.50262654 1001.70168337 193.95048795 1001.69558211 C176.08067776 1001.6904139 158.21092211 1001.70166714 140.34112271 1001.72068033 C121.97348015 1001.74007275 103.60586336 1001.74831225 85.2382105 1001.74455708 C74.93377946 1001.74264713 64.62939482 1001.7451125 54.32497215 1001.75927162 C45.55238938 1001.7712043 36.77988156 1001.77256918 28.00729772 1001.76048145 C23.53567476 1001.75460595 19.06418879 1001.75345642 14.59257507 1001.76548386 C10.49104 1001.77638723 6.38975557 1001.77318681 2.28823201 1001.75922217 C0.8125477 1001.75658744 -0.66315654 1001.75890288 -2.13882122 1001.76695804 C-18.66628218 1001.85084089 -32.09980393 999.54358212 -44.52441406 988.06845093 C-58.61343359 972.79689979 -57.14649595 953.74426605 -57.08613586 934.28471375 C-57.08887852 931.61996371 -57.09280871 928.95523919 -57.09817952 926.29049557 C-57.10743986 920.5112924 -57.10564682 914.73217639 -57.09644699 908.95297432 C-57.08280424 900.3590582 -57.08642668 891.76520856 -57.09340559 883.17128753 C-57.10531409 867.82061564 -57.10026062 852.46998489 -57.08812732 837.11931528 C-57.0775831 823.68740651 -57.07305286 810.25551174 -57.07442284 796.82359886 C-57.07450687 795.93196392 -57.0745909 795.04032897 -57.07467747 794.12167478 C-57.07502973 790.50209582 -57.07541375 786.88251687 -57.07584305 783.26293792 C-57.07980603 749.32526068 -57.06709946 715.3876082 -57.04631649 681.44993804 C-57.02794299 651.30510992 -57.02213562 621.16030553 -57.02758789 591.01547241 C-57.02793432 589.07939707 -57.02828042 587.14332174 -57.02862618 585.2072464 C-57.02879718 584.25008182 -57.02896817 583.29291724 -57.02914435 582.30674767 C-57.02999791 577.48839744 -57.03082169 572.67004721 -57.03161335 567.85169697 C-57.03177043 566.90108638 -57.03192751 565.9504758 -57.03208935 564.97105884 C-57.03607981 539.77163659 -57.03060339 514.57221662 -57.02210206 489.37279576 C-57.02119503 486.66122563 -57.02028938 483.9496555 -57.01938683 481.23808537 C-57.01878572 479.43935285 -57.0181771 477.64062033 -57.01756092 475.84188781 C-57.0133409 463.30632628 -57.01276071 450.77076923 -57.01466641 438.23520721 C-57.01710982 422.08238326 -57.01303375 405.92958336 -56.99745641 389.77676598 C-56.98940982 381.2362315 -56.98680196 372.69573706 -56.99209877 364.1552002 C-56.99507805 358.44876971 -56.99076658 352.74237457 -56.98055019 347.03595253 C-56.97493011 343.78594526 -56.97350826 340.53603548 -56.97871677 337.28602508 C-56.9838256 333.78012641 -56.97663252 330.27445737 -56.96638966 326.76857471 C-56.97078614 325.76667092 -56.97518263 324.76476713 -56.97971234 323.73250261 C-56.93836891 316.30403856 -56.48388007 308.716334 -53.6455253 301.77186938 C-52.34223326 298.43422211 -52.68616894 295.75273992 -52.96191406 292.19345093 C-53.01275146 291.4891394 -53.06358887 290.78482788 -53.1159668 290.05917358 C-53.39068677 286.48584326 -53.75164729 282.93641515 -54.23144531 279.38485718 C-55.56537792 269.37015703 -55.90522946 259.47319233 -55.89941406 249.38095093 C-55.9002298 248.70240051 -55.90104553 248.0238501 -55.90188599 247.32473755 C-55.900309 235.75774081 -55.900309 235.75774081 -54.71191406 233.38095093 C-54.96479232 231.86351704 -55.28423286 230.35704503 -55.63224792 228.85856628 C-57.17496244 220.85320556 -56.9998965 212.85486483 -56.98657227 204.73910522 C-56.99092692 202.97696722 -56.99611257 201.2148311 -57.00205994 199.45269775 C-57.01538088 194.69427485 -57.01603628 189.93593171 -57.01349664 185.17749381 C-57.01242211 181.19178856 -57.01732262 177.20609913 -57.02210206 173.22039729 C-57.03317362 163.80979165 -57.03364807 154.39922594 -57.02758789 144.98861694 C-57.02155113 135.31095889 -57.033857 125.63344634 -57.05515796 115.95581311 C-57.07282632 107.6191264 -57.07876704 99.28248578 -57.07552022 90.94578105 C-57.07371537 85.97895236 -57.07626313 81.01222745 -57.09023476 76.04541588 C-57.10289381 71.37083198 -57.10079334 66.69647335 -57.08782387 62.02189255 C-57.08547593 60.31683968 -57.08812795 58.61177056 -57.09644699 56.90673637 C-57.17336458 39.90166195 -55.46409088 25.63138706 -43.39941406 12.56845093 C-30.98085861 1.11150928 -16.27788266 -0.08105472 0 0 Z M-41.46191406 294.25595093 C-48.70458225 304.3152123 -50.01971524 314.46008452 -49.96638966 326.65111351 C-49.96959613 327.74805782 -49.97280261 328.84500213 -49.97610626 329.97518718 C-49.98439996 333.64665868 -49.97848405 337.31796678 -49.97261047 340.98944092 C-49.97563144 343.65002047 -49.9794399 346.31058841 -49.98420304 348.97116435 C-49.99295244 354.75366884 -49.99428164 360.53613792 -49.99069977 366.31864738 C-49.98538738 374.91761087 -49.99149345 383.51654013 -49.9997827 392.1154999 C-50.01501858 408.36723812 -50.01672821 424.61896076 -50.01425967 440.87070464 C-50.01242667 453.42042351 -50.01418678 465.97013727 -50.01848412 478.5198555 C-50.01908652 480.32317714 -50.01968772 482.12649878 -50.02028772 483.92982043 C-50.02119498 486.64728427 -50.02210364 489.36474812 -50.02302007 492.08221197 C-50.03144896 517.34587153 -50.03578571 542.60952916 -50.03161335 567.87318993 C-50.03145697 568.82547201 -50.0313006 569.7777541 -50.03113948 570.75889322 C-50.03033371 575.58538369 -50.02948793 580.41187416 -50.02862618 585.23836462 C-50.02845509 586.19691294 -50.02828401 587.15546126 -50.02810773 588.1430565 C-50.02776108 590.08147335 -50.02741255 592.0198902 -50.02706215 593.95830704 C-50.02170449 624.1226374 -50.02963689 654.28693852 -50.0480957 684.45126343 C-50.06881241 718.34495818 -50.07953909 752.23863482 -50.07552022 786.13233626 C-50.07512487 789.74636245 -50.07476333 793.36038863 -50.07442284 796.97441483 C-50.0743321 797.86427281 -50.07424137 798.75413079 -50.07414789 799.67095416 C-50.07298204 813.10280127 -50.07962928 826.53463009 -50.09023476 839.96647263 C-50.10228385 855.24218888 -50.10384902 870.51786486 -50.09144459 885.79358171 C-50.08481469 894.34057291 -50.08645007 902.88746779 -50.1000331 911.43445129 C-50.10827838 917.14660047 -50.10557904 922.85867752 -50.09405784 928.57082084 C-50.08780219 931.82338304 -50.08785961 935.07572033 -50.09792117 938.32827847 C-50.10802675 941.8387289 -50.09960492 945.3486757 -50.08664417 948.85910606 C-50.09395352 949.85952623 -50.10126286 950.85994641 -50.10879371 951.89068234 C-50.01013047 964.79709826 -46.77142357 975.03147423 -38.08691406 984.56845093 C-27.146115 995.05510361 -13.82220382 994.53093327 0.38131714 994.52139282 C1.92377074 994.52397922 3.46622368 994.52699315 5.00867569 994.53039622 C9.23548675 994.53843674 13.4622808 994.54025414 17.6890986 994.54099369 C22.25225034 994.54284932 26.81539336 994.55039904 31.37854004 994.55712891 C41.34949292 994.57069023 51.32044177 994.57673308 61.29140234 994.58113956 C67.5188655 994.58390484 73.74632711 994.58814263 79.97378922 994.59264374 C97.22174164 994.60483189 114.46969282 994.61513316 131.71764946 994.61851883 C132.82073948 994.6187384 133.9238295 994.61895796 135.06034649 994.61918418 C136.71888322 994.6195116 136.71888322 994.6195116 138.41092575 994.61984563 C140.6513919 994.62028909 142.89185806 994.62073566 145.13232422 994.6211853 C146.24366703 994.62140673 147.35500984 994.62162816 148.5000297 994.6218563 C166.51499335 994.62580588 184.5299166 994.64326681 202.54486464 994.66654482 C221.04799085 994.69026045 239.55109678 994.70272072 258.05423844 994.70388675 C268.44019214 994.70480321 278.82609314 994.71054866 289.21203232 994.72870636 C298.05360081 994.74410994 306.8951003 994.74922614 315.73667966 994.74096826 C320.24626951 994.73706313 324.75572039 994.73798478 329.26529312 994.7520256 C333.39695595 994.76477208 337.52837548 994.76356051 341.66003801 994.75143489 C343.15122095 994.74947924 344.64242116 994.75255026 346.13357984 994.76127926 C359.29379268 994.83341338 369.14109581 993.1410687 379.28808594 984.38095093 C384.02641268 979.38842211 386.7302087 973.70349876 389.28808594 967.38095093 C389.61808594 966.72095093 389.94808594 966.06095093 390.28808594 965.38095093 C390.38306376 963.9023155 390.41554534 962.41945147 390.4168871 960.93776941 C390.4201593 959.99551539 390.42343149 959.05326138 390.42680284 958.0824542 C390.42457741 956.51594704 390.42457741 956.51594704 390.42230701 954.91779327 C390.42465924 953.81090841 390.42701147 952.70402355 390.42943498 951.56359673 C390.43615518 947.81020029 390.43566586 944.05683824 390.43525696 940.30343628 C390.43855372 937.60296655 390.44224088 934.90249989 390.44639844 932.20203161 C390.45574248 925.52999515 390.45964952 918.85796533 390.4619174 912.18592315 C390.46487483 904.19819813 390.47356958 896.21048197 390.48233168 888.22276158 C390.50319696 868.91231586 390.5136495 849.60186858 390.52246129 830.29141421 C390.52666519 821.15889995 390.53188755 812.02638635 390.53714582 802.89387265 C390.55503861 771.6424076 390.570035 740.39094237 390.57746601 709.13947296 C390.57794077 707.17667789 390.57841666 705.21388282 390.57889367 703.25108775 C390.57913005 702.27769908 390.57936643 701.3043104 390.57960996 700.3014251 C390.58081119 695.36960037 390.58202663 690.43777565 390.58325195 685.50595093 C390.5834921 684.52720748 390.58373225 683.54846404 390.58397968 682.5400617 C390.59187279 650.80612071 390.61530352 619.0722171 390.6478079 587.33829243 C390.6820969 553.8008982 390.70181634 520.26352584 390.70511025 486.7261138 C390.7055278 483.04515679 390.70600737 479.36419979 390.70653343 475.6832428 C390.70665662 474.77686331 390.70677982 473.87048383 390.70690674 472.9366383 C390.70924005 458.34218306 390.72490749 443.74777117 390.74537528 429.15333139 C390.76561988 414.48539243 390.77111707 399.81750561 390.76160464 385.14955527 C390.75638418 376.4332974 390.76229281 367.71721295 390.78413932 359.00098 C390.79763147 353.17827908 390.79658446 347.35569773 390.78373736 341.53299566 C390.77682989 338.21539784 390.77841645 334.89840221 390.79329745 331.58079034 C390.80835013 328.00384079 390.79878832 324.42776536 390.78307056 320.85083771 C390.79840387 319.31242454 390.79840387 319.31242454 390.81404695 317.74293232 C390.73032745 309.02921587 388.433476 301.33951151 382.85058594 294.50595093 C382.295 293.80727905 381.73941406 293.10860718 381.16699219 292.38876343 C373.80837877 284.52529711 364.35236874 281.22304351 353.73215103 280.75453854 C350.90226336 280.71011435 348.07518861 280.72874311 345.24517822 280.75276184 C343.66056606 280.74770655 342.07595963 280.74047017 340.49136615 280.7312637 C336.17111502 280.71245483 331.85143527 280.72451024 327.53119922 280.74198663 C322.8590625 280.75541834 318.18700621 280.73990303 313.51487732 280.72816467 C304.37680025 280.70982859 295.23893765 280.71827266 286.10086736 280.7362529 C278.67370284 280.75030059 271.24659639 280.75416704 263.81941986 280.75081062 C262.76081638 280.75033318 261.7022129 280.74985574 260.61153053 280.74936383 C258.46079104 280.74833747 256.31005156 280.74728211 254.1593121 280.74619807 C235.16166654 280.73763959 216.16412432 280.75428016 197.16650391 280.7840271 C178.74035302 280.81287873 160.31435088 280.8199392 141.88818359 280.80453491 C121.80736278 280.78777026 101.72661251 280.78373999 81.64578986 280.80124527 C79.50435623 280.80308961 77.3629226 280.80492434 75.22148895 280.80674934 C74.16793597 280.80766143 73.11438299 280.80857352 72.02890415 280.80951325 C64.61003948 280.81511574 57.1912093 280.8118143 49.7723465 280.80520439 C40.7324713 280.79746968 31.69274245 280.80422936 22.65289673 280.82937943 C18.04211166 280.84186929 13.4315544 280.84802706 8.82076073 280.83683777 C4.5979737 280.82678356 0.37564064 280.83527999 -3.84709123 280.85841895 C-5.37241705 280.86357022 -6.89778369 280.86203084 -8.42309162 280.8530243 C-22.31329889 280.7778454 -31.76761595 284.1210029 -41.46191406 294.25595093 Z " fill="#FEFEFE" transform="translate(265.7119140625,728.6190490722656)" data-svg-af-field="kitchenRefrigerator"/> <path d="M0 0 C68.31 0 136.62 0 207 0 C207 164.34 207 328.68 207 498 C138.69 498 70.38 498 0 498 C0 333.66 0 169.32 0 0 Z " fill="#FEFEFE" transform="translate(2060,1208)" data-svg-af-field="kitchenCabinet"/> <path d="M0 0 C139.92 0 279.84 0 424 0 C424 74.91 424 149.82 424 227 C284.08 227 144.16 227 0 227 C0 152.09 0 77.18 0 0 Z " fill="#FEFEFE" transform="translate(1575,1375)" data-svg-af-field="kitchenOtg"/> <path d="M0 0 C78.87 0 157.74 0 239 0 C239 131.01 239 262.02 239 397 C160.13 397 81.26 397 0 397 C0 265.99 0 134.98 0 0 Z " fill="#FEFEFE" transform="translate(957,1309)" data-svg-af-field="kitchenCabinet"/> <path d="M0 0 C75.57 0 151.14 0 229 0 C229 130.68 229 261.36 229 396 C153.43 396 77.86 396 0 396 C0 265.32 0 134.64 0 0 Z " fill="#FEFEFE" transform="translate(721,1310)" data-svg-af-field="kitchenCabinet"/> <path d="M0 0 C101.31 0 202.62 0 307 0 C307 58.74 307 117.48 307 178 C205.69 178 104.38 178 0 178 C0 119.26 0 60.52 0 0 Z " fill="#FEFEFE" transform="translate(1203,1528)" data-svg-af-field="kitchenModularDrawer"/> <path d="M0 0 C465.63 0 931.26 0 1411 0 C1411 10.89 1411 21.78 1411 33 C945.37 33 479.74 33 0 33 C0 22.11 0 11.22 0 0 Z " fill="#FEFEFE" transform="translate(196,663)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C478.5 0 957 0 1450 0 C1450 10.23 1450 20.46 1450 31 C1423.68915156 32.17762398 1397.40658883 32.14348413 1371.07401852 32.12948795 C1364.01210345 32.12595437 1356.9501931 32.12840718 1349.88827805 32.1309446 C1336.69691034 32.13551702 1323.50554651 32.13540817 1310.31417847 32.13266373 C1296.96470817 32.12990337 1283.61524041 32.1293394 1270.26576996 32.13140106 C1268.99660556 32.13159482 1268.99660556 32.13159482 1267.70180148 32.13179249 C1264.25525616 32.13232582 1260.80871083 32.13287453 1257.36216551 32.13344277 C1225.3357247 32.13871931 1193.3092856 32.13909663 1161.28284454 32.13629532 C1160.33581694 32.13621252 1159.38878934 32.13612973 1158.41306394 32.13604442 C1157.46451844 32.13596149 1156.51597293 32.13587856 1155.53868363 32.13579312 C1126.61353455 32.13326758 1097.68838617 32.13261966 1068.763237 32.13381577 C1066.82451168 32.13389324 1064.88578637 32.1339704 1062.94706105 32.13404724 C1055.15597151 32.13435771 1047.36488198 32.13467638 1039.57379244 32.135007 C1017.79871558 32.13592381 996.02363873 32.13649455 974.24856186 32.13679314 C972.76147189 32.13681361 972.76147189 32.13681361 971.2443397 32.13683449 C939.67426718 32.13724351 908.10419491 32.13611807 876.53412247 32.13394356 C874.99904211 32.13383818 874.99904211 32.13383818 873.43295003 32.13373068 C856.81463763 32.13258579 840.19632523 32.1313663 823.57801283 32.13014051 C757.60051048 32.12527909 691.62301016 32.12551451 625.64550781 32.13037109 C609.00215785 32.13159225 592.35880789 32.13280329 575.71545792 32.13394356 C574.69070373 32.13401401 573.66594954 32.13408445 572.6101422 32.13415704 C541.04717154 32.13631203 509.48420105 32.13722774 477.92123032 32.13679314 C476.93094627 32.13677955 475.94066223 32.13676597 474.92036958 32.13675197 C453.1865265 32.13643955 431.45268345 32.13580603 409.71884039 32.13488263 C401.94363146 32.13455349 394.16842253 32.13424041 386.3932136 32.13393192 C384.45894621 32.13385453 382.52467883 32.1337758 380.59041144 32.13369573 C351.65283806 32.13250102 322.71526548 32.13352064 293.77769221 32.13604442 C292.82834634 32.13612722 291.87900046 32.13621001 290.90088654 32.13629532 C289.47949433 32.13641934 289.47949433 32.13641934 288.02938714 32.13654587 C256.12501999 32.13929928 224.22065488 32.1382991 192.31628802 32.13301457 C188.89585879 32.13246219 185.47542955 32.13192549 182.05500031 32.13140106 C181.215545 32.13127086 180.3760897 32.13114065 179.51119635 32.1310065 C166.18189616 32.12902877 152.8525985 32.13041298 139.52329853 32.13317007 C126.43970878 32.13580553 113.35612332 32.13490484 100.27253412 32.13015598 C92.58808183 32.12747368 84.90364128 32.12756669 77.21918953 32.13163758 C71.53657161 32.13434663 65.85396565 32.13192175 60.17134933 32.1273813 C57.87045017 32.12636404 55.56954953 32.12706626 53.26865153 32.12958724 C50.17171197 32.13274284 47.07483808 32.12987229 43.9779017 32.12534916 C43.07011145 32.12773991 42.1623212 32.13013065 41.22702215 32.13259384 C35.11415575 32.11415575 35.11415575 32.11415575 34 31 C31.47905924 30.91152257 28.98569107 30.88472699 26.46484375 30.90234375 C25.71159317 30.9037587 24.95834259 30.90517365 24.18226624 30.90663147 C21.7673044 30.91224624 19.35243399 30.92480117 16.9375 30.9375 C15.30403779 30.9425131 13.67057414 30.94707634 12.03710938 30.95117188 C8.0246757 30.96137125 4.01244064 30.98094355 0 31 C0 20.77 0 10.54 0 0 Z " fill="#FDFDFD" transform="translate(157,346)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C84.15 0 168.3 0 255 0 C255 31.68 255 63.36 255 96 C220.02 96 185.04 96 149 96 C149 95.34 149 94.68 149 94 C182.99 94 216.98 94 252 94 C252 91.69 252 89.38 252 87 C169.5 87 87 87 2 87 C2 89.31 2 91.62 2 94 C30.71 94 59.42 94 89 94 C89 100.93 89 107.86 89 115 C87.35 115 85.7 115 84 115 C84 117.31 84 119.62 84 122 C84.66531738 121.97381592 85.33063477 121.94763184 86.01611328 121.9206543 C89.05216535 121.8162454 92.08783911 121.75153652 95.125 121.6875 C96.17171875 121.64560547 97.2184375 121.60371094 98.296875 121.56054688 C107.02336749 121.42246946 107.02336749 121.42246946 110.55859375 124.45703125 C111.36425781 125.29621094 112.16992188 126.13539062 113 127 C116.98746711 128.35743561 118.66448994 128.11373222 122.6875 126.75 C125.91043945 125.32611981 125.91043945 125.32611981 127.2890625 123.40234375 C129.9462012 121.22446066 132.33048102 121.71278656 135.6875 121.8125 C137.45673828 121.85310547 137.45673828 121.85310547 139.26171875 121.89453125 C140.16535156 121.92933594 141.06898438 121.96414063 142 122 C142 122.66 142 123.32 142 124 C144.31 124 146.62 124 149 124 C149 123.34 149 122.68 149 122 C150.65 122 152.3 122 154 122 C154 120.02 154 118.04 154 116 C187.33 116 220.66 116 255 116 C255 149.66 255 183.32 255 218 C210.45 218 165.9 218 120 218 C122 211 122 211 123.5847168 209.47436523 C124.20000244 209.17216064 124.81528809 208.86995605 125.44921875 208.55859375 C126.12944092 208.20603516 126.80966309 207.85347656 127.51049805 207.49023438 C128.22890869 207.14283203 128.94731934 206.79542969 129.6875 206.4375 C131.14854997 205.67051748 132.60693856 204.89844188 134.0625 204.12109375 C134.75214844 203.75612793 135.44179688 203.39116211 136.15234375 203.01513672 C142.80908999 199.35779649 147.43767547 194.20159933 150 187 C150.98222854 181.39411029 150.74657935 176.58337938 147.9375 171.5625 C145.11716324 167.69347465 142.42396453 165.83060601 138 164 C133.79644934 163.63762494 130.09123507 164.00818544 126 165 C125.67 162.36 125.34 159.72 125 157 C108.5 157 92 157 75 157 C74.66187214 175.17437227 75.01003796 191.66639638 78.51928711 209.5 C79.0623513 212.32426475 79.52718811 215.16312866 80 218 C53.6 218 27.2 218 0 218 C0 146.06 0 74.12 0 0 Z " fill="#FEFEFE" transform="translate(832,948)"/> <path d="M0 0 C156.75 0 313.5 0 475 0 C475 31.35 475 62.7 475 95 C318.25 95 161.5 95 0 95 C0 63.65 0 32.3 0 0 Z " fill="#FEFEFE" transform="translate(721,1208)" data-svg-af-field="kitchenModularDrawer"/> <path d="M0 0 C1.85818359 0.01353516 1.85818359 0.01353516 3.75390625 0.02734375 C4.63949219 0.03894531 5.52507812 0.05054688 6.4375 0.0625 C7.77604913 4.07814738 7.57355756 7.93654179 7.5616985 12.12339514 C7.56297658 13.06817843 7.56425467 14.01296171 7.56557148 14.98637478 C7.56866206 18.18866001 7.56455463 21.39089698 7.56054783 24.59318066 C7.56128676 26.90753222 7.56246459 29.22188368 7.56404433 31.53623483 C7.56680574 37.27266624 7.56487189 43.00908311 7.56104124 48.7455136 C7.55669026 55.66046646 7.55817053 62.57541496 7.55984976 69.49036855 C7.56282029 82.41484728 7.56103724 95.3393215 7.55670547 108.26379967 C7.55233284 121.36779329 7.55013225 134.47178459 7.55060768 147.57577896 C7.55063637 148.40233488 7.55066507 149.22889079 7.55069463 150.08049385 C7.550851 154.29483832 7.55104294 158.50918279 7.55124746 162.72352726 C7.55265631 193.25574095 7.54921946 223.78795257 7.54323006 254.32016563 C7.53731124 284.56469419 7.5334557 314.80922186 7.53237724 345.05375099 C7.53234283 345.99240109 7.53230842 346.9310512 7.53227296 347.89814524 C7.53195977 356.47103981 7.53167208 365.04393437 7.53141499 373.61682894 C7.53077552 394.92981119 7.52981616 416.24279342 7.52863979 437.55577564 C7.52855982 439.01173029 7.52855982 439.01173029 7.52847823 440.49709816 C7.52585556 487.73382424 7.51954753 534.97054973 7.51293945 582.20727539 C7.51064783 598.6031901 7.50837248 614.99910481 7.50616455 631.39501953 C7.5060276 632.41187071 7.50589065 633.42872188 7.50574955 634.47638673 C7.4994076 681.73122945 7.49568057 728.98607227 7.49262976 776.24091531 C7.49243169 779.30805231 7.4922325 782.37518932 7.49203308 785.44232632 C7.49071332 805.76809436 7.48943866 826.09386239 7.48819422 846.41963043 C7.4857176 886.86421355 7.48297591 927.30879666 7.48005217 967.75337975 C7.47991293 969.67953508 7.47977388 971.60569041 7.47963501 973.53184574 C7.47338048 1060.26301138 7.46404208 1146.9941766 7.45336914 1233.7253418 C7.45326921 1234.53760312 7.45316927 1235.34986444 7.45306631 1236.18673974 C7.44806566 1276.81199319 7.4428825 1317.43724661 7.4375 1358.0625 C-3.4525 1358.0625 -14.3425 1358.0625 -25.5625 1358.0625 C-25.5625 910.2525 -25.5625 462.4425 -25.5625 1.0625 C-6.4375 -0.0625 -6.4375 -0.0625 0 0 Z " fill="#FAFAFA" transform="translate(182.5625,381.9375)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C4.29 0 8.58 0 13 0 C13 9.24 13 18.48 13 28 C-503.12 28 -1019.24 28 -1551 28 C-1551 19.42 -1551 10.84 -1551 2 C-1545.59447864 2.00138269 -1545.59447864 2.00138269 -1540.07975483 2.00279331 C-1444.00450598 2.02716403 -1347.92925651 2.04491936 -1207.42664474 2.06039681 C-1195.99540896 2.06154891 -1184.56417319 2.06273337 -1173.13293743 2.06401682 C-1104.53003103 2.07170623 -1035.9271255 2.07567773 -967.32421875 2.0703125 C-965.61608709 2.07017892 -965.61608709 2.07017892 -963.87344772 2.07004264 C-861.7310949 2.06185584 -759.58879454 2.03987355 -591.56784139 1.74682445 C-588.4231095 1.74064777 -585.27837751 1.73452152 -582.13364552 1.72839474 C-524.11722729 1.61531217 -466.10085007 1.48850501 -408.08453542 1.33066863 C-381.6752652 1.25883535 -355.26598728 1.19095821 -328.85669079 1.12948343 C-326.4674753 1.12391371 -324.07825989 1.1183066 -321.68904456 1.11266115 C-214.4568932 0.8595077 -107.22995112 1.32827254 0 2 C0 1.34 0 0.68 0 0 Z " fill="#FEFEFE" transform="translate(2272,1711)"/> <path d="M0 0 C10.89 0 21.78 0 33 0 C33 342.21 33 684.42 33 1037 C23.1 1037 13.2 1037 3 1037 C2.625 1022.125 2.625 1022.125 2.52197266 1017.43408203 C2.46855713 1015.61432861 2.46855713 1015.61432861 2.4140625 1013.7578125 C2.3826416 1012.5114502 2.3512207 1011.26508789 2.31884766 1009.98095703 C2.30317691 1006.88458224 2.30317691 1006.88458224 0 1005 C-0.24934233 1002.10682347 -0.24934233 1002.10682347 -0.24839699 998.30751359 C-0.25223125 997.25683015 -0.25223125 997.25683015 -0.25614297 996.18492077 C-0.26232712 993.80934004 -0.25410772 991.43401924 -0.24609566 989.05844688 C-0.24757344 987.34215983 -0.24992901 985.62587335 -0.25308865 983.90958858 C-0.25926316 979.15355022 -0.25284648 974.39759653 -0.24453239 969.64156444 C-0.23769496 964.48249151 -0.24239964 959.32342763 -0.24568737 954.16435301 C-0.24984587 945.1093256 -0.24652857 936.05432439 -0.23841095 926.9993 C-0.22637363 913.53467331 -0.22573629 900.07006325 -0.22749493 886.60543217 C-0.23012693 863.95916156 -0.22343852 841.31290382 -0.21146011 818.66663742 C-0.19962276 796.23353393 -0.19191145 773.80043524 -0.18975449 751.36732864 C-0.18968566 750.67112654 -0.18961684 749.97492444 -0.18954593 749.2576253 C-0.18891955 742.89906718 -0.18834416 736.54050905 -0.18782998 730.18195091 C-0.18655104 714.37395874 -0.18463231 698.56596668 -0.18227959 682.75797462 C-0.18217295 682.03804409 -0.18206632 681.31811356 -0.18195645 680.57636695 C-0.17671103 645.53984178 -0.16409494 610.50331979 -0.15087891 575.46679688 C-0.14629566 563.30548098 -0.14174497 551.14416508 -0.1373291 538.98284912 C-0.1370552 538.2286224 -0.1367813 537.47439569 -0.13649911 536.69731362 C-0.12381535 501.64753508 -0.11636119 466.59775601 -0.11025951 431.54797579 C-0.10986338 429.27304342 -0.109465 426.99811106 -0.10906615 424.7231787 C-0.10642663 409.64732103 -0.10387733 394.57146334 -0.10138843 379.49560565 C-0.09643519 349.49735183 -0.09095181 319.49909813 -0.08510434 289.50084447 C-0.08482586 288.07218874 -0.08454775 286.64353301 -0.08427001 285.21487727 C-0.06748746 198.90813449 -0.03957217 112.6013952 0 0 Z " fill="#FEFEFE" transform="translate(681,702)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C101.64 0 203.28 0 308 0 C308 33.99 308 67.98 308 103 C206.36 103 104.72 103 0 103 C0 69.01 0 35.02 0 0 Z " fill="#FDFDFD" transform="translate(1203,1418)" data-svg-af-field="kitchenModularDrawer"/> <path d="M0 0 C101.64 0 203.28 0 308 0 C308 33.99 308 67.98 308 103 C206.36 103 104.72 103 0 103 C0 69.01 0 35.02 0 0 Z " fill="#FDFDFD" transform="translate(1203,1309)" data-svg-af-field="kitchenModularDrawer"/> <path d="M0 0 C1.53653418 -0.0034651 3.07306586 -0.00823534 4.60959244 -0.01418173 C8.79238744 -0.02660448 12.9749748 -0.02056155 17.15777016 -0.01122308 C21.6840919 -0.00439681 26.21037952 -0.01493144 30.73669434 -0.02316284 C39.5881698 -0.03646441 48.4395687 -0.03363843 57.2910471 -0.02492492 C64.48834928 -0.01813466 71.6856301 -0.01723745 78.88293457 -0.02049637 C79.90942997 -0.02095607 80.93592537 -0.02141577 81.9935267 -0.0218894 C84.07918899 -0.02284862 86.16485127 -0.02382127 88.25051355 -0.02480717 C107.78264591 -0.03335059 127.31473595 -0.0235434 146.84686136 -0.00740607 C163.58640532 0.00599615 180.32588685 0.00366776 197.06542969 -0.01016235 C216.5302877 -0.0262367 235.99510866 -0.03252671 255.45997238 -0.02332556 C257.53772735 -0.02236997 259.61548232 -0.02142686 261.6932373 -0.02049637 C262.71538653 -0.02003354 263.73753575 -0.01957072 264.79065919 -0.01909386 C271.97474705 -0.01650954 279.1588113 -0.02086292 286.34289551 -0.02793503 C295.1044315 -0.03637086 303.86588692 -0.03402621 312.62741375 -0.0180928 C317.0929781 -0.01023806 321.55840837 -0.00707047 326.02397156 -0.01704025 C330.11984164 -0.02604599 334.21545462 -0.02095863 338.31130171 -0.0051076 C339.78487507 -0.00178448 341.2584706 -0.00339746 342.73202944 -0.01073496 C358.29895148 -0.08224165 372.75682578 1.78407389 384.59667969 12.60751343 C396.66620925 25.26240124 397.88608219 39.48465395 397.75805664 56.07943726 C397.75856644 57.93042117 397.76082857 59.7814053 397.76469421 61.63238525 C397.77007789 66.62181074 397.75079959 71.61085985 397.72659326 76.60021806 C397.70518152 81.83747534 397.70588737 87.07473289 397.7039032 92.31202698 C397.69747235 101.09865737 397.67628567 109.88514769 397.64477539 118.67172241 C397.60442551 129.93777014 397.58707436 141.20372691 397.57746601 152.46983814 C397.56915558 162.17885377 397.55192879 171.88785031 397.5324285 181.5968492 C397.52838491 183.67566934 397.52464453 185.75449009 397.52120614 187.83331132 C397.51139614 193.75691367 397.49685492 199.68046216 397.47436714 205.60403061 C397.46826785 207.39545264 397.46380491 209.18688113 397.46112442 210.97831154 C397.45711394 213.42932342 397.44696851 215.880237 397.43525696 218.33122253 C397.43544132 219.03444147 397.43562568 219.73766041 397.43581563 220.46218902 C397.4041896 225.18904258 396.92052914 229.70699053 396.28808594 234.38095093 C396.20562115 236.34421142 396.16034182 238.30951465 396.15869141 240.27450562 C396.15553925 241.36213196 396.15238708 242.4497583 396.1491394 243.57034302 C396.15116364 244.71956238 396.15318787 245.86878174 396.15527344 247.05282593 C396.15431671 248.25280212 396.15335999 249.45277832 396.15237427 250.68911743 C396.15169632 253.21383721 396.15352364 255.73855876 396.15771484 258.26327515 C396.16308735 262.13196702 396.15774711 266.0005438 396.15136719 269.86923218 C396.15202767 272.32626368 396.15330821 274.78329512 396.15527344 277.24032593 C396.15223709 278.97630035 396.15223709 278.97630035 396.1491394 280.74734497 C396.15229156 281.82236267 396.15544373 282.89738037 396.15869141 284.00497437 C396.159487 284.94903137 396.16028259 285.89308838 396.16110229 286.86575317 C396.19521711 289.29592779 396.19521711 289.29592779 396.78797234 291.2391316 C397.34318161 293.61690729 397.41472329 295.72387673 397.4168871 298.16525787 C397.4201593 299.13273906 397.42343149 300.10022025 397.42680284 301.09701905 C397.42531922 302.15931077 397.4238356 303.22160248 397.42230701 304.31608486 C397.42465924 305.44970423 397.42701147 306.58332359 397.42943498 307.75129506 C397.43613889 311.58362126 397.43566634 315.41591366 397.43525696 319.24824524 C397.43800605 322.01017501 397.44224224 324.77210206 397.44639844 327.53403002 C397.45573158 334.35042004 397.45964769 341.16680357 397.4619174 347.98319919 C397.46487765 356.14545356 397.47357405 364.3076993 397.48233168 372.46994915 C397.50318513 392.20085883 397.51364756 411.93177002 397.52246129 431.66268816 C397.52666679 440.9959819 397.53188893 450.329275 397.53714582 459.66256819 C397.55503739 491.60788617 397.57003338 523.55320433 397.57746601 555.49852657 C397.57794077 557.50444209 397.57841666 559.5103576 397.57889367 561.51627311 C397.57913005 562.51103401 397.57936643 563.50579491 397.57960996 564.53070008 C397.58081117 569.57070883 397.58202662 574.61071758 397.58325195 579.65072632 C397.5834921 580.65093435 397.58373225 581.65114239 397.58397968 582.68165976 C397.59187212 615.10879207 397.61530212 647.5358878 397.6478079 679.96300414 C397.68210712 714.24179372 397.70181727 748.5205619 397.70511025 782.79936892 C397.70552779 786.56263738 397.70600736 790.32590582 397.70653343 794.08917427 C397.70665662 795.01580574 397.70677982 795.94243721 397.70690674 796.89714843 C397.70923873 811.8089038 397.72489874 826.72061669 397.74537528 841.63235693 C397.76563311 856.62272315 397.77111079 871.61303835 397.76160464 886.60341572 C397.75638941 895.50790341 397.76226819 904.41222122 397.78413932 913.31668445 C397.79765287 919.26861231 397.79656552 925.22042331 397.78373736 931.17235234 C397.7768442 934.56125899 397.77838068 937.94957734 397.79329745 941.33849715 C397.92968783 974.37208358 397.92968783 974.37208358 385.28808594 988.38095093 C372.5231184 1000.5348296 357.86095361 1001.68927649 340.93693542 1001.64164734 C339.40299189 1001.64467275 337.86904987 1001.64856418 336.33511049 1001.65323991 C332.14558017 1001.66347843 327.95613582 1001.66134871 323.76659858 1001.65705931 C319.23818353 1001.65458452 314.70978877 1001.6636156 310.18138123 1001.6710968 C301.31948507 1001.68382504 292.45761924 1001.68563982 283.59571549 1001.68329654 C276.38976324 1001.68151108 269.18382018 1001.68326791 261.97786903 1001.68752098 C260.43751623 1001.68841376 260.43751623 1001.68841376 258.86604518 1001.68932458 C256.77965829 1001.69053638 254.6932714 1001.69175051 252.60688452 1001.69296696 C233.0547469 1001.70383533 213.50262654 1001.70168337 193.95048795 1001.69558211 C176.08067776 1001.6904139 158.21092211 1001.70166714 140.34112271 1001.72068033 C121.97348015 1001.74007275 103.60586336 1001.74831225 85.2382105 1001.74455708 C74.93377946 1001.74264713 64.62939482 1001.7451125 54.32497215 1001.75927162 C45.55238938 1001.7712043 36.77988156 1001.77256918 28.00729772 1001.76048145 C23.53567476 1001.75460595 19.06418879 1001.75345642 14.59257507 1001.76548386 C10.49104 1001.77638723 6.38975557 1001.77318681 2.28823201 1001.75922217 C0.8125477 1001.75658744 -0.66315654 1001.75890288 -2.13882122 1001.76695804 C-18.66628218 1001.85084089 -32.09980393 999.54358212 -44.52441406 988.06845093 C-58.61343359 972.79689979 -57.14649595 953.74426605 -57.08613586 934.28471375 C-57.08887852 931.61996371 -57.09280871 928.95523919 -57.09817952 926.29049557 C-57.10743986 920.5112924 -57.10564682 914.73217639 -57.09644699 908.95297432 C-57.08280424 900.3590582 -57.08642668 891.76520856 -57.09340559 883.17128753 C-57.10531409 867.82061564 -57.10026062 852.46998489 -57.08812732 837.11931528 C-57.0775831 823.68740651 -57.07305286 810.25551174 -57.07442284 796.82359886 C-57.07450687 795.93196392 -57.0745909 795.04032897 -57.07467747 794.12167478 C-57.07502973 790.50209582 -57.07541375 786.88251687 -57.07584305 783.26293792 C-57.07980603 749.32526068 -57.06709946 715.3876082 -57.04631649 681.44993804 C-57.02794299 651.30510992 -57.02213562 621.16030553 -57.02758789 591.01547241 C-57.02793432 589.07939707 -57.02828042 587.14332174 -57.02862618 585.2072464 C-57.02879718 584.25008182 -57.02896817 583.29291724 -57.02914435 582.30674767 C-57.02999791 577.48839744 -57.03082169 572.67004721 -57.03161335 567.85169697 C-57.03177043 566.90108638 -57.03192751 565.9504758 -57.03208935 564.97105884 C-57.03607981 539.77163659 -57.03060339 514.57221662 -57.02210206 489.37279576 C-57.02119503 486.66122563 -57.02028938 483.9496555 -57.01938683 481.23808537 C-57.01878572 479.43935285 -57.0181771 477.64062033 -57.01756092 475.84188781 C-57.0133409 463.30632628 -57.01276071 450.77076923 -57.01466641 438.23520721 C-57.01710982 422.08238326 -57.01303375 405.92958336 -56.99745641 389.77676598 C-56.98940982 381.2362315 -56.98680196 372.69573706 -56.99209877 364.1552002 C-56.99507805 358.44876971 -56.99076658 352.74237457 -56.98055019 347.03595253 C-56.97493011 343.78594526 -56.97350826 340.53603548 -56.97871677 337.28602508 C-56.9838256 333.78012641 -56.97663252 330.27445737 -56.96638966 326.76857471 C-56.97078614 325.76667092 -56.97518263 324.76476713 -56.97971234 323.73250261 C-56.93836891 316.30403856 -56.48388007 308.716334 -53.6455253 301.77186938 C-52.34223326 298.43422211 -52.68616894 295.75273992 -52.96191406 292.19345093 C-53.01275146 291.4891394 -53.06358887 290.78482788 -53.1159668 290.05917358 C-53.39068677 286.48584326 -53.75164729 282.93641515 -54.23144531 279.38485718 C-55.56537792 269.37015703 -55.90522946 259.47319233 -55.89941406 249.38095093 C-55.9002298 248.70240051 -55.90104553 248.0238501 -55.90188599 247.32473755 C-55.900309 235.75774081 -55.900309 235.75774081 -54.71191406 233.38095093 C-54.96479232 231.86351704 -55.28423286 230.35704503 -55.63224792 228.85856628 C-57.17496244 220.85320556 -56.9998965 212.85486483 -56.98657227 204.73910522 C-56.99092692 202.97696722 -56.99611257 201.2148311 -57.00205994 199.45269775 C-57.01538088 194.69427485 -57.01603628 189.93593171 -57.01349664 185.17749381 C-57.01242211 181.19178856 -57.01732262 177.20609913 -57.02210206 173.22039729 C-57.03317362 163.80979165 -57.03364807 154.39922594 -57.02758789 144.98861694 C-57.02155113 135.31095889 -57.033857 125.63344634 -57.05515796 115.95581311 C-57.07282632 107.6191264 -57.07876704 99.28248578 -57.07552022 90.94578105 C-57.07371537 85.97895236 -57.07626313 81.01222745 -57.09023476 76.04541588 C-57.10289381 71.37083198 -57.10079334 66.69647335 -57.08782387 62.02189255 C-57.08547593 60.31683968 -57.08812795 58.61177056 -57.09644699 56.90673637 C-57.17336458 39.90166195 -55.46409088 25.63138706 -43.39941406 12.56845093 C-30.98085861 1.11150928 -16.27788266 -0.08105472 0 0 Z M-41.69628906 20.85360718 C-48.71048052 29.64853329 -49.82749045 39.19194109 -49.85235596 50.09573364 C-49.85532708 50.82914168 -49.8582982 51.56254971 -49.86135936 52.31818223 C-49.8699663 54.752854 -49.87154774 57.18747614 -49.87304688 59.62216187 C-49.87768067 61.37724918 -49.88270608 63.13233549 -49.88809204 64.88742065 C-49.90116258 69.63966684 -49.90765033 74.39189893 -49.9121027 79.14416027 C-49.91504164 82.11793136 -49.91914793 85.09169866 -49.92360687 88.06546783 C-49.93726674 97.38371567 -49.94694119 106.70195478 -49.95080876 116.02021194 C-49.95528814 126.75116333 -49.97283684 137.48198727 -50.00180936 148.21289992 C-50.02346899 156.52570915 -50.0335153 164.83848262 -50.03484988 173.15131974 C-50.03589469 178.10807855 -50.04173354 183.0647173 -50.05966949 188.02144623 C-50.07622475 192.68694293 -50.07826972 197.35223025 -50.06953049 202.01774597 C-50.06876413 203.72202874 -50.07304934 205.42632313 -50.08298874 207.13057709 C-50.15282052 219.85895715 -49.69252447 231.86824883 -41.71191406 242.38095093 C-41.10476562 243.2033728 -40.49761719 244.02579468 -39.87207031 244.87313843 C-37.61827671 247.4896583 -35.47829944 249.1928438 -32.58691406 251.06845093 C-31.28367188 251.94050171 -31.28367188 251.94050171 -29.95410156 252.83016968 C-20.94354174 257.14003986 -11.01389658 256.67280085 -1.23977661 256.65510559 C0.31947877 256.65956409 1.87873188 256.66488014 3.43798172 256.67097431 C7.70203342 256.68509057 11.966012 256.68681883 16.2300837 256.68637741 C20.836876 256.6880312 25.44363865 256.7011079 30.05041504 256.71257019 C40.11229078 256.73537273 50.17414537 256.74333518 60.23604345 256.74839664 C66.52216371 256.75165815 72.80827788 256.75818323 79.09439468 256.76539803 C96.51055898 256.78495509 113.92671762 256.80136542 131.3428936 256.80427456 C133.01297425 256.80455591 133.01297425 256.80455591 134.7167939 256.80484295 C136.97371046 256.80520919 139.23062701 256.80557289 141.48754357 256.80593406 C142.60782118 256.80611688 143.7280988 256.80629969 144.88232422 256.80648804 C146.00397386 256.80666859 147.12562351 256.80684914 148.28126253 256.80703516 C166.46291205 256.81057814 184.64444323 256.83761229 202.8260517 256.87498593 C221.50779757 256.91307951 240.18948472 256.9324321 258.8712703 256.93273407 C269.35454579 256.93331828 279.83767996 256.94178734 290.32091904 256.97073174 C299.24512961 256.99525923 308.16914728 257.00251897 317.09338246 256.98748421 C321.64382855 256.98032186 326.19389379 256.98114384 330.74429703 257.00389481 C334.91560549 257.02455021 339.08624188 257.0218238 343.25754358 257.00101996 C344.76081804 256.99753765 346.26414166 257.00238146 347.76735173 257.0167244 C359.57087568 257.12202728 370.15074678 255.04332584 379.16308594 246.94345093 C388.76246289 237.25950196 391.04834959 226.79268472 391.09014893 213.65126038 C391.07689455 211.91710956 391.06301921 210.18296341 391.04858398 208.44882202 C391.05509168 206.58446739 391.06416298 204.72012024 391.07557678 202.85578918 C391.09848975 197.8329809 391.08403969 192.81094064 391.0611074 187.78815794 C391.0420706 182.51004802 391.05336837 177.23198567 391.06001282 171.95385742 C391.06633588 163.09577353 391.04817214 154.23799429 391.01538086 145.37997437 C390.97786994 135.16302146 390.97968067 124.9466448 391.00242203 114.72966135 C391.02342272 104.86673624 391.01606912 95.00402258 390.99610329 85.14110184 C390.98815126 80.95874557 390.99006774 76.7765698 391.00012779 72.59421921 C391.01073464 67.66415949 390.99639317 62.73476597 390.96338463 57.80481148 C390.95522796 56.00379432 390.9554014 54.20271557 390.96486282 52.40170479 C391.0253465 39.46015271 389.79997325 28.03810021 380.37011719 18.19735718 C368.98433844 8.26417309 358.80525711 7.07945167 344.20158386 7.12698364 C342.65984221 7.12467747 341.11810165 7.1214999 339.57636338 7.11752915 C335.35145628 7.1091937 331.12663973 7.11330078 326.90173233 7.11950159 C322.34060488 7.1240303 317.7794929 7.11704016 313.21836853 7.11154175 C304.28687957 7.10264995 295.35542422 7.104569 286.42393395 7.11036703 C279.16306022 7.11488519 271.90219591 7.11549575 264.64132118 7.1133194 C263.09073333 7.1128597 263.09073333 7.1128597 261.50882048 7.11239071 C259.40873779 7.11175125 257.30865511 7.11110283 255.20857242 7.11044553 C235.51633062 7.10474264 215.82410744 7.11129905 196.1318687 7.12204626 C179.24407175 7.13097776 162.35630231 7.12943296 145.46850586 7.12020874 C125.85100661 7.10949854 106.23352369 7.10529614 86.61602193 7.11143327 C84.52278062 7.11207035 82.42953931 7.11269909 80.33629799 7.1133194 C79.30642848 7.11362795 78.27655898 7.1139365 77.21548131 7.1142544 C69.96694008 7.11597938 62.71840923 7.11307039 55.46986961 7.10836029 C46.63089775 7.10274295 37.7919614 7.10428568 28.95299359 7.11492178 C24.44533727 7.12016761 19.93774008 7.12225386 15.43008423 7.11562347 C11.29902578 7.1096391 7.16808098 7.11298001 3.03703276 7.12357858 C1.54718138 7.12580214 0.05732029 7.12469993 -1.43252478 7.119827 C-17.82413079 7.07035091 -30.02129956 8.58670387 -41.69628906 20.85360718 Z M-41.46191406 294.25595093 C-48.70458225 304.3152123 -50.01971524 314.46008452 -49.96638966 326.65111351 C-49.96959613 327.74805782 -49.97280261 328.84500213 -49.97610626 329.97518718 C-49.98439996 333.64665868 -49.97848405 337.31796678 -49.97261047 340.98944092 C-49.97563144 343.65002047 -49.9794399 346.31058841 -49.98420304 348.97116435 C-49.99295244 354.75366884 -49.99428164 360.53613792 -49.99069977 366.31864738 C-49.98538738 374.91761087 -49.99149345 383.51654013 -49.9997827 392.1154999 C-50.01501858 408.36723812 -50.01672821 424.61896076 -50.01425967 440.87070464 C-50.01242667 453.42042351 -50.01418678 465.97013727 -50.01848412 478.5198555 C-50.01908652 480.32317714 -50.01968772 482.12649878 -50.02028772 483.92982043 C-50.02119498 486.64728427 -50.02210364 489.36474812 -50.02302007 492.08221197 C-50.03144896 517.34587153 -50.03578571 542.60952916 -50.03161335 567.87318993 C-50.03145697 568.82547201 -50.0313006 569.7777541 -50.03113948 570.75889322 C-50.03033371 575.58538369 -50.02948793 580.41187416 -50.02862618 585.23836462 C-50.02845509 586.19691294 -50.02828401 587.15546126 -50.02810773 588.1430565 C-50.02776108 590.08147335 -50.02741255 592.0198902 -50.02706215 593.95830704 C-50.02170449 624.1226374 -50.02963689 654.28693852 -50.0480957 684.45126343 C-50.06881241 718.34495818 -50.07953909 752.23863482 -50.07552022 786.13233626 C-50.07512487 789.74636245 -50.07476333 793.36038863 -50.07442284 796.97441483 C-50.0743321 797.86427281 -50.07424137 798.75413079 -50.07414789 799.67095416 C-50.07298204 813.10280127 -50.07962928 826.53463009 -50.09023476 839.96647263 C-50.10228385 855.24218888 -50.10384902 870.51786486 -50.09144459 885.79358171 C-50.08481469 894.34057291 -50.08645007 902.88746779 -50.1000331 911.43445129 C-50.10827838 917.14660047 -50.10557904 922.85867752 -50.09405784 928.57082084 C-50.08780219 931.82338304 -50.08785961 935.07572033 -50.09792117 938.32827847 C-50.10802675 941.8387289 -50.09960492 945.3486757 -50.08664417 948.85910606 C-50.09395352 949.85952623 -50.10126286 950.85994641 -50.10879371 951.89068234 C-50.01013047 964.79709826 -46.77142357 975.03147423 -38.08691406 984.56845093 C-27.146115 995.05510361 -13.82220382 994.53093327 0.38131714 994.52139282 C1.92377074 994.52397922 3.46622368 994.52699315 5.00867569 994.53039622 C9.23548675 994.53843674 13.4622808 994.54025414 17.6890986 994.54099369 C22.25225034 994.54284932 26.81539336 994.55039904 31.37854004 994.55712891 C41.34949292 994.57069023 51.32044177 994.57673308 61.29140234 994.58113956 C67.5188655 994.58390484 73.74632711 994.58814263 79.97378922 994.59264374 C97.22174164 994.60483189 114.46969282 994.61513316 131.71764946 994.61851883 C132.82073948 994.6187384 133.9238295 994.61895796 135.06034649 994.61918418 C136.71888322 994.6195116 136.71888322 994.6195116 138.41092575 994.61984563 C140.6513919 994.62028909 142.89185806 994.62073566 145.13232422 994.6211853 C146.24366703 994.62140673 147.35500984 994.62162816 148.5000297 994.6218563 C166.51499335 994.62580588 184.5299166 994.64326681 202.54486464 994.66654482 C221.04799085 994.69026045 239.55109678 994.70272072 258.05423844 994.70388675 C268.44019214 994.70480321 278.82609314 994.71054866 289.21203232 994.72870636 C298.05360081 994.74410994 306.8951003 994.74922614 315.73667966 994.74096826 C320.24626951 994.73706313 324.75572039 994.73798478 329.26529312 994.7520256 C333.39695595 994.76477208 337.52837548 994.76356051 341.66003801 994.75143489 C343.15122095 994.74947924 344.64242116 994.75255026 346.13357984 994.76127926 C359.29379268 994.83341338 369.14109581 993.1410687 379.28808594 984.38095093 C384.02641268 979.38842211 386.7302087 973.70349876 389.28808594 967.38095093 C389.61808594 966.72095093 389.94808594 966.06095093 390.28808594 965.38095093 C390.38306376 963.9023155 390.41554534 962.41945147 390.4168871 960.93776941 C390.4201593 959.99551539 390.42343149 959.05326138 390.42680284 958.0824542 C390.42457741 956.51594704 390.42457741 956.51594704 390.42230701 954.91779327 C390.42465924 953.81090841 390.42701147 952.70402355 390.42943498 951.56359673 C390.43615518 947.81020029 390.43566586 944.05683824 390.43525696 940.30343628 C390.43855372 937.60296655 390.44224088 934.90249989 390.44639844 932.20203161 C390.45574248 925.52999515 390.45964952 918.85796533 390.4619174 912.18592315 C390.46487483 904.19819813 390.47356958 896.21048197 390.48233168 888.22276158 C390.50319696 868.91231586 390.5136495 849.60186858 390.52246129 830.29141421 C390.52666519 821.15889995 390.53188755 812.02638635 390.53714582 802.89387265 C390.55503861 771.6424076 390.570035 740.39094237 390.57746601 709.13947296 C390.57794077 707.17667789 390.57841666 705.21388282 390.57889367 703.25108775 C390.57913005 702.27769908 390.57936643 701.3043104 390.57960996 700.3014251 C390.58081119 695.36960037 390.58202663 690.43777565 390.58325195 685.50595093 C390.5834921 684.52720748 390.58373225 683.54846404 390.58397968 682.5400617 C390.59187279 650.80612071 390.61530352 619.0722171 390.6478079 587.33829243 C390.6820969 553.8008982 390.70181634 520.26352584 390.70511025 486.7261138 C390.7055278 483.04515679 390.70600737 479.36419979 390.70653343 475.6832428 C390.70665662 474.77686331 390.70677982 473.87048383 390.70690674 472.9366383 C390.70924005 458.34218306 390.72490749 443.74777117 390.74537528 429.15333139 C390.76561988 414.48539243 390.77111707 399.81750561 390.76160464 385.14955527 C390.75638418 376.4332974 390.76229281 367.71721295 390.78413932 359.00098 C390.79763147 353.17827908 390.79658446 347.35569773 390.78373736 341.53299566 C390.77682989 338.21539784 390.77841645 334.89840221 390.79329745 331.58079034 C390.80835013 328.00384079 390.79878832 324.42776536 390.78307056 320.85083771 C390.79840387 319.31242454 390.79840387 319.31242454 390.81404695 317.74293232 C390.73032745 309.02921587 388.433476 301.33951151 382.85058594 294.50595093 C382.295 293.80727905 381.73941406 293.10860718 381.16699219 292.38876343 C373.80837877 284.52529711 364.35236874 281.22304351 353.73215103 280.75453854 C350.90226336 280.71011435 348.07518861 280.72874311 345.24517822 280.75276184 C343.66056606 280.74770655 342.07595963 280.74047017 340.49136615 280.7312637 C336.17111502 280.71245483 331.85143527 280.72451024 327.53119922 280.74198663 C322.8590625 280.75541834 318.18700621 280.73990303 313.51487732 280.72816467 C304.37680025 280.70982859 295.23893765 280.71827266 286.10086736 280.7362529 C278.67370284 280.75030059 271.24659639 280.75416704 263.81941986 280.75081062 C262.76081638 280.75033318 261.7022129 280.74985574 260.61153053 280.74936383 C258.46079104 280.74833747 256.31005156 280.74728211 254.1593121 280.74619807 C235.16166654 280.73763959 216.16412432 280.75428016 197.16650391 280.7840271 C178.74035302 280.81287873 160.31435088 280.8199392 141.88818359 280.80453491 C121.80736278 280.78777026 101.72661251 280.78373999 81.64578986 280.80124527 C79.50435623 280.80308961 77.3629226 280.80492434 75.22148895 280.80674934 C74.16793597 280.80766143 73.11438299 280.80857352 72.02890415 280.80951325 C64.61003948 280.81511574 57.1912093 280.8118143 49.7723465 280.80520439 C40.7324713 280.79746968 31.69274245 280.80422936 22.65289673 280.82937943 C18.04211166 280.84186929 13.4315544 280.84802706 8.82076073 280.83683777 C4.5979737 280.82678356 0.37564064 280.83527999 -3.84709123 280.85841895 C-5.37241705 280.86357022 -6.89778369 280.86203084 -8.42309162 280.8530243 C-22.31329889 280.7778454 -31.76761595 284.1210029 -41.46191406 294.25595093 Z " fill="#63615D" transform="translate(265.7119140625,728.6190490722656)"/> <path d="M0 0 C101.64 0 203.28 0 308 0 C308 31.35 308 62.7 308 95 C206.36 95 104.72 95 0 95 C0 63.65 0 32.3 0 0 Z " fill="#FEFEFE" transform="translate(1203,1208)" data-svg-af-field="kitchenModularDrawer"/> <path d="M0 0 C241.89 0 483.78 0 733 0 C733 12.21 733 24.42 733 37 C667.70832885 37.01705266 602.41665751 37.03303119 537.12498474 37.04234314 C536.15945258 37.0424812 535.19392042 37.04261925 534.19912971 37.04276149 C513.21815656 37.04575404 492.23718339 37.04852427 471.25621018 37.05106533 C460.96792592 37.05231272 450.67964167 37.05360927 440.39135742 37.05493164 C439.36752094 37.0550624 438.34368445 37.05519316 437.28882262 37.05532788 C404.07207202 37.05959321 370.85532313 37.06710748 337.63857356 37.07629722 C303.51894456 37.08571967 269.3993165 37.09188308 235.27968622 37.09391499 C230.46630812 37.09420317 225.65293002 37.0945288 220.83955193 37.09487724 C219.41846594 37.09497838 219.41846594 37.09497838 217.96867115 37.09508156 C202.68612994 37.09626568 187.40359163 37.1009102 172.1210516 37.10683203 C156.77643193 37.11270468 141.43181515 37.11497166 126.08719439 37.11350138 C116.95808609 37.11273778 107.82898831 37.11479536 98.6998819 37.12079754 C92.61339903 37.12452774 86.52692311 37.12467765 80.44043978 37.12183181 C76.96493192 37.12031179 73.48944404 37.12042835 70.01393826 37.12488318 C66.28292301 37.12884228 62.55196095 37.12676645 58.82094669 37.12304783 C57.72459708 37.12567484 56.62824747 37.12830186 55.49867514 37.13100848 C54.02246802 37.12763754 54.02246802 37.12763754 52.51643854 37.1241985 C51.23451178 37.12443247 51.23451178 37.12443247 49.92668751 37.12467116 C48 37 48 37 47 36 C45.55815707 35.87778475 44.11056856 35.82227242 42.66381836 35.79467773 C41.7429393 35.77473251 40.82206024 35.75478729 39.87327576 35.73423767 C38.87224319 35.71752518 37.87121063 35.70081268 36.83984375 35.68359375 C35.31043907 35.6524221 35.31043907 35.6524221 33.75013733 35.62062073 C30.47932952 35.55501148 27.20843863 35.49618766 23.9375 35.4375 C21.72590272 35.39432558 19.51431397 35.35071166 17.30273438 35.30664062 C11.86857849 35.1993186 6.43433918 35.09757377 1 35 C0.67 35.66 0.34 36.32 0 37 C0 24.79 0 12.58 0 0 Z " fill="#FDFDFD" transform="translate(1944,156)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C199.98 0 399.96 0 606 0 C606 14.19 606 28.38 606 43 C406.02 43 206.04 43 0 43 C0 28.81 0 14.62 0 0 Z " fill="#FEFEFE" transform="translate(1474,703)" data-svg-af-field="kitchenChimney"/> <path d="M0 0 C65.28500305 -0.01708418 130.5700063 -0.03305919 195.85501099 -0.04234314 C196.82334123 -0.0424812 197.79167148 -0.04261925 198.78934506 -0.04276149 C219.84063166 -0.04575535 240.89191828 -0.04852539 261.94320493 -0.05106533 C272.26877725 -0.05231252 282.59434956 -0.05360909 292.91992188 -0.05493164 C294.46108851 -0.05512778 294.46108851 -0.05512778 296.03338982 -0.05532788 C329.25457029 -0.05957892 362.47574904 -0.06708246 395.69692848 -0.07629722 C429.8746908 -0.08575995 464.05245218 -0.0918924 498.23021579 -0.09391499 C503.07260688 -0.09420309 507.91499798 -0.09452872 512.75738907 -0.09487724 C513.71031428 -0.09494467 514.6632395 -0.09501209 515.64504124 -0.09508156 C530.90088857 -0.09625705 546.15673294 -0.10087813 561.41257907 -0.10683203 C576.80047594 -0.11276233 592.18836992 -0.11495733 607.57626788 -0.11350138 C615.89316854 -0.11281409 624.21006132 -0.11367847 632.52696037 -0.11920547 C666.02984048 -0.14066635 699.50989644 -0.05927121 733 1 C733 11.56 733 22.12 733 33 C491.11 33 249.22 33 0 33 C0 22.11 0 11.22 0 0 Z " fill="#FEFEFE" transform="translate(1944,663)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C177.21 0 354.42 0 537 0 C537 14.19 537 28.38 537 43 C359.79 43 182.58 43 0 43 C0 28.81 0 14.62 0 0 Z " fill="#FEFEFE" transform="translate(1517,1663)"/> <path d="M0 0 C84.15 0 168.3 0 255 0 C255 31.68 255 63.36 255 96 C220.02 96 185.04 96 149 96 C149 95.34 149 94.68 149 94 C182.99 94 216.98 94 252 94 C252 91.69 252 89.38 252 87 C169.5 87 87 87 2 87 C1.67 130.23 1.34 173.46 1 218 C0.67 218 0.34 218 0 218 C0 146.06 0 74.12 0 0 Z " fill="#FDFDFD" transform="translate(832,948)" data-svg-af-field="kitchenCoffeeMaker"/> <path d="M0 0 C1.59293381 -0.02409439 1.59293381 -0.02409439 3.2180481 -0.04867554 C8.06283575 -0.0936195 12.90749352 -0.13419096 17.75244141 -0.15722656 C20.29713097 -0.17375894 22.84177462 -0.20101252 25.38623047 -0.23925781 C29.08048267 -0.29440306 32.77365174 -0.3159595 36.46826172 -0.33056641 C37.59056183 -0.35323578 38.71286194 -0.37590515 39.86917114 -0.39926147 C50.88786579 -0.37020736 61.50839559 3.3265077 69.46044922 11.19287109 C77.34188785 20.64741945 79.9170241 28.82361152 79.84863281 40.94213867 C79.85388977 42.09606613 79.85914673 43.24999359 79.86456299 44.43888855 C79.87772365 48.23853248 79.86903666 52.03775443 79.85888672 55.83740234 C79.86090899 58.49005143 79.86381772 61.14268793 79.86758423 63.79533386 C79.87303062 69.35082527 79.86588205 74.90619676 79.8515625 80.46166992 C79.83526218 86.85895139 79.84050977 93.25594557 79.85704172 99.65322 C79.87071752 105.16860667 79.87254596 110.68390754 79.86472571 116.19930571 C79.86007934 119.48320985 79.86053945 122.76695167 79.86933517 126.05085182 C79.87700313 129.71923494 79.86526893 133.38707682 79.84863281 137.05541992 C79.85470551 138.12539215 79.8607782 139.19536438 79.86703491 140.29776001 C79.76087759 153.01306898 76.56931885 163.19130516 67.39013672 172.23193359 C58.01538769 180.12822758 48.04264044 181.80635031 36.08544922 181.72412109 C34.21687256 181.72986145 34.21687256 181.72986145 32.31054688 181.73571777 C29.69188625 181.7384247 27.07319802 181.7311497 24.45458984 181.71435547 C20.47154828 181.6929308 16.49031041 181.71420154 12.50732422 181.73974609 C9.95002861 181.7371026 7.39273412 181.73197719 4.83544922 181.72412109 C3.06935303 181.73626648 3.06935303 181.73626648 1.26757812 181.74865723 C-9.96695923 181.62272934 -19.86668848 178.52753785 -28.53955078 171.19287109 C-38.28295252 160.90575274 -39.68603174 149.55895537 -39.70068359 136.00024414 C-39.7056485 134.89362427 -39.7106134 133.78700439 -39.71572876 132.64685059 C-39.7302896 128.99942393 -39.73714176 125.35204074 -39.74267578 121.70458984 C-39.74843161 119.16022237 -39.75418929 116.6158549 -39.75994873 114.07148743 C-39.76910225 109.42135912 -39.77540999 104.77124375 -39.77844548 100.12110871 C-39.78292357 93.30106058 -39.80047013 86.48121313 -39.82944608 79.66122597 C-39.85375798 73.7308197 -39.86139409 67.80046283 -39.86312103 61.87000465 C-39.86613969 59.3579073 -39.87414151 56.84581063 -39.88730621 54.33374596 C-39.90443951 50.81357142 -39.90246857 47.29388142 -39.89599609 43.77368164 C-39.90521088 42.74529678 -39.91442566 41.71691193 -39.92391968 40.65736389 C-39.85641787 28.88507323 -36.5266256 19.65019509 -28.50048828 10.99365234 C-20.32052832 3.17499804 -11.22819214 0.1556779 0 0 Z " fill="#FEFEFE" transform="translate(610.53955078125,474.80712890625)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C1.59293381 -0.02409439 1.59293381 -0.02409439 3.2180481 -0.04867554 C8.06283575 -0.0936195 12.90749352 -0.13419096 17.75244141 -0.15722656 C20.29713097 -0.17375894 22.84177462 -0.20101252 25.38623047 -0.23925781 C29.08048267 -0.29440306 32.77365174 -0.3159595 36.46826172 -0.33056641 C37.59056183 -0.35323578 38.71286194 -0.37590515 39.86917114 -0.39926147 C50.88786579 -0.37020736 61.50839559 3.3265077 69.46044922 11.19287109 C77.34188785 20.64741945 79.9170241 28.82361152 79.84863281 40.94213867 C79.85388977 42.09606613 79.85914673 43.24999359 79.86456299 44.43888855 C79.87772365 48.23853248 79.86903666 52.03775443 79.85888672 55.83740234 C79.86090899 58.49005143 79.86381772 61.14268793 79.86758423 63.79533386 C79.87303062 69.35082527 79.86588205 74.90619676 79.8515625 80.46166992 C79.83526218 86.85895139 79.84050977 93.25594557 79.85704172 99.65322 C79.87071752 105.16860667 79.87254596 110.68390754 79.86472571 116.19930571 C79.86007934 119.48320985 79.86053945 122.76695167 79.86933517 126.05085182 C79.87700313 129.71923494 79.86526893 133.38707682 79.84863281 137.05541992 C79.85470551 138.12539215 79.8607782 139.19536438 79.86703491 140.29776001 C79.76087759 153.01306898 76.56931885 163.19130516 67.39013672 172.23193359 C58.01538769 180.12822758 48.04264044 181.80635031 36.08544922 181.72412109 C34.21687256 181.72986145 34.21687256 181.72986145 32.31054688 181.73571777 C29.69188625 181.7384247 27.07319802 181.7311497 24.45458984 181.71435547 C20.47154828 181.6929308 16.49031041 181.71420154 12.50732422 181.73974609 C9.95002861 181.7371026 7.39273412 181.73197719 4.83544922 181.72412109 C3.06935303 181.73626648 3.06935303 181.73626648 1.26757812 181.74865723 C-8.82756548 181.6355008 -17.41172142 179.38550299 -25.53955078 173.19287109 C-26.77705078 172.38849609 -26.77705078 172.38849609 -28.03955078 171.56787109 C-35.4667767 164.51200647 -39.23492334 154.84155895 -39.63689423 144.74873924 C-39.6835146 141.83220718 -39.69753152 138.9171496 -39.70068359 136.00024414 C-39.7056485 134.89362427 -39.7106134 133.78700439 -39.71572876 132.64685059 C-39.7302896 128.99942393 -39.73714176 125.35204074 -39.74267578 121.70458984 C-39.74843161 119.16022237 -39.75418929 116.6158549 -39.75994873 114.07148743 C-39.76910225 109.42135912 -39.77540999 104.77124375 -39.77844548 100.12110871 C-39.78292357 93.30106058 -39.80047013 86.48121313 -39.82944608 79.66122597 C-39.85375798 73.7308197 -39.86139409 67.80046283 -39.86312103 61.87000465 C-39.86613969 59.3579073 -39.87414151 56.84581063 -39.88730621 54.33374596 C-39.90443951 50.81357142 -39.90246857 47.29388142 -39.89599609 43.77368164 C-39.90521088 42.74529678 -39.91442566 41.71691193 -39.92391968 40.65736389 C-39.85641787 28.88507323 -36.5266256 19.65019509 -28.50048828 10.99365234 C-20.32052832 3.17499804 -11.22819214 0.1556779 0 0 Z " fill="#FEFEFE" transform="translate(751.53955078125,474.80712890625)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C1.92661469 -0.01641289 1.92661469 -0.01641289 3.89215088 -0.03315735 C6.59850132 -0.0524665 9.30433637 -0.05605492 12.01074219 -0.04956055 C14.75769408 -0.04476841 17.50244808 -0.06554754 20.24902344 -0.11108398 C49.39615543 -0.58891475 49.39615543 -0.58891475 60.390625 7.63671875 C61.12933838 8.15588867 61.86805176 8.67505859 62.62915039 9.20996094 C69.24716519 14.10077936 73.85427079 21.59816717 75.390625 29.63671875 C75.69003532 33.60186144 75.69463281 37.55684884 75.69702148 41.53198242 C75.705345 42.71341827 75.71366852 43.89485413 75.72224426 45.11209106 C75.74215 48.33761821 75.752974 51.56299564 75.75807071 54.78857589 C75.76172786 56.80972314 75.76797497 58.8308461 75.7750721 60.85198402 C75.79953243 67.92029522 75.81261046 74.98853343 75.81616211 82.05688477 C75.81979171 88.61725828 75.849654 95.17716236 75.89156669 101.7373926 C75.92641072 107.39204296 75.94171299 113.04653884 75.94240814 118.70129567 C75.9431964 122.06876966 75.95413846 125.43538658 75.98040581 128.80281639 C76.00742911 132.56711399 76.00246023 136.33013555 75.98999023 140.09448242 C76.00482452 141.19048264 76.01965881 142.28648285 76.03494263 143.41569519 C75.93447286 154.13108823 72.53529935 163.23546829 65.0859375 171.0234375 C55.05644799 180.56762913 45.86366774 181.94844679 32.45703125 181.90234375 C31.22452133 181.9042572 29.99201141 181.90617065 28.72215271 181.90814209 C26.12425532 181.90949876 23.52635103 181.90583861 20.9284668 181.89746094 C16.96973305 181.88676363 13.01145402 181.89736953 9.05273438 181.91015625 C6.52083234 181.90883439 3.98893058 181.90627143 1.45703125 181.90234375 C-0.30585487 181.90841644 -0.30585487 181.90841644 -2.10435486 181.91461182 C-15.03568977 181.84147587 -23.74843638 179.18634437 -33.359375 170.38671875 C-38.91425656 164.59930726 -42.71273786 156.73694008 -42.76327515 148.7006073 C-42.77187561 147.6817746 -42.78047607 146.66294189 -42.78933716 145.61323547 C-42.79359711 144.49587509 -42.79785706 143.37851471 -42.80224609 142.22729492 C-42.81042358 141.04965576 -42.81860107 139.8720166 -42.82702637 138.65869141 C-42.85189878 134.74903721 -42.86856409 130.83939067 -42.8828125 126.9296875 C-42.88817516 125.57940477 -42.89355268 124.2291221 -42.89894485 122.87883949 C-42.92058154 117.25392553 -42.93931046 111.62901438 -42.95056725 106.00406933 C-42.96675174 97.97153464 -42.99978492 89.93948791 -43.05696809 81.9071371 C-43.09587916 76.24575839 -43.11522542 70.58450893 -43.12048781 64.92300016 C-43.12411598 61.54989192 -43.13585985 58.17730423 -43.16859055 54.80434227 C-43.43756357 22.89459988 -43.43756357 22.89459988 -35.06723022 13.90715027 C-32.89169599 11.89751136 -30.7245699 9.93624783 -28.421875 8.07421875 C-27.74769531 7.51605469 -27.07351563 6.95789063 -26.37890625 6.3828125 C-17.84333448 1.00142945 -9.96068173 0.01075748 0 0 Z " fill="#FEFEFE" transform="translate(432.609375,474.36328125)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C0 151.8 0 303.6 0 460 C-13.2 460 -26.4 460 -40 460 C-40 309.19 -40 158.38 -40 3 C-35.71 2.34 -31.42 1.68 -27 1 C-18.16872303 -0.76625539 -9.00617072 0 0 0 Z " fill="#FDFDFD" transform="translate(1984,197)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C115.5 0 231 0 350 0 C326.49929415 35.25105878 281.73603547 53.95119984 242 63 C242 64.65 242 66.3 242 68 C197.12 68 152.24 68 106 68 C105.67 66.35 105.34 64.7 105 63 C103.5459375 62.76216797 103.5459375 62.76216797 102.0625 62.51953125 C89.14542382 60.31084459 76.51706029 57.3242531 64.91796875 51.015625 C62.87737672 49.86774153 62.87737672 49.86774153 60 49 C60 48.34 60 47.68 60 47 C59.15566406 46.7628125 58.31132812 46.525625 57.44140625 46.28125 C53.55485116 44.83426922 50.33325222 42.82924042 46.9375 40.5 C46.28265625 40.05567627 45.6278125 39.61135254 44.953125 39.15356445 C28.80725012 28.08840914 13.2583359 15.44359254 0 1 C0 0.67 0 0.34 0 0 Z " fill="#FEFEFE" transform="translate(2129,588)" data-svg-af-field="kitchenBowl"/> <path d="M0 0 C0 151.47 0 302.94 0 459 C-10.89 459 -21.78 459 -33 459 C-33 307.86 -33 156.72 -33 1 C-23.15678463 -3.92160769 -11.00504935 0 0 0 Z " fill="#FEFEFE" transform="translate(2677,199)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C8.56655612 8.03983244 14.40945729 18.04802211 14.9375 29.9375 C14.61890134 39.82791052 11.09424495 48.33584583 4.5 55.625 C3.86320313 56.35332031 3.22640625 57.08164062 2.5703125 57.83203125 C-14.3226601 75.99352377 -40.91090906 83.57951359 -65.09130859 84.75048828 C-93.18596801 85.72705374 -124.85346667 81.28005227 -146.5 61.625 C-147.20640625 60.99851562 -147.9128125 60.37203125 -148.640625 59.7265625 C-157.07864935 51.81982116 -161.62009268 42.29276377 -162.9375 30.8125 C-162.27909051 17.74965579 -155.58957089 7.25740584 -146.375 -1.5625 C-108.60257842 -33.23422119 -37.02329116 -33.1209299 0 0 Z " fill="#FEFEFE" transform="translate(551.5,255.375)" data-svg-af-field="kitchenFlowerPots"/> <path d="M0 0 C8.79732532 8.66961263 14.16245675 16.99333413 14.54394531 29.62060547 C14.34416209 36.24008948 13.24127432 41.33543829 10.04394531 47.12060547 C9.63144531 47.87728516 9.21894531 48.63396484 8.79394531 49.41357422 C-1.27374933 66.03099067 -21.20239832 75.57720725 -39.44824219 80.34326172 C-48.23317485 82.48307405 -56.9018501 83.87423255 -65.95605469 84.12060547 C-66.6421582 84.14638672 -67.32826172 84.17216797 -68.03515625 84.19873047 C-96.41335955 85.18794888 -125.88918776 79.06073393 -147.95605469 60.12060547 C-155.49312582 52.98499345 -161.34276852 44.40994968 -162.22949219 33.87060547 C-162.54334821 22.28207541 -160.40369532 13.7228691 -152.64355469 4.80810547 C-151.10005341 3.22683499 -149.53864433 1.66275414 -147.95605469 0.12060547 C-147.3746875 -0.49298828 -146.79332031 -1.10658203 -146.19433594 -1.73876953 C-111.43099101 -35.79903557 -34.38818621 -32.65219096 0 0 Z " fill="#FEFEFE" transform="translate(1287.9560546875,255.87939453125)" data-svg-af-field="kitchenFlowerPots"/> <path d="M0 0 C0.33 0 0.66 0 1 0 C0.38952045 8.6703927 -0.68294279 17.2143771 -1.9375 25.8125 C-2.64170948 30.87281181 -3.32755023 35.93537316 -4 41 C-4.12584473 41.94681641 -4.25168945 42.89363281 -4.38134766 43.86914062 C-6.15325344 57.92749953 -6.23035168 72.03892954 -6.3125 86.1875 C-6.32212769 87.11636017 -6.33175537 88.04522034 -6.3416748 89.00222778 C-6.5409079 111.44296094 -5.47578213 137.23150941 10 155 C11.9698665 154.87194561 11.9698665 154.87194561 14 154 C15.1098766 151.88526512 15.1098766 151.88526512 15.7109375 149.21484375 C15.98284912 148.21718994 16.25476074 147.21953613 16.53491211 146.19165039 C16.81214111 145.11778076 17.08937012 144.04391113 17.375 142.9375 C17.98388372 140.7253474 18.59717676 138.51440377 19.21484375 136.3046875 C19.51632324 135.22155273 19.81780273 134.13841797 20.12841797 133.02246094 C26.60727814 110.55515312 37.48448604 89.52628109 53 72 C53.68449219 71.22011719 54.36898437 70.44023437 55.07421875 69.63671875 C67.84259286 55.97149027 85.50558049 47.34355338 104.2019043 46.66601562 C118.79673179 46.40553214 133.86616939 49.46641929 147 56 C147.33 56.66 147.66 57.32 148 58 C147.34 58.14695313 146.68 58.29390625 146 58.4453125 C143.1064735 59.1008771 140.21689469 59.77179249 137.32910156 60.45214844 C135.66503263 60.84357094 134.00023451 61.2318987 132.33496094 61.61816406 C96.28451785 70.03360898 56.96356108 84.26625554 36 117 C29.54844329 127.8554223 25.70720391 139.49842807 24 152 C24.33 152.99 24.66 153.98 25 155 C29.3572922 154.43546032 32.10851647 152.84786021 35.75 150.4375 C55.84029028 137.63317961 80.34626074 127.93887149 104.4765625 132.68359375 C114.24450989 135.99919279 121.57167387 142.27590443 127 151 C127.71915546 152.54654888 128.41866644 154.10232372 129.10253906 155.66479492 C129.45898499 156.47631516 129.81543091 157.28783539 130.18267822 158.12394714 C130.45239441 158.74304459 130.7221106 159.36214203 131 160 C118.45639882 160.02317537 105.91280273 160.04094162 93.36918449 160.05181217 C87.5446179 160.05702961 81.72006597 160.06410663 75.89550781 160.07543945 C70.27397645 160.08630873 64.65245918 160.09228543 59.03091812 160.09487724 C56.88673811 160.09672419 54.74255887 160.1003308 52.59838486 160.10573006 C49.59405605 160.11299405 46.5897854 160.11398867 43.58544922 160.11352539 C42.25727425 160.1189183 42.25727425 160.1189183 40.90226746 160.12442017 C36.48515507 160.11705494 32.34883992 159.89281314 28 159 C26.25728062 161.297221 24.60088848 163.59866729 23 166 C20.0769043 166.27709961 20.0769043 166.27709961 16.32421875 166.15234375 C14.93507746 166.12034542 13.54591604 166.08921168 12.15673828 166.05883789 C11.42714905 166.03806183 10.69755981 166.01728577 9.94586182 165.99588013 C-11.72645623 165.43563656 -29.85542516 168.92096525 -50 177 C-50.99 177.33 -51.98 177.66 -53 178 C-53 177.34 -53 176.68 -53 176 C-54.2684375 175.814375 -54.2684375 175.814375 -55.5625 175.625 C-59 175 -59 175 -61.84765625 173.99609375 C-80.0196591 168.77609451 -101.32059017 173.24464919 -118.61352539 179.24389648 C-121.0586321 180.01857633 -123.47807938 180.54220896 -126 181 C-125.76440192 177.8194259 -124.80010594 176.78985497 -122.5625 174.4375 C-112.94979554 166.90947844 -99.02520069 167.80096823 -87.5 167.8125 C-86.76911163 167.8117749 -86.03822327 167.8110498 -85.28518677 167.81030273 C-72.7683657 167.81167412 -60.43511266 168.5104464 -48 170 C-50.2110329 150.89230831 -79.08432503 133.47994454 -93.27880859 122.18701172 C-103.72364021 113.9541328 -114.3295856 105.93739273 -125 98 C-124.01 97.505 -124.01 97.505 -123 97 C-120.53165229 98.14184165 -118.23003323 99.3406573 -115.875 100.6875 C-115.16577393 101.09033203 -114.45654785 101.49316406 -113.72583008 101.90820312 C-105.65515095 106.61409697 -98.3105624 112.20513954 -91 118 C-89.989375 118.79664063 -88.97875 119.59328125 -87.9375 120.4140625 C-82.27687236 124.96507848 -76.87627463 129.76315417 -71.53515625 134.68359375 C-69.47356947 136.56729323 -67.38279934 138.38636708 -65.25 140.1875 C-59.71705289 144.98425456 -54.64124875 150.28005068 -49.48828125 155.4765625 C-48.89184814 156.07734619 -48.29541504 156.67812988 -47.6809082 157.29711914 C-46.61845767 158.37345792 -45.56153376 159.45530542 -44.51245117 160.54467773 C-42.09775263 163.0332366 -40.54279104 164.60635655 -37 165 C-36.67 164.01 -36.34 163.02 -36 162 C-37.19117369 160.13064817 -37.19117369 160.13064817 -39 158.3125 C-40.33333333 156.875 -41.66666667 155.4375 -43 154 C-43.78733521 153.1642041 -43.78733521 153.1642041 -44.59057617 152.31152344 C-49.30456531 147.14954557 -52.85754098 141.68678416 -56.3125 135.625 C-56.90297119 134.59971191 -57.49344238 133.57442383 -58.10180664 132.51806641 C-76.52050942 100.21932608 -93.18685808 66.86355396 -108.61035156 33.04150391 C-109.55797886 30.96744543 -110.51339462 28.89693208 -111.47558594 26.82958984 C-111.93481445 25.83781738 -112.39404297 24.84604492 -112.8671875 23.82421875 C-113.2782373 22.94209717 -113.68928711 22.05997559 -114.11279297 21.15112305 C-115 19 -115 19 -115 17 C-97.8524964 15.77517831 -80.24222936 23.32850224 -67.1875 34.125 C-32.66286462 64.18921122 -26.08943396 114.13632466 -22 157 C-20.68 157.33 -19.36 157.66 -18 158 C-17.34 156.68 -16.68 155.36 -16 154 C-14.68 154.33 -13.36 154.66 -12 155 C-12.53093616 148.82301103 -13.62096949 143.00714263 -15.06982422 136.98242188 C-25.15686717 94.92147139 -28.28635901 45.11025882 -4.9609375 6.63671875 C-3.38183431 4.33954601 -1.8257304 2.10620493 0 0 Z " fill="#FDFDFD" transform="translate(471,61)" data-svg-af-field="kitchenPlants"/> <path d="M0 0 C166.98 0 333.96 0 506 0 C506 8.25 506 16.5 506 25 C339.02 25 172.04 25 0 25 C0 16.75 0 8.5 0 0 Z " fill="#62605C" transform="translate(1532,1303)"/> <path d="M0 0 C-3.90331762 3.34141969 -7.9408421 5.71663894 -12.4375 8.125 C-60.14618505 34.3623088 -94.07907242 80.4489043 -110 132 C-115.70773563 151.22076088 -115.70773563 151.22076088 -118 171 C-113.04451301 169.64293201 -111.06421147 166.80167872 -108.375 162.6875 C-93.04949742 140.26583238 -72.28550706 119.23805054 -44.8125 113.3125 C-36.43694421 112.62597903 -27.96512131 111.96566807 -20 115 C-20 115.33 -20 115.66 -20 116 C-20.67353516 116.12004395 -21.34707031 116.24008789 -22.04101562 116.36376953 C-45.83793908 120.67463007 -66.5435783 126.64825797 -85 143 C-85.67289063 143.57878906 -86.34578125 144.15757812 -87.0390625 144.75390625 C-94.1228967 151.28740273 -101.4367698 160.99403357 -105 170 C-105 171.32 -105 172.64 -105 174 C-99.8306511 173.59443869 -99.8306511 173.59443869 -95 172 C-73.48871748 168.60869309 -47.93295939 166.46339236 -29 179.4140625 C-19.40305363 187.02414107 -13.88798568 196.09339237 -11 208 C-15.76141285 207.45480006 -19.27588894 205.24857229 -23.25 202.75 C-24.57874017 201.93247624 -25.90816597 201.11606579 -27.23828125 200.30078125 C-27.87975098 199.90584473 -28.5212207 199.5109082 -29.18212891 199.10400391 C-32.72311701 196.95354081 -36.3543106 194.9661035 -40 193 C-40 192.34 -40 191.68 -40 191 C-40.73500732 190.87995605 -41.47001465 190.75991211 -42.22729492 190.63623047 C-44.95518161 190.01028412 -46.92123985 189.16079426 -49.36328125 187.8203125 C-50.16830078 187.38589844 -50.97332031 186.95148438 -51.80273438 186.50390625 C-52.63095703 186.04886719 -53.45917969 185.59382812 -54.3125 185.125 C-65.78362057 178.84168692 -75.66676046 174.36423712 -89.078125 177.78515625 C-90.04234375 178.08292969 -91.0065625 178.38070312 -92 178.6875 C-98.01994304 180.41783122 -102.60363443 179.45818233 -108.578125 177.859375 C-117.42880677 175.63660104 -126.36837778 175.7635397 -135.4375 175.75 C-136.14943512 175.74766357 -136.86137024 175.74532715 -137.59487915 175.74291992 C-147.24689316 175.73095332 -156.47302156 176.20751064 -165.91796875 178.34375 C-168.72850116 178.94219036 -171.14075459 179.12923143 -174 179 C-174 178.34 -174 177.68 -174 177 C-193.83160981 170.46723441 -216.18213195 174.88751971 -236.58056641 176.78137207 C-242.80513981 177.35876025 -249.03053291 177.9268162 -255.25668526 178.48690796 C-257.40332549 178.6819116 -259.54930234 178.88324146 -261.69529724 179.08520508 C-269.14841399 179.77066005 -276.51317395 180.18572276 -284 180 C-281.75552378 170.05405766 -277.14721541 161.59213558 -268.6875 155.5625 C-252.67862266 146.06151962 -235.76120147 147.18107382 -218.30200195 151.52539062 C-206.92554181 154.57135008 -196.11699223 159.20313572 -185.734375 164.7421875 C-182.89597311 166.27860374 -182.89597311 166.27860374 -179 166 C-179.96210752 147.07855207 -191.2691503 130.06624701 -204.6875 117.375 C-233.67742062 92.38675554 -272.90267787 84.25565414 -310 81 C-310 80.34 -310 79.68 -310 79 C-289.58401495 68.20232883 -268.47278011 61.08212178 -245.3125 67.6875 C-214.24444766 78.34699049 -195.07352891 104.55225096 -181 133 C-176.61194717 142.39495759 -172.70359952 151.92857728 -169.984375 161.9453125 C-169.19220677 164.20399898 -169.19220677 164.20399898 -166.890625 164.8046875 C-166.26671875 164.86914062 -165.6428125 164.93359375 -165 165 C-147.12604933 141.40638511 -151.71324811 106.26253028 -155.45214844 78.74853516 C-158.25424014 59.57593446 -162.04438795 40.65323917 -166.90332031 21.89672852 C-167.19174805 20.76807373 -167.48017578 19.63941895 -167.77734375 18.4765625 C-168.03765381 17.48736816 -168.29796387 16.49817383 -168.56616211 15.47900391 C-169 13 -169 13 -168 10 C-145.86030843 32.27806464 -138.78664035 67.73144739 -138 98 C-137.96003906 99.17175781 -137.92007812 100.34351563 -137.87890625 101.55078125 C-137.52156016 121.79338633 -139.99672341 142.01819978 -143 162 C-140 163.33333333 -140 163.33333333 -137 162 C-136.67 162.66 -136.34 163.32 -136 164 C-134.68 164 -133.36 164 -132 164 C-131.91548584 163.43418213 -131.83097168 162.86836426 -131.74389648 162.28540039 C-126.21485089 126.13116314 -114.79353678 89.82914252 -93 60 C-92.61827637 59.47164551 -92.23655273 58.94329102 -91.84326172 58.39892578 C-72.67646071 32.1106206 -35.34377806 -1.7671889 0 0 Z " fill="#FCFCFC" transform="translate(1350,51)" data-svg-af-field="kitchenPlants"/> <path d="M0 0 C1.52839094 -0.00233999 1.52839094 -0.00233999 3.08765846 -0.00472724 C6.42304316 -0.00864189 9.75838042 -0.00558546 13.09376526 -0.00241089 C15.51728847 -0.00376919 17.94081148 -0.00555152 20.36433411 -0.00772095 C26.21653702 -0.01177693 32.06872545 -0.01122555 37.92092877 -0.00830831 C42.68527379 -0.00603338 47.44961523 -0.00575072 52.21396065 -0.00683212 C52.89667683 -0.00698536 53.57939301 -0.00713859 54.28279756 -0.00729647 C55.67050679 -0.00761625 57.05821602 -0.00794046 58.44592524 -0.00826906 C71.40523156 -0.01110867 84.36453077 -0.00786089 97.32383592 -0.00246869 C108.39835368 0.00199695 119.47286096 0.00122243 130.54737854 -0.00338745 C143.46442225 -0.00876193 156.38145974 -0.01083307 169.29850441 -0.00777519 C170.68090665 -0.0074567 172.06330889 -0.00714233 173.44571114 -0.00683212 C174.12555558 -0.00667785 174.80540003 -0.00652357 175.50584583 -0.00636462 C180.25359803 -0.00550798 185.00134624 -0.00694381 189.74909782 -0.00931168 C196.16214076 -0.01222437 202.57516411 -0.01015295 208.98820496 -0.00441742 C211.3260908 -0.00310785 213.66397833 -0.0034528 216.00186348 -0.00568008 C229.8412195 -0.01763769 243.57893957 0.32242936 257.39674377 1.12698364 C257.39674377 13.99698364 257.39674377 26.86698364 257.39674377 40.12698364 C251.45674377 40.45698364 245.51674377 40.78698364 239.39674377 41.12698364 C238.07674377 41.45698364 236.75674377 41.78698364 235.39674377 42.12698364 C229.26111154 42.34611337 229.26111154 42.34611337 226.42467701 41.62703621 C222.85767684 40.74747688 219.17209999 40.99039889 215.51707458 41 C214.61008037 40.99844001 213.70308615 40.99688002 212.76860726 40.99527276 C209.72259859 40.9912771 206.67663956 40.99444695 203.63063049 40.99758911 C201.44924897 40.99623438 199.26786768 40.99445404 197.08648682 40.99227905 C191.15441756 40.98771167 185.22236565 40.98949187 179.29029608 40.99265814 C173.08229875 40.99518724 166.87430293 40.99284248 160.66630554 40.99127197 C149.56496638 40.98933436 138.46363405 40.99244715 127.36229624 40.99753131 C117.31062378 41.00199248 107.25896289 41.00122867 97.20729065 40.99661255 C85.52795716 40.99127034 73.84863091 40.98927463 62.16929638 40.99222481 C55.98968613 40.99378181 49.81008383 40.99399731 43.63047409 40.99068832 C37.81436436 40.98779181 31.99827635 40.989818 26.18216896 40.99558258 C24.05134047 40.996901 21.92051014 40.9965317 19.78968239 40.99431992 C16.87253547 40.99157203 13.9554574 40.99503389 11.03831482 41 C10.20249024 40.99776928 9.36666567 40.99553856 8.50551307 40.99324024 C3.4871923 41.00971699 -1.38592868 41.36347591 -6.36409271 42.01035416 C-8.60325623 42.12698364 -8.60325623 42.12698364 -12.60325623 41.12698364 C-18.54325623 40.79698364 -24.48325623 40.46698364 -30.60325623 40.12698364 C-30.60325623 27.25698364 -30.60325623 14.38698364 -30.60325623 1.12698364 C-8.77715969 -0.02175828 -8.77715969 -0.02175828 0 0 Z " fill="#FDFDFD" transform="translate(1664.603256225586,1229.8730163574219)"/> <path d="M0 0 C144.54 0 289.08 0 438 0 C438 79.53 438 159.06 438 241 C293.46 241 148.92 241 0 241 C0 161.47 0 81.94 0 0 Z M7 7 C7 81.91 7 156.82 7 234 C146.92 234 286.84 234 431 234 C431 159.09 431 84.18 431 7 C291.08 7 151.16 7 7 7 Z " fill="#63615D" transform="translate(1568,1368)"/> <path d="M0 0 C10.89 0 21.78 0 33 0 C33 90.09 33 180.18 33 273 C3 273 3 273 -1 272 C-1.02286531 237.49322476 -1.04049769 202.98645125 -1.05106533 168.47967008 C-1.05231611 164.41019345 -1.05361042 160.34071684 -1.05493164 156.27124023 C-1.05519395 155.46104594 -1.05545626 154.65085165 -1.05572652 153.81610601 C-1.06008343 140.68003077 -1.06797109 127.54395988 -1.0771528 114.40788723 C-1.08648876 100.93926487 -1.09205549 87.4706448 -1.09408849 74.00201935 C-1.09546384 65.6843582 -1.09981506 57.36670936 -1.10791647 49.04905199 C-1.11318322 43.35319593 -1.11480446 37.65734628 -1.11350138 31.96148796 C-1.11285788 28.67029632 -1.1144152 25.37913097 -1.11920547 22.08794212 C-1.12413535 18.52809798 -1.12300091 14.96830775 -1.12025452 11.40846252 C-1.12316736 10.35692838 -1.1260802 9.30539423 -1.12908131 8.22199541 C-1.12709026 7.27600416 -1.12509921 6.33001291 -1.12304783 5.35535526 C-1.12342755 4.53250131 -1.12380727 3.70964735 -1.1241985 2.86185843 C-1 1 -1 1 0 0 Z " fill="#FEFEFE" transform="translate(1574,384)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C213.18 0 426.36 0 646 0 C646 4.62 646 9.24 646 14 C432.82 14 219.64 14 0 14 C0 9.38 0 4.76 0 0 Z " fill="#FCFCFC" transform="translate(1991,420)" data-svg-af-field="kitchenOpenShelf"/> <path d="M0 0 C84.48 0 168.96 0 256 0 C256 23 256 23 253 30 C221.20257564 30.11398996 189.40520926 30.2025105 157.60762842 30.25532665 C153.85617577 30.2615804 150.10472353 30.26805199 146.35327148 30.2746582 C145.60640472 30.27596976 144.85953796 30.27728131 144.09003887 30.2786326 C131.98666515 30.30040685 119.88340981 30.3398394 107.78010639 30.38576398 C95.36691307 30.43247261 82.95378187 30.46028352 70.54050428 30.47044247 C62.87682007 30.47731331 55.21347043 30.49903672 47.54988918 30.53958233 C41.67978854 30.56906277 35.8098609 30.57228831 29.93968391 30.56553841 C27.52692474 30.56691904 25.11415342 30.57693177 22.70146942 30.59602737 C19.41774857 30.62075185 16.13548191 30.61497973 12.85173035 30.60127258 C11.8877318 30.61583679 10.92373325 30.630401 9.93052262 30.64540654 C9.05370058 30.6354513 8.17687854 30.62549606 7.27348614 30.61523914 C6.13603389 30.61808705 6.13603389 30.61808705 4.97560281 30.62099248 C3 30 3 30 0 25 C0 16.75 0 8.5 0 0 Z " fill="#FAFAFA" transform="translate(832,1172)" data-svg-af-field="kitchenCoffeeMaker"/> <path d="M0 0 C23.20102564 19.30136259 31.71855424 52.50144494 34.67578125 81.2265625 C35.48901402 91.8702037 35.28399819 102.57941287 35.18275094 113.24477601 C35.15078027 117.20306822 35.14850261 121.16139534 35.1426239 125.11979675 C35.1272875 132.56344979 35.08654344 140.006721 35.03587645 147.45020837 C34.97934032 155.94643252 34.95233762 164.44267817 34.92739928 172.93904459 C34.87560085 190.36843546 34.78806741 207.7974582 34.67578125 225.2265625 C33.68578125 225.2265625 32.69578125 225.2265625 31.67578125 225.2265625 C31.67578125 227.2065625 31.67578125 229.1865625 31.67578125 231.2265625 C32.66578125 231.2265625 33.65578125 231.2265625 34.67578125 231.2265625 C34.67578125 253.0065625 34.67578125 274.7865625 34.67578125 297.2265625 C30.05578125 297.2265625 25.43578125 297.2265625 20.67578125 297.2265625 C20.67081603 295.74731513 20.67081603 295.74731513 20.6657505 294.23818398 C20.58438441 270.12807346 20.49195916 246.01802408 20.38825417 221.90799904 C20.33835133 210.24808661 20.29190793 198.58818045 20.25390625 186.92822266 C20.22073517 176.75321938 20.18077008 166.57826811 20.13299119 156.40332258 C20.10797289 151.02686614 20.08612219 145.65044307 20.07243729 140.27394485 C21.99204899 74.33477217 21.99204899 74.33477217 -6.32421875 17.2265625 C-19.30402763 6.30504047 -33.30818173 3.12377855 -49.91552734 4.00585938 C-63.73244266 5.2718731 -74.10302183 15.21648836 -82.94921875 25.1015625 C-93.27709876 38.4480692 -99.58368143 54.34051651 -104.68017578 70.27734375 C-105.46001694 72.63756052 -106.35915601 74.93627007 -107.32421875 77.2265625 C-113.39314504 77.47943443 -118.48622283 76.92488859 -124.32421875 75.2265625 C-121.80340676 48.24453785 -106.16024449 22.10224398 -86.32421875 4.2265625 C-80.20430925 -0.7734375 -80.20430925 -0.7734375 -77.32421875 -0.7734375 C-77.32421875 -1.4334375 -77.32421875 -2.0934375 -77.32421875 -2.7734375 C-51.63798151 -15.39195468 -23.76780527 -18.13543461 0 0 Z " fill="#FDFDFD" transform="translate(2561.32421875,903.7734375)" data-svg-af-field="kitchenTap"/> <path d="M0 0 C162.36 0 324.72 0 492 0 C492 3.63 492 7.26 492 11 C329.64 11 167.28 11 0 11 C0 7.37 0 3.74 0 0 Z " fill="#FFFFFF" transform="translate(1539,1310)"/> <path d="M0 0 C0.77053711 0.59312988 0.77053711 0.59312988 1.55664062 1.19824219 C5.42012368 4.13988022 9.23242744 6.91054757 13.5 9.25 C14.3559375 9.72953125 15.211875 10.2090625 16.09375 10.703125 C24.61859493 14.50722247 33.08256805 14.28824537 42.23162842 14.26742554 C43.78915732 14.27116495 45.34668435 14.27576763 46.90420842 14.28115618 C51.1727828 14.29336558 55.44127868 14.29312815 59.70986652 14.29076743 C64.31805435 14.29035874 68.92621718 14.30140336 73.53439331 14.31088257 C82.55845442 14.32748219 91.58248939 14.33299164 100.60656449 14.33410732 C107.94323153 14.33505828 115.27988995 14.33917096 122.61655426 14.34550858 C143.42609122 14.36311808 164.23560757 14.37234789 185.04515204 14.37084763 C186.16656046 14.37076772 187.28796888 14.3706878 188.44335938 14.37060547 C189.56614002 14.37052371 190.68892067 14.37044195 191.84572497 14.37035771 C210.04041714 14.36954487 228.23502652 14.38868275 246.42969474 14.4168822 C265.12041696 14.44562146 283.81109882 14.45942192 302.50184369 14.45769465 C312.99183223 14.45703111 323.48173396 14.46250751 333.97170258 14.48405075 C342.90326363 14.50227622 351.83469852 14.50659863 360.76627013 14.4930319 C365.32069997 14.4865092 369.87488787 14.48635981 374.42929459 14.5037384 C378.60430521 14.51950506 382.77888279 14.51656907 386.95388308 14.49917014 C388.45856009 14.49610813 389.96326971 14.49970233 391.46790823 14.51089029 C407.52133448 14.62228543 418.83550077 9.77633282 432 1 C432 13.87 432 26.74 432 40 C428.04 37.03 428.04 37.03 424 34 C413.68002174 27.3111252 403.51965551 26.56186276 391.47644043 26.6257782 C389.91163472 26.6230342 388.34683086 26.61897921 386.78203154 26.61373454 C382.50266161 26.60318866 378.22350181 26.61125001 373.94414115 26.62248504 C369.32103321 26.63135119 364.69795206 26.62287657 360.07484436 26.61662292 C351.02630365 26.60714695 341.97784283 26.61372428 332.92930806 26.62588587 C322.38752652 26.6395252 311.84576388 26.63786629 301.30397576 26.63575254 C282.49218491 26.6325644 263.68043196 26.64422028 244.86865234 26.66381836 C226.62287237 26.68282174 208.37713681 26.68990567 190.13134766 26.68432617 C170.25344859 26.67826554 150.37556905 26.67845068 130.4976716 26.689812 C128.377237 26.69101927 126.2568024 26.69222525 124.1363678 26.69342995 C123.093127 26.69403349 122.04988621 26.69463702 120.97503206 26.69525885 C113.63032003 26.69913483 106.28561527 26.69874561 98.94090271 26.6968441 C89.98776219 26.69471988 81.03466052 26.69996348 72.08153093 26.71445765 C67.51525449 26.72169092 62.94903457 26.72578778 58.38275337 26.72121429 C54.19939499 26.71712632 50.01615311 26.72233616 45.83281237 26.73484037 C44.32285186 26.73775875 42.81288029 26.73734937 41.30292267 26.73319729 C26.11664203 26.67341309 26.11664203 26.67341309 12.125 32 C10.79855469 32.7734375 10.79855469 32.7734375 9.4453125 33.5625 C8.63835937 34.036875 7.83140625 34.51125 7 35 C5.67000139 35.67329483 4.33719889 36.34112114 3 37 C0.18066368 28.64582229 -0.37964329 21.08704369 -0.1875 12.3125 C-0.17396484 11.12205078 -0.16042969 9.93160156 -0.14648438 8.70507812 C-0.11151828 5.80289262 -0.06244696 2.90170191 0 0 Z " fill="#FBFBFB" transform="translate(220,977)"/> <path d="M0 0 C15.51 0 31.02 0 47 0 C47 36.3 47 72.6 47 110 C31.49 110 15.98 110 0 110 C0 73.7 0 37.4 0 0 Z " fill="#FDFDFD" transform="translate(1336,535)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C15.51 0 31.02 0 47 0 C47 36.3 47 72.6 47 110 C31.49 110 15.98 110 0 110 C0 73.7 0 37.4 0 0 Z " fill="#FDFDFD" transform="translate(1228,535)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C15.51 0 31.02 0 47 0 C47 36.3 47 72.6 47 110 C31.49 110 15.98 110 0 110 C0 73.7 0 37.4 0 0 Z " fill="#FDFDFD" transform="translate(1024,535)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C15.18 0 30.36 0 46 0 C46 36.3 46 72.6 46 110 C30.82 110 15.64 110 0 110 C0 73.7 0 37.4 0 0 Z " fill="#FEFEFE" transform="translate(1126,535)" data-svg-af-field="kitchenStorageContainers"/> <path d="M0 0 C1.52839094 -0.00233999 1.52839094 -0.00233999 3.08765846 -0.00472724 C6.42304316 -0.00864189 9.75838042 -0.00558546 13.09376526 -0.00241089 C15.51728847 -0.00376919 17.94081148 -0.00555152 20.36433411 -0.00772095 C26.21653702 -0.01177693 32.06872545 -0.01122555 37.92092877 -0.00830831 C42.68527379 -0.00603338 47.44961523 -0.00575072 52.21396065 -0.00683212 C52.89667683 -0.00698536 53.57939301 -0.00713859 54.28279756 -0.00729647 C55.67050679 -0.00761625 57.05821602 -0.00794046 58.44592524 -0.00826906 C71.40523156 -0.01110867 84.36453077 -0.00786089 97.32383592 -0.00246869 C108.39835368 0.00199695 119.47286096 0.00122243 130.54737854 -0.00338745 C143.46442225 -0.00876193 156.38145974 -0.01083307 169.29850441 -0.00777519 C170.68090665 -0.0074567 172.06330889 -0.00714233 173.44571114 -0.00683212 C174.12555558 -0.00667785 174.80540003 -0.00652357 175.50584583 -0.00636462 C180.25359803 -0.00550798 185.00134624 -0.00694381 189.74909782 -0.00931168 C196.16214076 -0.01222437 202.57516411 -0.01015295 208.98820496 -0.00441742 C211.3260908 -0.00310785 213.66397833 -0.0034528 216.00186348 -0.00568008 C229.8412195 -0.01763769 243.57893957 0.32242936 257.39674377 1.12698364 C257.39674377 13.99698364 257.39674377 26.86698364 257.39674377 40.12698364 C251.45674377 40.45698364 245.51674377 40.78698364 239.39674377 41.12698364 C238.07674377 41.45698364 236.75674377 41.78698364 235.39674377 42.12698364 C229.26111154 42.34611337 229.26111154 42.34611337 226.42467701 41.62703621 C222.85767684 40.74747688 219.17209999 40.99039889 215.51707458 41 C214.61008037 40.99844001 213.70308615 40.99688002 212.76860726 40.99527276 C209.72259859 40.9912771 206.67663956 40.99444695 203.63063049 40.99758911 C201.44924897 40.99623438 199.26786768 40.99445404 197.08648682 40.99227905 C191.15441756 40.98771167 185.22236565 40.98949187 179.29029608 40.99265814 C173.08229875 40.99518724 166.87430293 40.99284248 160.66630554 40.99127197 C149.56496638 40.98933436 138.46363405 40.99244715 127.36229624 40.99753131 C117.31062378 41.00199248 107.25896289 41.00122867 97.20729065 40.99661255 C85.52795716 40.99127034 73.84863091 40.98927463 62.16929638 40.99222481 C55.98968613 40.99378181 49.81008383 40.99399731 43.63047409 40.99068832 C37.81436436 40.98779181 31.99827635 40.989818 26.18216896 40.99558258 C24.05134047 40.996901 21.92051014 40.9965317 19.78968239 40.99431992 C16.87253547 40.99157203 13.9554574 40.99503389 11.03831482 41 C10.20249024 40.99776928 9.36666567 40.99553856 8.50551307 40.99324024 C3.4871923 41.00971699 -1.38592868 41.36347591 -6.36409271 42.01035416 C-8.60325623 42.12698364 -8.60325623 42.12698364 -12.60325623 41.12698364 C-18.54325623 40.79698364 -24.48325623 40.46698364 -30.60325623 40.12698364 C-30.60325623 27.25698364 -30.60325623 14.38698364 -30.60325623 1.12698364 C-8.77715969 -0.02175828 -8.77715969 -0.02175828 0 0 Z M10.39674377 5.12698364 C11.39898588 7.63258891 12.40223378 10.13928281 13.50221252 12.60354614 C15.44795931 18.09242134 15.30077978 24.66313539 13.08424377 30.06448364 C11.39674377 33.12698364 11.39674377 33.12698364 8.39674377 37.12698364 C77.36674377 37.12698364 146.33674377 37.12698364 217.39674377 37.12698364 C215.74674377 34.48698364 214.09674377 31.84698364 212.39674377 29.12698364 C209.342632 19.96464833 212.33743981 14.05745235 216.39674377 5.12698364 C148.41674377 5.12698364 80.43674377 5.12698364 10.39674377 5.12698364 Z " fill="#62605C" transform="translate(1664.603256225586,1229.8730163574219)"/> <path d="M0 0 C95.7 0 191.4 0 290 0 C290 3.96 290 7.92 290 12 C194.3 12 98.6 12 0 12 C0 8.04 0 4.08 0 0 Z " fill="#FEFEFE" transform="translate(1649,719)"/> <path d="M0 0 C1.0037114 -0.01007584 2.00742279 -0.02015167 3.04154968 -0.03053284 C6.36269239 -0.05905056 9.68338111 -0.0648916 13.00463867 -0.06811523 C15.31385994 -0.07775448 17.62307936 -0.08784681 19.93229675 -0.09837341 C24.7752202 -0.11634493 29.61798306 -0.12189346 34.4609375 -0.12011719 C40.66194636 -0.11981247 46.86192346 -0.16075156 53.06268787 -0.21243382 C57.83343723 -0.24581871 62.60393789 -0.25187407 67.3747921 -0.25028801 C69.66052491 -0.25382531 71.94626435 -0.26707924 74.2318821 -0.29028511 C77.4326625 -0.31973709 80.63121365 -0.3110355 83.83203125 -0.29296875 C84.77305695 -0.30982727 85.71408264 -0.32668579 86.68362427 -0.34405518 C92.51392438 -0.26058241 95.59577844 0.84902776 99.81354809 4.9268961 C102.56305556 8.1266863 103.32135587 11.26715502 103.11010742 15.43579102 C101.36535843 19.96270733 98.45612233 24.12697059 94.11010742 26.43579102 C89.42060449 27.70982811 84.75334016 27.58359682 79.93286133 27.58105469 C78.5587484 27.58609261 78.5587484 27.58609261 77.15687561 27.5912323 C74.13345986 27.60071847 71.11009962 27.60268422 68.08666992 27.60375977 C65.9806618 27.60697387 63.8746539 27.61033806 61.76864624 27.61384583 C57.35544314 27.61983119 52.94225961 27.62168632 48.52905273 27.62109375 C42.88110062 27.62099214 37.23327426 27.63464582 31.58535194 27.65186596 C27.23584418 27.66299784 22.88636671 27.66501259 18.53684616 27.66448402 C16.45489442 27.66566229 14.37294186 27.67007544 12.29100418 27.67781639 C9.37596131 27.68764051 6.46119005 27.68472865 3.54614258 27.67871094 C2.69084457 27.68433044 1.83554657 27.68994995 0.95433044 27.69573975 C-4.44940145 27.66746892 -10.28375866 27.59783037 -14.63208008 23.99047852 C-17.71152486 19.42440522 -18.70563509 15.96351568 -18.88989258 10.43579102 C-18.55989258 9.44579102 -18.22989258 8.45579102 -17.88989258 7.43579102 C-17.22989258 7.43579102 -16.56989258 7.43579102 -15.88989258 7.43579102 C-15.64239258 6.83766602 -15.39489258 6.23954102 -15.13989258 5.62329102 C-11.57753576 -0.61083342 -6.4918382 -0.00931902 0 0 Z " fill="#5E5C58" transform="translate(526.889892578125,1031.564208984375)"/> <path d="M0 0 C1.0037114 -0.01007584 2.00742279 -0.02015167 3.04154968 -0.03053284 C6.36269239 -0.05905056 9.68338111 -0.0648916 13.00463867 -0.06811523 C15.31385994 -0.07775448 17.62307936 -0.08784681 19.93229675 -0.09837341 C24.7752202 -0.11634493 29.61798306 -0.12189346 34.4609375 -0.12011719 C40.66194636 -0.11981247 46.86192346 -0.16075156 53.06268787 -0.21243382 C57.83343723 -0.24581871 62.60393789 -0.25187407 67.3747921 -0.25028801 C69.66052491 -0.25382531 71.94626435 -0.26707924 74.2318821 -0.29028511 C77.4326625 -0.31973709 80.63121365 -0.3110355 83.83203125 -0.29296875 C84.77305695 -0.30982727 85.71408264 -0.32668579 86.68362427 -0.34405518 C92.53168208 -0.26032818 95.61192019 0.86453007 99.84253979 4.95359898 C102.57190371 8.14509848 102.44079319 11.06985553 102.39526367 15.11547852 C101.86666849 19.41665027 99.43752195 22.01141648 96.58285522 25.07460022 C92.64679189 27.24131256 88.71681172 26.86102963 84.29614258 26.83984375 C83.30057846 26.846707 82.30501434 26.85357025 81.27928162 26.86064148 C77.98576626 26.87895384 74.69272531 26.87506515 71.39916992 26.86938477 C69.1099736 26.87394483 66.82077865 26.87924987 64.53158569 26.88526917 C59.73153119 26.8942093 54.93164298 26.89176725 50.1315918 26.88183594 C43.98225916 26.8703525 37.83350127 26.8905441 31.68424416 26.91975307 C26.9555802 26.93810678 22.22705413 26.9378241 17.49836349 26.93211555 C15.23136973 26.9319622 12.96436669 26.93801813 10.69740677 26.95040703 C7.52552605 26.96529686 4.35470894 26.95465342 1.18286133 26.9375 C0.24759109 26.94716797 -0.68767914 26.95683594 -1.65129089 26.96679688 C-8.51140352 26.88917482 -11.66211283 25.34079279 -16.76489258 20.74829102 C-18.57266376 17.03231692 -18.52884711 13.48016255 -17.88989258 9.43579102 C-13.43876006 0.85146401 -9.02529239 -0.01295579 0 0 Z " fill="#585652" transform="translate(526.889892578125,931.564208984375)"/> <path d="M0 0 C177.21 0 354.42 0 537 0 C537 1.65 537 3.3 537 5 C359.79 5 182.58 5 0 5 C0 3.35 0 1.7 0 0 Z " fill="#F9F9F9" transform="translate(1517,1196)" data-svg-af-field="kitchenHob"/> <path d="M0 0 C51.48 0 102.96 0 156 0 C156 5.28 156 10.56 156 16 C104.52 16 53.04 16 0 16 C0 10.72 0 5.44 0 0 Z " fill="#73716E" transform="translate(876,1229)"/> <path d="M0 0 C51.15 0 102.3 0 155 0 C155 5.28 155 10.56 155 16 C103.85 16 52.7 16 0 16 C0 10.72 0 5.44 0 0 Z " fill="#72706D" transform="translate(2089,1229)"/> <path d="M0 0 C51.15 0 102.3 0 155 0 C155 5.28 155 10.56 155 16 C103.85 16 52.7 16 0 16 C0 10.72 0 5.44 0 0 Z " fill="#72706D" transform="translate(1279,1229)"/> <path d="M0 0 C51.15 0 102.3 0 155 0 C155 4.95 155 9.9 155 15 C103.85 15 52.7 15 0 15 C0 10.05 0 5.1 0 0 Z " fill="#6E6C68" transform="translate(1279,1549)"/> <path d="M0 0 C51.15 0 102.3 0 155 0 C155 4.95 155 9.9 155 15 C103.85 15 52.7 15 0 15 C0 10.05 0 5.1 0 0 Z " fill="#6A6865" transform="translate(1279,1436)"/> <path d="M0 0 C51.15 0 102.3 0 155 0 C155 4.95 155 9.9 155 15 C103.85 15 52.7 15 0 15 C0 10.05 0 5.1 0 0 Z " fill="#6B6965" transform="translate(1279,1333)"/> <path d="M0 0 C4.95 0 9.9 0 15 0 C15 51.15 15 102.3 15 155 C10.05 155 5.1 155 0 155 C0 103.85 0 52.7 0 0 Z " fill="#6A6864" transform="translate(983,1324)"/> <path d="M0 0 C4.95 0 9.9 0 15 0 C15 51.15 15 102.3 15 155 C10.05 155 5.1 155 0 155 C0 103.85 0 52.7 0 0 Z " fill="#6A6865" transform="translate(909,1324)"/> <path d="M0 0 C98.01 0 196.02 0 297 0 C297 6.27 297 12.54 297 19 C198.99 19 100.98 19 0 19 C0 12.73 0 6.46 0 0 Z M4 3 C4 6.96 4 10.92 4 15 C99.7 15 195.4 15 294 15 C294 11.04 294 7.08 294 3 C198.3 3 102.6 3 4 3 Z " fill="#686662" transform="translate(1645,716)"/> <path d="M0 0 C12.54 0 25.08 0 38 0 C38 3.63 38 7.26 38 11 C38.66 11 39.32 11 40 11 C39.90912109 11.84594727 39.90912109 11.84594727 39.81640625 12.70898438 C39.53994962 15.30555006 39.26993901 17.90274897 39 20.5 C38.85691406 21.8303125 38.85691406 21.8303125 38.7109375 23.1875 C38.16562887 28.48478381 37.71219601 33.67562625 38 39 C38.66 39.66 39.32 40.32 40 41 C39.37480469 41.21527344 38.74960937 41.43054687 38.10546875 41.65234375 C35.17339988 43.52908542 35.0657017 45.22316068 34.3125 48.5625 C33.06101695 53.93898305 33.06101695 53.93898305 32 55 C30.07332493 55.08748207 28.14348139 55.10697334 26.21484375 55.09765625 C24.46010742 55.09282227 24.46010742 55.09282227 22.66992188 55.08789062 C21.43822266 55.07951172 20.20652344 55.07113281 18.9375 55.0625 C17.08415039 55.05573242 17.08415039 55.05573242 15.19335938 55.04882812 C12.12885883 55.03699608 9.06445279 55.02051173 6 55 C2.64677369 41.55453915 0.17107557 28.35946127 -0.6875 14.5 C-0.73608154 13.745979 -0.78466309 12.99195801 -0.8347168 12.21508789 C-0.87250244 11.49442139 -0.91028809 10.77375488 -0.94921875 10.03125 C-0.98362061 9.39767578 -1.01802246 8.76410156 -1.0534668 8.11132812 C-0.98444406 5.38571792 -0.44823121 2.68938728 0 0 Z " fill="#FEFEFE" transform="translate(913,1111)"/> <path d="M0 0 C1.24306664 -0.002062 1.24306664 -0.002062 2.51124573 -0.00416565 C3.41683228 -0.00057037 4.32241882 0.0030249 5.25544739 0.00672913 C6.68987938 0.00651009 6.68987938 0.00651009 8.15328979 0.00628662 C11.31863156 0.00698408 14.48391471 0.01476871 17.64924622 0.02259827 C19.84214241 0.02446304 22.03503903 0.02588666 24.22793579 0.02688599 C30.00325162 0.0307065 35.77854236 0.04053284 41.55384827 0.05158997 C47.44567017 0.06181408 53.33749612 0.06638575 59.22932434 0.07142639 C70.79248642 0.0821555 82.35562986 0.09922636 93.91877747 0.12025452 C93.91877747 0.78025452 93.91877747 1.44025452 93.91877747 2.12025452 C94.90877747 2.45025452 95.89877747 2.78025452 96.91877747 3.12025452 C97.94092643 6.37254667 98.10549045 7.70948595 96.66877747 10.87025452 C94.91877747 13.12025452 94.91877747 13.12025452 91.91877747 14.12025452 C90.56062573 14.20822756 89.19855176 14.24225167 87.83755493 14.24050903 C86.5944883 14.24257103 86.5944883 14.24257103 85.3263092 14.24467468 C84.42072266 14.24107941 83.51513611 14.23748413 82.58210754 14.23377991 C81.14767555 14.23399895 81.14767555 14.23399895 79.68426514 14.23422241 C76.51892337 14.23352496 73.35364022 14.22574032 70.18830872 14.21791077 C67.99541252 14.21604599 65.8025159 14.21462237 63.60961914 14.21362305 C57.83430331 14.20980253 52.05901257 14.19997619 46.28370667 14.18891907 C40.39188476 14.17869496 34.50005881 14.17412328 28.60823059 14.16908264 C17.04506851 14.15835354 5.48192508 14.14128267 -6.08122253 14.12025452 C-6.08122253 13.46025452 -6.08122253 12.80025452 -6.08122253 12.12025452 C-7.07122253 11.79025452 -8.06122253 11.46025452 -9.08122253 11.12025452 C-9.41122253 8.81025452 -9.74122253 6.50025452 -10.08122253 4.12025452 C-9.42122253 4.12025452 -8.76122253 4.12025452 -8.08122253 4.12025452 C-7.75122253 3.13025452 -7.42122253 2.14025452 -7.08122253 1.12025452 C-4.35723104 0.21225735 -2.79699947 -0.00358131 0 0 Z " fill="#F8F8F8" transform="translate(525.0812225341797,1037.8797454833984)"/> <path d="M0 0 C1.24306664 -0.002062 1.24306664 -0.002062 2.51124573 -0.00416565 C3.41683228 -0.00057037 4.32241882 0.0030249 5.25544739 0.00672913 C6.68987938 0.00651009 6.68987938 0.00651009 8.15328979 0.00628662 C11.31863156 0.00698408 14.48391471 0.01476871 17.64924622 0.02259827 C19.84214241 0.02446304 22.03503903 0.02588666 24.22793579 0.02688599 C30.00325162 0.0307065 35.77854236 0.04053284 41.55384827 0.05158997 C47.44567017 0.06181408 53.33749612 0.06638575 59.22932434 0.07142639 C70.79248642 0.0821555 82.35562986 0.09922636 93.91877747 0.12025452 C93.91877747 0.78025452 93.91877747 1.44025452 93.91877747 2.12025452 C94.90877747 2.45025452 95.89877747 2.78025452 96.91877747 3.12025452 C97.94092643 6.37254667 98.10549045 7.70948595 96.66877747 10.87025452 C94.91877747 13.12025452 94.91877747 13.12025452 91.91877747 14.12025452 C90.56062573 14.20822756 89.19855176 14.24225167 87.83755493 14.24050903 C86.5944883 14.24257103 86.5944883 14.24257103 85.3263092 14.24467468 C84.42072266 14.24107941 83.51513611 14.23748413 82.58210754 14.23377991 C81.14767555 14.23399895 81.14767555 14.23399895 79.68426514 14.23422241 C76.51892337 14.23352496 73.35364022 14.22574032 70.18830872 14.21791077 C67.99541252 14.21604599 65.8025159 14.21462237 63.60961914 14.21362305 C57.83430331 14.20980253 52.05901257 14.19997619 46.28370667 14.18891907 C40.39188476 14.17869496 34.50005881 14.17412328 28.60823059 14.16908264 C17.04506851 14.15835354 5.48192508 14.14128267 -6.08122253 14.12025452 C-6.08122253 13.46025452 -6.08122253 12.80025452 -6.08122253 12.12025452 C-7.07122253 11.79025452 -8.06122253 11.46025452 -9.08122253 11.12025452 C-9.41122253 8.81025452 -9.74122253 6.50025452 -10.08122253 4.12025452 C-9.42122253 4.12025452 -8.76122253 4.12025452 -8.08122253 4.12025452 C-7.75122253 3.13025452 -7.42122253 2.14025452 -7.08122253 1.12025452 C-4.35723104 0.21225735 -2.79699947 -0.00358131 0 0 Z " fill="#F8F8F8" transform="translate(525.0812225341797,937.8797454833984)"/> <path d="M0 0 C5.26611624 3.03855988 9.37777488 7.81473026 11.6875 13.4375 C12.73083815 20.31254925 11.75821133 26.13637043 8.38671875 32.203125 C4.65107648 37.1152799 -1.08405668 40.8431405 -7.2578125 41.7109375 C-14.57655382 42.05195412 -19.72132963 39.66801865 -25.140625 34.79296875 C-29.95628026 29.61497049 -31.96247506 23.76414537 -31.75390625 16.6171875 C-30.51062001 10.47777401 -26.61784487 5.05058367 -21.625 1.375 C-15.03979251 -2.47672514 -7.07976514 -3.19819506 0 0 Z " fill="#FDFDFD" transform="translate(894.3125,966.5625)"/> <path d="M0 0 C6.6 0 13.2 0 20 0 C20 21.78 20 43.56 20 66 C13.4 66 6.8 66 0 66 C0 44.22 0 22.44 0 0 Z " fill="#F9F9F9" transform="translate(2602,1135)" data-svg-af-field="kitchenSoapDispenser"/> <path d="M0 0 C5.07748109 2.85229017 8.48063544 7.00018921 10.75 12.375 C11.73543809 19.1126465 10.77426887 24.83701532 6.75 30.375 C2.51120405 34.82407564 -1.32908953 36.52380494 -7.4375 36.6875 C-12.88749284 36.62982812 -16.8338523 35.60098024 -21.25 32.375 C-25.23730902 28.17783261 -27.53492929 24.39830128 -27.5625 18.5625 C-27.40442169 12.88832073 -26.43244993 8.64383857 -22.375 4.42578125 C-15.66661309 -1.65369439 -8.63476368 -3.94872495 0 0 Z " fill="#605E5A" transform="translate(980.25,968.625)"/> <path d="M0 0 C7.67740648 4.92689216 12.1105481 10.33164429 15 19 C15.86968479 27.85836075 15.04458018 34.57248277 10 42 C5.84412018 47.05444842 0.21852012 50.92715996 -6 53 C-15.24439773 53.78437314 -23.31035216 53.76374693 -31 48 C-38.04119056 41.73374123 -41.22909856 34.61193405 -42 25.296875 C-42 16.62136273 -38.58530497 10.71679752 -32.875 4.375 C-24.15560072 -3.97414878 -10.5669461 -6.18066659 0 0 Z M-28.75390625 9.90625 C-33.3131072 15.79476014 -35.82224865 20.37061087 -35 28 C-33.68136526 35.59846949 -30.20854791 39.61119889 -24 44 C-19.09166983 47.23740926 -14.73474573 47.94812008 -9 47 C-1.90773763 44.78567374 2.13178374 41.41012671 5.94140625 35.0859375 C8.58581291 29.87518784 8.68898706 24.72329021 8 19 C5.54139994 12.69453864 0.75450702 7.76829186 -5.35546875 4.890625 C-13.65187553 2.09656186 -22.72662027 3.35543584 -28.75390625 9.90625 Z " fill="#605E5A" transform="translate(898,961)"/> <path d="M0 0 C15.18 0 30.36 0 46 0 C46 7.26 46 14.52 46 22 C30.82 22 15.64 22 0 22 C0 14.74 0 7.48 0 0 Z " fill="#F9F9F9" transform="translate(928,1042)"/> <path d="M0 0 C43.23 0 86.46 0 131 0 C131 1.98 131 3.96 131 6 C87.77 6 44.54 6 0 6 C0 4.02 0 2.04 0 0 Z " fill="#FFFFFF" transform="translate(981,1051)"/> <path d="M0 0 C3.92722481 2.56092255 7.08299412 5.47165687 9.5 9.5 C10.51882 14.59410002 10.78122168 18.32058174 7.875 22.75 C5.28315589 25.96446588 3.0215554 27.76259834 -1 29 C-6.96885647 29.24691313 -11.44134455 28.01595837 -16 24 C-18.59981956 20.39379867 -19.21350245 17.77321229 -18.875 13.4375 C-18.26080605 9.66368973 -17.58993617 6.92412148 -15 4 C-10.29378212 0.77045093 -5.73623277 -1.12676001 0 0 Z " fill="#FCFCFC" transform="translate(1664,1236)"/> <path d="M0 0 C4.79088924 1.72472013 8.75851116 4.31840938 11 9 C11.93193628 13.64566733 12.10562371 17.94251482 9.8203125 22.1953125 C6.01179593 26.9115584 2.59381826 28.71703801 -3.4375 29.375 C-8.97861522 28.79172471 -11.75454739 26.40932795 -15.375 22.3125 C-17.47650352 18.02866591 -17.82454452 14.68644179 -17 10 C-13.42541975 2.71335565 -8.19059979 -1.02382497 0 0 Z " fill="#FDFDFD" transform="translate(1899,1236)"/> <path d="M0 0 C4.03019601 2.12916016 6.30220108 3.78637177 8 8 C8.8382746 12.85316873 8.49228037 16.15389312 6 20.4375 C2.42638134 23.48996594 -0.29073438 24.86570535 -5 25 C-9.29469478 23.85474806 -11.41780829 22.62697569 -14.4375 19.375 C-16.41693124 15.09942853 -17.00018858 11.6333522 -16 7 C-11.51522792 1.14488089 -7.31610212 -0.75683815 0 0 Z " fill="#FDFDFD" transform="translate(976,974)"/> <path d="M0 0 C2.42895508 -0.3742218 2.42895508 -0.3742218 5.51953125 -0.37231445 C6.67412842 -0.37854324 7.82872559 -0.38477203 9.01831055 -0.39118958 C10.27039307 -0.38197983 11.52247559 -0.37277008 12.8125 -0.36328125 C14.09229736 -0.36377975 15.37209473 -0.36427826 16.69067383 -0.36479187 C19.40099852 -0.3647021 22.11102602 -0.35426453 24.82128906 -0.33618164 C28.29851254 -0.31349392 31.77530162 -0.31294976 35.25257874 -0.31969929 C38.56426893 -0.32384084 41.87582479 -0.31186968 45.1875 -0.30078125 C46.43958252 -0.30169266 47.69166504 -0.30260406 48.98168945 -0.30354309 C50.13628662 -0.29401108 51.29088379 -0.28447906 52.48046875 -0.2746582 C53.50035889 -0.27005081 54.52024902 -0.26544342 55.57104492 -0.26069641 C58 0 58 0 60 2 C59.67 3.65 59.34 5.3 59 7 C39.53 7 20.06 7 0 7 C-0.66 5.68 -1.32 4.36 -2 3 C-1.34 2.01 -0.68 1.02 0 0 Z " fill="#F8F8F8" transform="translate(420,461)"/> <path d="M0 0 C1.53888382 0.00666183 1.53888382 0.00666183 3.1088562 0.01345825 C4.85043503 0.01368484 4.85043503 0.01368484 6.62719727 0.01391602 C7.88555389 0.02423859 9.14391052 0.03456116 10.44039917 0.04519653 C11.72493988 0.04802643 13.00948059 0.05085632 14.33294678 0.05377197 C17.74921434 0.06141094 21.16531204 0.08106151 24.58151245 0.10317993 C28.0670034 0.12363279 31.55252177 0.13277248 35.03805542 0.14285278 C41.87796898 0.16430729 48.71776967 0.19844632 55.55758667 0.24050903 C56.21758667 1.56050903 56.87758667 2.88050903 57.55758667 4.24050903 C56.89758667 5.23050903 56.23758667 6.22050903 55.55758667 7.24050903 C53.07720947 7.60127258 53.07720947 7.60127258 49.91452026 7.58108521 C48.73344696 7.58085861 47.55237366 7.58063202 46.33551025 7.58039856 C44.41516464 7.55717278 44.41516464 7.55717278 42.45602417 7.53347778 C41.14928741 7.52923294 39.84255066 7.5249881 38.49621582 7.52061462 C35.02066881 7.50915535 31.5454974 7.47967953 28.07009888 7.44650269 C24.52431317 7.41582472 20.97846682 7.4021142 17.43258667 7.38699341 C10.47409896 7.35481038 3.51586084 7.30360133 -3.44241333 7.24050903 C-4.06741333 4.86550903 -4.06741333 4.86550903 -4.44241333 2.24050903 C-2.44241333 0.24050903 -2.44241333 0.24050903 0 0 Z " fill="#F8F8F8" transform="translate(745.4424133300781,460.7594909667969)"/> <path d="M0 0 C1.53888382 0.00666183 1.53888382 0.00666183 3.1088562 0.01345825 C4.85043503 0.01368484 4.85043503 0.01368484 6.62719727 0.01391602 C7.88555389 0.02423859 9.14391052 0.03456116 10.44039917 0.04519653 C11.72493988 0.04802643 13.00948059 0.05085632 14.33294678 0.05377197 C17.74921434 0.06141094 21.16531204 0.08106151 24.58151245 0.10317993 C28.0670034 0.12363279 31.55252177 0.13277248 35.03805542 0.14285278 C41.87796898 0.16430729 48.71776967 0.19844632 55.55758667 0.24050903 C55.93891966 2.23191463 56.27084249 4.2332998 56.55758667 6.24050903 C55.55758667 7.24050903 55.55758667 7.24050903 53.19746399 7.36076355 C52.15155594 7.35854294 51.10564789 7.35632233 50.02804565 7.35403442 C48.84689682 7.35395889 47.66574799 7.35388336 46.44880676 7.35380554 C45.16341507 7.34864426 43.87802338 7.34348297 42.55368042 7.33816528 C41.24552872 7.33675034 39.93737701 7.33533539 38.58958435 7.33387756 C35.10595808 7.33005313 31.62237328 7.3202235 28.13876343 7.30917358 C24.58631959 7.29895786 21.03386908 7.2943796 17.48141479 7.28933716 C10.50678835 7.27860115 3.5321895 7.26152563 -3.44241333 7.24050903 C-4.06741333 4.86550903 -4.06741333 4.86550903 -4.44241333 2.24050903 C-2.44241333 0.24050903 -2.44241333 0.24050903 0 0 Z " fill="#F8F8F8" transform="translate(604.4424133300781,460.7594909667969)"/> <path d="M0 0 C11.55 0 23.1 0 35 0 C35.495 2.475 35.495 2.475 36 5 C98.37 5 160.74 5 225 5 C225 5.33 225 5.66 225 6 C150.75 6 76.5 6 0 6 C0 4.02 0 2.04 0 0 Z " fill="#7F7D7A" transform="translate(1341,651)"/> <path d="M0 0 C0.69551971 -0.00095673 1.39103943 -0.00191345 2.1076355 -0.00289917 C3.57501313 -0.0035766 5.04239383 -0.00175293 6.50976562 0.00244141 C8.71491539 0.00774688 10.9198569 0.00250692 13.125 -0.00390625 C21.33091455 -0.00737129 29.44931688 0.27107369 37.6171875 1.1328125 C37.6171875 1.7928125 37.6171875 2.4528125 37.6171875 3.1328125 C38.6071875 3.6278125 38.6071875 3.6278125 39.6171875 4.1328125 C38.1397129 4.49397296 36.66014075 4.84656298 35.1796875 5.1953125 C34.35597656 5.39253906 33.53226562 5.58976563 32.68359375 5.79296875 C31.66072266 5.96119141 31.66072266 5.96119141 30.6171875 6.1328125 C30.1221875 5.6378125 30.1221875 5.6378125 29.6171875 5.1328125 C25.12959883 4.72484989 20.62126057 4.68695272 16.1171875 4.6328125 C15.11342575 4.6201384 15.11342575 4.6201384 14.08938599 4.60720825 C1.00723926 4.52264351 -10.61602404 7.08174324 -22.99633789 11.37670898 C-25.4414446 12.15138883 -27.86089188 12.67502146 -30.3828125 13.1328125 C-30.14721442 9.9522384 -29.18291844 8.92266747 -26.9453125 6.5703125 C-19.58595802 0.80696261 -8.99145328 0.00795603 0 0 Z " fill="#F8F8F8" transform="translate(375.3828125,228.8671875)"/> <path d="M0 0 C2.31 0 4.62 0 7 0 C7 4.29 7 8.58 7 13 C-5.21 13 -17.42 13 -30 13 C-30 10.69 -30 8.38 -30 6 C-20.1 6 -10.2 6 0 6 C0 4.02 0 2.04 0 0 Z " fill="#F0F0F0" transform="translate(2036,1177)"/> <path d="M0 0 C11.55 0 23.1 0 35 0 C35.495 2.475 35.495 2.475 36 5 C55.47 5 74.94 5 95 5 C95 5.33 95 5.66 95 6 C63.65 6 32.3 6 0 6 C0 4.02 0 2.04 0 0 Z " fill="#7E7C79" transform="translate(1029,651)"/> <path d="M0 0 C11.55 0 23.1 0 35 0 C35 1.32 35 2.64 35 4 C23.45 4 11.9 4 0 4 C0 2.68 0 1.36 0 0 Z " fill="#FEFEFE" transform="translate(1131,652)"/> <path d="M0 0 C3.3 0 6.6 0 10 0 C10 10.89 10 21.78 10 33 C7.03 33 4.06 33 1 33 C2.26953125 31.046875 3.5390625 29.09375 4.80859375 27.140625 C7.59075272 22.14186068 7.62011461 16.58941138 7 11 C5.44617431 6.42313719 3.42132587 3.42132587 0 0 Z " fill="#ECEBEB" transform="translate(1909,1234)"/> <path d="M0 0 C11.22 0 22.44 0 34 0 C34 1.32 34 2.64 34 4 C22.78 4 11.56 4 0 4 C0 2.68 0 1.36 0 0 Z " fill="#FFFFFF" transform="translate(1342,652)"/> <path d="M0 0 C11.22 0 22.44 0 34 0 C34 1.32 34 2.64 34 4 C22.78 4 11.56 4 0 4 C0 2.68 0 1.36 0 0 Z " fill="#FFFFFF" transform="translate(1234,652)"/> <path d="M0 0 C11.22 0 22.44 0 34 0 C34 1.32 34 2.64 34 4 C22.78 4 11.56 4 0 4 C0 2.68 0 1.36 0 0 Z " fill="#FFFFFF" transform="translate(1030,652)"/> <path d="M0 0 C2.97 0 5.94 0 9 0 C8.21625 1.11375 7.4325 2.2275 6.625 3.375 C3.25869029 8.83803976 1.41872988 14.23271156 2.4140625 20.68359375 C3.73778585 25.57846085 5.41916384 29.29568674 9 33 C6.03 33 3.06 33 0 33 C0 22.11 0 11.22 0 0 Z " fill="#D1D0CF" transform="translate(1637,1234)"/> <path d="M0 0 C1.12841855 5.12128419 1.12841855 5.12128419 1 8 C-1.1875 10.8125 -1.1875 10.8125 -4 13 C-4.721875 13.598125 -5.44375 14.19625 -6.1875 14.8125 C-8 16 -8 16 -10 16 C-9.93994409 13.89504036 -9.85114641 11.79088565 -9.75 9.6875 C-9.70359375 8.51574219 -9.6571875 7.34398437 -9.609375 6.13671875 C-9 3 -9 3 -7.125 1.09375 C-4.58179425 -0.21525296 -2.82276284 -0.23523024 0 0 Z " fill="#FCFCFC" transform="translate(968,1125)"/> <path d="M0 0 C2.31 0 4.62 0 7 0 C5.02 3.63 3.04 7.26 1 11 C0.67 11 0.34 11 0 11 C0 7.37 0 3.74 0 0 Z " fill="#F4F4F3" transform="translate(1638,1235)"/> <path d="M0 0 C3.03278067 1.51639033 3.61513595 3.98942599 5 7 C5.33 7.99 5.66 8.98 6 10 C4.02 10 2.04 10 0 10 C0 6.7 0 3.4 0 0 Z " fill="#F7F7F7" transform="translate(1638,1256)"/> <path d="M0 0 C7.59 0 15.18 0 23 0 C23 0.99 23 1.98 23 3 C22.4337793 2.84152588 21.86755859 2.68305176 21.28417969 2.51977539 C18.9654655 1.99214152 16.82641603 1.795844 14.453125 1.68359375 C13.60878906 1.64169922 12.76445312 1.59980469 11.89453125 1.55664062 C11.02183594 1.51732422 10.14914062 1.47800781 9.25 1.4375 C7.91775391 1.37272461 7.91775391 1.37272461 6.55859375 1.30664062 C4.37254037 1.20086385 2.18637911 1.09877454 0 1 C0 0.67 0 0.34 0 0 Z " fill="#E4E4E3" transform="translate(386,232)"/> <path d="M0 0 C1.65 0 3.3 0 5 0 C2 2 2 2 0 2 C0 1.34 0 0.68 0 0 Z " fill="#A7A6A4" transform="translate(2165,710)"/>" + width="2823"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="12"/> + </cq:responsive> + </svg> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="6"/> + </cq:responsive> + </imageSelectionPanel> + <accessibleSelectionPanel + jcr:created="{Date}2024-11-20T17:15:04.181+05:30" + jcr:lastModified="{Date}2024-11-20T17:18:19.745+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Accessible Selection" + sling:resourceType="forms-components-examples/components/form/panelcontainer" + enabled="{Boolean}true" + fieldType="panel" + hideTitle="false" + layout="responsiveGrid" + name="accessibleSelectionPanel" + readOnly="{Boolean}false" + repeatable="false" + visible="{Boolean}true" + wrapData="{Boolean}false"> + <checkbox + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:28:12.812+05:30" + jcr:lastModified="{Date}2024-11-28T11:38:52.551+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Sink" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenSink" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox> + <checkbox_20276723 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:47:21.436+05:30" + jcr:lastModified="{Date}2024-11-20T16:47:37.031+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Coffee Maker" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenCoffeeMaker" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_20276723> + <checkbox_2114590349 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:44:17.578+05:30" + jcr:lastModified="{Date}2024-11-20T16:44:37.873+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Tap" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenTap" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_2114590349> + <checkbox_435131954 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:44:42.298+05:30" + jcr:lastModified="{Date}2024-11-20T16:45:07.787+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Soap Dispenser" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenSoapDispenser" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_435131954> + <checkbox_512559013 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:45:30.964+05:30" + jcr:lastModified="{Date}2024-11-28T11:39:04.027+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Cabinets" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenCabinet" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_512559013> + <checkbox_1896701200 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:45:49.633+05:30" + jcr:lastModified="{Date}2024-11-20T16:46:15.171+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Open Shelfs" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenOpenShelf" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_1896701200> + <checkbox_585102187 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:46:24.818+05:30" + jcr:lastModified="{Date}2024-11-20T16:46:42.509+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Modular Drawers" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenModularDrawer" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_585102187> + <checkbox_1035090150 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:46:56.180+05:30" + jcr:lastModified="{Date}2024-11-20T16:47:09.924+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Chimney" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenChimney" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_1035090150> + <checkbox_791012958 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:47:42.607+05:30" + jcr:lastModified="{Date}2024-11-20T16:47:58.041+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Refrigerator" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenRefrigerator" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_791012958> + <checkbox_1814244509 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:48:02.520+05:30" + jcr:lastModified="{Date}2024-11-20T16:48:21.083+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Bowl" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenBowl" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_1814244509> + <checkbox_2052938824 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:48:30.867+05:30" + jcr:lastModified="{Date}2024-11-20T16:48:48.847+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Kitchen Storage Containers" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenStorageContainers" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_2052938824> + <checkbox_591715653 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:48:53.899+05:30" + jcr:lastModified="{Date}2024-11-20T16:49:13.610+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Hob" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenHob" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_591715653> + <checkbox_963737871 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:49:25.618+05:30" + jcr:lastModified="{Date}2024-11-20T16:49:41.750+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="OTG" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenOtg" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_963737871> + <checkbox_1788152173 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:49:46.325+05:30" + jcr:lastModified="{Date}2024-11-20T16:50:02.733+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Flower Pots" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenFlowerPots" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_1788152173> + <checkbox_1947254358 + fd:customPropertySelect="[1732774062798]" + jcr:created="{Date}2024-11-20T16:50:07.262+05:30" + jcr:lastModified="{Date}2024-11-20T16:50:21.661+05:30" + jcr:primaryType="nt:unstructured" + jcr:title="Plants" + sling:resourceType="forms-components-examples/components/form/checkbox" + checkedValue="on" + enabled="{Boolean}true" + enableUncheckedValue="{Boolean}false" + fieldType="checkbox" + hideTitle="false" + name="kitchenPlants" + readOnly="{Boolean}false" + type="string" + unboundFormElement="{Boolean}false" + uncheckedValue="off" + visible="{Boolean}true"> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="2"/> + </cq:responsive> + </checkbox_1947254358> + <cq:responsive jcr:primaryType="nt:unstructured"> + <default + jcr:primaryType="nt:unstructured" + offset="0" + width="6"/> + </cq:responsive> + </accessibleSelectionPanel> + <fd:rules jcr:primaryType="nt:unstructured"/> + <fd:events jcr:primaryType="nt:unstructured"/> + </svgselector> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/.content.xml new file mode 100644 index 0000000000..3edadd6c63 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:mixinTypes="[rep:AccessControllable]" + jcr:primaryType="sling:Folder" + hidden="true"/> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/basic/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/basic/.content.xml new file mode 100644 index 0000000000..8999bca137 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/basic/.content.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:conf="/conf/core-components-it" + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-05-10T12:08:50.299+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="basic" + sling:configRef="/conf/forms/core-components-it/samples/turnstile/basic/" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:version="2.1" + jcr:lastModified="{Date}2024-05-10T12:08:50.288+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + actionType="forms-core-components-it/customsubmission/logsubmit" + dorType="none" + fieldType="form" + schemaType="none" + specVersion="0.13.0" + textIsRich="true" + thankYouMessage="Thank you for submitting the form." + thankYouOption="message" + themeRef="/libs/fd/af/themes/canvas" + title="basic"> + <turnstile + jcr:created="{Date}2024-05-10T12:07:58.973+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-05-10T12:08:37.859+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="TURNSTILE" + sling:resourceType="forms-core-components-it/form/turnstile" + cloudServicePath="managed" + enabled="{Boolean}true" + fieldType="captcha" + hideTitle="false" + name="turnstile1715323079433" + readOnly="{Boolean}false" + required="{Boolean}true" + size="normal" + textIsRich="true" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <submit + jcr:created="{Date}2024-05-10T12:08:41.722+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-05-10T12:08:41.722+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Submit" + sling:resourceType="forms-components-examples/components/form/actions/submit" + buttonType="submit" + dorExclusion="true" + fieldType="button" + name="submit1715323122133"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1667450213112"\,"type":"BUTTON"\,"name":"button1667450213112"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SUBMIT_FORM"\,"items":[]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["submitForm()"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[submitForm()]"/> + </submit> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/invisible/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/invisible/.content.xml new file mode 100644 index 0000000000..6318dc1f19 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/invisible/.content.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:conf="/conf/core-components-it" + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-05-10T12:08:50.299+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="basic" + sling:configRef="/conf/forms/core-components-it/samples/turnstile/basic/" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:version="2.1" + jcr:lastModified="{Date}2024-05-10T12:08:50.288+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + actionType="forms-core-components-it/customsubmission/logsubmit" + dorType="none" + fieldType="form" + schemaType="none" + specVersion="0.13.0" + textIsRich="true" + thankYouMessage="Thank you for submitting the form." + thankYouOption="message" + themeRef="/libs/fd/af/themes/canvas" + title="basic"> + <turnstile + jcr:created="{Date}2024-05-10T12:07:58.973+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-05-10T12:08:37.859+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="TURNSTILE" + sling:resourceType="forms-core-components-it/form/turnstile" + cloudServicePath="invisible" + enabled="{Boolean}true" + fieldType="captcha" + hideTitle="false" + name="turnstile1715323079433" + readOnly="{Boolean}false" + required="{Boolean}true" + size="normal" + textIsRich="true" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <submit + jcr:created="{Date}2024-05-10T12:08:41.722+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-05-10T12:08:41.722+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Submit" + sling:resourceType="forms-components-examples/components/form/actions/submit" + buttonType="submit" + dorExclusion="true" + fieldType="button" + name="submit1715323122133"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1667450213112"\,"type":"BUTTON"\,"name":"button1667450213112"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SUBMIT_FORM"\,"items":[]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["submitForm()"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[submitForm()]"/> + </submit> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/managed/.content.xml b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/managed/.content.xml new file mode 100644 index 0000000000..1196a59e27 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/af/core-components-it/samples/turnstile/managed/.content.xml @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:conf="/conf/core-components-it" + cq:deviceGroups="[/etc/mobile/groups/responsive]" + cq:lastModified="{Date}2024-05-10T12:08:50.299+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/af-blank-v2" + jcr:language="en" + jcr:primaryType="cq:PageContent" + jcr:title="managed" + sling:configRef="/conf/forms/core-components-it/samples/turnstile/managed/" + sling:resourceType="forms-components-examples/components/page"> + <guideContainer + fd:version="2.1" + jcr:lastModified="{Date}2024-05-10T12:08:50.288+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/form/container" + actionType="forms-core-components-it/customsubmission/logsubmit" + dorType="none" + fieldType="form" + schemaType="none" + specVersion="0.13.0" + textIsRich="true" + thankYouMessage="Thank you for submitting the form." + thankYouOption="message" + themeRef="/libs/fd/af/themes/canvas" + title="managed"> + <turnstile + jcr:created="{Date}2024-05-10T12:07:58.973+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-05-10T12:08:37.859+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="TURNSTILE" + sling:resourceType="forms-core-components-it/form/turnstile" + cloudServicePath="managed" + enabled="{Boolean}true" + fieldType="captcha" + hideTitle="false" + name="turnstile1715323079433" + readOnly="{Boolean}false" + required="{Boolean}true" + size="normal" + textIsRich="true" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + <submit + jcr:created="{Date}2024-05-10T12:08:41.722+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-05-10T12:08:41.722+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Submit" + sling:resourceType="forms-components-examples/components/form/actions/submit" + buttonType="submit" + dorExclusion="true" + fieldType="button" + name="submit1715323122133"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1667450213112"\,"type":"BUTTON"\,"name":"button1667450213112"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SUBMIT_FORM"\,"items":[]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["submitForm()"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[submitForm()]"/> + </submit> + </guideContainer> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/sites/core-components-it/site-with-captcha-inline-form/.content.xml b/it/content/src/main/content/jcr_root/content/forms/sites/core-components-it/site-with-captcha-inline-form/.content.xml new file mode 100644 index 0000000000..a225e5b6d8 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/sites/core-components-it/site-with-captcha-inline-form/.content.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fd="http://www.adobe.com/aemfd/fd/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:conf="/conf/core-components-it/samples/recaptcha/basic" + cq:lastModified="{Date}2024-12-03T16:11:14.992+05:30" + cq:lastModifiedBy="admin" + cq:template="/conf/core-components-examples/settings/wcm/templates/content-page" + jcr:description="Inline Form with Captcha Runtime test" + jcr:primaryType="cq:PageContent" + jcr:title="Container" + sling:resourceType="forms-components-examples/components/page" + pwaCachestrategy="staleWhileRevalidate" + pwaDisplay="standalone" + pwaOrientation="any"> + <root + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/foundation/components/responsivegrid"> + <responsivegrid + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/foundation/components/responsivegrid"> + <container + fd:autoSaveStrategyType="time" + fd:version="2.1" + jcr:created="{Date}2024-12-03T15:15:01.796+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-12-03T15:20:02.193+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Form Container" + sling:resourceType="forms-components-examples/components/form/container" + actionType="forms-core-components-it/customsubmission/logsubmit" + fieldType="form" + schemaType="none" + specVersion="0.14.2" + textIsRich="true" + thankYouMessage="<p>Thank you for submitting the form.</p> " + thankYouOption="message"> + <submit + jcr:created="{Date}2024-12-03T15:15:14.621+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-12-03T15:15:14.621+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="Submit" + sling:resourceType="forms-components-examples/components/form/actions/submit" + buttonType="submit" + dorExclusion="true" + fieldType="button" + name="submit1733219114749"> + <fd:rules + fd:click="[{"nodeName":"ROOT"\,"items":[{"nodeName":"STATEMENT"\,"choice":{"nodeName":"EVENT_SCRIPTS"\,"items":[{"nodeName":"EVENT_CONDITION"\,"choice":{"nodeName":"EVENT_AND_COMPARISON"\,"items":[{"nodeName":"COMPONENT"\,"value":{"id":"$form.button1667450213112"\,"type":"BUTTON"\,"name":"button1667450213112"}}\,{"nodeName":"EVENT_AND_COMPARISON_OPERATOR"\,"choice":{"nodeName":"is clicked"\,"value":null}}\,{"nodeName":"PRIMITIVE_EXPRESSION"\,"choice":null}]}\,"nested":false}\,{"nodeName":"Then"\,"value":null}\,{"nodeName":"BLOCK_STATEMENTS"\,"items":[{"nodeName":"BLOCK_STATEMENT"\,"choice":{"nodeName":"SUBMIT_FORM"\,"items":[]}}]}]}}]\,"isValid":true\,"enabled":true\,"version":1\,"script":["submitForm()"]\,"eventName":"Click"\,"ruleType":""\,"description":""}]" + jcr:primaryType="nt:unstructured"/> + <fd:events + jcr:primaryType="nt:unstructured" + click="[submitForm()]"/> + </submit> + <recaptcha + jcr:created="{Date}2024-12-03T15:56:55.306+05:30" + jcr:createdBy="admin" + jcr:lastModified="{Date}2024-12-03T16:09:39.983+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="CAPTCHA" + sling:resourceType="forms-core-components-it/form/recaptcha" + enabled="{Boolean}true" + fieldType="captcha" + hideTitle="false" + name="recaptcha1733221615591" + rcCloudServicePath="entscore" + readOnly="{Boolean}false" + required="{Boolean}true" + textIsRich="true" + unboundFormElement="{Boolean}false" + visible="{Boolean}true"/> + </container> + </responsivegrid> + </root> + <cq:featuredimage + jcr:lastModified="{Date}2024-12-03T16:11:14.941+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="core/wcm/components/image/v3/image" + altValueFromDAM="false"/> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/content/forms/sites/core-components-it/site-with-turnstile-afv2-form/.content.xml b/it/content/src/main/content/jcr_root/content/forms/sites/core-components-it/site-with-turnstile-afv2-form/.content.xml new file mode 100644 index 0000000000..b4205fa962 --- /dev/null +++ b/it/content/src/main/content/jcr_root/content/forms/sites/core-components-it/site-with-turnstile-afv2-form/.content.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:lastModified="{Date}2023-08-02T10:36:18.709+05:30" + cq:lastModifiedBy="admin" + cq:tags="[]" + cq:template="/conf/core-components-examples/settings/wcm/templates/content-page" + jcr:description="Aem Embed Container Runtime test" + jcr:primaryType="cq:PageContent" + jcr:title="Aem Embed Container" + sling:resourceType="forms-components-examples/components/page"> + <root + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/foundation/components/responsivegrid"> + <responsivegrid + jcr:primaryType="nt:unstructured" + sling:resourceType="wcm/foundation/components/responsivegrid"> + <aemform + jcr:lastModified="{Date}2023-08-02T10:36:18.704+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + sling:resourceType="forms-components-examples/components/aemform" + enableFocusOnFirstField="{Boolean}true" + formRef="/content/dam/formsanddocuments/core-components-it/samples/turnstile/managed" + submitType="inline" + textIsRich="true" + useiframe="false" + usePageLocale="true"/> + </responsivegrid> + </root> + </jcr:content> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/etc/.content.xml b/it/content/src/main/content/jcr_root/etc/.content.xml new file mode 100755 index 0000000000..1581aa3428 --- /dev/null +++ b/it/content/src/main/content/jcr_root/etc/.content.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:mixinTypes="[rep:AccessControllable]" + jcr:primaryType="sling:Folder"/> diff --git a/it/content/src/main/content/jcr_root/etc/replication/.content.xml b/it/content/src/main/content/jcr_root/etc/replication/.content.xml new file mode 100755 index 0000000000..54909b7586 --- /dev/null +++ b/it/content/src/main/content/jcr_root/etc/replication/.content.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:mixinTypes="[rep:AccessControllable]" + jcr:primaryType="sling:OrderedFolder" + jcr:title="Replication" + sling:resourceType="cq/replication/components/home"> + <rep:policy/> + <agents.author/> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/etc/replication/agents.author/.content.xml b/it/content/src/main/content/jcr_root/etc/replication/agents.author/.content.xml new file mode 100755 index 0000000000..5580192f8c --- /dev/null +++ b/it/content/src/main/content/jcr_root/etc/replication/agents.author/.content.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="cq:Page"> + <jcr:content/> + <corecomponentsit/> +</jcr:root> diff --git a/it/content/src/main/content/jcr_root/etc/replication/agents.author/corecomponentsit/.content.xml b/it/content/src/main/content/jcr_root/etc/replication/agents.author/corecomponentsit/.content.xml new file mode 100755 index 0000000000..e55cdbc22e --- /dev/null +++ b/it/content/src/main/content/jcr_root/etc/replication/agents.author/corecomponentsit/.content.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + jcr:primaryType="cq:Page"> + <jcr:content + cq:lastModified="{Date}2024-11-12T15:30:38.557+05:30" + cq:lastModifiedBy="admin" + cq:template="/libs/cq/replication/templates/agent" + jcr:description="Agent that replicates headless adaptive form json to external system" + jcr:lastModified="{Date}2024-11-12T15:30:38.550+05:30" + jcr:lastModifiedBy="admin" + jcr:primaryType="nt:unstructured" + jcr:title="corecomponentsit" + sling:resourceType="cq/replication/components/agent" + enabled="true" + logLevel="info" + retryDelay="60000" + serializationType="durbo" + transportUri="corecomponentsitheadless"/> +</jcr:root> diff --git a/it/core/pom.xml b/it/core/pom.xml index 462a280e46..3ef2cf1334 100644 --- a/it/core/pom.xml +++ b/it/core/pom.xml @@ -85,6 +85,8 @@ <_metatypeannotations>*</_metatypeannotations> <Import-Package> javax.annotation;version=0.0.0, + com.adobe.cq.forms.core.components.models.form;version="[1.0.0,10.0.0)", + io.jsonwebtoken;resolution:=optional;version="[0.0.0,1.0.0)", * </Import-Package> </instructions> @@ -156,6 +158,24 @@ Import-Package: javax.annotation;version=0.0.0,* <groupId>com.adobe.aem</groupId> <artifactId>aem-forms-sdk-api</artifactId> </dependency> + <dependency> + <groupId>com.adobe.aem</groupId> + <artifactId>core-forms-components-af-core</artifactId> + <version>3.0.70</version> + </dependency> + <!-- Json web token dependencies for oauth2 flow --> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-api</artifactId> + <version>0.11.2</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-impl</artifactId> + <version>0.11.2</version> + <scope>provided</scope> + </dependency> </dependencies> <!-- ====================================================================== --> diff --git a/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/HeadlessTransportHandler.java b/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/HeadlessTransportHandler.java new file mode 100644 index 0000000000..33acd89eb1 --- /dev/null +++ b/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/HeadlessTransportHandler.java @@ -0,0 +1,236 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.it.service; + +import com.adobe.cq.forms.core.components.models.form.FormStructureParser; +import com.adobe.cq.forms.core.components.util.ComponentUtils; +import com.day.cq.replication.AgentConfig; +import com.day.cq.replication.ReplicationAction; +import com.day.cq.replication.ReplicationException; +import com.day.cq.replication.ReplicationResult; +import com.day.cq.replication.ReplicationTransaction; +import com.day.cq.replication.TransportContext; +import com.day.cq.replication.TransportHandler; +import com.day.cq.wcm.api.NameConstants; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.osgi.services.HttpClientBuilderFactory; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.serviceusermapping.ServiceUserMapped; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +/** + * Agent needs to be configured as per this, https://medium.com/@toimrank/aem-transporthandler-e761accaec51 + * https://blog.developer.adobe.com/reimagining-replication-agents-on-aem-as-a-cloud-service-a4437b7eeb60 + */ + +@Component( + service = TransportHandler.class, + property = { + "service.ranking:Integer=1000" + } +) +public class HeadlessTransportHandler implements TransportHandler { + + // todo: embedding credentials in source code risks unauthorized access + private static final String CLIENT_ID = "your_client_id"; + private static final String CLIENT_SECRET = "your_client_secret"; + + private static final Logger LOG = LoggerFactory.getLogger(HeadlessTransportHandler.class); + private static final Map<String, Object> AUTH; + private final static String URI = "corecomponentsitheadless"; + /** + * The Sling ServiceUserMapper service allows for mapping Service IDs comprised of the Service + * Names defined by the providing bundles and optional Subservice Name to ResourceResolver and/or + * JCR Repository user IDs. This mapping is configurable such that system administrators are in + * full control of assigning users to services. cf. http://sling.apache.org/documentation/the-sling-engine/service-authentication.html#implementation + */ + private final static String USER_MAPPED_SUB_SERVICE_NAME = "core-components-it-replication-sub-service"; + + static { + AUTH = new HashMap<>(); + // name of subservice, this is part of ui.config + AUTH.put(ResourceResolverFactory.SUBSERVICE, USER_MAPPED_SUB_SERVICE_NAME); + } + + @Reference + private HttpClientBuilderFactory clientBuilderFactory; + @Reference + private ResourceResolverFactory resourceResolverFactory; + + private CloseableHttpClient httpClient; + + @Activate + protected void activate() { + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + connectionManager.setDefaultMaxPerRoute(100); + connectionManager.setMaxTotal(100); + + httpClient = clientBuilderFactory.newBuilder() + .setConnectionManager(connectionManager) + .setDefaultRequestConfig(RequestConfig.custom() + .setConnectTimeout(30000) + .setSocketTimeout(30000) + .setConnectionRequestTimeout(30000) + .build()) + .build(); + } + + @Deactivate + protected void deactivate() { + try { + httpClient.close(); + } catch (IOException ex) { + LOG.warn("[HeadlessTransportHandler] Failed to release http client: {}", ex.getMessage(), ex); + } + } + + @Override + public boolean canHandle(AgentConfig agentConfig) { + return StringUtils.equals(agentConfig.getTransportURI(), URI); + // for oauth 2, hence commenting this + //&& StringUtils.isNotEmpty(agentConfig.getTransportUser()) + // && StringUtils.isNotEmpty(agentConfig.getTransportPassword()); + + } + + @Override + public ReplicationResult deliver(TransportContext transportContext, ReplicationTransaction replicationTransaction) + throws ReplicationException { + ReplicationAction action = replicationTransaction.getAction(); + Function<String, HttpRequestBase> requestSupplier; + + switch (action.getType()) { + case ACTIVATE: + requestSupplier = HttpPost::new; + break; + case DEACTIVATE: + case DELETE: + requestSupplier = HttpDelete::new; + break; + default: + LOG.debug("[HeadlessTransportHandler] Unsupported replication action type: {}", action); + return new ReplicationResult(true, 405, "Method Not Allowed"); + } + + AgentConfig agentConfig = transportContext.getConfig(); + /* + String transportUri = agentConfig.getTransportURI(); + String transportAuth = agentConfig.getTransportUser() + ':' + agentConfig.getTransportPassword(); + byte[] encodedAuth = Base64.encodeBase64(transportAuth.getBytes(StandardCharsets.ISO_8859_1)); + Header authHeader = new BasicHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth)); + Function<String, HttpRequestBase> authenticatedRequestSupplier = uri -> { + HttpRequestBase request = requestSupplier.apply(uri); + request.addHeader(authHeader); + return request; + }; */ + + try (ResourceResolver resourceResolver = resourceResolverFactory.getServiceResourceResolver(AUTH)) { + for (String path : action.getPaths()) { + Resource resource = resourceResolver.getResource(path); + if (resource == null || (!resource.isResourceType(NameConstants.NT_PAGE))) { + LOG.info("[HeadlessTransportHandler] Resource not found or not a cq:Page {}. Skipping", path); + continue; + } + // get the model json from the resource + FormStructureParser parser = getFormStructureParserFromPage(resource); + if (parser != null) { + String formModelJson = parser.getFormDefinition(); + // todo: publish this form model json to the external system + LOG.info("[HeadlessTransportHandler] Form Model JSON: {}", formModelJson); + /** + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + connectionManager.setDefaultMaxPerRoute(100); + connectionManager.setMaxTotal(100); + + CloseableHttpClient httpClient = HttpClients.custom() + .setConnectionManager(connectionManager) + .setDefaultRequestConfig(RequestConfig.custom() + .setConnectTimeout(30000) + .setSocketTimeout(30000) + .setConnectionRequestTimeout(30000) + .build()) + .build(); + + OAuth2Client oauth2Client = new OAuth2Client( + "https://example.com/oauth2/token", + "your_client_id", + "your_private_key", + "your_certificate_thumbprint", + "your_resource_uri", + httpClient + ); + oauth2Client.publishOrDeleteFormModelJson(formModelJson, "https://example.com/api/publish", HttpPost::new); + **/ + } else { + LOG.info("[HeadlessTransportHandler] No adaptive form container found for resource {}. Skipping", resource.getPath()); + } + } + return ReplicationResult.OK; + } catch (LoginException /*| IOException */ ex) { + throw new ReplicationException("Failed to get delivery url for: " + action, ex); + } + } + + private static FormStructureParser getFormStructureParserFromPage(Resource resource) { + if (resource == null) { + LOG.info("[HeadlessTransportHandler] Resource is null. Skipping"); + return null; + } + + if (ComponentUtils.isAFContainer(resource)) { + FormStructureParser parser = resource.adaptTo(FormStructureParser.class); + if (parser != null) { + return parser; + } else { + LOG.info("[HeadlessTransportHandler] Form structure parser not found for form container resource {}. Skipping", resource.getPath()); + return null; + } + } + + for (Resource child : resource.getChildren()) { + FormStructureParser parser = getFormStructureParserFromPage(child); + if (parser != null) { + return parser; + } + } + return null; + } + + private static class NotOk extends IOException { + NotOk(int status) { + super("status code = " + status); + } + } +} diff --git a/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/OAuth2Client.java b/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/OAuth2Client.java new file mode 100644 index 0000000000..78ff020fe2 --- /dev/null +++ b/it/core/src/main/java/com/adobe/cq/forms/core/components/it/service/OAuth2Client.java @@ -0,0 +1,194 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package com.adobe.cq.forms.core.components.it.service; + +import java.io.IOException; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; +import java.util.Date; +import java.util.concurrent.locks.ReentrantLock; + +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonReader; +import java.io.StringReader; +import java.util.function.Function; + +// these bundles are not present on local cloud ready sdk +// to make this work, you have to download/install 0.11.2 from here, https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api/0.11.2 +// making the import optional +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * Uses the OAuth2 Client Credentials flow with a signed JWT (client assertion) for certificate-based authentication. + * The token request payload includes grant_type, client_id, client_assertion_type, client_assertion, and resource. + * The signed JWT includes claims such as iss, sub, aud, jti, iat, and exp. + * The JWT is signed using a private key and includes a certificate thumbprint in the header. + * + * Uses a signed JWT (client assertion) with a private key and certificate thumbprint. + * Provides enhanced security by using certificate-based authentication and a signed JWT. + */ +public class OAuth2Client { + private static final Logger LOG = LoggerFactory.getLogger(OAuth2Client.class); + + private final String tokenEndpoint; + private final String clientId; + private final String privateKey; + private final String certificateThumbprint; + private final String resource; + private final CloseableHttpClient httpClient; + + private String accessToken; + private long tokenExpirationTime; + private final ReentrantLock lock = new ReentrantLock(); + + public OAuth2Client(String tokenEndpoint, String clientId, String privateKey, String certificateThumbprint, String resource, CloseableHttpClient httpClient) { + this.tokenEndpoint = tokenEndpoint; + this.clientId = clientId; + this.privateKey = privateKey; + this.certificateThumbprint = certificateThumbprint; + this.resource = resource; + this.httpClient = httpClient; + } + + public void publishOrDeleteFormModelJson(String formModelJson, String apiEndpoint, Function<String, HttpRequestBase> requestSupplier) throws IOException { + String token = getValidToken(); + HttpRequestBase request = requestSupplier.apply(apiEndpoint); + request.setHeader("Authorization", "Bearer " + token); + request.setHeader("Content-Type", "application/json"); + if (request instanceof HttpPost) { + ((HttpPost) request).setEntity(new StringEntity(formModelJson)); + } + + try (CloseableHttpResponse response = httpClient.execute(request)) { + if (response.getStatusLine().getStatusCode() == 401) { + // Token expired, refresh and retry + token = refreshOAuth2Token(); + request.setHeader("Authorization", "Bearer " + token); + try (CloseableHttpResponse retryResponse = httpClient.execute(request)) { + if (retryResponse.getStatusLine().getStatusCode() != 200) { + throw new NotOk(retryResponse.getStatusLine().getStatusCode()); + } + } + } else if (response.getStatusLine().getStatusCode() != 200) { + throw new NotOk(response.getStatusLine().getStatusCode()); + } + } + } + + private String getValidToken() throws IOException { + lock.lock(); + try { + if (accessToken == null || System.currentTimeMillis() >= tokenExpirationTime) { + accessToken = fetchOAuth2Token(); + } + return accessToken; + } finally { + lock.unlock(); + } + } + + private String fetchOAuth2Token() throws IOException { + HttpPost post = new HttpPost(tokenEndpoint); + post.setHeader("Content-Type", "application/x-www-form-urlencoded"); + + String clientAssertion = generateClientAssertion(); + + String payload = "grant_type=client_credentials&client_id=" + clientId + "&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=" + clientAssertion + "&resource=" + resource; + + post.setEntity(new StringEntity(payload)); + + try (CloseableHttpResponse response = httpClient.execute(post)) { + if (response.getStatusLine().getStatusCode() == 200) { + String responseBody = EntityUtils.toString(response.getEntity()); + return parseToken(responseBody); + } else { + throw new NotOk(response.getStatusLine().getStatusCode()); + } + } + } + + private String refreshOAuth2Token() throws IOException { + return fetchOAuth2Token(); // Assuming the same flow for refresh token + } + + private String parseToken(String responseBody) { + try (JsonReader jsonReader = Json.createReader(new StringReader(responseBody))) { + JsonObject jsonObject = jsonReader.readObject(); + long expiresIn = jsonObject.getJsonNumber("expires_in").longValue(); + tokenExpirationTime = System.currentTimeMillis() + (expiresIn * 1000) - 60000; // 1 minute buffer + return jsonObject.getString("access_token"); + } + } + + private String generateClientAssertion() { + long nowMillis = System.currentTimeMillis(); + Date now = new Date(nowMillis); + + // Create the JWT claims + JsonObject claims = Json.createObjectBuilder() + .add("iss", clientId) + .add("sub", clientId) + .add("aud", tokenEndpoint) + .add("jti", java.util.UUID.randomUUID().toString()) + .add("iat", nowMillis / 1000) + .add("exp", (nowMillis / 1000) + 300) // 5 minutes expiration + .build(); + + // Create the JWT header + JsonObject header = Json.createObjectBuilder() + .add("alg", "RS256") + .add("x5t", certificateThumbprint) + .build(); + + // Sign the JWT + return Jwts.builder() + .setHeaderParam("x5t", certificateThumbprint) + .setClaims(claims) + .setHeaderParam("typ", "JWT") + .signWith(SignatureAlgorithm.RS256, getPrivateKey()) + .compact(); + } + + private PrivateKey getPrivateKey() { + try { + byte[] keyBytes = Base64.getDecoder().decode(privateKey); + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePrivate(spec); + } catch (Exception e) { + throw new RuntimeException("Failed to load private key", e); + } + } + + private static class NotOk extends IOException { + NotOk(int status) { + super("status code = " + status); + } + } +} \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/af-clientlibs/core-forms-components-runtime-all/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/af-clientlibs/core-forms-components-runtime-all/.content.xml index 99d071211e..0ef50cf14f 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/af-clientlibs/core-forms-components-runtime-all/.content.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/af-clientlibs/core-forms-components-runtime-all/.content.xml @@ -5,4 +5,4 @@ cssProcessor="[default:none,min:none]" jsProcessor="[default:none,min:none]" categories="[core.forms.components.runtime.all]" - embed="[core.forms.components.runtime.base,core.forms.components.container.v2.runtime,core.forms.components.datePicker.v1.runtime,core.forms.components.textinput.v1.runtime,core.forms.components.numberinput.v1.runtime,core.forms.components.panelcontainer.v1.runtime,core.forms.components.radiobutton.v1.runtime,core.forms.components.text.v1.runtime,core.forms.components.checkboxgroup.v1.runtime,core.forms.components.button.v1.runtime,core.forms.components.image.v1.runtime,core.forms.components.dropdown.v1.runtime,core.forms.components.fileinput.v3.runtime,core.forms.components.accordion.v1.runtime,core.forms.components.tabs.v1.runtime,core.forms.components.wizard.v1.runtime,core.forms.components.verticaltabs.v1.runtime,core.forms.components.recaptcha.v1.runtime,core.forms.components.checkbox.v1.runtime,core.forms.components.fragment.v1.runtime,core.forms.components.switch.v1.runtime,core.forms.components.termsandconditions.v1.runtime, core.forms.components.hcaptcha.v1.runtime]"/> + embed="[core.forms.components.runtime.base,core.forms.components.container.v2.runtime,core.forms.components.datePicker.v1.runtime,core.forms.components.textinput.v1.runtime,core.forms.components.numberinput.v1.runtime,core.forms.components.panelcontainer.v1.runtime,core.forms.components.radiobutton.v1.runtime,core.forms.components.text.v1.runtime,core.forms.components.checkboxgroup.v1.runtime,core.forms.components.button.v1.runtime,core.forms.components.image.v1.runtime,core.forms.components.dropdown.v1.runtime,core.forms.components.fileinput.v3.runtime,core.forms.components.accordion.v1.runtime,core.forms.components.tabs.v1.runtime,core.forms.components.wizard.v1.runtime,core.forms.components.verticaltabs.v1.runtime,core.forms.components.recaptcha.v1.runtime,core.forms.components.checkbox.v1.runtime,core.forms.components.fragment.v1.runtime,core.forms.components.switch.v1.runtime,core.forms.components.termsandconditions.v1.runtime, core.forms.components.hcaptcha.v1.runtime,core.forms.components.review.v1.runtime, core.forms.components.turnstile.v1.runtime]"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/commons/js/common.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/commons/js/common.js index ff44304bcf..977f8b7faa 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/commons/js/common.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/commons/js/common.js @@ -42,11 +42,13 @@ static cssClasses = { button: { disabled: "cmp-accordion__button--disabled", - expanded: "cmp-accordion__button--expanded" + expanded: "cmp-accordion__button--expanded", + stepped: "cmp-accordion__button--stepped" }, panel: { hidden: "cmp-accordion__panel--hidden", - expanded: "cmp-accordion__panel--expanded" + expanded: "cmp-accordion__panel--expanded", + stepped: "cmp-accordion__panel--stepped" } }; @@ -239,6 +241,11 @@ item.removeAttribute(this.constructor.dataAttributes.item.expanded); var button = this.getCachedButtons()[index]; var panel = this.getCachedPanels()[index]; + if (button.classList.contains(this.constructor.cssClasses.button.expanded)) { + // Only apply `stepped` class if the tab was previously expanded + button.classList.add(this.constructor.cssClasses.button.stepped); + panel.classList.add(this.constructor.cssClasses.panel.stepped); + } button.classList.remove(this.constructor.cssClasses.button.expanded); // used to fix some known screen readers issues in reading the correct state of the 'aria-expanded' attribute // e.g. https://bugs.webkit.org/show_bug.cgi?id=210934 @@ -250,8 +257,9 @@ panel.setAttribute("aria-hidden", true); } } - } + }; } + window.Forms = window.Forms || {}; window.Forms.CoreComponentsCommons = window.Forms.CoreComponentsCommons || {}; diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/site/js/accordionview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/site/js/accordionview.js index a73d45d652..4ae139799e 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/site/js/accordionview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/accordion/v1/accordion/clientlibs/site/js/accordionview.js @@ -258,6 +258,12 @@ } this.expandItem(itemDivToExpand); this.collapseAllOtherItems(itemDivToExpand.id); + + const cachedItems = this.getCachedItems(); + const newIndex = cachedItems.indexOf(itemDivToExpand); + this.getCachedButtons()[newIndex].classList.remove(this.constructor.cssClasses.button.stepped); + this.getCachedPanels()[newIndex].classList.remove(this.constructor.cssClasses.panel.stepped); + this.#showHideRepeatableButtons(childView.getInstanceManager()); } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/button/v1/button/clientlibs/site/js/buttonview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/button/v1/button/clientlibs/site/js/buttonview.js index 5f274ceaca..dc7512fc63 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/button/v1/button/clientlibs/site/js/buttonview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/button/v1/button/clientlibs/site/js/buttonview.js @@ -30,6 +30,7 @@ static selectors = { self: "[data-" + this.NS + '-is="' + this.IS + '"]', widget: `.${Button.bemBlock}__widget`, + label: `.${Button.bemBlock}__text`, description: `.${Button.bemBlock}__longdescription`, qm: `.${Button.bemBlock}__questionmark`, tooltipDiv: `.${Button.bemBlock}__shortdescription` @@ -40,7 +41,7 @@ } getLabel() { - return null; + return this.element.querySelector(Button.selectors.label); } getWidget() { diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkboxgroup/v1/checkboxgroup/clientlibs/site/js/checkboxgroupview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkboxgroup/v1/checkboxgroup/clientlibs/site/js/checkboxgroupview.js index 39c6ce71e2..ee342d89b8 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkboxgroup/v1/checkboxgroup/clientlibs/site/js/checkboxgroupview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/checkboxgroup/v1/checkboxgroup/clientlibs/site/js/checkboxgroupview.js @@ -112,10 +112,13 @@ } updateValidity(validity) { - const valid = validity.valid ? validity.valid : false; - let widgets = this.widget; - this.element.setAttribute(FormView.Constants.DATA_ATTRIBUTE_VALID, valid); - widgets.forEach(widget => widget.setAttribute(FormView.Constants.ARIA_INVALID, !valid)); + if(validity.valid === undefined) { + this.element.removeAttribute(FormView.Constants.DATA_ATTRIBUTE_VALID); + this.widget.forEach(widget => widget.removeAttribute(FormView.Constants.ARIA_INVALID)); + } else { + this.element.setAttribute(FormView.Constants.DATA_ATTRIBUTE_VALID, validity.valid); + this.widget.forEach(widget => widget.setAttribute(FormView.Constants.ARIA_INVALID, !validity.valid)); + } } updateValue(modelValue) { diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/radiobutton/v1/radiobutton/clientlibs/site/js/radiobuttonview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/radiobutton/v1/radiobutton/clientlibs/site/js/radiobuttonview.js index e58e0c1563..99f2f04f9f 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/radiobutton/v1/radiobutton/clientlibs/site/js/radiobuttonview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/radiobutton/v1/radiobutton/clientlibs/site/js/radiobuttonview.js @@ -120,10 +120,13 @@ } updateValidity(validity) { - const valid = validity.valid ? validity.valid : false; - let widgets = this.widget; - this.element.setAttribute(FormView.Constants.DATA_ATTRIBUTE_VALID, valid); - widgets.forEach(widget => widget.setAttribute(FormView.Constants.ARIA_INVALID, !valid)); + if(validity.valid === undefined) { + this.element.removeAttribute(FormView.Constants.DATA_ATTRIBUTE_VALID); + this.widget.forEach(widget => widget.removeAttribute(FormView.Constants.ARIA_INVALID)); + } else { + this.element.setAttribute(FormView.Constants.DATA_ATTRIBUTE_VALID, validity.valid); + this.widget.forEach(widget => widget.setAttribute(FormView.Constants.ARIA_INVALID, !validity.valid)); + } } updateValue(modelValue) { diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/.content.xml new file mode 100644 index 0000000000..491392d539 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/.content.xml new file mode 100644 index 0000000000..4551dc306a --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" + jcr:primaryType="nt:unstructured"> + <review/> +</jcr:root> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/.content.xml new file mode 100644 index 0000000000..40bea36bd4 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/.content.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + cq:icon="abc" + jcr:description="Add a field to review the form." + jcr:primaryType="cq:Component" + jcr:title="Adaptive Form Review (v1)" + componentGroup=".core-adaptiveform"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/README.md new file mode 100644 index 0000000000..e848248ad5 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/README.md @@ -0,0 +1,59 @@ +<!-- +Copyright 2024 Adobe + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> +Adaptive Form Review (v1) +==== +Adaptive Form Review field component written in HTL. + +## Features + +* Provides the review all Components/Panel: +* Styles + +### Use Object +The Form Review component uses the `com.adobe.cq.forms.core.components.models.form.Review` Sling Model for its Use-object. + +### Edit Dialog Properties +The following properties are written to JCR for this Form Review component and are expected to be available as `Resource` properties: + +1. `./jcr:title` - defines the label to use for this field +2. `./hideTitle` - if set to `true`, the label of this field will be hidden +3. `./name` - defines the name of the field, which will be submitted with the form data +3. `./fd:linkedPanels` - defines linked panels for reviewing the panel. If no panel is linked, the component will review the entire form. +3. `./fd:editModeAction` - defines the edit action for editing the fields, panels, field & panel, or none +## Client Libraries +The component provides a `core.forms.components.review.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. + +It also provides a `core.forms.components.review.v1.editor` editor client library category that includes +JavaScript handling for dialog interaction. It is already included by its edit dialog. + +## BEM Description +``` +BLOCK cmp-adaptiveform-review + ELEMENT cmp-adaptiveform-review__container + ELEMENT cmp-adaptiveform-review__panel + MODIFIER cmp-adaptiveform-review__panel--repeatable + ELEMENT cmp-adaptiveform-review__label-container + ELEMENT cmp-adaptiveform-review__label + ELEMENT cmp-adaptiveform-review__edit-button + ELEMENT cmp-adaptiveform-review__value + ELEMENT cmp-adaptiveform-review__field + ELEMENT cmp-adaptiveform-review__label + ELEMENT cmp-adaptiveform-review__value + ELEMENT cmp-adaptiveform-review__edit-button + ELEMENT cmp-adaptiveform-review__text + ELEMENT cmp-adaptiveform-review__label +``` \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/_cq_dialog/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/_cq_dialog/.content.xml new file mode 100644 index 0000000000..b2de838672 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/_cq_dialog/.content.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2023 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + xmlns:granite="http://www.adobe.com/jcr/granite/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="Adaptive Form Review Component" + sling:resourceType="cq/gui/components/authoring/dialog" + extraClientlibs="[core.forms.components.review.v1.editor]" + helpPath="https://www.adobe.com/go/aem_af_cmp_review_v1" + trackingFeature="core-components:adaptiveform-review:v1"> + <content + granite:class="cmp-adaptiveform-review__editdialog" + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <tabs + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/tabs" + maximized="{Boolean}true"> + <items jcr:primaryType="nt:unstructured"> + <basic + jcr:primaryType="nt:unstructured" + jcr:title="Basic" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <columns + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns" + margin="{Boolean}true"> + <items jcr:primaryType="nt:unstructured"> + <column + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <name + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/textfield" + fieldLabel="Name" + name="./name" + required="{Boolean}true"> + <granite:data + jcr:primaryType="nt:unstructured" + node-name-validation="" /> + </name> + <title + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/textfield" + fieldLabel="Title" + name="./jcr:title" /> + <hideTitle + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/checkbox" + name="./hideTitle" + text="Hide title" + uncheckedValue="false" + value="true" /> + <editModeAction + jcr:primaryType="nt:unstructured" + sling:orderBefore="customText" + sling:resourceType="granite/ui/components/coral/foundation/form/select" + granite:class="cmp-adaptiveform-review__editaction" + fieldLabel="Enable edit mode actions for" + name="./fd:editModeAction" + value="field"> + <items jcr:primaryType="nt:unstructured"> + <field + jcr:primaryType="nt:unstructured" + text="Field" + value="field" /> + <panel + jcr:primaryType="nt:unstructured" + text="Panel" + value="panel" /> + <both + jcr:primaryType="nt:unstructured" + text="Panel and Field" + value="both" /> + <none + jcr:primaryType="nt:unstructured" + text="None" + value="none" /> + </items> + </editModeAction> + <linkedPanels + jcr:primaryType="nt:unstructured" + granite:class="cmp-adaptiveform-review__linkedPanels" + sling:resourceType="granite/ui/components/coral/foundation/form/select" + emptyText="Select" + fieldLabel="Link panels" + multiple="true" + value="string[]" + name="./fd:linkedPanels" + > + <datasource + jcr:primaryType="nt:unstructured" + sling:resourceType="core/fd/components/form/review/v1/datasource" + type="preSelectedLinkedPanels" /> + </linkedPanels> + </items> + </column> + </items> + </columns> + </items> + </basic> + </items> + </tabs> + </items> + </content> +</jcr:root> \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/_cq_template.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/_cq_template.xml new file mode 100644 index 0000000000..5c1a29ae2e --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/_cq_template.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="Review" + fieldType="plain-text"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/.content.xml new file mode 100644 index 0000000000..491392d539 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/.content.xml new file mode 100644 index 0000000000..5279ed95aa --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="cq:ClientLibraryFolder" + categories="[core.forms.components.review.v1.runtime]" + dependencies="[core.forms.components.runtime.base]"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/css.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/css.txt new file mode 100644 index 0000000000..1b9eacb50e --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/css.txt @@ -0,0 +1,18 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=css +reviewview.css diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/css/reviewview.css b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/css/reviewview.css new file mode 100644 index 0000000000..cbb445de86 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/css/reviewview.css @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + + .cmp-adaptiveform-review { + + } + .cmp-adaptiveform-review__container { + } + .cmp-adaptiveform-review__panel{ + } + .cmp-adaptiveform-review__label-container{ + } + + .cmp-adaptiveform-review__field{ + } + .cmp-adaptiveform-review__label{ + } + .cmp-adaptiveform-review__value{ + } + .cmp-adaptiveform-review__edit-button{ + } \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/js.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/js.txt new file mode 100644 index 0000000000..9cdd050115 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/js.txt @@ -0,0 +1,18 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=js +reviewview.js diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/js/reviewview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/js/reviewview.js new file mode 100644 index 0000000000..2e12c323bb --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/clientlibs/site/js/reviewview.js @@ -0,0 +1,333 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +(function () { + + "use strict"; + class Review extends FormView.FormFieldBase { + + static NS = FormView.Constants.NS; + /** + * Each FormField has a data attribute class that is prefixed along with the global namespace to + * distinguish between them. If a component wants to put a data-attribute X, the attribute in HTML would be + * data-{NS}-{IS}-x="" + * @type {string} + */ + static IS = "adaptiveFormReview"; + static bemBlock = 'cmp-adaptiveform-review'; + static templateAttribute = 'data-cmp-review'; + static DATA_ATTRIBUTE_VISIBLE = 'data-cmp-visible'; + static FIELD_TYPE = FormView.Constants.FIELD_TYPE; + static HIDE_FIELD_FROM_REVIEW = [Review.FIELD_TYPE.BUTTON, Review.FIELD_TYPE.PLAIN_TEXT, Review.FIELD_TYPE.CAPTCHA, Review.FIELD_TYPE.IMAGE]; + static panelModifier = '__panel--repeatable'; + static fieldModifier = '__field--'; + static selectors = { + self: "[data-" + this.NS + '-is="' + this.IS + '"]', + container: `.${Review.bemBlock}__container`, + templates: "template[data-cmp-review-fieldType]", + label: '[' + Review.templateAttribute + '-label]', + value: '[' + Review.templateAttribute + '-value]', + editButton:'[' + Review.templateAttribute + '-editButton]', + fieldId: Review.templateAttribute + '-fieldId', + fieldType: Review.templateAttribute + '-fieldType', + panelContent:'[' + Review.templateAttribute + '-content]', + labelContainer: `.${Review.bemBlock}__label-container`, + intersection: Review.templateAttribute + "-intersection=" + }; + static intersectionOptions = { + root: null, + rootMargin: "0px", + threshold: Review.buildThresholdList(), + }; + static buildThresholdList() { + let thresholds = []; + let numSteps = 20; + for (let i = 1.0; i <= numSteps; i++) { + thresholds.push(i / numSteps); + } + thresholds.push(0); + return thresholds; + } + + static sanitizedValue(value, options) { + if(options){ + return window.DOMPurify ? window.DOMPurify.sanitize(value, options) : value; + } + return window.DOMPurify ? window.DOMPurify.sanitize(value) : value; + } + + static hasChild(element) { + return element && element.children && element.children.length; + } + + static addClassModifier(element, item) { + if(item.fieldType !== Review.FIELD_TYPE.PANEL){ + element.querySelector('div').classList.add(Review.bemBlock + Review.fieldModifier + item.fieldType); + } + if(item.repeatable){ + element.querySelector('div').classList.add(Review.bemBlock + Review.panelModifier); + } + if(item.name){ + element.querySelector('div').classList.add(item.name); + } + } + + static renderLabel(element, item) { + const label = element.querySelector(Review.selectors.label); + label.innerHTML = item.fieldType === Review.FIELD_TYPE.PLAIN_TEXT ? Review.sanitizedValue(item.value) : Review.sanitizedValue(item?.label?.value, {ALLOWED_TAGS: [] }); + if (item.required) { + label.setAttribute('data-cmp-required', item.required); + } + } + + static renderValue(element, item) { + const value = element.querySelector(Review.selectors.value); + if (value) { + const plainText = Review.getValue(item, item.value) || ''; + value.innerHTML = Review.sanitizedValue(plainText); + } + } + + static addAccessibilityAttributes(element, item) { + const container = element.querySelector('div'); + const label = element.querySelector(Review.selectors.label); + const value = element.querySelector(Review.selectors.value); + const editButton = element.querySelector(Review.selectors.editButton); + const id = `${item.id}-review-label`; + if(label){ + label.setAttribute('id', id); + container.setAttribute('role', 'region'); + container.setAttribute('aria-labelledby', id); + } + if(value){ + value.setAttribute('aria-labelledby', id); + } + if(editButton && editButton.getAttribute(Review.DATA_ATTRIBUTE_VISIBLE) === 'true'){ + editButton.setAttribute('aria-describedby', id); + } + } + + static isRepeatable(item) { + return item.fieldType === Review.FIELD_TYPE.PANEL && item.type === 'array' + } + + /* return value of the field, if value is array then return comma separated string and + if value is file then return file name + */ + static getValue(item, value) { + if (value === undefined || value === null) return ''; + if (item.fieldType === Review.FIELD_TYPE.FILE_INPUT) { + return Array.isArray(value) ? value.filter(file => file && file.name).map(file => file.name).join(', ') : (value.name || ''); + } + if (Array.isArray(item.enumNames)) { + const values = Array.isArray(value) ? value : [value]; + return values.reduce((names, val) => { + const index = item.enum.indexOf(val); + if (index >= 0) { + names.push(item.enumNames[index]); + } + return names; + }, []).join(', '); + } + if (Array.isArray(value)) { + return value.join(', '); + } + return value; + } + + constructor(params) { + super(params); + this.#attachIntersectionObserver(); + this.#attachClickEventOnEdit(); + this.#setFieldTemplateMapping(); + } + getContainer() { + return this.element.querySelector(Review.selectors.container); + } + getTemplates() { + return this.element.querySelectorAll(Review.selectors.templates); + } + getIntersectionElement() { + return this.element.querySelector("[" + Review.selectors.intersection + this.id + "]"); + } + getWidget() { return null } + getDescription() { return null; } + getLabel() { return null; } + getErrorDiv() { return null; } + getTooltipDiv() { return null; } + getQuestionMarkDiv() { return null; } + setModel(model) { + super.setModel(model); + } + + // attach intersection observer to the review container for lazy loading + #attachIntersectionObserver() { + let observer = new IntersectionObserver(this.#intersectionObserverHandler.bind(this), Review.intersectionOptions); + const ele = this.getIntersectionElement(); + if(ele){ + observer.observe(ele); + } + } + + // attach click event on edit button to set focus on the field + #attachClickEventOnEdit() { + this.getContainer().addEventListener('click', this.#clickHandler.bind(this)) + } + + // create template mapping based on field type and use it to render review fields + #setFieldTemplateMapping() { + const templates = this.getTemplates(); + let mappings = {}; + templates.forEach(template => { + const type = template.getAttribute(Review.selectors.fieldType); + mappings[type || 'default'] = template; + }); + this.templateMappings = mappings; + } + + // click handler to set focus on the field when use click on edit button + #clickHandler(event) { + if (event?.target?.nodeName === 'BUTTON') { + const id = event.target.getAttribute(Review.selectors.fieldId); + const form = this.formContainer.getModel();; + const field = this.formContainer.getField(id); + if (form && field) { + form.setFocus(field._model); + } + } + } + + // if review container is in view port then render review fields + #intersectionObserverHandler(entries) { + entries.forEach(entry => { + if (entry.isIntersecting && this._model) { + const panels = this.#getPanels(); + const reviewContainer = this.getContainer(); + const children = this.#renderReviewFields(panels); + reviewContainer.innerHTML = ''; + reviewContainer.appendChild(children); + } + }) + } + + // iterate over all the panels or linked panels and render child of each panel + #renderReviewFields(items) { + if (!items) return; + const currentFragment = document.createDocumentFragment(); + items.filter(item => item.visible !== false && item.fieldType && item[':type']).forEach(item => { + if (Review.isRepeatable(item)) { + const repeatableItems = this.getModel().form.getElement(item.id).getState(); + const repeatablePanel = this.#renderReviewFields(repeatableItems.items); + if (Review.hasChild(repeatablePanel)) { + currentFragment.appendChild(repeatablePanel); + } + } else { + let template = this.templateMappings[item.fieldType] || this.templateMappings['default']; + const cloneNode = template.content.cloneNode(true); + Review.addClassModifier(cloneNode, item); + Review.renderLabel(cloneNode, item); + this.#renderEditButton(cloneNode, item); + if (item.fieldType === Review.FIELD_TYPE.PANEL) { + const fields = this.#renderReviewFields(item.items); + if (Review.hasChild(fields)) { + const labelContainer = cloneNode.querySelector(Review.selectors.labelContainer); + if(item?.label?.visible === false && labelContainer){ + labelContainer.remove(); + } + Review.addAccessibilityAttributes(cloneNode, item); + const contentElement = cloneNode.querySelector(Review.selectors.panelContent); + if(contentElement){ + contentElement.appendChild(fields); + } + currentFragment.appendChild(cloneNode); + } + } else if (!Review.HIDE_FIELD_FROM_REVIEW.includes(item.fieldType) && !item[':type'].endsWith('review')) { + Review.renderValue(cloneNode, item); + Review.addAccessibilityAttributes(cloneNode, item); + currentFragment.appendChild(cloneNode); + } + } + }); + return currentFragment; + } + + #getPanels() { + const linkedPanels = this.getModel().properties["fd:linkedPanels"] || []; + if (linkedPanels.length) { + return this.#getLinkedPanels([...linkedPanels]); + } + return this.#getAllPanels(); + } + + // return all top lavel panels if author has not linked any panel + #getAllPanels() { + let state = this.getModel().form.getState(); + while (state?.items?.length === 1) { + state = state.items[0]; + } + return state.items || []; + } + + // return linked panels if author has linked any panel + #getLinkedPanels(linkedPanels) { + let queue = [], result = []; + let state = this.getModel().form.getState(); + queue.push(state); + while (queue.length && linkedPanels.length) { + const items = Array.isArray(queue[0]) ? queue[0] : [queue[0]]; + items.forEach(item => { + const index = linkedPanels.indexOf(item.name); + if (index > -1) { + result.push(item); + linkedPanels.splice(index, 1); + } + if (item.items) { + queue.push(item.items); + } + }) + queue.shift(); + } + return result; + } + + // render edit button of the field + #renderEditButton(cloneNode, item) { + const editButton = cloneNode.querySelector(Review.selectors.editButton); + if (editButton) { + editButton.setAttribute(Review.selectors.fieldId, item.id); + editButton.setAttribute('aria-label', item?.label?.value); + if (item.enabled === false) { + editButton.setAttribute('disabled', true); + } + editButton.setAttribute(Review.DATA_ATTRIBUTE_VISIBLE, this.#isVisibleEditButton(item.fieldType)); + } + } + #isVisibleEditButton(fieldType) { + let editModeAction = this.getModel().properties?.['fd:editModeAction']; + if (editModeAction === 'both' || + (editModeAction === Review.FIELD_TYPE.PANEL && fieldType === Review.FIELD_TYPE.PANEL) || + (editModeAction === 'field' && fieldType !== Review.FIELD_TYPE.PANEL)) { + return true; + } + return false; + } + } + + FormView.Utils.setupField(({ element, formContainer }) => { + return new Review({ element, formContainer }) + }, Review.selectors.self); + +})(); diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/review.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/review.html new file mode 100644 index 0000000000..0c23c5762b --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/review.html @@ -0,0 +1,50 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> + +<sly data-sly-use.review="com.adobe.cq.forms.core.components.models.form.Review" data-sly-use.renderer="${'review.js'}" + data-sly-use.clientlib="${'/libs/granite/sightly/templates/clientlib.html'}" + data-sly-use.label="${renderer.labelPath}" data-sly-use.shortDescription="${renderer.shortDescriptionPath}" + data-sly-use.longDescription="${renderer.longDescriptionPath}" + data-sly-use.errorMessage="${renderer.errorMessagePath}" + data-sly-use.questionMark="${renderer.questionMarkPath}" + data-sly-use.fieldTemplate="${renderer.fieldTemplatePath}" + data-sly-use.panelTemplate="${renderer.panelTemplatePath}" + data-sly-use.plainTextTemplate="${renderer.plainTextTemplatePath}" + data-sly-use.templates="core/wcm/components/commons/v1/templates.html"> +</sly> +<div data-sly-use.formstructparser="com.adobe.cq.forms.core.components.models.form.FormStructureParser" + class="cmp-adaptiveform-review" + data-cmp-is="adaptiveFormReview" + data-cmp-visible="${review.visible ? 'true' : 'false'}" + data-cmp-enabled="${review.enabled ? 'true' : 'false'}" + id="${review.id}" + data-cmp-adaptiveformcontainer-path="${formstructparser.formContainerPath}"> + + <div data-cmp-review-intersection="${review.id}"></div> + <div class="cmp-adaptiveform-review__container"></div> + + <template data-cmp-review-fieldType="default"> + <div data-sly-call="${fieldTemplate.fieldTemplate @bemBlock='cmp-adaptiveform-review'}" data-sly-unwrap></div> + </template> + <template data-cmp-review-fieldType="panel"> + <div data-sly-call="${panelTemplate.panelTemplate @bemBlock='cmp-adaptiveform-review'}" data-sly-unwrap></div> + </template> + <template data-cmp-review-fieldType="plain-text"> + <div data-sly-call="${plainTextTemplate.plainTextTemplate @bemBlock='cmp-adaptiveform-review'}" data-sly-unwrap></div> + </template> + +</div> +<sly data-sly-call="${templates.placeholder @ isEmpty = true}"></sly> \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/review.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/review.js new file mode 100644 index 0000000000..e14853be36 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/review.js @@ -0,0 +1,40 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +use(function () { + + var clientlibsArr = ['core.forms.components.base.v1.editor']; + var labelPath = 'core/fd/components/af-commons/v1/fieldTemplates/label.html'; + var shortDescriptionPath = "core/fd/components/af-commons/v1/fieldTemplates/shortDescription.html"; + var longDescriptionPath = "core/fd/components/af-commons/v1/fieldTemplates/longDescription.html"; + var questionMarkPath = "core/fd/components/af-commons/v1/fieldTemplates/questionMark.html" + var errorMessagePath = "core/fd/components/af-commons/v1/fieldTemplates/errorMessage.html"; + var fieldTemplatePath = "core/fd/components/form/review/v1/review/template/fieldTemplate.html"; + var panelTemplatePath = "core/fd/components/form/review/v1/review/template/panelTemplate.html"; + var plainTextTemplatePath = "core/fd/components/form/review/v1/review/template/plainTextTemplate.html"; + + return { + labelPath: labelPath, + shortDescriptionPath: shortDescriptionPath, + longDescriptionPath: longDescriptionPath, + questionMarkPath: questionMarkPath, + errorMessagePath: errorMessagePath, + clientlibs: clientlibsArr, + fieldTemplatePath: fieldTemplatePath, + panelTemplatePath: panelTemplatePath, + plainTextTemplatePath: plainTextTemplatePath + } +}); \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/fieldTemplate.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/fieldTemplate.html new file mode 100644 index 0000000000..35ce3308e2 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/fieldTemplate.html @@ -0,0 +1,23 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> + +<template data-sly-template.fieldTemplate="${@ bemBlock}"> + <div class="${bemBlock}__field"> + <div class="${bemBlock}__label" data-cmp-review-label></div> + <div class="${bemBlock}__value" data-cmp-review-value></div> + <button class="${bemBlock}__edit-button" data-cmp-review-editButton type="button"></button> + </div> +</template> \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/panelTemplate.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/panelTemplate.html new file mode 100644 index 0000000000..c8ec2e4e33 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/panelTemplate.html @@ -0,0 +1,25 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> + +<template data-sly-template.panelTemplate="${@ bemBlock}"> + <div class="${bemBlock}__panel"> + <div class="${bemBlock}__label-container"> + <div class="${bemBlock}__label" data-cmp-review-label></div> + <button class="${bemBlock}__edit-button" data-cmp-review-editButton type="button"></button> + </div> + <div class="${bemBlock}__content" data-cmp-review-content></div> + </div> +</template> \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/plainTextTemplate.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/plainTextTemplate.html new file mode 100644 index 0000000000..6b9fb16fa7 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/review/v1/review/template/plainTextTemplate.html @@ -0,0 +1,21 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> + +<template data-sly-template.plainTextTemplate="${@ bemBlock}"> + <div class="${bemBlock}__text"> + <div class="${bemBlock}__label" data-cmp-review-label></div> + </div> +</template> \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/README.md index 34f4f2afc0..95c3bffba8 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/README.md +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/README.md @@ -50,6 +50,7 @@ BLOCK cmp-tabs ELEMENT cmp-tabs__tablist ELEMENT cmp-tabs__tab MOD cmp-tabs__tab--active + MOD cmp-tabs__tab--stepped ELEMENT cmp-tabs__title ELEMENT cmp-tabs__icon ELEMENT cmp-tabs__label diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/clientlibs/site/js/tabs.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/clientlibs/site/js/tabs.js index 4dd738e70b..1489af4264 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/clientlibs/site/js/tabs.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/tabsontop/v1/tabsontop/clientlibs/site/js/tabs.js @@ -27,6 +27,10 @@ tab: "cmp-tabs__tab--active", tabpanel: "cmp-tabs__tabpanel--active" }, + stepped: { + tab: "cmp-tabs__tab--stepped", + tabpanel: "cmp-tabs__tabpanel--stepped" + }, label: `.${Tabs.bemBlock}__label`, description: `.${Tabs.bemBlock}__longdescription`, qm: `.${Tabs.bemBlock}__questionmark`, diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/.content.xml new file mode 100644 index 0000000000..491392d539 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/.content.xml new file mode 100644 index 0000000000..5e25fbe65e --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/.content.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" + jcr:primaryType="nt:unstructured"> +</jcr:root> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/.content.xml new file mode 100644 index 0000000000..9af5bb2a03 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/.content.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0" + cq:icon="shield" + jcr:description="Add CAPTCHA validation using turnstile service" + jcr:primaryType="cq:Component" + jcr:title="Adaptive Form Cloudflare® Turnstile (v1)" + sling:resourceSuperType="core/fd/components/form/recaptcha/v1/recaptcha" + componentGroup=".core-adaptiveform"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/README.md new file mode 100644 index 0000000000..e5fe2ab00f --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/README.md @@ -0,0 +1,71 @@ +<!-- +Copyright 2024 Adobe + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> +Adaptive Form Turnstile (v1) +==== +Adaptive Form Cloudflare Turnstile field component written in HTL. + +## Features + +* Provides the following type of input: + * Turnstile +* The following widgets are supported for Turnstile: + * Managed + * Non-Interactive + * Invisible +* Styles +* Custom constraint messages for the above types + +### Use Object +The Form Text component uses the `com.adobe.cq.forms.core.components.models.form.Turnstile` Sling Model for its Use-object. + +### Edit Dialog Properties +The following properties are written to JCR for this Form Recaptcha component and are expected to be available as `Resource` properties: + +1. `./jcr:title` - defines the label to use for this field +2. `./hideTitle` - if set to `true`, the label of this field will be hidden +3. `./name` - defines the name of the field, which will be submitted with the form data +4. `./mandatoryMessage` - defines the message displayed as tooltip when submitting the form if the value is left empty +5. `./cloudServicePath` - defines the path of cloud configuration resource for Turnstile +6. `./size` - defines the size attribute of Turnstile + +## Client Libraries +The component provides a `core.forms.components.turnstile.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. + + +## BEM Description +``` +BLOCK cmp-adaptiveform-turnstile + ELEMENT cmp-adaptiveform-turnstile__label + ELEMENT cmp-adaptiveform-turnstile__widget + ELEMENT cmp-adaptiveform-turnstile__errormessage +``` + +## JavaScript Data Attribute Bindings + +The following attributes must be added for the initialization of the hCaptcha component in the form view: +1. `data-cmp-is="adaptiveFormTurnstile"` +2. `data-cmp-adaptiveformcontainer-path="${formstructparser.formContainerPath}"` + + + +The following are optional attributes that can be added to the component in the form view: +1. `data-cmp-valid` having a boolean value to indicate whether the field is currently valid or not +2. `data-cmp-required` having a boolean value to indicate whether the field is currently required or not +3. `data-cmp-readonly` having a boolean value to indicate whether the field is currently readonly or not +4. `data-cmp-active` having a boolean value to indicate whether the field is currently active or not +5. `data-cmp-visible` having a boolean value to indicate whether the field is currently visible or not +6. `data-cmp-enabled` having a boolean value to indicate whether the field is currently enabled or not diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/_cq_dialog/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/_cq_dialog/.content.xml new file mode 100644 index 0000000000..5f51f816fa --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/_cq_dialog/.content.xml @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:granite="http://www.adobe.com/jcr/granite/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="Adaptive Form Cloudflare Turnstile" + sling:resourceType="cq/gui/components/authoring/dialog" + extraClientlibs="[core.forms.components.turnstile.v1.editor]" + helpPath="https://www.adobe.com/go/aem_af_cmp_textinput_v1" + trackingFeature="core-components:adaptiveform-turnstile:v1"> + <content + granite:class="cmp-adaptiveform-turnstile__editdialog" + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <tabs + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/tabs" + maximized="{Boolean}true"> + <items jcr:primaryType="nt:unstructured"> + <basic + jcr:primaryType="nt:unstructured" + jcr:title="Basic" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <columns + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns" + margin="{Boolean}true"> + <items jcr:primaryType="nt:unstructured"> + <column + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <placeholder + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <bindref + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <dorBindref + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <unboundFormElement + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <readonly + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <visible + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <enabled + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + <configuration + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/select" + fieldLabel="Configuration Settings" + emptyText="Select CAPTCHA Configuration" + sling:orderBefore="visible" + required="{Boolean}true" + name="./cloudServicePath" + granite:class="cmp-adaptiveform-turnstile__configuration"> + <datasource + jcr:primaryType="nt:unstructured" + sling:resourceType="fd/af/components/commons/datasources/propertyprovider" + type="turnstileCloudServiceConfiguration"/> + </configuration> + <size + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/radiogroup" + fieldDescription="Represents data-size attribute of turnstile (https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#widget-size)" + fieldLabel="Type" + sling:orderBefore="visible" + name="./size" + text="Captcha Size" + granite:class="cmp-adaptiveform-turnstile__size"> + <items jcr:primaryType="nt:unstructured"> + <normal + jcr:primaryType="nt:unstructured" + checked="{Boolean}true" + text="Normal" + value="normal"/> + <compact + jcr:primaryType="nt:unstructured" + text="Compact" + value="compact"/> + </items> + </size> + </items> + </column> + </items> + </columns> + </items> + </basic> + <validation + jcr:primaryType="nt:unstructured" + jcr:title="Validation" + margin="{Boolean}true" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <columns + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns" + margin="{Boolean}true"> + <items jcr:primaryType="nt:unstructured"> + <column + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/container"> + <items jcr:primaryType="nt:unstructured"> + <required + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/checkbox" + checked="{Boolean}true" + fieldLabel="Required" + sling:hideResource="{Boolean}true" + labelledBy="Mandatory" + name="./required" + granite:class="cmp-adaptiveform-base__required" + text="Required" + value="true"> + </required> + <mandatoryMessage + jcr:primaryType="nt:unstructured" + sling:resourceType="granite/ui/components/coral/foundation/form/textarea" + fieldDescription="Error message shown when required field is left empty." + granite:class="cmp-adaptiveform-base__mandatorymessage" + fieldLabel="Error message" + name="./mandatoryMessage"/> + <validateExpMessage + jcr:primaryType="nt:unstructured" + sling:hideResource="true"/> + </items> + </column> + </items> + </columns> + </items> + </validation> + <patterns + jcr:primaryType="nt:unstructured" + jcr:title="Patterns" + sling:hideResource="{Boolean}true" + sling:resourceType="granite/ui/components/coral/foundation/container"/> + <help + jcr:primaryType="nt:unstructured" + jcr:title="Help Content" + sling:hideResource="{Boolean}true" + sling:resourceType="granite/ui/components/coral/foundation/container"/> + <accessibility + jcr:primaryType="nt:unstructured" + jcr:title="Accessibility" + sling:hideResource="{Boolean}true" + sling:resourceType="granite/ui/components/coral/foundation/container"/> + </items> + </tabs> + </items> + </content> +</jcr:root> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/_cq_template.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/_cq_template.xml new file mode 100644 index 0000000000..6e03b7d2d3 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/_cq_template.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" + jcr:primaryType="nt:unstructured" + jcr:title="TURNSTILE" + required="{Boolean}true" + fieldType="captcha"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/.content.xml new file mode 100644 index 0000000000..491392d539 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/.content.xml @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="sling:Folder"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/.content.xml new file mode 100644 index 0000000000..9370b2d52c --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/.content.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="cq:ClientLibraryFolder" + categories="[core.forms.components.turnstile.v1.editor]" + dependencies="[core.forms.components.base.v1.editor, core.forms.components.commons.v1.editor.utils]"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/js.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/js.txt new file mode 100644 index 0000000000..dd642eaed7 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/js.txt @@ -0,0 +1,18 @@ +############################################################################### +# Copyright 2022 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=js +editDialog.js \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/js/editDialog.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/js/editDialog.js new file mode 100644 index 0000000000..8c2817de3d --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/editor/js/editDialog.js @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +(function($) { + "use strict"; + + var EDIT_DIALOG = ".cmp-adaptiveform-turnstile__editdialog", + TURNSTILE_CONFIG = EDIT_DIALOG + " .cmp-adaptiveform-turnstile__configuration", + TURNSTILE_SIZE = EDIT_DIALOG + " .cmp-adaptiveform-turnstile__size", + Utils = window.CQ.FormsCoreComponents.Utils.v1; + + + function addListenerForCaptchaConfigChange(dialog) { + const turnstileConfigElement = dialog.find(TURNSTILE_CONFIG)[0]; + turnstileConfigElement.addEventListener("change", function() { + handleCaptchaConfigChange(turnstileConfigElement, dialog); + }); + handleCaptchaConfigChange(turnstileConfigElement, dialog); + } + + function handleCaptchaConfigChange(turnstileConfigElement, dialog) { + const turnstileSizeElement = dialog.find(TURNSTILE_SIZE)[0]; + const selectedConfig = turnstileConfigElement.querySelector("coral-select-item[selected]"); + const selectedWidgetType = selectedConfig.getAttribute("data-widget.type"); + const inputs = turnstileSizeElement.querySelectorAll('input'); + if (selectedWidgetType === "invisible") { + inputs.forEach(input => input.setAttribute("disabled", true)); + } else { + inputs.forEach(input => input.removeAttribute("disabled")); + } + } + + Utils.initializeEditDialog(EDIT_DIALOG)(addListenerForCaptchaConfigChange); + +})(jQuery); diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/.content.xml new file mode 100644 index 0000000000..0ace1e4531 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/.content.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" + jcr:primaryType="cq:ClientLibraryFolder" + allowProxy="{Boolean}true" + categories="[core.forms.components.turnstile.v1.runtime]" + dependencies="[core.forms.components.runtime.base]"/> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/css.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/css.txt new file mode 100644 index 0000000000..b2a208dac5 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/css.txt @@ -0,0 +1,18 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=css +turnstileview.css diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/css/turnstileview.css b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/css/turnstileview.css new file mode 100644 index 0000000000..941298eba2 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/css/turnstileview.css @@ -0,0 +1,19 @@ +/** +## BEM Description +BLOCK cmp-adaptiveform-turnstile + ELEMENT cmp-adaptiveform-turnstile__label + ELEMENT cmp-adaptiveform-turnstile__widget + ELEMENT cmp-adaptiveform-turnstile__errormessage +*/ + +.cmp-adaptiveform-turnstile { + +} + +.cmp-adaptiveform-turnstile__widget { + +} + +.cmp-adaptiveform-turnstile__label { + +} diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js.txt new file mode 100644 index 0000000000..fff80d07dd --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js.txt @@ -0,0 +1,19 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=js +turnstileview.js +turnstilewidget.js diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js/turnstileview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js/turnstileview.js new file mode 100644 index 0000000000..87d65a0d1c --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js/turnstileview.js @@ -0,0 +1,85 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +(function() { + + "use strict"; + class Turnstile extends FormView.FormFieldBase { + + static NS = FormView.Constants.NS; + static IS = "adaptiveFormTurnstile"; + static bemBlock = 'cmp-adaptiveform-turnstile'; + static selectors = { + self: "[data-" + this.NS + '-is="' + this.IS + '"]', + widget: `.${Turnstile.bemBlock}__widget`, + label: `.${Turnstile.bemBlock}__label`, + errorDiv: `.${Turnstile.bemBlock}__errormessage` + }; + + constructor(params) { + super(params); + } + + getWidget() { + return this.element.querySelector(Turnstile.selectors.widget); + } + + getDescription() { + return null; + } + + getLabel() { + return this.element.querySelector(Turnstile.selectors.label); + } + + getTooltipDiv() { + return null; + } + + getErrorDiv() { + return this.element.querySelector(Turnstile.selectors.errorDiv); + } + + getQuestionMarkDiv() { + return null; + } + + initializeWidget() { + this.widgetObject = new TurnstileWidget(this, this._model, this.getWidget()); + this.getWidget().addEventListener('blur', (e) => { + if(this.element) { + this.setInactive(); + } + }); + + } + + setModel(model) { + super.setModel(model); + if (this.widgetObject == null) { + this.initializeWidget(); + } else { + if (this.widget.value !== '') { + this._model.dispatch(new FormView.Actions.UIChange({'value': this.widget.value})); + } + } + } + } + + FormView.Utils.setupField(({element, formContainer}) => { + return new Turnstile({element, formContainer}) + }, Turnstile.selectors.self); + +})(); diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js/turnstilewidget.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js/turnstilewidget.js new file mode 100644 index 0000000000..d9ccf2ce0e --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/clientlibs/site/js/turnstilewidget.js @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +/** + * This class is responsible for interacting with the turnstile widget. It displays turnstile challenge. + */ + +if (typeof window.TurnstileWidget === 'undefined') { + window.TurnstileWidget = class { + #widget = null + #model = null // passed by reference + #options = null + #lang = 'en' + static FD_CAPTCHA = "fd:captcha"; + + constructor(view, model, widget) { + // initialize the widget and model + this.#widget = widget; + this.#model = model; + this.#widget = document.createElement("div"); + this.#widget.classList.add("cmp-adaptiveform-turnstile__widget"); + this.#lang = view.formContainer.getModel().lang; + + //Always inserting it in body + document.body.appendChild(this.#widget); + this.#options = Object.assign({}, this.#model._jsonModel); + + this.#renderTurnstile(widget); + } + + #renderTurnstile(turnstileContainer) { + + const self = this; + const turnstileConfigData = this.#options; + let widgetId; + const url = turnstileConfigData.properties[TurnstileWidget.FD_CAPTCHA].config.uri; + + const successCallback = function(response) { + self.setCaptchaModel(response); + }; + + const expiredCallback = function() { + turnstile.reset(widgetId); + self.setCaptchaModel(""); + }; + + const onloadCallbackInternal = function() { + widgetId = turnstile.render( + turnstileContainer, + turnstileParameters + ); + return widgetId; + }; + + const turnstileParameters = { + 'sitekey': this.#model.captchaSiteKey, + 'size': turnstileConfigData.properties[TurnstileWidget.FD_CAPTCHA].config.size, + 'theme': turnstileConfigData.properties[TurnstileWidget.FD_CAPTCHA].config.theme || 'light', + 'callback': successCallback, + 'expired-callback': expiredCallback, + 'language': this.#lang + }; + + window.onloadTurnstileCallback = onloadCallbackInternal; + const scr = document.createElement('script'); + const queryParams = (this.#model.captchaDisplayMode === 'invisible') + ? "?render=explicit" + : "?onload=onloadTurnstileCallback&render=explicit"; + scr.src = url + queryParams; + scr.async = true; + turnstileContainer.appendChild(scr); + } + + setCaptchaModel(response) { + this.#model.dispatch(new FormView.Actions.UIChange({'value': response})); + } + } +} diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/turnstile.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/turnstile.html new file mode 100644 index 0000000000..af12e42f7e --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/turnstile/v1/turnstile/turnstile.html @@ -0,0 +1,42 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> +<sly data-sly-use.renderer="${'recaptcha.js'}" + data-sly-use.clientlib="${'/libs/granite/sightly/templates/clientlib.html'}" + data-sly-use.label="${renderer.labelPath}" + data-sly-use.shortDescription="${renderer.shortDescriptionPath}" + data-sly-use.longDescription="${renderer.longDescriptionPath}" + data-sly-use.errorMessage="${renderer.errorMessagePath}" + data-sly-use.questionMark="${renderer.questionMarkPath}"></sly> + +<div class="cmp-adaptiveform-turnstile" + data-cmp-is="adaptiveFormTurnstile" + id="${turnstile.id}" + data-sly-use.formstructparser="com.adobe.cq.forms.core.components.models.form.FormStructureParser" + data-sly-use.turnstile="com.adobe.cq.forms.core.components.models.form.Turnstile" + data-sly-use.component="com.adobe.cq.wcm.core.components.models.Component" + data-cmp-visible="${turnstile.visible ? 'true' : 'false'}" + data-cmp-enabled="${turnstile.enabled ? 'true' : 'false'}" + data-cmp-required="${turnstile.required ? 'true': 'false'}" + data-cmp-readonly="${turnstile.readOnly ? 'true' : 'false'}" + data-cmp-adaptiveformcontainer-path="${formstructparser.formContainerPath}"> + <div data-sly-call="${label.label @componentId=component.id, labelValue=turnstile.label.value, labelVisible=turnstile.label.visible, bemBlock='cmp-adaptiveform-turnstile'}" data-sly-unwrap></div> + + <div class="cmp-adaptiveform-turnstile__widget" + name="${turnstile.name}"></div> + <div data-sly-test="${turnstile && turnstile.captchaDisplayMode && turnstile.captchaDisplayMode != 'invisible'}"> + <div data-sly-call="${errorMessage.errorMessage @componentId=turnstile.id, bemBlock='cmp-adaptiveform-turnstile'}" data-sly-unwrap></div> + </div> +</div> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/README.md index d616724e0c..8a5f4638b9 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/README.md +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/README.md @@ -48,6 +48,7 @@ BLOCK cmp-verticaltabs ELEMENT cmp-verticaltabs__label-container ELEMENT cmp-verticaltabs__tab MOD cmp-verticaltabs__tab--active + MOD cmp-verticaltabs__tab--stepped ELEMENT cmp-verticaltabs__title ELEMENT cmp-verticaltabs__icon ELEMENT cmp-verticaltabs__label diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/contentframe/css.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/contentframe/css.txt new file mode 100644 index 0000000000..b04581e480 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/contentframe/css.txt @@ -0,0 +1,18 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=css +tabsview.css diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/contentframe/css/tabsview.css b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/contentframe/css/tabsview.css new file mode 100644 index 0000000000..ee36a0ef2b --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/contentframe/css/tabsview.css @@ -0,0 +1,23 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> + +.cmp-verticaltabs__tabpanel{ + display: none; +} + +.cmp-verticaltabs__tabpanel.cmp-verticaltabs__tabpanel--active{ + display: block; +} \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/site/js/verticaltabs.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/site/js/verticaltabs.js index 69667ae682..5e0e654d42 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/site/js/verticaltabs.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/clientlibs/site/js/verticaltabs.js @@ -27,6 +27,10 @@ tab: "cmp-verticaltabs__tab--active", tabpanel: "cmp-verticaltabs__tabpanel--active" }, + stepped: { + tab: "cmp-verticaltabs__tab--stepped", + tabpanel: "cmp-verticaltabs__tabpanel--stepped" + }, label: `.${VerticalTabs.bemBlock}__label`, description: `.${VerticalTabs.bemBlock}__longdescription`, qm: `.${VerticalTabs.bemBlock}__questionmark`, diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/verticaltabs.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/verticaltabs.html index ea042f2561..ebcdcfaa42 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/verticaltabs.html +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/verticaltabs/v1/verticaltabs/verticaltabs.html @@ -64,6 +64,6 @@ data-sly-test="${(wcmmode.edit || wcmmode.preview)}"></sly> </div> <sly data-sly-use.clientlib="core/wcm/components/commons/v1/templates/clientlib.html"> - <sly data-sly-test="${wcmmode.edit}" data-sly-call="${clientlib.js @ categories='core.forms.components.verticaltabs.v1.contentframe'}"/> + <sly data-sly-test="${wcmmode.edit}" data-sly-call="${clientlib.all @ categories='core.forms.components.verticaltabs.v1.contentframe'}"/> </sly> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/README.md b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/README.md index 19aa9653be..ee369fc407 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/README.md +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/README.md @@ -46,11 +46,15 @@ It is already included by its edit and policy dialogs. ``` BLOCK cmp-adaptiveform-wizard ELEMENT cmp-adaptiveform-wizard__label - ELEMENT cmp-adaptiveform-wizard__label-container + ELEMENT cmp-adaptiveform-wizard__label-container ELEMENT cmp-adaptiveform-wizard__tab + MOD cmp-adaptiveform-wizard__tab--active + MOD cmp-adaptiveform-wizard__tab--stepped ELEMENT cmp-adaptiveform-wizard__wizardpanel ELEMENT cmp-adaptiveform-wizard__previousNav + MOD cmp-adaptiveform-wizard__previousNav--hidden ELEMENT cmp-adaptiveform-wizard__nextNav + MOD cmp-adaptiveform-wizard__nextNav--hidden ``` diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/commons/js/common.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/commons/js/common.js index 419285efb7..b2dc6ea8ab 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/commons/js/common.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/commons/js/common.js @@ -29,7 +29,11 @@ active: { tab: "cmp-adaptiveform-wizard__tab--active", wizardpanel: "cmp-adaptiveform-wizard__wizardpanel--active" - } + }, + stepped: { + tab: "cmp-adaptiveform-wizard__tab--stepped", + wizardpanel: "cmp-adaptiveform-wizard__wizardpanel--stepped", + } }; _active; @@ -72,6 +76,48 @@ } } + addSteppedClass() { + const tabs = this.getCachedTabs(); + const wizardPanels = this.getCachedWizardPanels(); + const activeChildId = this.getActiveWizardTabId(tabs) + const activeTab = this.getTabNavElementById(activeChildId); + if (activeTab.classList.contains(this.constructor.selectors.active.tab)) { + activeTab.classList.add(this.constructor.selectors.stepped.tab); + + const correspondingPanel = Array.from(wizardPanels).find(panel => + panel.getAttribute("aria-labelledby") === activeTab.id + ); + + if (correspondingPanel) { + correspondingPanel.classList.add(this.constructor.selectors.stepped.wizardpanel); + } + } + } + + getTabNavElementById(tabId) { + let tabs = this.getCachedTabs(); + if (tabs) { + for (let i = 0; i < tabs.length; i++) { + if (tabs[i].id === tabId) { + return tabs[i]; + } + } + } + } + + getActiveWizardTabId(tabs) { + if (tabs) { + var result = tabs[0].id; + for (var i = 0; i < tabs.length; i++) { + if (tabs[i].classList.contains(this.constructor.selectors.active.tab)) { + result = tabs[i].id; + break; + } + } + return result; + } + } + /** * Returns the index of the active tab, if no tab is active returns 0 * @@ -105,6 +151,7 @@ */ navigate(index) { this._active = index; + this.addSteppedClass(); this.refreshActive(); } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/contentframe/css.txt b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/contentframe/css.txt new file mode 100644 index 0000000000..c66062ae91 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/contentframe/css.txt @@ -0,0 +1,19 @@ +############################################################################### +# Copyright 2024 Adobe +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +############################################################################### + +#base=css + +wizard.css diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/contentframe/css/wizard.css b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/contentframe/css/wizard.css new file mode 100644 index 0000000000..a60e1fe698 --- /dev/null +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/contentframe/css/wizard.css @@ -0,0 +1,30 @@ +<!--/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Copyright 2024 Adobe + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> + +.cmp-adaptiveform-wizard__wizardpanel { + display: none; +} + +.cmp-adaptiveform-wizard__wizardpanel--active { + display: block; +} + +.cmp-adaptiveform-wizard__previousNav--hidden{ + display: none; +} +.cmp-adaptiveform-wizard__nextNav--hidden{ + display: none; +} \ No newline at end of file diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/css/wizard.css b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/css/wizard.css index eac9f77359..952cbc3d4d 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/css/wizard.css +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/css/wizard.css @@ -55,10 +55,10 @@ .cmp-adaptiveform-wizard__previousNav{ } -.cmp-adaptiveform-wizard__previousNav__hidden{ +.cmp-adaptiveform-wizard__previousNav--hidden{ display: none; } -.cmp-adaptiveform-wizard__nextNav__hidden{ +.cmp-adaptiveform-wizard__nextNav--hidden{ display: none; } .cmp-adaptiveform-wizard{ diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/js/wizardview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/js/wizardview.js index 71f22f814e..1283389070 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/js/wizardview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/clientlibs/site/js/wizardview.js @@ -41,17 +41,21 @@ tab: "cmp-adaptiveform-wizard__tab--active", wizardpanel: "cmp-adaptiveform-wizard__wizardpanel--active" }, + stepped: { + tab: "cmp-adaptiveform-wizard__tab--stepped", + wizardpanel: "cmp-adaptiveform-wizard__wizardpanel--stepped", + }, label: `.${Wizard.bemBlock}__label`, description: `.${Wizard.bemBlock}__longdescription`, qm: `.${Wizard.bemBlock}__questionmark`, widget: `.${Wizard.bemBlock}__widget`, tooltipDiv: `.${Wizard.bemBlock}__shortdescription`, previousButton: `.${Wizard.bemBlock}__previousNav`, - previousButtonHidden: "cmp-adaptiveform-wizard__previousNav__hidden", + previousButtonHidden: "cmp-adaptiveform-wizard__previousNav--hidden", nextButton: `.${Wizard.bemBlock}__nextNav`, previousButtonV2: `.${Wizard.bemBlock}__nav--previous`, nextButtonV2: `.${Wizard.bemBlock}__nav--next`, - nextButtonHidden: "cmp-adaptiveform-wizard__nextNav__hidden", + nextButtonHidden: "cmp-adaptiveform-wizard__nextNav--hidden", olTabList: `.${Wizard.bemBlock}__tabList` }; @@ -331,7 +335,7 @@ this.navigate(index); this.focusWithoutScroll(this.getCachedTabs()[index]); } - + #syncWizardNavLabels() { const tabs = this.getCachedTabs(); const wizardPanels = this.getCachedWizardPanels(); @@ -382,12 +386,21 @@ } } else { let beforeTabNavElementId = childView.getInstanceManager().children[instanceIndex - 1].element.id + Wizard.#tabIdSuffix - let beforeElement = this.#getTabNavElementById(beforeTabNavElementId); + let beforeElement = this.getTabNavElementById(beforeTabNavElementId); beforeElement.after(navigationTabToBeRepeated); } this.cacheElements(this._elements.self); let repeatedWizardPanel = this.#getWizardPanelElementById(childView.id + Wizard.#wizardPanelIdSuffix); repeatedWizardPanel.setAttribute("aria-labelledby", childView.id + Wizard.#tabIdSuffix); + + const steppedTabClass = Array.from(navigationTabToBeRepeated.classList).find(cls => cls.includes('--stepped')); + if (steppedTabClass) { + navigationTabToBeRepeated.classList.remove(steppedTabClass); + } + const steppedWizardPanelClass = Array.from(repeatedWizardPanel.classList).find(cls => cls.includes('--stepped')); + if (steppedWizardPanelClass) { + repeatedWizardPanel.classList.remove(steppedWizardPanelClass); + } this.refreshActive(); this.#getTabIndexById(); if (childView.getInstanceManager().getModel().minOccur != undefined && childView.getInstanceManager().children.length > childView.getInstanceManager().getModel().minOccur) { @@ -400,7 +413,7 @@ let removedTabPanelId = removedInstanceView.element.id + Wizard.#wizardPanelIdSuffix; let removedTabNavId = removedTabPanelId.substring(0, removedTabPanelId.lastIndexOf("__")) + Wizard.#tabIdSuffix; let wizardPanelElement = this.#getWizardPanelElementById(removedTabPanelId); - let tabNavElement = this.#getTabNavElementById(removedTabNavId); + let tabNavElement = this.getTabNavElementById(removedTabNavId); tabNavElement.remove(); wizardPanelElement.remove(); this.children.splice(this.children.indexOf(removedInstanceView), 1); @@ -448,7 +461,7 @@ let tabId = childView.element.id + Wizard.#tabIdSuffix; let wizardPanelId = childView.element.id + Wizard.#wizardPanelIdSuffix; let instanceManagerId = childView.getInstanceManager().getId(); - let navigationTabToBeRepeated = this.#getTabNavElementById(tabId); + let navigationTabToBeRepeated = this.getTabNavElementById(tabId); let wizardPanelToBeRepeated = this.#getWizardPanelElementById(wizardPanelId) this._templateHTML[instanceManagerId] = {}; this._templateHTML[instanceManagerId]['navigationTab'] = navigationTabToBeRepeated; @@ -456,17 +469,6 @@ } } - #getTabNavElementById(tabId) { - let tabs = this.getCachedTabs(); - if (tabs) { - for (let i = 0; i < tabs.length; i++) { - if (tabs[i].id === tabId) { - return tabs[i]; - } - } - } - } - #getWizardPanelElementById(wizardPanelId) { let wizardPanels = this.getCachedWizardPanels(); if (wizardPanels) { @@ -516,7 +518,7 @@ } updateChildVisibility(visible, state) { - this.updateVisibilityOfNavigationElement(this.#getTabNavElementById(state.id + Wizard.#tabIdSuffix), visible); + this.updateVisibilityOfNavigationElement(this.getTabNavElementById(state.id + Wizard.#tabIdSuffix), visible); let activeTabNavElement = this.getCachedTabs()[this._active]; this.#setNavigationRange(); this.#hideUnhideNavButtons(this._active); diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/wizard.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/wizard.html index 565ee7130d..f806f46cad 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/wizard.html +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v1/wizard/wizard.html @@ -77,6 +77,6 @@ <sly data-sly-resource="${resource.path @ resourceType='core/wcm/components/container/v1/container/new', appendPath='/*', decorationTagName='div', cssClassName='new section aem-Grid-newComponent'}"> </sly> <sly data-sly-use.clientlib="core/wcm/components/commons/v1/templates/clientlib.html"> - <sly data-sly-test="${wcmmode.edit}" data-sly-call="${clientlib.js @ categories='core.forms.components.wizard.v1.contentframe'}"/> + <sly data-sly-test="${wcmmode.edit}" data-sly-call="${clientlib.all @ categories='core.forms.components.wizard.v1.contentframe'}"/> </sly> </div> diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v2/wizard/wizard.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v2/wizard/wizard.html index b377027624..28441ef100 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v2/wizard/wizard.html +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/wizard/v2/wizard/wizard.html @@ -78,6 +78,6 @@ <sly data-sly-resource="${resource.path @ resourceType='core/wcm/components/container/v1/container/new', appendPath='/*', decorationTagName='div', cssClassName='new section aem-Grid-newComponent'}"> </sly> <sly data-sly-use.clientlib="core/wcm/components/commons/v1/templates/clientlib.html"> - <sly data-sly-test="${wcmmode.edit}" data-sly-call="${clientlib.js @ categories='core.forms.components.wizard.v1.contentframe'}"/> + <sly data-sly-test="${wcmmode.edit}" data-sly-call="${clientlib.all @ categories='core.forms.components.wizard.v1.contentframe'}"/> </sly> </div> diff --git a/ui.frontend/clientlib-dev.config.cjs b/ui.frontend/clientlib-dev.config.cjs index de057d032e..10173a641f 100644 --- a/ui.frontend/clientlib-dev.config.cjs +++ b/ui.frontend/clientlib-dev.config.cjs @@ -46,7 +46,7 @@ module.exports = { ...libsBaseConfig, name: 'core-forms-components-runtime-base', categories: ['core.forms.components.runtime.base'], - dependencies: ['granite.csrf.standalone.fetchsupport', 'af.rum'], + dependencies: ['granite.csrf.standalone.fetchsupport', 'af.rum', 'dompurify'], assets: { js: ['dist/main.js'], resources: ['dist/main.js.map'] diff --git a/ui.frontend/package-lock.json b/ui.frontend/package-lock.json index 4d25a3c47d..bfe27a044c 100644 --- a/ui.frontend/package-lock.json +++ b/ui.frontend/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@aemforms/af-core": "^0.22.109", - "@aemforms/af-custom-functions": "1.0.10", + "@aemforms/af-core": "^0.22.112", + "@aemforms/af-custom-functions": "1.0.13", "@aemforms/af-formatters": "^0.22.109" }, "devDependencies": { @@ -26,6 +26,52 @@ "webpack-merge": "^5.8.0" } }, + "../../../repos/af-custom-functions": { + "name": "@aemforms/af-custom-functions", + "version": "1.0.12", + "extraneous": true, + "license": "MIT License, Copyright 2024 Adobe Systems Incorporated", + "devDependencies": { + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0" + } + }, + "../../../repos/af2-web-runtime/packages/forms-next-core": { + "name": "@aemforms/af-core", + "version": "0.22.111", + "extraneous": true, + "license": "Adobe Proprietary", + "dependencies": { + "@adobe/json-formula": "0.1.50", + "@aemforms/af-formatters": "^0.22.111" + }, + "devDependencies": { + "@babel/preset-env": "^7.20.2", + "@types/jest": "29.2.4", + "@types/lodash": "^4.14.171", + "@typescript-eslint/eslint-plugin": "^4.28.2", + "@typescript-eslint/parser": "^4.28.2", + "babel-jest": "^29.4.1", + "blob-polyfill": "^7.0.20220408", + "eslint": "^7.30.0", + "eslint-config-standard": "^16.0.3", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jest": "^24.3.6", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", + "form-data": "^4.0.0", + "jest": "29.3", + "jest-environment-jsdom": "^29.3.1", + "jest-junit": "^12.2.0", + "nock": "^13.1.3", + "node-fetch": "^2.6.1", + "parse-multipart-data": "^1.5.0", + "ts-jest": "29.0", + "typedoc": "0.22.11", + "typedoc-plugin-markdown": "3.11.13", + "typescript": "^4.3.5" + } + }, "../../af2-web-runtime/packages/forms-next-formatters": { "name": "@aemforms/af-formatters", "version": "0.22.75", @@ -61,23 +107,23 @@ } }, "node_modules/@aemforms/af-core": { - "version": "0.22.109", - "resolved": "https://registry.npmjs.org/@aemforms/af-core/-/af-core-0.22.109.tgz", - "integrity": "sha512-vJv7dxJrx0Ta0KdL6/hC/RytMzJyQwHRra52V3VQoIa8O9r6/zfNovOYbhlXhGj2iF996UasrGrem+f9WuolvA==", + "version": "0.22.112", + "resolved": "https://registry.npmjs.org/@aemforms/af-core/-/af-core-0.22.112.tgz", + "integrity": "sha512-cyUbPYu/l+w9elyTLEWhyQj2qLp/PlI2fXDX/2kpTcGfb+ckRqXRzpItbPqa66m4scjcNpK0RpwfThcSRb1S3w==", "dependencies": { "@adobe/json-formula": "0.1.50", - "@aemforms/af-formatters": "^0.22.109" + "@aemforms/af-formatters": "^0.22.112" } }, "node_modules/@aemforms/af-custom-functions": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@aemforms/af-custom-functions/-/af-custom-functions-1.0.10.tgz", - "integrity": "sha512-n3w9tHkJOI5ISVYAK2cCi5k/oTu3rGgByDmMIgOH1+Ry4mL9nM3cxBTKEkPF8Y8JiKF1aUHIKM+MeP6u5PiiUA==" + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@aemforms/af-custom-functions/-/af-custom-functions-1.0.13.tgz", + "integrity": "sha512-thtSn92qpkZg0uldYMaiN81MGxyttv+kyO2h34YA1Li8V79DYFp3JJWE3duhCgo+tslCLGamqryVwJbMdSJV6Q==" }, "node_modules/@aemforms/af-formatters": { - "version": "0.22.109", - "resolved": "https://registry.npmjs.org/@aemforms/af-formatters/-/af-formatters-0.22.109.tgz", - "integrity": "sha512-WG4JiC1TDfg/5KLQyGziOKscYJ0mD8JgPzXYw7ZqpMAobgCEwKRSfu2Bf+Wr9v13ASigS0KhLssxSZIfOX/QJA==" + "version": "0.22.112", + "resolved": "https://registry.npmjs.org/@aemforms/af-formatters/-/af-formatters-0.22.112.tgz", + "integrity": "sha512-hnscUtTMxfEWNcBiatYY5lzGCCtRn1lbCdKemPTqMMRIzBCWFJXx1mxV84ysyktXXW7R+PS64P0A2K8IBVtVFw==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", @@ -11076,23 +11122,23 @@ "integrity": "sha512-dmlLYfbty8NPVIdxvI9cJ+ZdXsrRCFrCdmL1+aR2auEzXJ86rD0bm1qu+S4NOpFiZLKIyx0zvUTykms40vNjsA==" }, "@aemforms/af-core": { - "version": "0.22.109", - "resolved": "https://registry.npmjs.org/@aemforms/af-core/-/af-core-0.22.109.tgz", - "integrity": "sha512-vJv7dxJrx0Ta0KdL6/hC/RytMzJyQwHRra52V3VQoIa8O9r6/zfNovOYbhlXhGj2iF996UasrGrem+f9WuolvA==", + "version": "0.22.112", + "resolved": "https://registry.npmjs.org/@aemforms/af-core/-/af-core-0.22.112.tgz", + "integrity": "sha512-cyUbPYu/l+w9elyTLEWhyQj2qLp/PlI2fXDX/2kpTcGfb+ckRqXRzpItbPqa66m4scjcNpK0RpwfThcSRb1S3w==", "requires": { "@adobe/json-formula": "0.1.50", - "@aemforms/af-formatters": "^0.22.109" + "@aemforms/af-formatters": "^0.22.112" } }, "@aemforms/af-custom-functions": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@aemforms/af-custom-functions/-/af-custom-functions-1.0.10.tgz", - "integrity": "sha512-n3w9tHkJOI5ISVYAK2cCi5k/oTu3rGgByDmMIgOH1+Ry4mL9nM3cxBTKEkPF8Y8JiKF1aUHIKM+MeP6u5PiiUA==" + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@aemforms/af-custom-functions/-/af-custom-functions-1.0.13.tgz", + "integrity": "sha512-thtSn92qpkZg0uldYMaiN81MGxyttv+kyO2h34YA1Li8V79DYFp3JJWE3duhCgo+tslCLGamqryVwJbMdSJV6Q==" }, "@aemforms/af-formatters": { - "version": "0.22.109", - "resolved": "https://registry.npmjs.org/@aemforms/af-formatters/-/af-formatters-0.22.109.tgz", - "integrity": "sha512-WG4JiC1TDfg/5KLQyGziOKscYJ0mD8JgPzXYw7ZqpMAobgCEwKRSfu2Bf+Wr9v13ASigS0KhLssxSZIfOX/QJA==" + "version": "0.22.112", + "resolved": "https://registry.npmjs.org/@aemforms/af-formatters/-/af-formatters-0.22.112.tgz", + "integrity": "sha512-hnscUtTMxfEWNcBiatYY5lzGCCtRn1lbCdKemPTqMMRIzBCWFJXx1mxV84ysyktXXW7R+PS64P0A2K8IBVtVFw==" }, "@ampproject/remapping": { "version": "2.2.1", diff --git a/ui.frontend/package.json b/ui.frontend/package.json index 68ac54f75c..dd5ed20f1e 100644 --- a/ui.frontend/package.json +++ b/ui.frontend/package.json @@ -23,8 +23,8 @@ "webpack-merge": "^5.8.0" }, "dependencies": { - "@aemforms/af-core": "^0.22.109", + "@aemforms/af-core": "^0.22.112", "@aemforms/af-formatters": "^0.22.109", - "@aemforms/af-custom-functions": "1.0.10" + "@aemforms/af-custom-functions": "1.0.13" } } diff --git a/ui.frontend/src/constants.js b/ui.frontend/src/constants.js index c278bcabe8..04d6f8078e 100644 --- a/ui.frontend/src/constants.js +++ b/ui.frontend/src/constants.js @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ +import { FIELD_TYPE } from "@aemforms/af-core"; /** * @module FormView @@ -365,6 +366,14 @@ export const Constants = { * Prefix path for all AF HTTP APIs. * @type {string} */ - API_PATH_PREFIX : "/adobe/forms/af" + API_PATH_PREFIX : "/adobe/forms/af", + + /** + * Field type object. + * @type {object} + * @memberof module:FormView~Constants + * @namespace FIELD_TYPE + */ + FIELD_TYPE: FIELD_TYPE }; diff --git a/ui.frontend/src/customFunctions.js b/ui.frontend/src/customFunctions.js index 681ab3d2df..8633feeb0a 100644 --- a/ui.frontend/src/customFunctions.js +++ b/ui.frontend/src/customFunctions.js @@ -98,5 +98,21 @@ export const customFunctions = { * @param {object} globals - An object containing read-only form instance, read-only target field instance and methods for form modifications. * @returns {string} - The captcha token. */ - fetchCaptchaToken: cf.fetchCaptchaToken + fetchCaptchaToken: cf.fetchCaptchaToken, + + /** + * Converts a date to the number of days since the Unix epoch (1970-01-01). + * + * If the input date is a number, it is assumed to represent the number of days since the epoch, + * including both integer and decimal parts. In this case, only the integer part is returned as the number of days. + * + * @param {string|Date|number} date - The date to convert. + * Can be: + * - An ISO string (yyyy-mm-dd) + * - A Date object + * - A number representing the days since the epoch, where the integer part is the number of days and the decimal part is the fraction of the day + * + * @returns {number} - The number of days since the Unix epoch + */ + dateToDaysSinceEpoch: cf.dateToDaysSinceEpoch }; diff --git a/ui.frontend/src/utils.js b/ui.frontend/src/utils.js index b201ae4eee..16e03a285a 100644 --- a/ui.frontend/src/utils.js +++ b/ui.frontend/src/utils.js @@ -269,6 +269,7 @@ class Utils { } /** + * @deprecated Use `registerCustomFunctionsV2` instead. * Registers custom functions from clientlibs. * @param {string} formId - The form ID. */ @@ -286,6 +287,30 @@ class Utils { } } + /** + * Registers custom functions from clientlibs. + * @param {object} formJson - The Sling model exporter representation of the form + */ + static async registerCustomFunctionsV2(formJson) { + let funcConfig; + const customFunctionsUrl = formJson.properties['fd:customFunctionsUrl']; + if (customFunctionsUrl) { + funcConfig = await HTTPAPILayer.getJson(customFunctionsUrl); + } else { + funcConfig = await HTTPAPILayer.getCustomFunctionConfig(formJson.id); + } + console.debug("Fetched custom functions: " + JSON.stringify(funcConfig)); + if (funcConfig && funcConfig.customFunction) { + const funcObj = funcConfig.customFunction.reduce((accumulator, func) => { + if (window[func.id]) { + accumulator[func.id] = window[func.id]; + } + return accumulator; + }, {}); + FunctionRuntime.registerFunctions(funcObj); + } + } + /** * Sets up the Form Container. * @param {Function} createFormContainer - The function to create a form container. @@ -309,14 +334,15 @@ class Utils { } else { const _formJson = await HTTPAPILayer.getFormDefinition(_path, _pageLang); console.debug("fetched model json", _formJson); - await this.registerCustomFunctions(_formJson.id); + await this.registerCustomFunctionsV2( _formJson); await this.registerCustomFunctionsByUrl(customFunctionUrl); const urlSearchParams = new URLSearchParams(window.location.search); const params = Object.fromEntries(urlSearchParams.entries()); let _prefillData = {}; if (_formJson?.properties?.['fd:formDataEnabled'] === true) { // only execute when fd:formDataEnabled is present and set to true - _prefillData = await HTTPAPILayer.getPrefillData(_formJson.id, params) || {}; + _prefillData = await HTTPAPILayer.getJson(_formJson.properties['fd:dataUrl'] + "?" + Object.keys(params).map(p => p+"="+params[p]).join("&")) + _prefillData = _prefillData || {}; _prefillData = Utils.stripIfWrapped(_prefillData); } const formContainer = await createFormContainer({ diff --git a/ui.frontend/src/view/FormFileInputWidgetBase.js b/ui.frontend/src/view/FormFileInputWidgetBase.js index 11104593ac..c34eeef9c0 100644 --- a/ui.frontend/src/view/FormFileInputWidgetBase.js +++ b/ui.frontend/src/view/FormFileInputWidgetBase.js @@ -41,7 +41,32 @@ class FormFileInputWidgetBase { "dll": "application/x-msdownload", "exe": "application/x-msdownload", "msi": "application/x-msdownload", - "msg": "application/vnd.ms-outlook" + "msg": "application/vnd.ms-outlook", + "dwg": "image/vnd.dwg", + "jxr": "image/vnd.ms-photo", + "psd": "image/vnd.adobe.photoshop", + "ico": "image/vnd.microsoft.icon", + "cab": "application/vnd.ms-cab-compressed", + "deb": "application/vnd.debian.binary-package", + "sqlite": "application/vnd.sqlite3", + "inf2": "image/vnd.cns.inf2", + "djv": "image/vnd.djvu", + "djvu": "image/vnd.djvu", + "dxf": "image/vnd.dxf", + "fbs": "image/vnd.fastbidsheet", + "fpx": "image/vnd.fpx", + "fst": "image/vnd.fst", + "mmr": "image/vnd.fujixerox.edmics-mmr", + "rlc": "image/vnd.fujixerox.edmics-rlc", + "pgb": "image/vnd.globalgraphics.pgb", + "mix": "image/vnd.mix", + "mdi": "image/vnd.ms-modi", + "npx": "image/vnd.net-fpx", + "radiance": "image/vnd.radiance", + "sealed.png": "image/vnd.sealed.png", + "softseal.gif": "image/vnd.sealedmedia.softseal.gif", + "softseal.jpg": "image/vnd.sealedmedia.softseal.jpg", + "svf": "image/vnd.svf" } initialFileValueFileNameMap; diff --git a/ui.frontend/src/view/FormTabs.js b/ui.frontend/src/view/FormTabs.js index e432c30ca4..462d87d8e8 100644 --- a/ui.frontend/src/view/FormTabs.js +++ b/ui.frontend/src/view/FormTabs.js @@ -286,9 +286,29 @@ class FormTabs extends FormPanel { */ navigate(tabId) { this.#_active = tabId; + this.addSteppedClass(tabId); this.#refreshActive(); } + + addSteppedClass(tabId) { + var tabs = this.#getCachedTabs(); + var tabpanels= this.#getCachedTabPanels(); + const activeTabId = this.getActiveTabId(tabs); + const activeTabElement = this.#getTabNavElementById(activeTabId); + if (activeTabElement.classList.contains(this.#_selectors.active.tab)) { + activeTabElement.classList.add(this.#_selectors.stepped.tab); + + const correspondingPanel = Array.from(tabpanels).find(panel => + panel.getAttribute("aria-labelledby") === activeTabElement.id + ); + + if (correspondingPanel) { + correspondingPanel.classList.add(this.#_selectors.stepped.tabpanel); + } + } + } + /** * Returns the id of the active tab, if no tab is active returns 0th element id * @@ -384,6 +404,14 @@ class FormTabs extends FormPanel { this.#cacheElements(this._elements.self); var repeatedTabPanel = this.#getTabPanelElementById(childView.id + this.#tabPanelIdSuffix); repeatedTabPanel.setAttribute("aria-labelledby", childView.id + this.#tabIdSuffix); + const steppedTabClass = Array.from(navigationTabToBeRepeated.classList).find(cls => cls.includes('--stepped')); + if (steppedTabClass) { + navigationTabToBeRepeated.classList.remove(steppedTabClass); + } + const steppedTabpanelClass = Array.from(repeatedTabPanel.classList).find(cls => cls.includes('--stepped')); + if (steppedTabpanelClass) { + repeatedTabPanel.classList.remove(steppedTabpanelClass); + } this.#bindEventsToTab(navigationTabToBeRepeated.id); this.#refreshActive(); if (childView.getInstanceManager().getModel().minOccur != undefined && childView.getInstanceManager().children.length > childView.getInstanceManager().getModel().minOccur) { diff --git a/ui.tests/test-module/libs/commons/formsConstants.js b/ui.tests/test-module/libs/commons/formsConstants.js index 0f59444f59..c511260f7a 100644 --- a/ui.tests/test-module/libs/commons/formsConstants.js +++ b/ui.tests/test-module/libs/commons/formsConstants.js @@ -48,7 +48,8 @@ var formsConstants = { "fragment": "/apps/forms-components-examples/components/form/fragment", "fragmentcontainer": "/apps/forms-components-examples/components/form/fragmentcontainer", "termsandconditions": "/apps/forms-components-examples/components/form/termsandconditions", - "submitButton": "/apps/forms-components-examples/components/form/actions/submit" + "submitButton": "/apps/forms-components-examples/components/form/actions/submit", + "review": "/apps/forms-components-examples/components/form/review", } }, resourceType : { diff --git a/ui.tests/test-module/libs/commons/guideSelectors.js b/ui.tests/test-module/libs/commons/guideSelectors.js index 16540133ca..40b0f31bb7 100644 --- a/ui.tests/test-module/libs/commons/guideSelectors.js +++ b/ui.tests/test-module/libs/commons/guideSelectors.js @@ -167,6 +167,7 @@ var selectors = { ruleEditor : { action : { + configure: "#EditableToolbar [data-action='CONFIGURE']", editRule : "#EditableToolbar [data-action='editexpression']", createRuleButton : "#create-rule-button", saveRule : ".exp-Save-Button", @@ -181,16 +182,19 @@ var selectors = { EVENT_AND_COMPARISON_OPERATOR : ".choice-model.u-coral-clearFix.EVENT_AND_COMPARISON_OPERATOR", PRIMITIVE_EXPRESSION : ".choice-model.u-coral-clearFix.PRIMITIVE_EXPRESSION.choice-model-inline", BLOCK_STATEMENT : ".choice-model.u-coral-clearFix.BLOCK_STATEMENT", - PARAMETER : ".Parameters .choice-model.u-coral-clearFix.EXPRESSION" + PARAMETER : ".Parameters .choice-model.u-coral-clearFix.EXPRESSION", + STRING_LITERAL : ".choice-model.u-coral-clearFix .STRING_LITERAL", }, ruleSummary : { CREATED_RULE: "#rule-summary table[handle='table'] tr[title='Button - Click']", + DATE_PICKER_RULE: "#rule-summary table[handle='table'] tr[title='Date Input - Validate']", SUBMISSION_SUCCESS_RULE: "#rule-summary table[handle='table'] tr[title='FORM - Successful Submission']", SUBMISSION_FAILURE_RULE: "#rule-summary table[handle='table'] tr[title='FORM - Error in Submission']", CUSTOM_SUBMIT_FORM_RULE: "#rule-summary table[handle='table'] tr[title='Submit - Click']", }, operator : { CONTAINS : "coral-selectlist [value='CONTAINS']", + EQUALS_TO : "coral-selectlist [value='EQUALS_TO']", HIDE : "coral-selectlist [value='HIDE_STATEMENT']", SAVE_FORM: "coral-selectlist [value='SAVE_FORM']", FUNCTION_CALL : "coral-selectlist [value='FUNCTION_CALL']", diff --git a/ui.tests/test-module/specs/accordion/accordion.repeatability.runtime.cy.js b/ui.tests/test-module/specs/accordion/accordion.repeatability.runtime.cy.js index 2b0f4993fc..d716a09330 100644 --- a/ui.tests/test-module/specs/accordion/accordion.repeatability.runtime.cy.js +++ b/ui.tests/test-module/specs/accordion/accordion.repeatability.runtime.cy.js @@ -212,6 +212,41 @@ describe("Form with Accordion Container with repeatable elements", () => { getAccordionButtons().should('have.length', 8); }) }); + + it("if item-1 is repeated, the repeated instance should not have stepped class", () => { + getItemDivs().should('have.length', 5); + getAccordionPanels().should('have.length', 5); + getAccordionButtons().should('have.length', 5); + getExpandedPanelDiv().should('have.length', 1); + getExpandedButtonDiv().should('have.length', 1); + getAccordionButtonsAtIndex(0).should('have.class', 'cmp-accordion__button--expanded'); + getAccordionPanelsAtIndex(0).should('have.class', 'cmp-accordion__panel--expanded'); + cy.get("button").contains("+RP1").click().then(() => { + getItemDivs().should('have.length', 6); + getAccordionPanels().should('have.length', 6); + getAccordionButtons().should('have.length', 6); + getExpandedPanelDiv().should('have.length', 1); + getExpandedButtonDiv().should('have.length', 1); + getAccordionButtonsAtIndex(1).should('have.class', 'cmp-accordion__button--expanded'); + getAccordionPanelsAtIndex(1).should('have.class', 'cmp-accordion__panel--expanded'); + getAccordionButtonsAtIndex(0).should('have.class', 'cmp-accordion__button--stepped'); + getAccordionPanelsAtIndex(0).should('have.class', 'cmp-accordion__panel--stepped'); + }); + cy.get("button").contains("+RP1").click().then(() => { + getItemDivs().should('have.length', 7); + getAccordionPanels().should('have.length', 7); + getAccordionButtons().should('have.length', 7); + getExpandedPanelDiv().should('have.length', 1); + getExpandedButtonDiv().should('have.length', 1); + getAccordionButtonsAtIndex(2).should('have.class', 'cmp-accordion__button--expanded'); + getAccordionPanelsAtIndex(2).should('have.class', 'cmp-accordion__panel--expanded'); + getAccordionButtonsAtIndex(1).should('have.class', 'cmp-accordion__button--stepped'); + getAccordionPanelsAtIndex(1).should('have.class', 'cmp-accordion__panel--stepped'); + getAccordionButtonsAtIndex(0).should('have.class', 'cmp-accordion__button--stepped'); + getAccordionPanelsAtIndex(0).should('have.class', 'cmp-accordion__panel--stepped'); + }); + cy.expectNoConsoleErrors(); + }) }) describe("Form with Accordion Container with nested repeatable elements", () => { diff --git a/ui.tests/test-module/specs/button/button.runtime.cy.js b/ui.tests/test-module/specs/button/button.runtime.cy.js index 163e35212f..99ae2cdc92 100644 --- a/ui.tests/test-module/specs/button/button.runtime.cy.js +++ b/ui.tests/test-module/specs/button/button.runtime.cy.js @@ -108,4 +108,10 @@ describe("Form Runtime with Button Input", () => { cy.get('.cmp-adaptiveform-button__widget').eq(0).should('have.attr', 'type', 'button'); }); + it(`label changes should reflect via rules`, () => { + const [id] = Object.entries(formContainer._fields)[5]; + cy.get(`#${id}`).find('.cmp-adaptiveform-button__text').contains('change me'); + cy.get(`#${id}`).find('.cmp-adaptiveform-button__widget').click(); + cy.get(`#${id}`).find('.cmp-adaptiveform-button__text').contains('changed'); + }); }) diff --git a/ui.tests/test-module/specs/checkboxgroup/checkboxgroup.runtime.cy.js b/ui.tests/test-module/specs/checkboxgroup/checkboxgroup.runtime.cy.js index 85ee4b2cb8..f095eca80c 100644 --- a/ui.tests/test-module/specs/checkboxgroup/checkboxgroup.runtime.cy.js +++ b/ui.tests/test-module/specs/checkboxgroup/checkboxgroup.runtime.cy.js @@ -238,6 +238,17 @@ describe("Form Runtime with CheckBoxGroup Input", () => { cy.get(`#${id}`).invoke('attr', 'data-cmp-required').should('eq', 'true'); }); + it("reset of checkbox group resulting in invalidation", () => { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + const [resetButton, resetButtonView] = Object.entries(formContainer._fields)[7]; + const [checkBox2, checkBox2FieldView] = Object.entries(formContainer._fields)[1]; + cy.get(`#${checkBox2}`).find("input").check(["0","3"]); + cy.get(`#${checkBox2}`).invoke('attr', 'data-cmp-valid').should('eq', 'true'); + cy.get(`#${resetButton} button`).click().then(() => { + cy.get(`#${checkBox2}`).find("input").should('not.be.checked'); + cy.get(`#${checkBox2}`).invoke('attr', 'data-cmp-valid').should('not.exist'); + }); + }) }) describe("setFocus on checkboxgroup via rules", () => { diff --git a/ui.tests/test-module/specs/customactions.cy.js b/ui.tests/test-module/specs/customactions.cy.js new file mode 100644 index 0000000000..880d3fa577 --- /dev/null +++ b/ui.tests/test-module/specs/customactions.cy.js @@ -0,0 +1,48 @@ + +/* + * + * ADOBE CONFIDENTIAL + * ___________________ + * + * Copyright 2024 Adobe Systems Incorporated + * All Rights Reserved. + * + * NOTICE: All information contained herein is, and remains + * the property of Adobe Systems Incorporated and its suppliers, + * if any. The intellectual and technical concepts contained + * herein are proprietary to Adobe Systems Incorporated and its + * suppliers and are protected by trade secret or copyright law. + * Dissemination of this information or reproduction of this material + * is strictly forbidden unless prior written permission is obtained + * from Adobe Systems Incorporated. + */ + +describe('Custom Urls to fetch Custom Function & Prefill', () => { + const pagePath = "/content/forms/af/core-components-it/samples/embed/customactiontesting.html?wcmmode=disabled"; + const formJsonPath = "/content/forms/af/core-components-it/samples/embed/customactiontesting/jcr:content/guideContainer.model.en.json"; + const formJson = '{"id":"L2NvbnRlbnQvZm9ybXMvYWYvY29yZS1jb21wb25lbnRzLWl0L3NhbXBsZXMvZW1iZWQvY3VzdG9tYWN0aW9udGVzdGluZw==","fieldType":"form","lang":"en","title":"customactiontesting","action":"/adobe/forms/af/submit/L2NvbnRlbnQvZm9ybXMvYWYvY29yZS1jb21wb25lbnRzLWl0L3NhbXBsZXMvZW1iZWQvY3VzdG9tYWN0aW9udGVzdGluZw==","properties":{"themeRef":"/libs/fd/af/themes/canvas","schemaType":"none","fd:dor":{"dorType":"none"},"fd:path":"/content/forms/af/core-components-it/samples/embed/customactiontesting/jcr:content/guideContainer","fd:schemaType":"BASIC","fd:isHamburgerMenuEnabled":false,"fd:roleAttribute":null,"fd:formDataEnabled":true,"fd:autoSave":{"fd:enableAutoSave":false},"fd:customFunctionsUrl":"/customfunctionsprefix/adobe/forms/af/customfunctions/L2NvbnRlbnQvZm9ybXMvYWYvY29yZS1jb21wb25lbnRzLWl0L3NhbXBsZXMvZW1iZWQvY3VzdG9tYWN0aW9udGVzdGluZw==","fd:dataUrl":"/prefillprefix/adobe/forms/af/data/L2NvbnRlbnQvZm9ybXMvYWYvY29yZS1jb21wb25lbnRzLWl0L3NhbXBsZXMvZW1iZWQvY3VzdG9tYWN0aW9udGVzdGluZw=="},"columnCount":12,"gridClassNames":"aem-Grid aem-Grid--12 aem-Grid--default--12","events":{"custom:setProperty":["$event.payload"]},"metadata":{"grammar":"json-formula-1.0.0","version":"1.0.0"},"adaptiveform":"0.14.2",":type":"forms-components-examples/components/form/container","allowedComponents":{"components":[],"applicable":false}}'; + + + /** + * initialization of form container before every test + * */ + beforeEach(() => { + cy.intercept('GET', formJsonPath, { + statusCode: 200, + body: formJson + }) + cy.openPage(pagePath); + }); + + it('should use fd:customFunctionUrl to fetch the custom functions', () => { + cy.intercept('GET', /^\/customfunctionsprefix.*/).as('customFunctionRequest'); + cy.wait('@customFunctionRequest').its('response.statusCode').should('eq', 404); + cy.get('@customFunctionRequest').should('have.property', 'state', 'Complete'); + }) + + it('should use fd:dataUrl to fetch the prefill data', () => { + cy.intercept('GET', /^\/prefillprefix.*/).as('prefillRequest'); + cy.wait('@prefillRequest').its('response.statusCode').should('eq', 404); + cy.get('@prefillRequest').should('have.property', 'state', 'Complete'); + }) +}) diff --git a/ui.tests/test-module/specs/fileinput/fileinputstring.runtime.cy.js b/ui.tests/test-module/specs/fileinput/fileinputstring.runtime.cy.js index 18e41b1244..6fa604fe30 100644 --- a/ui.tests/test-module/specs/fileinput/fileinputstring.runtime.cy.js +++ b/ui.tests/test-module/specs/fileinput/fileinputstring.runtime.cy.js @@ -90,6 +90,15 @@ describe("Form with File Input - Prefill & Submit tests", () => { const submitBtn = "submit1673953138924"; const pagePath = "/content/forms/af/core-components-it/samples/fileinput/fileinputstring/basic.html" + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); beforeEach(() => { cy.wrap(prefillId).as('prefillId'); @@ -113,72 +122,76 @@ describe("Form with File Input - Prefill & Submit tests", () => { fileInputs.forEach((fileInput, idx) => { - it(`${fileInput.type} - attach files, check model, view, preview attachment and submit the form`, () => { - cy.previewForm(pagePath, { - onBeforeLoad: (win) => { - cy.stub(win, 'open'); // creating a stub to check file preview - } - }); - - // attach the file - cy.attachFile(fileInput.selector, fileInput.fileNames); - if(fileInput.multiple) - cy.attachFile(fileInput.selector, ['sample2.txt']); - - // submit the form - cy.get(".cmp-adaptiveform-button__widget").click(); - - // check for successful submission - submitTest(); - }) - - it(`${fileInput.type} - view prefill of submitted form, make changes to attachments and submit`, () => { - cy.get("@prefillId").then(id => { + // these test are based on don't replace data of FA which is present as string inside main form data + // hence checking if FT is explicitly enabled + if (toggle_array.includes('FT_FORMS-16351')) { + it(`${fileInput.type} - attach files, check model, view, preview attachment and submit the form`, () => { cy.previewForm(pagePath, { - params: [`prefillId=${id}`], - onBeforeLoad(win) { + onBeforeLoad: (win) => { cy.stub(win, 'open'); // creating a stub to check file preview } }); - // check if files were prefilled - checkFileNamesInFileAttachmentView(fileInput.selector, fileInput.fileNames); - - checkFilePreviewInFileAttachment(fileInput.selector); - - // check if guideBridge API returns file attachments correctly - getFormObjTest(['empty.pdf', ...(fileInput.multiple ? ['sample2.txt', 'sample.txt']: []) ]).then(() => { - // add new files after preview to both the component - cy.attachFile(fileInput.selector, ['sample2.txt']).then(() => { - // check if guideBridge API returns correctly after prefill and attaching more files - getFormObjTest(['sample2.txt', ...(fileInput.multiple ? ['sample.txt', 'empty.pdf', 'sample2.txt']: []) ]).then(() => { - // submit the form - cy.get(".cmp-adaptiveform-button__widget").click(); - // check if submission is success - submitTest(); - }) + // attach the file + cy.attachFile(fileInput.selector, fileInput.fileNames); + if (fileInput.multiple) + cy.attachFile(fileInput.selector, ['sample2.txt']); + + // submit the form + cy.get(".cmp-adaptiveform-button__widget").click(); + + // check for successful submission + submitTest(); + }) + + it(`${fileInput.type} - view prefill of submitted form, make changes to attachments and submit`, () => { + cy.get("@prefillId").then(id => { + cy.previewForm(pagePath, { + params: [`prefillId=${id}`], + onBeforeLoad(win) { + cy.stub(win, 'open'); // creating a stub to check file preview + } }); - }); - }); - }); + // check if files were prefilled + checkFileNamesInFileAttachmentView(fileInput.selector, fileInput.fileNames); + + checkFilePreviewInFileAttachment(fileInput.selector); + + // check if guideBridge API returns file attachments correctly + getFormObjTest(['empty.pdf', ...(fileInput.multiple ? ['sample2.txt', 'sample.txt'] : [])]).then(() => { + // add new files after preview to both the component + cy.attachFile(fileInput.selector, ['sample2.txt']).then(() => { + // check if guideBridge API returns correctly after prefill and attaching more files + getFormObjTest(['sample2.txt', ...(fileInput.multiple ? ['sample.txt', 'empty.pdf', 'sample2.txt'] : [])]).then(() => { + // submit the form + cy.get(".cmp-adaptiveform-button__widget").click(); + // check if submission is success + submitTest(); + }) + }); + }); - it(`${fileInput.type} - prefill of submitted prefilled form`, () => { - cy.get("@prefillId").then(id => { - cy.previewForm(pagePath, { - params: [`prefillId=${id}`], - onBeforeLoad(win) { - cy.stub(win, 'open'); // creating a stub to check file preview - } }); + }); - // check if files were prefilled - checkFileNamesInFileAttachmentView(fileInput.selector, ['sample2.txt', ...(fileInput.multiple ? ['sample.txt', 'empty.pdf']: []) ]); - getFormObjTest(['sample2.txt', ...(fileInput.multiple ? ['sample.txt', 'empty.pdf', 'sample2.txt']: []) ]); + it(`${fileInput.type} - prefill of submitted prefilled form`, () => { + cy.get("@prefillId").then(id => { + cy.previewForm(pagePath, { + params: [`prefillId=${id}`], + onBeforeLoad(win) { + cy.stub(win, 'open'); // creating a stub to check file preview + } + }); - }); + // check if files were prefilled + checkFileNamesInFileAttachmentView(fileInput.selector, ['sample2.txt', ...(fileInput.multiple ? ['sample.txt', 'empty.pdf'] : [])]); + getFormObjTest(['sample2.txt', ...(fileInput.multiple ? ['sample.txt', 'empty.pdf', 'sample2.txt'] : [])]); - }); + }); + + }); + } }) }); diff --git a/ui.tests/test-module/specs/radiobutton/radiobutton.runtime.cy.js b/ui.tests/test-module/specs/radiobutton/radiobutton.runtime.cy.js index 661230be48..cee413e625 100644 --- a/ui.tests/test-module/specs/radiobutton/radiobutton.runtime.cy.js +++ b/ui.tests/test-module/specs/radiobutton/radiobutton.runtime.cy.js @@ -230,6 +230,18 @@ describe("Form with Radio Button Input", () => { }) cy.get(`#${id}`).invoke('attr', 'data-cmp-required').should('eq', 'true'); }) + + it("reset of radiobutton resulting in invalidation", () => { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + const [radioButton1, radioButton1FieldView] = Object.entries(formContainer._fields)[0]; + const [resetButton, resetButtonFieldView] = Object.entries(formContainer._fields)[9]; + + cy.get(`#${radioButton1}`).find("input").check("1"); + cy.get(`#${resetButton} button`).click().then(() => { + cy.get(`#${radioButton1}`).find("input[value='1']").should('not.be.checked'); + cy.get(`#${radioButton1}`).invoke('attr', 'data-cmp-valid').should('not.exist'); + }) + }) }) describe("setFocus on radiobutton via rules", () => { diff --git a/ui.tests/test-module/specs/recaptcha/recaptcha.authoring.cy.js b/ui.tests/test-module/specs/recaptcha/recaptcha.authoring.cy.js index 6b4b92eb72..0d4422af2e 100644 --- a/ui.tests/test-module/specs/recaptcha/recaptcha.authoring.cy.js +++ b/ui.tests/test-module/specs/recaptcha/recaptcha.authoring.cy.js @@ -64,7 +64,7 @@ describe('Page - Authoring', function () { // Checking some dynamic behaviours cy.get(".cmp-adaptiveform-recaptcha__configuration").click().then(() => { - cy.get("coral-selectlist-item[value='entScore']").click(); + cy.get("coral-selectlist-item[value='entscore']").click(); cy.get("input[name='./recaptchaSize'][value='normal']").should("be.disabled"); cy.get("input[name='./recaptchaSize'][value='compact']").should("be.disabled"); }) diff --git a/ui.tests/test-module/specs/review/review.authoring.spec.js b/ui.tests/test-module/specs/review/review.authoring.spec.js new file mode 100644 index 0000000000..460150da09 --- /dev/null +++ b/ui.tests/test-module/specs/review/review.authoring.spec.js @@ -0,0 +1,97 @@ +/* + * Copyright 2024 Adobe Systems Incorporated + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +const sitesSelectors = require('../../libs/commons/sitesSelectors'), + afConstants = require('../../libs/commons/formsConstants'); + +describe.only('Page - Authoring', function () { + + const dropComponent = function (responsiveGridDropZoneSelector, componentTitle, componentType) { + cy.selectLayer("Edit"); + cy.insertComponent(responsiveGridDropZoneSelector, componentTitle, componentType); + cy.get('body').click(0, 0); + } + + const getDropZoneSelector = function (responsiveGridDropZone) { + return sitesSelectors.overlays.overlay.component + "[data-path='" + responsiveGridDropZone + "']"; + } + + const dropTabsInContainer = function () { + const responsiveGridDropZoneSelector = getDropZoneSelector("/content/forms/af/core-components-it/blank/jcr:content/guideContainer/*"); + dropComponent(responsiveGridDropZoneSelector, "Adaptive Form Horizontal Tabs", afConstants.components.forms.resourceType.tabsontop); + } + const dropPanelInTabComponent = function () { + const responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-text='Please drag Tab components here']:last"; + dropComponent(responsiveGridDropZoneSelector, "Adaptive Form Panel", afConstants.components.forms.resourceType.panelcontainer); + } + const dropTextInputInTabComponent = function () { + const responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-text='Please drag Tab components here']:first"; + dropComponent(responsiveGridDropZoneSelector, "Adaptive Form Text Box", afConstants.components.forms.resourceType.formtextinput); + } + const dropReviewInTabComponent = function () { + const responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-text='Please drag Tab components here']"; + cy.get(responsiveGridDropZoneSelector).eq(1).then(($element) => { + dropComponent($element, "Adaptive Form Review", afConstants.components.forms.resourceType.review); + }); + } + const dropTabsInSites = function () { + const dataPath = "/content/core-components-examples/library/adaptive-form/panelcontainer/jcr:content/root/responsivegrid/demo/component/guideContainer/*", + responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-path='" + dataPath + "']"; + dropComponent(responsiveGridDropZoneSelector, "Adaptive Form Horizontal Tabs", afConstants.components.forms.resourceType.tabsontop); + } + + context('Open Forms Editor', function () { + const pagePath = "/content/forms/af/core-components-it/blank", + tabsPath = pagePath + afConstants.FORM_EDITOR_FORM_CONTAINER_SUFFIX + "/tabsontop", + tabsContainerPathSelector = "[data-path='" + tabsPath + "']", + reviewPath = pagePath + afConstants.FORM_EDITOR_FORM_CONTAINER_SUFFIX + "/review", + reviewContainerPathSelector = "[data-path='" + reviewPath + "']", + editDialogConfigurationSelector = "[data-action='CONFIGURE']", + reviewBlockBemSelector = '.cmp-adaptiveform-review'; + beforeEach(function () { + // this is done since cypress session results in 403 sometimes + cy.openAuthoring(pagePath); + }); + + + it('Drop tabs and drop element in tabs on top', {retries: 3}, function () { + cy.cleanTest(tabsPath).then(function () { + dropTabsInContainer(); + dropPanelInTabComponent(); + dropTextInputInTabComponent(); + dropPanelInTabComponent(); + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + tabsContainerPathSelector); + cy.invokeEditableAction("[data-action='PANEL_SELECT']").then(() => { + cy.get("table.cmp-panelselector__table tr").eq(1).click().then(() => { + cy.get('body').click(0, 0); + dropReviewInTabComponent(); + + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + reviewContainerPathSelector); + cy.invokeEditableAction(editDialogConfigurationSelector); + cy.get("[name='./name']").should("exist"); + cy.get("[name='./jcr:title']").should("exist"); + cy.get("[name='./fd:editModeAction']").should("exist"); + cy.get("[name='./fd:editModeAction'] coral-select-item").should("have.length", 4); + cy.get("[name='./linkedPanels']").should("exist"); + cy.get("[name='./linkedPanels'] coral-select-item").should("have.length", 2); + cy.deleteComponentByPath(tabsPath); + }) + }); + }); + }); + }); +}); diff --git a/ui.tests/test-module/specs/review/review.repeatability.runtime.spec.js b/ui.tests/test-module/specs/review/review.repeatability.runtime.spec.js new file mode 100644 index 0000000000..4dad25a9e0 --- /dev/null +++ b/ui.tests/test-module/specs/review/review.repeatability.runtime.spec.js @@ -0,0 +1,245 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +describe("Form with Review component with repeatablity", () => { + + const pagePath = "content/forms/af/core-components-it/samples/review/repeatability.html"; + const bemBlock = 'cmp-adaptiveform-review'; + let formContainer = null; + + beforeEach(() => { + cy.previewForm(pagePath).then(p => { + formContainer = p; + }) + }); + + const tabSelector = 'ol li'; + const tab1 = () => { + return cy.get(tabSelector).eq(0); + } + const tab2 = () => { + return cy.get(tabSelector).eq(1); + } + const tab3 = () => { + return cy.get(tabSelector).eq(2); + } + const fillFirstTab = () => { + tab1().click(); + cy.get('input[name="textinput1724402270046"]').type('john'); + cy.get('input[name="textinput_16829110921724402298524"]').type('deo'); + cy.get('input[name="emailinput1724402315995"]').type('abc@gmail.com'); + cy.get('input[name="telephoneinput1724402330900"]').type('+91987654321'); + cy.get('input[name="datepicker1724402449174"]').type('2020-10-10'); + cy.get(`#gender_id-widget`).find("input").eq(0).click(); + cy.get(`#interest_id-widget`).find("input").eq(0).click(); + cy.get(`#interest_id-widget`).find("input").eq(1).click(); + } + const fillSecondTab = () => { + tab2().click(); + cy.get('input[name="textinput1724402488097"]').type('adobe system'); + cy.get('input[name="textinput_19265691141724402493991"]').type('noida'); + cy.get('select[name="dropdown1724402520718"]').select("UP") + cy.get('input[name="numberinput1724402569060"]').type('123456'); + } + const fillSecondRepeatablePanel = () => { + tab2().click(); + cy.get(`#add_address_id-widget`).click().then(() => { + cy.get('input[name="textinput1724402488097"]').eq(1).type('sector 132'); + cy.get('input[name="textinput_19265691141724402493991"]').eq(1).type('delhi'); + cy.get('select[name="dropdown1724402520718"]').eq(1).select("Delhi") + cy.get('input[name="numberinput1724402569060"]').eq(1).type('201301'); + }); + } + + // Verify the first panel + const checkFirstPanel = () => { + cy.get(`.${bemBlock}__container .${bemBlock}__panel`).eq(0).within(() => { + cy.get(`.${bemBlock}__label-container`).should('exist'); + cy.get(`.${bemBlock}__label`).contains('Personal Information'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + + cy.get(`.${bemBlock}__content`).should('exist').within(() => { + cy.get(`.${bemBlock}__field`).eq(0).within(() => { + cy.get(`.${bemBlock}__label`).contains('First name'); + cy.get(`.${bemBlock}__value`).contains('john'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(1).within(() => { + cy.get(`.${bemBlock}__label`).contains('Last name'); + cy.get(`.${bemBlock}__value`).contains('deo'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(2).within(() => { + cy.get(`.${bemBlock}__label`).contains('Email Address'); + cy.get(`.${bemBlock}__value`).contains('abc@gmail.com'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(3).within(() => { + cy.get(`.${bemBlock}__label`).contains('Mobile Number'); + cy.get(`.${bemBlock}__value`).contains('+91987654321'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(4).within(() => { + cy.get(`.${bemBlock}__label`).contains('DOB'); + cy.get(`.${bemBlock}__value`).contains('2020-10-10'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(5).within(() => { + cy.get(`.${bemBlock}__label`).contains('Gender'); + cy.get(`.${bemBlock}__value`).contains('Male'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(6).within(() => { + cy.get(`.${bemBlock}__label`).contains('Interest'); + cy.get(`.${bemBlock}__value`).contains('Music , Football'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + }); + }); + } + // Verify the second panel + const checkSecondPanel = () => { + cy.get(`.${bemBlock}__container .${bemBlock}__panel`).eq(1).within(() => { + cy.get(`.${bemBlock}__content`).should('exist').within(() => { + cy.get(`.${bemBlock}__label-container`).should('exist'); + cy.get(`.${bemBlock}__label`).contains('Address'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + + cy.get(`.${bemBlock}__content`).should('exist').within(() => { + cy.get(`.${bemBlock}__field`).eq(0).within(() => { + cy.get(`.${bemBlock}__label`).contains('Address 1'); + cy.get(`.${bemBlock}__value`).contains('adobe system'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(1).within(() => { + cy.get(`.${bemBlock}__label`).contains('City'); + cy.get(`.${bemBlock}__value`).contains('noida'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(2).within(() => { + cy.get(`.${bemBlock}__label`).contains('State'); + cy.get(`.${bemBlock}__value`).contains('UP'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(3).within(() => { + cy.get(`.${bemBlock}__label`).contains('Zip code'); + cy.get(`.${bemBlock}__value`).contains('123456'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + }); + }); + }); + }; + // Verify the second repeatable panel + const checkSecondRepeatablePanel = () => { + cy.get(`.${bemBlock}__panel--repeatable`).eq(1).within(() => { + cy.get(`.${bemBlock}__content`).should('exist').within(() => { + cy.get(`.${bemBlock}__field`).eq(0).within(() => { + cy.get(`.${bemBlock}__label`).contains('Address 1'); + cy.get(`.${bemBlock}__value`).contains('sector 132'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(1).within(() => { + cy.get(`.${bemBlock}__label`).contains('City'); + cy.get(`.${bemBlock}__value`).contains('delhi'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(2).within(() => { + cy.get(`.${bemBlock}__label`).contains('State'); + cy.get(`.${bemBlock}__value`).contains('Delhi'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + + cy.get(`.${bemBlock}__field`).eq(3).within(() => { + cy.get(`.${bemBlock}__label`).contains('Zip code'); + cy.get(`.${bemBlock}__value`).contains('201301'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + }); + }); + }); + }; + + it("should render tabs on top with review component", () => { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get('.cmp-tabs').should('have.length', 1); + cy.get('.cmp-tabs__tab').should('have.length', 3); + tab3().click(); + tab3().should('have.class', 'cmp-tabs__tab--active'); + cy.get(`.${bemBlock}`).should('exist') + }); + + it("should render filled values with labels and edit buttons", () => { + fillFirstTab(); + fillSecondTab(); + // Check review component + tab3().click(); + cy.get(`.${bemBlock}`).should('exist'); + cy.get(`.${bemBlock}__container`).should('exist'); + cy.get(`.${bemBlock}__container`).children(`.${bemBlock}__panel`).should('have.length', 2); + cy.get(`.${bemBlock}__container`).then(() => { + checkFirstPanel(); + }); + cy.get(`.${bemBlock}__container`).then(() => { + checkSecondPanel(); + }); + }); + + it("should focus on the first field of the panel when clicking the edit button of the panel", () => { + fillFirstTab(); + fillSecondTab(); + tab3().click(); + cy.get(`.panelcontainer1724402234656 .${bemBlock}__label-container .${bemBlock}__edit-button`).click().then(() => { + cy.get('input[name="textinput1724402270046"]').should('be.focused').and('have.value', 'john'); + }); + }); + + it("should render repeatable panel with filled values and edit buttons", () => { + fillFirstTab(); + fillSecondTab(); + fillSecondRepeatablePanel() + tab3().click(); + cy.get(`.${bemBlock}__container`).then(() => { + checkSecondPanel(); + }); + cy.get(`.${bemBlock}__container`).then(() => { + checkSecondRepeatablePanel(); + }); + }); + + it("should focus on the second repeatable panel when clicking the edit button of the repeatable panel", () => { + fillFirstTab(); + fillSecondTab(); + fillSecondRepeatablePanel() + tab3().click(); + cy.get(`.${bemBlock}__panel--repeatable`).eq(1).find(`.${bemBlock}__label-container .${bemBlock}__edit-button`).click().then(() => { + cy.get('input[name="textinput1724402488097"]').eq(1).should('be.focused').and('have.value', 'sector 132'); + }); + }); + +}); + + diff --git a/ui.tests/test-module/specs/review/review.runtime.spec.js b/ui.tests/test-module/specs/review/review.runtime.spec.js new file mode 100644 index 0000000000..b5b39d7396 --- /dev/null +++ b/ui.tests/test-module/specs/review/review.runtime.spec.js @@ -0,0 +1,172 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ + +describe("Form with Review component", () => { + + const pagePath = "content/forms/af/core-components-it/samples/review/basic.html"; + const bemBlock = 'cmp-adaptiveform-review'; + let formContainer = null; + + beforeEach(() => { + cy.previewForm(pagePath).then(p => { + formContainer = p; + }) + }); + + const tabSelector = 'ol li'; + const tab1 = () => { + return cy.get(tabSelector).eq(0); + } + const tab2 = () => { + return cy.get(tabSelector).eq(1); + } + const tab3 = () => { + return cy.get(tabSelector).eq(2); + } + const fillFirstTab = () => { + tab1().click(); + cy.get('input[name="textinput1724402270046"]').type('john'); + cy.get('input[name="textinput_16829110921724402298524"]').type('deo'); + cy.get('input[name="emailinput1724402315995"]').type('abc@gmail.com'); + cy.get('input[name="telephoneinput1724402330900"]').type('+91987654321'); + cy.get('input[name="datepicker1724402449174"]').type('2020-10-10'); + cy.get(`#gender_id-widget`).find("input").eq(0).click(); + cy.get(`#interest_id-widget`).find("input").eq(0).click(); + cy.get(`#interest_id-widget`).find("input").eq(1).click(); + } + const fillSecondTab = () => { + tab2().click(); + cy.get('input[name="textinput1724402488097"]').type('adobe system'); + cy.get('input[name="textinput_19265691141724402493991"]').type('noida'); + cy.get('select[name="dropdown1724402520718"]').select("UP") + cy.get('input[name="numberinput1724402569060"]').type('123456'); + } + + // Verify the first panel + const checkFirstPanel = () => { + cy.get(`.${bemBlock}__container .${bemBlock}__panel`).within(() => { + cy.get(`.${bemBlock}__label-container`).should('exist'); + cy.get(`.${bemBlock}__label`).contains('Personal Information'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'false'); + + cy.get(`.${bemBlock}__content`).should('exist').within(() => { + cy.get(`.${bemBlock}__field`).eq(0).within(() => { + cy.get(`.${bemBlock}__label`).contains('First name'); + cy.get(`.${bemBlock}__value`).contains('john'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + + cy.get(`.${bemBlock}__field`).eq(1).within(() => { + cy.get(`.${bemBlock}__label`).contains('Last name'); + cy.get(`.${bemBlock}__value`).contains('deo'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + + cy.get(`.${bemBlock}__field`).eq(2).within(() => { + cy.get(`.${bemBlock}__label`).contains('Full name'); + cy.get(`.${bemBlock}__value`).contains('johndeo'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'disabled'); + }); + + cy.get(`.${bemBlock}__field`).eq(3).within(() => { + cy.get(`.${bemBlock}__label`).contains('Email Address'); + cy.get(`.${bemBlock}__value`).contains('abc@gmail.com'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + + cy.get(`.${bemBlock}__field`).eq(4).within(() => { + cy.get(`.${bemBlock}__label`).contains('Mobile Number'); + cy.get(`.${bemBlock}__value`).contains('+91987654321'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + + cy.get(`.${bemBlock}__field`).eq(5).within(() => { + cy.get(`.${bemBlock}__label`).contains('DOB'); + cy.get(`.${bemBlock}__value`).contains('2020-10-10'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + + cy.get(`.${bemBlock}__field`).eq(6).within(() => { + cy.get(`.${bemBlock}__label`).contains('Gender'); + cy.get(`.${bemBlock}__value`).contains('Male'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + + cy.get(`.${bemBlock}__field`).eq(7).within(() => { + cy.get(`.${bemBlock}__label`).contains('Interest'); + cy.get(`.${bemBlock}__value`).contains('Music , Football'); + cy.get(`.${bemBlock}__edit-button`).should('have.attr', 'data-cmp-visible', 'true'); + }); + }); + }); + } + + it("should render tabs on top with review component", () => { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get('.cmp-tabs').should('have.length', 1); + cy.get('.cmp-tabs__tab').should('have.length', 3); + tab3().click(); + tab3().should('have.class', 'cmp-tabs__tab--active'); + cy.get(`.${bemBlock}`).should('exist') + }); + + it("should render linked panel (Tab 1) and check filled value", () => { + fillFirstTab(); + fillSecondTab(); + tab3().click(); + cy.get(`.${bemBlock}`).should('exist'); + cy.get(`.${bemBlock}__container`).should('exist'); + cy.get(`.${bemBlock}__container`).should('contain', 'Personal Information'); + cy.get(`.${bemBlock}__container`).then(() => { + checkFirstPanel(); + }); + }); + + it("should not render unlinked panel", () => { + tab3().click(); + cy.get(`.${bemBlock}__panel`).should('have.length', 1); + cy.get(`.${bemBlock}__panel`).find('Address').should('not.exist'); + cy.get(`.${bemBlock}__panel`).find('Address 1').should('not.exist'); + cy.get(`.${bemBlock}__panel`).find('City').should('not.exist'); + }); + + it("should focus on the first field of the panel when clicking the edit button of the panel", () => { + fillFirstTab(); + tab3().click(); + cy.get(`.textinput1724402270046 .${bemBlock}__edit-button`).click().then(() => { + cy.get('input[name="textinput1724402270046"]').should('be.focused').and('have.value', 'john'); + }); + }); + + it("Edit button should be disabled for disabled field", () => { + fillFirstTab(); + tab3().click(); + cy.get(`.textinput_19678416231729233302926 .${bemBlock}__edit-button`).should('have.attr', 'disabled'); + }); + + it("Hidden field should not be visible", () => { + tab3().click(); + cy.get(`.${bemBlock}__container .hidden_name`).should('not.exist'); + }); + + it("Button field should not be visible", () => { + tab3().click(); + cy.get(`.${bemBlock}__container .hidden_button`).should('not.exist'); + }); +}); + + diff --git a/ui.tests/test-module/specs/ruleeditor/authoring/navigatePanel.authoring.cy.js b/ui.tests/test-module/specs/ruleeditor/authoring/navigatePanel.authoring.cy.js new file mode 100644 index 0000000000..849dfed11b --- /dev/null +++ b/ui.tests/test-module/specs/ruleeditor/authoring/navigatePanel.authoring.cy.js @@ -0,0 +1,119 @@ +const commons = require('../../../libs/commons/commons'), + sitesSelectors = require('../../../libs/commons/sitesSelectors'), + formsSelectors = require('../../../libs/commons/guideSelectors'), + afConstants = require('../../../libs/commons/formsConstants'); + +describe('Rule editor navigate-in-panel rule authoring',function(){ + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + + context('Open Forms Editor', function() { + const formPath = "/content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/blank", + formContainerPath = formPath + afConstants.FORM_EDITOR_FORM_CONTAINER_SUFFIX, + buttonEditPath = formContainerPath + "/" + afConstants.components.forms.resourceType.formbutton.split("/").pop(), + panelEditPath = formContainerPath + "/" + afConstants.components.forms.resourceType.panelcontainer.split("/").pop(), + buttonEditPathSelector = "[data-path='" + buttonEditPath + "']"; + + it('should add rule to focus previousItem in Panel on button click', function () { + if (toggle_array.includes("FT_FORMS-10781")) { + cy.openAuthoring(formPath); + cy.selectLayer("Edit"); + cy.get(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']").should("exist"); + + cy.insertComponent(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']", + "Adaptive Form Panel", afConstants.components.forms.resourceType.panelcontainer); + cy.get(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/panelcontainer/*']").should("exist"); + cy.wait(1000); + + cy.insertComponent(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/panelcontainer/*']", + "Adaptive Form Text Box", afConstants.components.forms.resourceType.formtextinput); + cy.insertComponent(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/panelcontainer/*']", + "Adaptive Form Text Box", afConstants.components.forms.resourceType.formtextinput); + + cy.insertComponent(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']", + "Adaptive Form Button", afConstants.components.forms.resourceType.formbutton); + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + buttonEditPathSelector); + + // Edit rule option not existing on button toolbar + cy.get(formsSelectors.ruleEditor.action.editRule).should("exist"); + cy.initializeEventHandlerOnChannel("af-rule-editor-initialized").as("isRuleEditorInitialized"); + cy.get(formsSelectors.ruleEditor.action.editRule).click(); + + // click on create option from rule editor header + cy.get("@isRuleEditorInitialized").its('done').should('equal', true); + createNavigateInPanelRule(); + + // check and close rule editor + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).click(); + + cy.get(sitesSelectors.overlays.overlay.component + buttonEditPathSelector).should("exist"); + cy.selectLayer("Edit"); + cy.deleteComponentByPath(buttonEditPath); + cy.deleteComponentByPath(panelEditPath); + } + }) + }) + + const createNavigateInPanelRule = function() { + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.createRuleButton).should("be.visible").click(); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sideToggleButton + ":first").click(); + + // // Forms Objects option is not existing on side panel + // cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sidePanelFormObjectTab).should("exist"); + // cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sidePanelFormObjectTab).then($el => { + // expect($el.text().trim()).to.equal("Form Objects"); + // }) + // + // // Functions option is not existing on side panel + // cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sidePanelFunctionObjectTab).should("exist"); + // cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sidePanelFunctionObjectTab).then($el => { + // expect($el.text().trim()).to.equal("Functions"); + // }) + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .child-choice-name").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .child-choice-name").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .expeditor-customoverlay.is-open coral-selectlist-item[value='EVENT_SCRIPTS']") + .click({force: true}); + + // select the component for which rule is to written i.e. Button here + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.EVENT_AND_COMPARISON_OPERATOR + " .choice-view-default").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.EVENT_AND_COMPARISON_OPERATOR + " .choice-view-default").click(); + + // IS CLICKED option not existing in 'OPERATIONS' dropdown + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.IS_CLICKED).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.IS_CLICKED).click(); + + // check and click on dropdown to view the actions available + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.BLOCK_STATEMENT + " .choice-view-default").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.BLOCK_STATEMENT + " .choice-view-default").click(); + + // select HIDE action from dropdown + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.NAVIGATE_IN_PANEL).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.NAVIGATE_IN_PANEL).click({force: true}); + + cy.getRuleEditorIframe().find(".PANEL_FOCUS_OPTION").should("exist"); + cy.getRuleEditorIframe().find(".PANEL_FOCUS_OPTION").click(); + + cy.getRuleEditorIframe().find(".PANEL_FOCUS_OPTION coral-selectlist [value='PREVIOUS_ITEM']").click({force: true}); + + cy.getRuleEditorIframe().find(".terminal-view.PANEL.VARIABLE").should("be.visible"); + cy.getRuleEditorIframe().find(".terminal-view.PANEL.VARIABLE").click(); + + cy.getRuleEditorIframe().find(".terminal-view.PANEL.VARIABLE coral-overlay.is-open .expression-selectlist coral-selectlist-item:first").click({force: true}); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.saveRule).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.saveRule).click(); + + // check if rule is created + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.ruleSummary.CREATED_RULE).should("exist"); + } +}) diff --git a/ui.tests/test-module/specs/ruleeditor/ruleEditor.authoring.cy.js b/ui.tests/test-module/specs/ruleeditor/authoring/ruleEditor.authoring.cy.js similarity index 73% rename from ui.tests/test-module/specs/ruleeditor/ruleEditor.authoring.cy.js rename to ui.tests/test-module/specs/ruleeditor/authoring/ruleEditor.authoring.cy.js index b2875adb53..f07808d426 100644 --- a/ui.tests/test-module/specs/ruleeditor/ruleEditor.authoring.cy.js +++ b/ui.tests/test-module/specs/ruleeditor/authoring/ruleEditor.authoring.cy.js @@ -1,7 +1,7 @@ -const commons = require('../../libs/commons/commons'), - sitesSelectors = require('../../libs/commons/sitesSelectors'), - formsSelectors = require('../../libs/commons/guideSelectors'), - afConstants = require('../../libs/commons/formsConstants'); +const commons = require('../../../libs/commons/commons'), + sitesSelectors = require('../../../libs/commons/sitesSelectors'), + formsSelectors = require('../../../libs/commons/guideSelectors'), + afConstants = require('../../../libs/commons/formsConstants'); describe('Rule editor authoring sanity for core-components',function(){ let toggle_array = []; @@ -76,6 +76,113 @@ describe('Rule editor authoring sanity for core-components',function(){ cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).click(); } + const createRuleToHideTextInputOnEqualityOperator = function() { + // Edit rule option not existing on button toolbar + cy.get(formsSelectors.ruleEditor.action.editRule).should("exist"); + cy.initializeEventHandlerOnChannel("af-rule-editor-initialized").as("isRuleEditorInitialized"); + cy.get(formsSelectors.ruleEditor.action.editRule).click(); + + // click on create option from rule editor header + cy.get("@isRuleEditorInitialized").its('done').should('equal', true); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.createRuleButton).should("be.visible").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sideToggleButton + ":first").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .child-choice-name").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .child-choice-name").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .expeditor-customoverlay.is-open coral-selectlist-item[value='EVENT_SCRIPTS']") + .click({force: true}); + + // select the component for which rule is to written i.e. Button here + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.EVENT_AND_COMPARISON_OPERATOR + " .choice-view-default").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.EVENT_AND_COMPARISON_OPERATOR + " .choice-view-default").click(); + + // EQUALS option not existing in 'OPERATIONS' dropdown + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.EQUALS_TO).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.EQUALS_TO).click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STRING_LITERAL).type('abc'); + cy.getRuleEditorIframe().find(".delete-else-button").click(); + + // check and click on dropdown to view the actions available + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.BLOCK_STATEMENT + " .choice-view-default").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.BLOCK_STATEMENT + " .choice-view-default").click(); + + // select HIDE action from dropdown + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.HIDE).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.operator.HIDE).click(); + + cy.getRuleEditorIframe().find(".terminal-view.AFCOMPONENT.VARIABLE").should("be.visible"); + cy.getRuleEditorIframe().find(".terminal-view.AFCOMPONENT.VARIABLE").click(); + + cy.getRuleEditorIframe().find(".terminal-view.AFCOMPONENT.VARIABLE coral-overlay.is-open .expression-selectlist coral-selectlist-item:first").click({force: true}); + + cy.intercept('POST', /content\/forms\/af\/core-components-it\/samples\/ruleeditor\/blank.*/).as('ruleEditorRequest'); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.saveRule).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.saveRule).click(); + + cy.wait('@ruleEditorRequest').then((interception) => { + expect(interception.response.statusCode).to.equal(201); + const submittedData = Object.fromEntries(new URLSearchParams(interception.request.body)); + expect(submittedData[":content"]).contains("\"fd:events\":{\"change\":[\"if(contains($event.payload.changes[].propertyName, 'value'), if($field.$value == 'abc', {visible : false()}, {}), {})\"]}"); + }); + + // check and close rule editor + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).click(); + } + + const createRuleToValidateDate = function() { + // Edit rule option not existing on button toolbar + cy.get(formsSelectors.ruleEditor.action.editRule).should("exist"); + cy.initializeEventHandlerOnChannel("af-rule-editor-initialized").as("isRuleEditorInitialized"); + cy.get(formsSelectors.ruleEditor.action.editRule).click(); + + // click on create option from rule editor header + cy.get("@isRuleEditorInitialized").its('done').should('equal', true); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.createRuleButton).should("be.visible").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.sideToggleButton + ":first").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .child-choice-name").should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .child-choice-name").click(); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.choiceModels.STATEMENT + " .expeditor-customoverlay.is-open coral-selectlist-item[value='VALIDATE_EXPRESSION']") + .click({force: true}); + + // select the component for which rule is to written i.e. Button here + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .EXPRESSION").first().click(); + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .EXPRESSION").first().find("coral-selectlist-item[title='Date Input']:first").click(); + + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .OPERATOR").click(); + cy.getRuleEditorIframe().find("coral-selectlist-item[value='IS_BEFORE']").click(); + + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .EXPRESSION").last().click(); + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .EXPRESSION").last().find(".selectlist-header").click(); + cy.getRuleEditorIframe().find("coral-selectlist-item[value='FUNCTION_CALL']").click(); + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .EXPRESSION").last().click(); + cy.getRuleEditorIframe().find(".COMPARISON_EXPRESSION .sequence-view-cell .EXPRESSION").last().find("coral-selectlist-item[value='today']").click(); + + cy.intercept('POST', /content\/forms\/af\/core-components-it\/samples\/ruleeditor\/blank.*/).as('ruleEditorRequest'); + + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.saveRule).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.saveRule).click(); + cy.wait('@ruleEditorRequest').then((interception) => { + expect(interception.response.statusCode).to.equal(201); + const submittedData = Object.fromEntries(new URLSearchParams(interception.request.body)); + expect(submittedData[":content"]).contains("dateToDaysSinceEpoch($field.$value)<dateToDaysSinceEpoch(today())"); + }); + + // check if rule is created + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.ruleSummary.DATE_PICKER_RULE).should("exist"); + + // check and close rule editor + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).should("exist"); + cy.getRuleEditorIframe().find(formsSelectors.ruleEditor.action.closeRuleEditor).click(); + } + const createRuleToSaveFormOnButtonClick = function() { // Edit rule option not existing on button toolbar cy.get(formsSelectors.ruleEditor.action.editRule).should("exist"); @@ -227,8 +334,11 @@ describe('Rule editor authoring sanity for core-components',function(){ saveFormContainerPath = saveFormPath + afConstants.FORM_EDITOR_FORM_CONTAINER_SUFFIX, textinputEditPath = formContainerPath + "/" + afConstants.components.forms.resourceType.formtextinput.split("/").pop(), buttonEditPath = formContainerPath + "/" + afConstants.components.forms.resourceType.formbutton.split("/").pop(), + datePickerEditPath = formContainerPath + "/" + afConstants.components.forms.resourceType.datepicker.split("/").pop(), saveButtonEditPath = saveFormContainerPath + "/" + afConstants.components.forms.resourceType.formbutton.split("/").pop(), buttonEditPathSelector = "[data-path='" + buttonEditPath + "']", + textinputEditPathSelector = "[data-path='" + textinputEditPath + "']", + datePickerEditPathSelector = "[data-path='" + datePickerEditPath + "']", saveButtonEditPathSelector = "[data-path='" + saveButtonEditPath + "']", submitFormButtonEditPath = submitFormContainerPath + "/" + afConstants.components.forms.resourceType.submitButton.split("/").pop(), submitFormButtonEditPathSelector = "[data-path='" + submitFormButtonEditPath + "']"; @@ -282,7 +392,7 @@ describe('Rule editor authoring sanity for core-components',function(){ * 12 Close rule editor * 13 Check if button is visible */ - it('should add rule on button to disable a text box', function () { + it('should add rule on button to hide a text box', function () { cy.openAuthoring(formPath); cy.selectLayer("Edit"); cy.get(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']").should("exist"); @@ -301,6 +411,45 @@ describe('Rule editor authoring sanity for core-components',function(){ cy.deleteComponentByPath(buttonEditPath); }) + if (cy.af.isLatestAddon()) { + it('should add validation rule on date fields', function () { + cy.openAuthoring(formPath); + cy.selectLayer("Edit"); + cy.get(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']").should("exist"); + + cy.insertComponent(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']", + "Adaptive Form Date Picker", afConstants.components.forms.resourceType.datepicker); + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + datePickerEditPathSelector); + + createRuleToValidateDate(); + cy.get(sitesSelectors.overlays.overlay.component + datePickerEditPathSelector).should("exist"); + + cy.selectLayer("Edit"); + cy.deleteComponentByPath(datePickerEditPath); + }) + } + + it('should add rule on texbox equality operator to hide a text box', function () { + cy.openAuthoring(formPath); + cy.selectLayer("Edit"); + cy.get(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']").should("exist"); + + cy.insertComponent(sitesSelectors.overlays.overlay.component + "[data-path='" + formContainerPath + "/*']", + "Adaptive Form Text Box", afConstants.components.forms.resourceType.formtextinput); + // cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + textinputEditPathSelector); + // cy.get(formsSelectors.ruleEditor.action.configure).should("exist"); + // cy.get(formsSelectors.ruleEditor.action.configure).click(); + // cy.get(".cmp-adaptiveform-base__editdialogbasic [name='./name']").clear().type("textinput"); + // cy.get(".cq-dialog-actions.cq-dialog-submit").click(); + + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + textinputEditPathSelector); + + createRuleToHideTextInputOnEqualityOperator(); + cy.get(sitesSelectors.overlays.overlay.component + textinputEditPathSelector).should("exist"); + + cy.selectLayer("Edit"); + cy.deleteComponentByPath(textinputEditPath); + }) it('should add submission handler rules on form', function () { if (cy.af.isLatestAddon() && toggle_array.includes("FT_FORMS-13209")) { diff --git a/ui.tests/test-module/specs/ruleeditor/ruleEditor.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/ruleEditor.runtime.cy.js deleted file mode 100644 index 82bf3dec99..0000000000 --- a/ui.tests/test-module/specs/ruleeditor/ruleEditor.runtime.cy.js +++ /dev/null @@ -1,234 +0,0 @@ -describe('Rule editor runtime sanity for core-components',function(){ - const formPath = "/content/forms/af/core-components-it/samples/ruleeditor/basic.html"; - let formContainer = null; - let toggle_array = []; - - before(() => { - cy.fetchFeatureToggles().then((response) => { - if (response.status === 200) { - toggle_array = response.body.enabled; - } - }); - }); - - /** - * initialization of form container before every test - * */ - beforeEach(() => { - cy.previewForm(formPath).then(p => { - formContainer = p; - }); - }); - - if (cy.af.isLatestAddon()) { - it("should have merged custom function list registered in FunctionRuntime from both clientlibs", () => { - expect(formContainer, "formcontainer is initialized").to.not.be.null; - let func; - cy.window().then(win => { - func = win.FormView.FunctionRuntime.customFunctions.testFunction1; // from corecomponent.it.customfunction - expect(func).to.not.be.null; - expect(func).to.not.be.undefined; - - func = win.FormView.FunctionRuntime.customFunctions.testSubmitFormPreprocessor; // from corecomponent.it.customfunction - expect(func).to.not.be.null; - expect(func).to.not.be.undefined; - - func = win.FormView.FunctionRuntime.customFunctions.testSetProperty; // from corecomponent.it.customfunction2 - expect(func).to.not.be.null; - expect(func).to.not.be.undefined; - }) - }) - } - - /** - * Runtime ruleSanity for button to change label of textbox - * [when button is clicked the textbox field label should change using custom function] - */ - it("should change textinput label on button click", () => { - if (cy.af.isLatestAddon() && toggle_array.includes("FT_FORMS-11541")) { - expect(formContainer, "formcontainer is initialized").to.not.be.null; - cy.get(`.cmp-adaptiveform-button__widget`).click() - const [textbox1, textBox1FieldView] = Object.entries(formContainer._fields)[0]; - cy.get(`#${textbox1}`).find("div > label").should('have.text', "Changed Label") - } - }) -}) - -describe("Rule editor submission handler runtime", () => { - let toggle_array = []; - - before(() => { - cy.fetchFeatureToggles().then((response) => { - if (response.status === 200) { - toggle_array = response.body.enabled; - } - }); - }); - const submitSuccessHardcodedHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitsuccesshardcodedhandler.html" - const submitErrorHardcodedHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submiterrorhardcodedhandler.html" - const submitDefaultSuccessHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitdefaultsuccesshandler.html" - const submitDefaultErrorHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitdefaulterrorhandler.html" - const submitCustomSuccessHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitcustomsuccesshandler.html" - const submitCustomErrorHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitcustomerrorhandler.html" - const bemBlock = 'cmp-button' - const IS = "adaptiveFormButton" - const selectors = { - submit: `[data-cmp-is="${IS}"]` - } - - let formContainer = null; - - it("Hardcoded submitSuccess handler should handle successful form submission", () => { - cy.previewForm(submitSuccessHardcodedHandler); - cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { - cy.get('body').should('contain', "Thank you for submitting the form.\n") - }); - }); - - it("Default submitSuccess handler should handle successful form submission", () => { - if (cy.af.isLatestAddon() && toggle_array.includes("FT_FORMS-13209")) { - cy.previewForm(submitDefaultSuccessHandler); - cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { - cy.get('body').should('contain', "Thank you for submitting the form.\n") - }); - } - }); - - it("Custom submitSuccess handler should handle successful form submission", () => { - if (cy.af.isLatestAddon() && toggle_array.includes("FT_FORMS-13209")) { - cy.previewForm(submitCustomSuccessHandler); - cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { - cy.get('.modal .success-message').should('contain', "Thank you for submitting the form.") - }); - } - }); - - it("Hardcoded submitError handler should handle form submission error", () => { - cy.previewForm(submitErrorHardcodedHandler); - - cy.window().then(win => { - let alertFired = false; - - // Stub the window alert to capture the alert message and set alertFired to true - cy.stub(win, 'alert').callsFake((message) => { - expect(message).to.equal('Encountered an internal error while submitting the form.'); - alertFired = true; - }); - - // Click the submit button - cy.get('.cmp-adaptiveform-button__widget').click().then(() => { - // Use cy.wrap to ensure Cypress waits for the promise to resolve - cy.wrap(null).should(() => { - expect(alertFired).to.be.true; - }); - }); - }); - }); - - it("Default submitError handler should handle form submission error", () => { - if (cy.af.isLatestAddon() && toggle_array.includes("FT_FORMS-13209")) { - cy.previewForm(submitDefaultErrorHandler); - - cy.window().then(win => { - let alertFired = false; - - // Stub the window alert to capture the alert message and set alertFired to true - cy.stub(win, 'alert').callsFake((message) => { - expect(message).to.equal('Form submission failed!'); - alertFired = true; - }); - - // Click the submit button - cy.get('.cmp-adaptiveform-button__widget').click().then(() => { - // Use cy.wrap to ensure Cypress waits for the promise to resolve - cy.wrap(null).should(() => { - expect(alertFired).to.be.true; - }); - }); - }); - } - }); - - it("Custom submitError handler should handle form submission error", () => { - if (cy.af.isLatestAddon() && toggle_array.includes("FT_FORMS-13209")) { - cy.previewForm(submitCustomErrorHandler); - let alertFired = false; - cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { - cy.get('.modal .error-message').should('contain', "Custom Form submission failed!") - }); - } - }); -}) - -describe("Rule editor save handler runtime", () => { - - let toggle_array = []; - - before(() => { - cy.fetchFeatureToggles().then((response) => { - if (response.status === 200) { - toggle_array = response.body.enabled; - } - }); - }); - - const saveRunTime = "content/forms/af/core-components-it/samples/ruleeditor/save/saveruntime.html" - - it("should save formData on button click", () => { - if (toggle_array.includes("FT_FORMS-11581")) { - - const saveApiResponse = { - 'draftId': 'ABC' - }; - // Rule when button is clicked then save call should trigger - cy.intercept('POST' , '**/adobe/forms/af/save/*', saveApiResponse).as('afSave'); - - cy.previewForm(saveRunTime); - - cy.get(`.cmp-adaptiveform-button__widget`).click(); - - cy.wait('@afSave').then(({request, response}) => { - // Check the request payload - expect(request.body).to.be.not.null; - - expect(response.statusCode).to.equal(200); - expect(response.body).to.be.not.null; - expect(response.body.draftId).to.equal('ABC'); - }); - } - }) -}) - - -describe('Rule editor properties on form initialize test', () => { - const pagePath = "content/forms/af/core-components-it/samples/ruleeditor/set_property_test.html" - let formContainer = null; - - before(() => { - cy.previewForm(pagePath).then(p => { - formContainer = p; - }) - }); - - it("Check properties are properly set on form initialize", () => { - const [checkBoxId, checkBoxFieldView] = Object.entries(formContainer._fields)[0] - const [fileInputId, fileInputView] = Object.entries(formContainer._fields)[1] - - const checkProperties = (id, bemBlock, labelSelector, expectedLabel, expectedDescription) => { - cy.get(`#${id}`).invoke('attr', 'data-cmp-required').should('eq', 'true'); - cy.get(`#${id} ${labelSelector}`) - .should('have.text', expectedLabel); - // cy.get(`#${id}__longdescription p`) - // .should('have.text', expectedDescription); - - cy.get(`#${id}`).find(`.${bemBlock}__questionmark`).click(); - // long description should be shown - cy.get(`#${id}`).find(`.${bemBlock}__longdescription`).invoke('attr', 'data-cmp-visible') - .should('not.exist'); - cy.get(`#${id}`).find(`.${bemBlock}__longdescription`) - .should('contain.text', expectedDescription); - } - checkProperties(checkBoxId, 'cmp-adaptiveform-checkboxgroup', '.cmp-adaptiveform-checkboxgroup__label', 'Updated CheckBox', 'This is a long description of checkboxgroup'); - checkProperties(fileInputId, 'cmp-adaptiveform-fileinput', '.cmp-adaptiveform-fileinput__label', 'Updated File Input Label', 'File Input Description'); - }); -}) diff --git a/ui.tests/test-module/specs/ruleeditor/customFunction.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/runtime/customFunction.runtime.cy.js similarity index 100% rename from ui.tests/test-module/specs/ruleeditor/customFunction.runtime.cy.js rename to ui.tests/test-module/specs/ruleeditor/runtime/customFunction.runtime.cy.js diff --git a/ui.tests/test-module/specs/ruleeditor/runtime/navigatePanel.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/runtime/navigatePanel.runtime.cy.js new file mode 100644 index 0000000000..b96c97a475 --- /dev/null +++ b/ui.tests/test-module/specs/ruleeditor/runtime/navigatePanel.runtime.cy.js @@ -0,0 +1,107 @@ +describe("Rule editor navigate in panel runtime", () => { + let toggle_array = []; + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + + const formsPage = "content/forms/af/core-components-it/samples/ruleeditor/navigate-in-panel/basic.html" + let formContainer = null; + + it("should navigate to next item in panel", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-b1a2a445a1-widget').click(); + cy.get('#button-46e2481a3f-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-46e2481a3f-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-4ab644c5b9-widget'); + } + }); + + it("should navigate to previous item in panel", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-4ab644c5b9-widget').click(); + cy.get('#button-56f02db62a-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-56f02db62a-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-b1a2a445a1-widget'); + } + }); + + it("should navigate to next panel in wizard", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-e2985267ed-widget').click(); + cy.get('#button-aae7ec869b-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-aae7ec869b-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-adb1f55685-widget'); + } + }); + + it("should navigate to previous panel in wizard", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-e2985267ed-widget').click(); + cy.get('#button-aae7ec869b-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-aae7ec869b-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-eb427c0e82-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-eb427c0e82-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-e2985267ed-widget'); + } + }); + + it("should navigate to next panel in HorizontalTabs", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-cc08c3e84a-widget').click(); + cy.get('#button-4e44ce2042-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-4e44ce2042-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-77fa9bd1dc-widget'); + } + }); + + it("should navigate to previous panel in HorizontalTabs", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-cc08c3e84a-widget').click(); + cy.get('#button-4e44ce2042-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-4e44ce2042-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-e75d381952-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-e75d381952-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-cc08c3e84a-widget'); + } + }); + + it("should navigate to next panel in VerticalTabs", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-802818ca90-widget').click(); + cy.get('#button-ff091257b7-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-ff091257b7-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-d227c4c481-widget'); + } + }); + + it("should navigate to previous panel in VerticalTabs", () => { + if(toggle_array.includes("FT_FORMS-10781")) { + cy.previewForm(formsPage); + cy.get('#textinput-802818ca90-widget').click(); + cy.get('#button-ff091257b7-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-ff091257b7-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-2c88dbcca7-widget > .cmp-adaptiveform-button__text').click(); + cy.get('#button-2c88dbcca7-widget > .cmp-adaptiveform-button__text').click(); + + cy.focused().should('have.attr', 'id', 'textinput-802818ca90-widget'); + } + }); +}) diff --git a/ui.tests/test-module/specs/ruleeditor/runtime/ruleEditorSanity.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/runtime/ruleEditorSanity.runtime.cy.js new file mode 100644 index 0000000000..92a57af3a3 --- /dev/null +++ b/ui.tests/test-module/specs/ruleeditor/runtime/ruleEditorSanity.runtime.cy.js @@ -0,0 +1,120 @@ +describe('Rule editor runtime sanity for core-components',function(){ + const formPath = "/content/forms/af/core-components-it/samples/ruleeditor/basic.html"; + let formContainer = null; + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + + /** + * initialization of form container before every test + * */ + beforeEach(() => { + cy.previewForm(formPath).then(p => { + formContainer = p; + }); + }); + + it("should have merged custom function list registered in FunctionRuntime from both clientlibs", () => { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + let func; + cy.window().then(win => { + func = win.FormView.FunctionRuntime.customFunctions.testFunction1; // from corecomponent.it.customfunction + expect(func).to.not.be.null; + expect(func).to.not.be.undefined; + + func = win.FormView.FunctionRuntime.customFunctions.testSubmitFormPreprocessor; // from corecomponent.it.customfunction + expect(func).to.not.be.null; + expect(func).to.not.be.undefined; + + func = win.FormView.FunctionRuntime.customFunctions.testSetProperty; // from corecomponent.it.customfunction2 + expect(func).to.not.be.null; + expect(func).to.not.be.undefined; + }) + }) + + if (cy.af.isLatestAddon()) { + it("should validate start and end date", () => { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + console.log(formContainer._fields); + const [startDate, startDateFieldView] = Object.entries(formContainer._fields)[0]; + cy.get(`#${startDate}`).find("input").clear().type(getCurrentDateOffsetBy(-1)).blur().then(x => { + const startDateModel = formContainer._model.getElement(startDate); + expect(startDateModel.getState().valid).to.equal(true); + }); + const [endDate, endDateFieldView] = Object.entries(formContainer._fields)[1]; + cy.get(`#${endDate}`).find("input").clear().type(getCurrentDateOffsetBy(+1)).blur().then(x => { + const endDateModel = formContainer._model.getElement(endDate); + expect(endDateModel.getState().valid).to.equal(true); + }); + + //invalid start value + cy.get(`#${startDate}`).find("input").clear().type(getCurrentDateOffsetBy(+1)).blur().then(x => { + const startDateModel = formContainer._model.getElement(startDate); + expect(startDateModel.getState().valid).to.equal(false); + }); + }) + } + + function getCurrentDateOffsetBy(days) { + const today = new Date(); + today.setDate(today.getDate() + days); + + const day = String(today.getDate()).padStart(2, '0'); // Get day and pad with leading zero if necessary + const month = String(today.getMonth() + 1).padStart(2, '0'); // Get month (0-based index) and pad with leading zero if necessary + const year = today.getFullYear(); // Get full year + + return `${year}-${month}-${day}`; // Format the date as yyyy-mm-dd + } + + /** + * Runtime ruleSanity for button to change label of textbox + * [when button is clicked the textbox field label should change using custom function] + */ + it("should change textinput label on button click", () => { + if (toggle_array.includes("FT_FORMS-11541")) { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get(`.cmp-adaptiveform-button__widget`).click() + const [textbox1, textBox1FieldView] = Object.entries(formContainer._fields)[2]; + cy.get(`#${textbox1}`).find("div > label").should('have.text', "Changed Label") + } + }) +}) + +describe('Rule editor properties on form initialize test', () => { + const pagePath = "content/forms/af/core-components-it/samples/ruleeditor/set_property_test.html" + let formContainer = null; + + before(() => { + cy.previewForm(pagePath).then(p => { + formContainer = p; + }) + }); + + it("Check properties are properly set on form initialize", () => { + const [checkBoxId, checkBoxFieldView] = Object.entries(formContainer._fields)[0] + const [fileInputId, fileInputView] = Object.entries(formContainer._fields)[1] + + const checkProperties = (id, bemBlock, labelSelector, expectedLabel, expectedDescription) => { + cy.get(`#${id}`).invoke('attr', 'data-cmp-required').should('eq', 'true'); + cy.get(`#${id} ${labelSelector}`) + .should('have.text', expectedLabel); + // cy.get(`#${id}__longdescription p`) + // .should('have.text', expectedDescription); + + cy.get(`#${id}`).find(`.${bemBlock}__questionmark`).click(); + // long description should be shown + cy.get(`#${id}`).find(`.${bemBlock}__longdescription`).invoke('attr', 'data-cmp-visible') + .should('not.exist'); + cy.get(`#${id}`).find(`.${bemBlock}__longdescription`) + .should('contain.text', expectedDescription); + } + checkProperties(checkBoxId, 'cmp-adaptiveform-checkboxgroup', '.cmp-adaptiveform-checkboxgroup__label', 'Updated CheckBox', 'This is a long description of checkboxgroup'); + checkProperties(fileInputId, 'cmp-adaptiveform-fileinput', '.cmp-adaptiveform-fileinput__label', 'Updated File Input Label', 'File Input Description'); + }); +}) diff --git a/ui.tests/test-module/specs/ruleeditor/runtime/saveHandler.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/runtime/saveHandler.runtime.cy.js new file mode 100644 index 0000000000..88f0d4dc0e --- /dev/null +++ b/ui.tests/test-module/specs/ruleeditor/runtime/saveHandler.runtime.cy.js @@ -0,0 +1,38 @@ +describe("Rule editor save handler runtime", () => { + + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + + const saveRunTime = "content/forms/af/core-components-it/samples/ruleeditor/save/saveruntime.html" + + it("should save formData on button click", () => { + if (toggle_array.includes("FT_FORMS-11581")) { + + const saveApiResponse = { + 'draftId': 'ABC' + }; + // Rule when button is clicked then save call should trigger + cy.intercept('POST' , '**/adobe/forms/af/save/*', saveApiResponse).as('afSave'); + + cy.previewForm(saveRunTime); + + cy.get(`.cmp-adaptiveform-button__widget`).click(); + + cy.wait('@afSave').then(({request, response}) => { + // Check the request payload + expect(request.body).to.be.not.null; + + expect(response.statusCode).to.equal(200); + expect(response.body).to.be.not.null; + expect(response.body.draftId).to.equal('ABC'); + }); + } + }) +}) \ No newline at end of file diff --git a/ui.tests/test-module/specs/ruleeditor/runtime/submitHandler.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/runtime/submitHandler.runtime.cy.js new file mode 100644 index 0000000000..6183a34b4c --- /dev/null +++ b/ui.tests/test-module/specs/ruleeditor/runtime/submitHandler.runtime.cy.js @@ -0,0 +1,106 @@ +describe("Rule editor submission handler runtime", () => { + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + const submitSuccessHardcodedHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitsuccesshardcodedhandler.html" + const submitErrorHardcodedHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submiterrorhardcodedhandler.html" + const submitDefaultSuccessHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitdefaultsuccesshandler.html" + const submitDefaultErrorHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitdefaulterrorhandler.html" + const submitCustomSuccessHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitcustomsuccesshandler.html" + const submitCustomErrorHandler = "content/forms/af/core-components-it/samples/ruleeditor/submit/submitcustomerrorhandler.html" + const bemBlock = 'cmp-button' + const IS = "adaptiveFormButton" + const selectors = { + submit: `[data-cmp-is="${IS}"]` + } + + let formContainer = null; + + it("Hardcoded submitSuccess handler should handle successful form submission", () => { + cy.previewForm(submitSuccessHardcodedHandler); + cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { + cy.get('body').should('contain', "Thank you for submitting the form.\n") + }); + }); + + it("Default submitSuccess handler should handle successful form submission", () => { + if (toggle_array.includes("FT_FORMS-13209")) { + cy.previewForm(submitDefaultSuccessHandler); + cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { + cy.get('body').should('contain', "Thank you for submitting the form.\n") + }); + } + }); + + it("Custom submitSuccess handler should handle successful form submission", () => { + if (toggle_array.includes("FT_FORMS-13209")) { + cy.previewForm(submitCustomSuccessHandler); + cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { + cy.get('.modal .success-message').should('contain', "Thank you for submitting the form.") + }); + } + }); + + it("Hardcoded submitError handler should handle form submission error", () => { + cy.previewForm(submitErrorHardcodedHandler); + + cy.window().then(win => { + let alertFired = false; + + // Stub the window alert to capture the alert message and set alertFired to true + cy.stub(win, 'alert').callsFake((message) => { + expect(message).to.equal('Encountered an internal error while submitting the form.'); + alertFired = true; + }); + + // Click the submit button + cy.get('.cmp-adaptiveform-button__widget').click().then(() => { + // Use cy.wrap to ensure Cypress waits for the promise to resolve + cy.wrap(null).should(() => { + expect(alertFired).to.be.true; + }); + }); + }); + }); + + + it("Default submitError handler should handle form submission error", () => { + if (toggle_array.includes("FT_FORMS-13209")) { + cy.previewForm(submitDefaultErrorHandler); + + cy.window().then(win => { + let alertFired = false; + + // Stub the window alert to capture the alert message and set alertFired to true + cy.stub(win, 'alert').callsFake((message) => { + expect(message).to.equal('Form submission failed!'); + alertFired = true; + }); + + // Click the submit button + cy.get('.cmp-adaptiveform-button__widget').click().then(() => { + // Use cy.wrap to ensure Cypress waits for the promise to resolve + cy.wrap(null).should(() => { + expect(alertFired).to.be.true; + }); + }); + }); + } + }); + + it("Custom submitError handler should handle form submission error", () => { + if (toggle_array.includes("FT_FORMS-13209")) { + cy.previewForm(submitCustomErrorHandler); + let alertFired = false; + cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { + cy.get('.modal .error-message').should('contain', "Custom Form submission failed!") + }); + } + }); +}) \ No newline at end of file diff --git a/ui.tests/test-module/specs/ruleeditor/uichange.runtime.cy.js b/ui.tests/test-module/specs/ruleeditor/runtime/uichange.runtime.cy.js similarity index 100% rename from ui.tests/test-module/specs/ruleeditor/uichange.runtime.cy.js rename to ui.tests/test-module/specs/ruleeditor/runtime/uichange.runtime.cy.js diff --git a/ui.tests/test-module/specs/sites/captchaEmbed.runtime.cy.js b/ui.tests/test-module/specs/sites/captchaEmbed.runtime.cy.js index f5f511aacc..11d46e4986 100644 --- a/ui.tests/test-module/specs/sites/captchaEmbed.runtime.cy.js +++ b/ui.tests/test-module/specs/sites/captchaEmbed.runtime.cy.js @@ -16,6 +16,7 @@ describe("Captcha In Sites Runtime Test", () => { const pagePath = "content/forms/sites/core-components-it/site-with-captcha-afv2-form.html"; const hCaptchaPagePath = "content/forms/sites/core-components-it/site-with-hcaptcha-afv2-form.html"; + const turnstilePagePath = "content/forms/sites/core-components-it/site-with-turnstile-afv2-form.html"; const FT_HCAPTCHA = "FT_FORMS-12407"; let formContainer = null; @@ -89,4 +90,20 @@ describe("Captcha In Sites Runtime Test", () => { }) } }) + + it("turnstile should render when form is embedded in site", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_HCAPTCHA)) { + cy.previewForm(turnstilePagePath).then(p => { + formContainer = p; + expect(formContainer, "formcontainer is initialized").to.not.be.null; + expect(formContainer._model.items.length, "model and view elements match").to.equal(Object.keys(formContainer._fields).length); + cy.get('.cmp-adaptiveform-turnstile__widget').should('exist').then($iframe => { + cy.wrap($iframe).then($iframe => { + cy.window().should('have.property', 'turnstile').and('not.be.undefined'); + }); + }); + }) + } + }) + }) diff --git a/ui.tests/test-module/specs/sites/inlineFormInSites.runtime.cy.js b/ui.tests/test-module/specs/sites/inlineFormInSites.runtime.cy.js new file mode 100644 index 0000000000..4fd7906efd --- /dev/null +++ b/ui.tests/test-module/specs/sites/inlineFormInSites.runtime.cy.js @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright 2024 Adobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +import 'cypress-wait-until'; + +describe("Captcha In Sites Runtime Test", () => { + const siteWithRecaptchaScore = "content/forms/sites/core-components-it/site-with-captcha-inline-form.html"; + + let formContainer = null; + + function updateEnterpriseConfig(score) { + const secretKey = Cypress.env('RECAPTCHA_ENT_API_KEY'); + cy.openPage("/mnt/overlay/fd/af/cloudservices/recaptcha/properties.html?item=%2Fconf%2Fcore-components-it%2Fsamples%2Frecaptcha%2Fbasic%2Fsettings%2Fcloudconfigs%2Frecaptcha%2Fentscore").then(x => { + cy.get('#recaptcha-cloudconfiguration-secret-key').clear().type(secretKey); + cy.get('#recaptcha-cloudconfiguration-threshold-score').clear().type(score); + cy.get("#shell-propertiespage-doneactivator").click(); + }) + } + + it("submission should pass for enterprise score based captcha",() => { + if (cy.af.isLatestAddon()) { + updateEnterpriseConfig(0.5); + cy.previewForm(siteWithRecaptchaScore).then((p) => { + formContainer = p; + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get(`div.grecaptcha-badge`).should('exist').then(() => { + cy.intercept('POST', /\/adobe\/forms\/af\/submit\/.*/).as('submitForm'); + const submitForm = () => { + cy.get(`.cmp-adaptiveform-button__widget`).click(); + + // Wait for the submitForm request + return cy.wait('@submitForm',{ timeout: 50000 }).then((interception) => { + if (interception.response.statusCode === 200) { + // Request succeeded + cy.log('Submit request succeeded'); + return cy.wrap(true); + } else { + // Request failed + cy.log(`Submit request failed, retrying...`); + return cy.wrap(false); + } + }); + }; + // Need to submit multiple times until the form is submitted successfully + // Due to below error while validating recaptcha enterprise + // https://cloud.google.com/recaptcha-enterprise/docs/faq#returned_browser_error_when_creating_an_assessment_what_should_i_do_about_this + cy.waitUntil(() => submitForm(), { + errorMsg: 'Maximum retry limit reached, request did not succeed', + timeout: 50000, // Total timeout (10 seconds) + interval: 5000, // Interval between retries (1 second) + }); + }); + }); + } + }) + +}) diff --git a/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.cy.js b/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.cy.js index e47f9aa364..94634c0248 100644 --- a/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.cy.js +++ b/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.cy.js @@ -90,10 +90,13 @@ describe("Form with Panel Container", () => { tab2().should('have.class', 'cmp-tabs__tab--active'); tab2().should('have.attr', 'aria-selected', 'true'); tab1().should('have.attr', 'aria-selected', 'false'); + tab1().should('have.class', 'cmp-tabs__tab--stepped'); tab1().click(); tab1().should('have.class', 'cmp-tabs__tab--active'); + tab1().should('have.class', 'cmp-tabs__tab--stepped'); tab1().should('have.attr', 'aria-selected', 'true'); tab2().should('have.attr', 'aria-selected', 'false'); + tab2().should('have.class', 'cmp-tabs__tab--stepped'); }); it("switch tab in runtime using keyboard", () => { diff --git a/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.repeatability.cy.js b/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.repeatability.cy.js index 68b9332bfa..0e0becc251 100644 --- a/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.repeatability.cy.js +++ b/ui.tests/test-module/specs/tabsontop/tabsontop.runtime.repeatability.cy.js @@ -145,4 +145,40 @@ describe("Form with TabsOnTop Container", () => { }) }); + it("After clicking on every tab, if tab-1 is repeated, the repeated instance should not have stepped class", () => { + getTabs().should('have.length', 4); + getTabPanels().should('have.length', 4); + getTabAtIndex(0).should('have.class', 'cmp-tabs__tab--active'); + getTabPanelAtIndex(0).should('have.class', 'cmp-tabs__tabpanel--active'); + getTabAtIndex(1).click(); + getTabAtIndex(1).should('have.class', 'cmp-tabs__tab--active'); + getTabPanelAtIndex(1).should('have.class', 'cmp-tabs__tabpanel--active'); + getTabAtIndex(0).should('have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(0).should('have.class', 'cmp-tabs__tabpanel--stepped'); + getTabAtIndex(2).click(); + getTabAtIndex(2).should('have.class', 'cmp-tabs__tab--active'); + getTabPanelAtIndex(2).should('have.class', 'cmp-tabs__tabpanel--active'); + getTabAtIndex(1).should('have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(1).should('have.class', 'cmp-tabs__tabpanel--stepped'); + getTabAtIndex(0).should('have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(0).should('have.class', 'cmp-tabs__tabpanel--stepped'); + getTabAtIndex(3).click(); + getTabAtIndex(3).should('have.class', 'cmp-tabs__tab--active'); + getTabPanelAtIndex(3).should('have.class', 'cmp-tabs__tabpanel--active'); + getTabAtIndex(2).should('have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(2).should('have.class', 'cmp-tabs__tabpanel--stepped'); + getTabAtIndex(1).should('have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(1).should('have.class', 'cmp-tabs__tabpanel--stepped'); + getTabAtIndex(0).should('have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(0).should('have.class', 'cmp-tabs__tabpanel--stepped'); + cy.get("button").contains("+R1").click().then(() => { + getTabs().should('have.length', 5); + getTabPanels().should('have.length', 5); + getTabAtIndex(1).should('have.class', 'cmp-tabs__tab--active'); + getTabAtIndex(1).should('not.have.class', 'cmp-tabs__tab--stepped'); + getTabPanelAtIndex(1).should('have.class', 'cmp-tabs__tabpanel--active'); + getTabPanelAtIndex(1).should('not.have.class', 'cmp-tabs__tabpanel--stepped'); + }) + }) + }) diff --git a/ui.tests/test-module/specs/title/titleV2.authoring.cy.js b/ui.tests/test-module/specs/title/titleV2.authoring.cy.js index 76476fdc35..095467dbcc 100644 --- a/ui.tests/test-module/specs/title/titleV2.authoring.cy.js +++ b/ui.tests/test-module/specs/title/titleV2.authoring.cy.js @@ -128,12 +128,14 @@ describe('Page - Authoring', function () { cy.get('[placeholder="New policy"]').eq(1).type("Default policy"); cy.get('[title="Done"]').click(); }).then(() => { - cy.openSiteAuthoring(pagePath); - dropTitleInContainer(); - cy.contains('button', 'Preview').should("exist").click({force : true}); - cy.get('h2').should('exist'); - cy.contains('button', 'Edit').should("exist").click({force : true}); - cy.deleteComponentByTitle('Adaptive Form Title'); + cy.openSiteAuthoring(pagePath); + dropTitleInContainer(); + // Switching from edit layer to preview layer is flaky, so using previewForm method + cy.previewForm(pagePath + ".html"); + cy.get("h2").should("be.visible"); + cy.openPage(""); + cy.openSiteAuthoring(pagePath); + cy.deleteComponentByTitle('Adaptive Form Title'); }) }); }); diff --git a/ui.tests/test-module/specs/turnstile/turnstile.authoring.cy.js b/ui.tests/test-module/specs/turnstile/turnstile.authoring.cy.js new file mode 100644 index 0000000000..86cc5bb3e4 --- /dev/null +++ b/ui.tests/test-module/specs/turnstile/turnstile.authoring.cy.js @@ -0,0 +1,157 @@ +/* + * Copyright 2024 Adobe Systems Incorporated + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const sitesSelectors = require('../../libs/commons/sitesSelectors'), + afConstants = require('../../libs/commons/formsConstants'); + +/** + * Testing Turnstile with Forms and Sites Editor + */ +describe('Page - Authoring', function () { + + const FT_TURNSTILE = "FT_FORMS-12407"; + const formturnstile = "/apps/forms-core-components-it/form/turnstile"; + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + + // we can use these values to log in + + const dropTurnstileInContainer = function () { + const dataPath = "/content/forms/af/core-components-it/samples/turnstile/basic/jcr:content/guideContainer/*", + responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-path='" + dataPath + "']"; + cy.selectLayer("Edit"); + cy.insertComponent(responsiveGridDropZoneSelector, "Adaptive Form Cloudflare® Turnstile", formturnstile); + cy.get('body').click(0, 0); + } + + const dropTurnstileInSites = function () { + const dataPath = "/content/core-components-examples/library/adaptive-form/turnstile/jcr:content/root/responsivegrid/demo/component/guideContainer/*", + responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-path='" + dataPath + "']"; + cy.selectLayer("Edit"); + cy.insertComponent(responsiveGridDropZoneSelector, "Adaptive Form Cloudflare® Turnstile", formturnstile); + cy.get('body').click(0, 0); + } + + const testTurnstileBehaviour = function (turnstileEditPathSelector, turnstileDrop, isSites) { + if (isSites) { + dropTurnstileInSites(); + } else { + dropTurnstileInContainer(); + } + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + turnstileEditPathSelector); + cy.invokeEditableAction("[data-action='CONFIGURE']"); // this line is causing frame busting which is causing cypress to fail + // Check If Dialog Options Are Visible + cy.get("[name='./cloudServicePath']") + .should("exist"); + cy.get("[name='./size']") + .should("exist"); + cy.get("[name='./name']") + .should("exist"); + + // Switching to invisible widget type key should disable size options + cy.get(".cmp-adaptiveform-turnstile__configuration").click().then(() => { + cy.get("coral-selectlist-item[value='invisible']").click(); + cy.get("input[name='./size'][value='normal']").should("be.disabled"); + cy.get("input[name='./size'][value='compact']").should("be.disabled"); + }) + cy.get('.cq-dialog-submit').click(); + cy.reload(); + // If invisible widget type key is selected, size options should be disabled + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + turnstileEditPathSelector); + cy.invokeEditableAction("[data-action='CONFIGURE']"); + cy.get("input[name='./size'][value='normal']").should("be.disabled"); + cy.get("input[name='./size'][value='compact']").should("be.disabled"); + // Switching to managed/non-interactive widget type key should enable size options + cy.get(".cmp-adaptiveform-turnstile__configuration").click().then(() => { + cy.get("coral-selectlist-item[value='managed']").click(); + cy.get("input[name='./size'][value='normal']").should("be.enabled"); + cy.get("input[name='./size'][value='compact']").should("be.enabled"); + }) + cy.get('.cq-dialog-submit').click(); + cy.reload(); + // If managed/non-interactive widget type key is selected, size options should be enabled + cy.openEditableToolbar(sitesSelectors.overlays.overlay.component + turnstileEditPathSelector); + cy.invokeEditableAction("[data-action='CONFIGURE']"); + cy.get("input[name='./size'][value='normal']").should("be.enabled"); + cy.get("input[name='./size'][value='compact']").should("be.enabled"); + cy.get('.cq-dialog-cancel').click(); + + cy.deleteComponentByPath(turnstileDrop); + } + + context('Open Forms Editor', function() { + const pagePath = "/content/forms/af/core-components-it/samples/turnstile/basic", + turnstileEditPath = pagePath + afConstants.FORM_EDITOR_FORM_CONTAINER_SUFFIX + "/turnstile", + turnstileEditPathSelector = "[data-path='" + turnstileEditPath + "']", + turnstileDrop = pagePath + afConstants.FORM_EDITOR_FORM_CONTAINER_SUFFIX + "/" + formturnstile.split("/").pop(); + beforeEach(function () { + if (cy.af.isLatestAddon()) { + // this is done since cypress session results in 403 sometimes + cy.openAuthoring(pagePath); + } + }); + + it('insert turnstile in form container', function () { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + dropTurnstileInContainer(); + cy.deleteComponentByPath(turnstileDrop); + } + }); + + it ('open edit dialog of turnstile',{ retries: 3 }, function(){ + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + cy.cleanTest(turnstileDrop).then(function(){ + testTurnstileBehaviour(turnstileEditPathSelector, turnstileDrop); + }); + } + }) + }) + + context('Open Sites Editor', function () { + const pagePath = "/content/core-components-examples/library/adaptive-form/turnstile", + turnstileEditPath = pagePath + afConstants.RESPONSIVE_GRID_DEMO_SUFFIX + "/guideContainer/turnstile", + turnstileEditPathSelector = "[data-path='" + turnstileEditPath + "']", + turnstileDrop = pagePath + afConstants.RESPONSIVE_GRID_DEMO_SUFFIX + '/guideContainer/' + formturnstile.split("/").pop(); + + beforeEach(function () { + if (cy.af.isLatestAddon()) { + // this is done since cypress session results in 403 sometimes + cy.openAuthoring(pagePath); + } + }); + + it('insert aem forms turnstile', function () { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + dropTurnstileInSites(); + cy.deleteComponentByPath(turnstileDrop); + } + }); + + it('open edit dialog of aem forms turnstile', function() { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + testTurnstileBehaviour(turnstileEditPathSelector, turnstileDrop, true); + } + }); + }); + +}); diff --git a/ui.tests/test-module/specs/turnstile/turnstile.runtime.cy.js b/ui.tests/test-module/specs/turnstile/turnstile.runtime.cy.js new file mode 100644 index 0000000000..3d6a79638a --- /dev/null +++ b/ui.tests/test-module/specs/turnstile/turnstile.runtime.cy.js @@ -0,0 +1,228 @@ +/* + * Copyright 2024 Adobe Systems Incorporated + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +describe("Form Runtime with Turnstile Input", () => { + + const FT_TURNSTILE = "FT_FORMS-12407"; + const pagePath = "content/forms/af/core-components-it/samples/turnstile/managed.html" + const invisiblePagePath = "content/forms/af/core-components-it/samples/turnstile/invisible.html" + const bemBlock = 'cmp-adaptiveform-turnstile' + // The secret keys are part of public documentation and are not sensitive : + // https://developers.cloudflare.com/turnstile/troubleshooting/testing/ + const alwaysPassSecretKey = "1x0000000000000000000000000000000AA"; + const alwaysFailSecretKey = "2x0000000000000000000000000000000AA"; + let formContainer = null + + let toggle_array = []; + + before(() => { + cy.fetchFeatureToggles().then((response) => { + if (response.status === 200) { + toggle_array = response.body.enabled; + } + }); + }); + + function updateTurnstileSecretKey(secretKey, configName) { + cy.openPage(`mnt/overlay/fd/af/cloudservices/turnstile/properties.html?item=%2Fconf%2Fcore-components-it%2Fsettings%2Fcloudconfigs%2Fturnstile%2F${configName}`).then(x => { + cy.get('#captcha-cloudconfiguration-secret-key').clear().type(secretKey).then(x => { + cy.get("#shell-propertiespage-doneactivator").click(); + }); + }); + } + + // render the form with captcha, we have whitelisted the "Missing required parameters: sitekey" error + beforeEach(() => { + if (cy.af.isLatestAddon()) { + cy.previewForm(pagePath).then((p) => { + formContainer = p; + }); + } + }); + + const checkHTML = (id, state) => { + const visible = state.visible; + const passVisibleCheck = `${visible === true ? "" : "not."}be.visible`; + const passDisabledAttributeCheck = `${state.enabled === false || state.readOnly === true ? "" : "not."}have.attr`; + const value = state.value + cy.get(`#${id}`) + .should(passVisibleCheck) + .invoke('attr', 'data-cmp-visible') + .should('eq', visible.toString()); + cy.get(`#${id}`) + .invoke('attr', 'data-cmp-enabled') + .should('eq', state.enabled.toString()); + return cy.get(`#${id}`).within((root) => { + cy.get('*').should(passVisibleCheck) + }) + } + + it(" should get model and view initialized properly ", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + expect(formContainer._model.items.length, "model and view elements match").to.equal(Object.keys(formContainer._fields).length); + Object.entries(formContainer._fields).forEach(([id, field]) => { + expect(field.getId()).to.equal(id) + expect(formContainer._model.getElement(id), `model and view are in sync`).to.equal(field.getModel()) + }); + } + }) + + it(" model's changes are reflected in the html ", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + const [id, fieldView] = Object.entries(formContainer._fields)[0] + const model = formContainer._model.getElement(id) + cy.get('.cmp-adaptiveform-turnstile__widget').should('exist'); + + checkHTML(model.id, model.getState()).then(() => { + model.visible = false + return checkHTML(model.id, model.getState()) + }).then(() => { + model.enable = false + return checkHTML(model.id, model.getState()) + }) + } + }); + + it(" html changes are reflected in model ", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + const [id, fieldView] = Object.entries(formContainer._fields)[0] + const model = formContainer._model.getElement(id) + cy.log(model.getState().value) + cy.get(`#${id}`).click().then(x => { + cy.log(model.getState().value) + expect(model.getState().value).to.not.be.null + }) + } + }); + + + it("decoration element should not have same class name", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.wrap().then(() => { + const id = formContainer._model._children[0].id; + cy.get(`#${id}`).parent().should("not.have.class", bemBlock); + }) + } + }) + + it("client side validation should fail if captcha is not filled", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { + cy.get('.cmp-adaptiveform-turnstile__errormessage').should('exist').contains('Please fill in this field.'); + }); + } + }) + + it("submission should pass for mandatory captcha", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + updateTurnstileSecretKey(alwaysPassSecretKey, "managed"); + cy.previewForm(pagePath).then((p) => { + formContainer = p; + }); + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get('.cmp-adaptiveform-turnstile__widget').should('be.visible').then($iframe => { + cy.wrap($iframe).then($iframe => { + cy.window().should('have.property', 'turnstile').and('not.be.undefined') + .then((turnstile) => { + turnstile.execute(); + return new Cypress.Promise(resolve => { + setTimeout(() => { + resolve(); + }, 3000); + }); + }).then(() => { + cy.get(`.cmp-adaptiveform-button__widget`).click().then(x => { + cy.get('body').should('contain', "Thank you for submitting the form.\n") + }); + }) + }); + }); + } + }) + + it("submission should fail for mandatory captcha", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + updateTurnstileSecretKey(alwaysFailSecretKey, "managed"); + cy.previewForm(pagePath).then((p) => { + formContainer = p; + }); + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get('.cmp-adaptiveform-turnstile__widget').should('be.visible').then($iframe => { + cy.wrap($iframe).then($iframe => { + cy.window().should('have.property', 'turnstile').and('not.be.undefined') + .then((hcaptcha) => { + hcaptcha.execute(); + return new Cypress.Promise(resolve => { + setTimeout(() => { + resolve(); + }, 3000); + }); + }).then(() => { + cy.on('window:alert', (message) => { + expect(message).to.equal('Encountered an internal error while submitting the form.'); + }); + cy.intercept('POST', /\/adobe\/forms\/af\/submit\/.*/).as('submitForm'); + cy.get(`.cmp-adaptiveform-button__widget`).click(); + cy.wait('@submitForm').then((interception) => { + expect(interception.response.statusCode).to.equal(400); + expect(interception.response.body).to.have.property('title', 'The CAPTCHA validation failed. Please try again.'); + expect(interception.response.body).to.have.property('detail', 'com.adobe.aem.forms.af.rest.exception.CaptchaValidationException: Captcha validation failed.'); + }); + }) + }); + }); + } + }) + + it("submission should pass for mandatory invisible captcha", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + updateTurnstileSecretKey(alwaysPassSecretKey, "invisible"); + cy.previewForm(invisiblePagePath).then((p) => { + formContainer = p; + }); + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get(`.cmp-adaptiveform-turnstile__widget`).should('exist').then(() => { + cy.intercept('POST', /\/adobe\/forms\/af\/submit\/.*/, (req) => { + req.reply((res) => { + expect(res.statusCode).to.equal(200); + }); + }); + cy.get(`.cmp-adaptiveform-button__widget`).click(); + }); + } + }); + + it("submission should return 400 if invisible captcha validation fails", () => { + if (cy.af.isLatestAddon() && toggle_array.includes(FT_TURNSTILE)) { + updateTurnstileSecretKey(alwaysFailSecretKey, "invisible"); + cy.previewForm(invisiblePagePath).then((p) => { + formContainer = p; + }); + expect(formContainer, "formcontainer is initialized").to.not.be.null; + cy.get(`.cmp-adaptiveform-turnstile__widget`).should('exist').then(() => { + cy.intercept('POST', /\/adobe\/forms\/af\/submit\/.*/, (req) => { + req.reply((res) => { + expect(res.statusCode).to.equal(400); + }); + }); + cy.get(`.cmp-adaptiveform-button__widget`).click(); + }); + } + }); + +}) diff --git a/ui.tests/test-module/specs/verticaltabs/verticaltabs.authoring.cy.js b/ui.tests/test-module/specs/verticaltabs/verticaltabs.authoring.cy.js index 411753b934..bfdece45bb 100644 --- a/ui.tests/test-module/specs/verticaltabs/verticaltabs.authoring.cy.js +++ b/ui.tests/test-module/specs/verticaltabs/verticaltabs.authoring.cy.js @@ -49,6 +49,12 @@ describe.only('Page - Authoring', function () { const responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-text='Please drag Tab components here']:last"; dropComponent(responsiveGridDropZoneSelector, "Adaptive Form Date Picker", afConstants.components.forms.resourceType.datepicker); } + + const dropPanelInVerticalTabComponent = function(tabsPath) { + const responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-path='" + tabsPath + "/*']"; + dropComponent(responsiveGridDropZoneSelector, "Adaptive Form Panel", afConstants.components.forms.resourceType.panelcontainer); + } + const dropTabsInSites = function() { const dataPath = "/content/core-components-examples/library/adaptive-form/panelcontainer/jcr:content/root/responsivegrid/demo/component/guideContainer/*", responsiveGridDropZoneSelector = sitesSelectors.overlays.overlay.component + "[data-path='" + dataPath + "']"; @@ -118,6 +124,18 @@ describe.only('Page - Authoring', function () { }); }); + it('verify second panel is not visible after adding two panel',{ retries: 3 }, function(){ + cy.cleanTest(tabsPath).then(function() { + dropTabsInContainer(); + dropPanelInVerticalTabComponent(tabsPath); + dropPanelInVerticalTabComponent(tabsPath); + cy.reload(); + cy.getContentIFrameBody().find('.cmp-verticaltabs__tabpanel').should('have.length', 2); + cy.getContentIFrameBody().find('.cmp-verticaltabs__tabpanel').eq(0).should('be.visible'); + cy.getContentIFrameBody().find('.cmp-verticaltabs__tabpanel').eq(1).should('not.be.visible'); + cy.deleteComponentByPath(tabsPath); + }); + }); }); context('Open Sites Editor', function () { diff --git a/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.cy.js b/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.cy.js index 860105eca4..e1c422bcc0 100644 --- a/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.cy.js +++ b/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.cy.js @@ -90,8 +90,10 @@ tab2().should('have.class','cmp-verticaltabs__tab--active'); tab2().should('have.attr','aria-selected','true'); tab1().should('have.attr','aria-selected','false'); + tab1().should('have.class','cmp-verticaltabs__tab--stepped'); tab1().click(); tab1().should('have.class','cmp-verticaltabs__tab--active'); + tab1().should('have.class','cmp-verticaltabs__tab--stepped'); tab1().should('have.attr','aria-selected','true'); tab2().should('have.attr','aria-selected','false'); }); diff --git a/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.repeatability.cy.js b/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.repeatability.cy.js index f8d0d04158..ac33bcc5a1 100644 --- a/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.repeatability.cy.js +++ b/ui.tests/test-module/specs/verticaltabs/verticaltabs.runtime.repeatability.cy.js @@ -130,5 +130,41 @@ describe("Form with VerticalTabs Container", () => { }) }) + it("After clicking on every tab, if tab-1 is repeated, the repeated instance should not have stepped class", () => { + getTabs().should('have.length', 4); + getTabPanels().should('have.length', 4); + getTabAtIndex(0).should('have.class', 'cmp-verticaltabs__tab--active'); + getTabPanelAtIndex(0).should('have.class', 'cmp-verticaltabs__tabpanel--active'); + getTabAtIndex(1).click(); + getTabAtIndex(1).should('have.class', 'cmp-verticaltabs__tab--active'); + getTabPanelAtIndex(1).should('have.class', 'cmp-verticaltabs__tabpanel--active'); + getTabAtIndex(0).should('have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(0).should('have.class', 'cmp-verticaltabs__tabpanel--stepped'); + getTabAtIndex(2).click(); + getTabAtIndex(2).should('have.class', 'cmp-verticaltabs__tab--active'); + getTabPanelAtIndex(2).should('have.class', 'cmp-verticaltabs__tabpanel--active'); + getTabAtIndex(1).should('have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(1).should('have.class', 'cmp-verticaltabs__tabpanel--stepped'); + getTabAtIndex(0).should('have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(0).should('have.class', 'cmp-verticaltabs__tabpanel--stepped'); + getTabAtIndex(3).click(); + getTabAtIndex(3).should('have.class', 'cmp-verticaltabs__tab--active'); + getTabPanelAtIndex(3).should('have.class', 'cmp-verticaltabs__tabpanel--active'); + getTabAtIndex(2).should('have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(2).should('have.class', 'cmp-verticaltabs__tabpanel--stepped'); + getTabAtIndex(1).should('have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(1).should('have.class', 'cmp-verticaltabs__tabpanel--stepped'); + getTabAtIndex(0).should('have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(0).should('have.class', 'cmp-verticaltabs__tabpanel--stepped'); + cy.get("button").contains("+R1").click().then(() => { + getTabs().should('have.length', 5); + getTabPanels().should('have.length', 5); + getTabAtIndex(1).should('have.class', 'cmp-verticaltabs__tab--active'); + getTabAtIndex(1).should('not.have.class', 'cmp-verticaltabs__tab--stepped'); + getTabPanelAtIndex(1).should('have.class', 'cmp-verticaltabs__tabpanel--active'); + getTabPanelAtIndex(1).should('not.have.class', 'cmp-verticaltabs__tabpanel--stepped'); + }) + }) + }) diff --git a/ui.tests/test-module/specs/wizard/wizard.authoring.cy.js b/ui.tests/test-module/specs/wizard/wizard.authoring.cy.js index 954fc279ae..6471ab8805 100644 --- a/ui.tests/test-module/specs/wizard/wizard.authoring.cy.js +++ b/ui.tests/test-module/specs/wizard/wizard.authoring.cy.js @@ -205,6 +205,19 @@ describe('Page - Authoring', function () { }); }); + it('verify second panel is not visible after adding two panels', function () { + cy.cleanTest(wizardLayoutDrop).then(function () { + dropWizardInContainer(); + addComponentInWizard("Adaptive Form Panel", afConstants.components.forms.resourceType.panelcontainer); + addComponentInWizard("Adaptive Form Panel", afConstants.components.forms.resourceType.panelcontainer); + cy.reload() + cy.getContentIFrameBody().find('.cmp-adaptiveform-wizard__wizardpanel').should('have.length', 2); + cy.getContentIFrameBody().find('.cmp-adaptiveform-wizard__wizardpanel').eq(0).should('be.visible'); + cy.getContentIFrameBody().find('.cmp-adaptiveform-wizard__wizardpanel').eq(1).should('not.be.visible'); + cy.deleteComponentByPath(wizardLayoutDrop); + }); + }); + it('save as fragment in Wizard',function () { cy.cleanTest(wizardLayoutDrop).then(function () { testSaveAsFragment(wizardEditPathSelector, wizardLayoutDrop); diff --git a/ui.tests/test-module/specs/wizard/wizard.runtime.cy.js b/ui.tests/test-module/specs/wizard/wizard.runtime.cy.js index f8d003c23b..7d75be997b 100644 --- a/ui.tests/test-module/specs/wizard/wizard.runtime.cy.js +++ b/ui.tests/test-module/specs/wizard/wizard.runtime.cy.js @@ -54,17 +54,21 @@ describe("Form with Wizard Layout Container", () => { cy.get(".cmp-adaptiveform-wizard__nav--next").click({force: true}); cy.get(".cmp-adaptiveform-wizard__tab").eq(0).should('not.have.class', 'cmp-adaptiveform-wizard__tab--active'); + cy.get(".cmp-adaptiveform-wizard__tab").eq(0).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); cy.get(".cmp-adaptiveform-wizard__tab").eq(1).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(0).should('not.have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(1).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); cy.get(".cmp-adaptiveform-wizard__nav--next").click({force: true}); cy.get(".cmp-adaptiveform-wizard__tab").eq(0).should('not.have.class', 'cmp-adaptiveform-wizard__tab--active'); + cy.get(".cmp-adaptiveform-wizard__tab").eq(0).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); cy.get(".cmp-adaptiveform-wizard__tab").eq(1).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(0).should('not.have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(1).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); cy.expectNoConsoleErrors(); }); @@ -90,9 +94,11 @@ describe("Form with Wizard Layout Container", () => { cy.get(".cmp-adaptiveform-wizard__nav--previous").click({force: true}); cy.get(".cmp-adaptiveform-wizard__tab").eq(0).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); + cy.get(".cmp-adaptiveform-wizard__tab").eq(0).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); cy.get(".cmp-adaptiveform-wizard__tab").eq(1).should('not.have.class', 'cmp-adaptiveform-wizard__tab--active'); cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); cy.get(".cmp-adaptiveform-wizard__wizardpanel").eq(1).should('not.have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); cy.expectNoConsoleErrors(); }); diff --git a/ui.tests/test-module/specs/wizard/wizard.runtime.repeatability.cy.js b/ui.tests/test-module/specs/wizard/wizard.runtime.repeatability.cy.js index f749a1829b..6f03946a2f 100644 --- a/ui.tests/test-module/specs/wizard/wizard.runtime.repeatability.cy.js +++ b/ui.tests/test-module/specs/wizard/wizard.runtime.repeatability.cy.js @@ -151,6 +151,43 @@ describe("Form with Wizard Container", () => { getWizardPanels().should('have.length', 6); }) }); + + it("After clicking on every tab, if tab-1 is repeated, the repeated instance should not have stepped class", () => { + getTabs().should('have.length', 4); + getWizardPanels().should('have.length', 4); + getTabAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); + getWizardPanelAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + cy.get(".cmp-adaptiveform-wizard__nav--next").click({force: true}); + getTabAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); + getWizardPanelAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + getTabAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + cy.get(".cmp-adaptiveform-wizard__nav--next").click({force: true}); + getTabAtIndex(2).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); + getWizardPanelAtIndex(2).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + getTabAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + getTabAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + cy.get(".cmp-adaptiveform-wizard__nav--next").click({force: true}); + getTabAtIndex(3).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); + getWizardPanelAtIndex(3).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + getTabAtIndex(2).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(2).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + getTabAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + getTabAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(0).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + cy.get("button").contains("+R1").click().then(() => { + getTabs().should('have.length', 5); + getWizardPanels().should('have.length', 5); + getTabAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__tab--active'); + getWizardPanelAtIndex(1).should('have.class', 'cmp-adaptiveform-wizard__wizardpanel--active'); + getTabAtIndex(1).should('not.have.class', 'cmp-adaptiveform-wizard__tab--stepped'); + getWizardPanelAtIndex(1).should('not.have.class', 'cmp-adaptiveform-wizard__wizardpanel--stepped'); + }) + cy.expectNoConsoleErrors(); + }) }) describe('visibility of navigation buttons', function () {