diff --git a/.circleci/config.yml b/.circleci/config.yml index 1fbabf8743..e44f656f77 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -436,4 +436,4 @@ workflows: branches: ignore: /.*/ tags: - only: /^core-forms-components-reactor-\d+\.\d+\.\d+$/ + only: /^core-forms-components-reactor-\d+\.\d+\.\d+-\w+$/ diff --git a/all/pom.xml b/all/pom.xml index f92bb369b6..dc308bc1c4 100644 --- a/all/pom.xml +++ b/all/pom.xml @@ -21,7 +21,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml diff --git a/bundles/af-core/pom.xml b/bundles/af-core/pom.xml index 41d466673c..6d62a96855 100644 --- a/bundles/af-core/pom.xml +++ b/bundles/af-core/pom.xml @@ -20,7 +20,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractFormComponentImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractFormComponentImpl.java index 723c9eec9a..0e439f93dc 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractFormComponentImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractFormComponentImpl.java @@ -17,17 +17,7 @@ import java.io.IOException; import java.math.BigDecimal; -import java.util.AbstractMap; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -68,9 +58,12 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.node.ArrayNode; public class AbstractFormComponentImpl extends AbstractComponentImpl implements FormComponent { @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL, name = ReservedProperties.PN_DATAREF) @@ -298,6 +291,10 @@ protected boolean getEditMode() { if (rulesProperties.size() > 0) { properties.put(CUSTOM_RULE_PROPERTY_WRAPPER, rulesProperties); } + List disabledScripts = getDisabledXFAScripts(); + if (disabledScripts.size() > 0) { + properties.put("fd:disabledXfaScripts", disabledScripts); + } return properties; } @@ -550,4 +547,24 @@ public Map getDorProperties() { return customDorProperties; } + private List getDisabledXFAScripts() { + Set disabledScripts = new HashSet<>(); + String xfaScripts = resource.getValueMap().get("fd:xfaScripts", ""); + if (StringUtils.isNotEmpty(xfaScripts)) { + // read string xfaScripts to jsonNode + ObjectMapper mapper = new ObjectMapper(); + try { + ArrayNode node = (ArrayNode) mapper.readTree(xfaScripts); + // iterate through the array node and add the elements which have disabled property set to true + for (JsonNode jsonNode : node) { + if (jsonNode.has("disabled") && jsonNode.get("disabled").asBoolean()) { + disabledScripts.add(jsonNode.get("activity").asText()); + } + } + } catch (IOException e) { + logger.error("Error while parsing xfaScripts {} {}", e, resource.getPath()); + } + } + return new ArrayList<>(disabledScripts); + } } diff --git a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractOptionsFieldImpl.java b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractOptionsFieldImpl.java index b43f30b643..1b7fb8537f 100644 --- a/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractOptionsFieldImpl.java +++ b/bundles/af-core/src/main/java/com/adobe/cq/forms/core/components/util/AbstractOptionsFieldImpl.java @@ -107,7 +107,11 @@ public String[] getEnumNames() { String[] enumName = map.values().toArray(new String[0]); return Arrays.stream(enumName) .map(p -> { - return this.translate(ReservedProperties.PN_ENUM_NAMES, p); + String value = this.translate(ReservedProperties.PN_ENUM_NAMES, p); + if (value == null) { + value = ""; + } + return value; }) .toArray(String[]::new); } diff --git a/bundles/core/pom.xml b/bundles/core/pom.xml index aa028c5d0d..a5a86858f1 100644 --- a/bundles/core/pom.xml +++ b/bundles/core/pom.xml @@ -20,7 +20,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/examples/all/pom.xml b/examples/all/pom.xml index a29935afb9..2fba0dd7de 100644 --- a/examples/all/pom.xml +++ b/examples/all/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/examples/core/pom.xml b/examples/core/pom.xml index c9a499bcdd..c3809ed5ef 100644 --- a/examples/core/pom.xml +++ b/examples/core/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/examples/pom.xml b/examples/pom.xml index 7f1e397d98..3398a28796 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml diff --git a/examples/ui.apps/pom.xml b/examples/ui.apps/pom.xml index 8105ac3d9b..ede377a8cf 100644 --- a/examples/ui.apps/pom.xml +++ b/examples/ui.apps/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/examples/ui.content/pom.xml b/examples/ui.content/pom.xml index d35c541e14..92e8021951 100644 --- a/examples/ui.content/pom.xml +++ b/examples/ui.content/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/it/apps/pom.xml b/it/apps/pom.xml index 797ab38b90..d8c8e4c31c 100644 --- a/it/apps/pom.xml +++ b/it/apps/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/it/config/pom.xml b/it/config/pom.xml index 70566fc69f..11f0042edb 100644 --- a/it/config/pom.xml +++ b/it/config/pom.xml @@ -20,7 +20,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/it/content/pom.xml b/it/content/pom.xml index 7cd4ab11de..b35d4f2000 100644 --- a/it/content/pom.xml +++ b/it/content/pom.xml @@ -20,7 +20,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/it/core/pom.xml b/it/core/pom.xml index 462a280e46..43182355e2 100644 --- a/it/core/pom.xml +++ b/it/core/pom.xml @@ -18,7 +18,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../../parent/pom.xml diff --git a/jsdocs/pom.xml b/jsdocs/pom.xml index 2e48818eb3..097f1e2211 100644 --- a/jsdocs/pom.xml +++ b/jsdocs/pom.xml @@ -22,7 +22,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml diff --git a/parent/pom.xml b/parent/pom.xml index 04435ab95d..e2d419b6e5 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -21,7 +21,7 @@ com.adobe.aem core-forms-components-parent pom - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT AEM Forms Core Components - Parent Parent POM for AEM Forms Core Components diff --git a/pom.xml b/pom.xml index dc12985651..95742b20dc 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT parent/pom.xml diff --git a/ui.af.apps/pom.xml b/ui.af.apps/pom.xml index 38362a2211..8eb3c8f892 100644 --- a/ui.af.apps/pom.xml +++ b/ui.af.apps/pom.xml @@ -20,7 +20,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/base/v1/base/_cq_editConfig.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/base/v1/base/_cq_editConfig.xml index fc6d62c32d..5a4a7100a8 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/base/v1/base/_cq_editConfig.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/base/v1/base/_cq_editConfig.xml @@ -23,6 +23,12 @@ handler="CQ.FormsCoreComponents.editorhooks.viewQualifiedName" icon="viewSOMExpression" text="View Qualified Name"/> + + 0){ schemaRef = schemaRef[0].value; configuredFormModel = schemaRef; @@ -143,6 +161,8 @@ $(FDM_DROPDOWN_SELECTOR).val(schemaRef); } else if (schemaType == CONNECTOR) { $(CONNECTOR_DROPDOWN_SELECTOR).val(schemaRef); + } else if (schemaType == FORM_TEMPLATE) { + $(FORM_TEMPLATE_DROPDOWN_SELECTOR).val(schemaRef); } } }; @@ -192,6 +212,21 @@ } }; + function formTemplateSelectorOnChanged(dialog) { + var selectedSchema = dialog.find(FORM_TEMPLATE_DROPDOWN_SELECTOR); + if(selectedSchema.length > 0) { + selectedSchema = selectedSchema[0].value; + setElementValue(dialog, SCHEMA_REF, selectedSchema); + setElementValue(dialog, DAM_SCHEMA_REF, selectedSchema); + isSchemaChanged = true; + if (configuredFormModel) { + confirmFormModelChange(selectedSchema, $(FORM_TEMPLATE_DROPDOWN_SELECTOR)); + } else { + toBeConfiguredFormModel = selectedSchema; + } + } + }; + function setElementValue(dialog, elementRef, value){ var element = dialog.find(elementRef); if(element.length > 0){ @@ -225,20 +260,29 @@ function hideContainersExcept(selectedSchemaType) { if (selectedSchemaType == JSON_SCHEMA) { $(FDM_CONTAINER).hide(); + $(FORM_TEMPLATE_CONTAINER).hide(); $(CONNECTOR_CONTAINER).hide(); $(SCHEMA_CONTAINER).show(); } else if (selectedSchemaType == FORM_DATA_MODEL) { $(SCHEMA_CONTAINER).hide(); + $(FORM_TEMPLATE_CONTAINER).hide(); $(CONNECTOR_CONTAINER).hide(); $(FDM_CONTAINER).show(); } else if (selectedSchemaType == CONNECTOR) { $(SCHEMA_CONTAINER).hide(); $(FDM_CONTAINER).hide(); + $(FORM_TEMPLATE_CONTAINER).hide(); $(CONNECTOR_CONTAINER).show(); - } else if (selectedSchemaType == 'none') { + } else if (selectedSchemaType == FORM_TEMPLATE) { $(FDM_CONTAINER).hide(); $(CONNECTOR_CONTAINER).hide(); $(SCHEMA_CONTAINER).hide(); + $(FORM_TEMPLATE_CONTAINER).show(); + } else if (selectedSchemaType == NONE) { + $(FDM_CONTAINER).hide(); + $(SCHEMA_CONTAINER).hide(); + $(CONNECTOR_CONTAINER).hide(); + $(FORM_TEMPLATE_CONTAINER).hide(); } }; @@ -266,7 +310,8 @@ var formModelSelector = dialog.find(FORM_MODEL_SELECTOR)[0], schemaSelector = dialog.find(SCHEMA_DROPDOWN_SELECTOR)[0], fdmSelector = dialog.find(FDM_DROPDOWN_SELECTOR)[0], - connectorSelector = dialog.find(CONNECTOR_DROPDOWN_SELECTOR)[0]; + connectorSelector = dialog.find(CONNECTOR_DROPDOWN_SELECTOR)[0], + formTemplateSelector = dialog.find(FORM_TEMPLATE_DROPDOWN_SELECTOR)[0]; if (formModelSelector) { formModelSelector.on("change", function() { selectFormModelOnChanged(dialog); @@ -287,6 +332,11 @@ connectorSelectorOnChanged(dialog); }); }; + if(formTemplateSelector) { + formTemplateSelector.on("change", function() { + formTemplateSelectorOnChanged(dialog); + }); + } selectFormModelOnLoad(dialog); } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml index e3bf5979ef..55e4dc661f 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/container/v2/container/_cq_dialog/.content.xml @@ -136,6 +136,10 @@ jcr:primaryType="nt:unstructured" sling:resourceType="/libs/fd/af/connectors/rendercondition/marketo"/> + + + + + + + + 0; + } catch(e) { + console.error('Error parsing xfaScripts', e, json['fd:xfaScripts']); + } + } + } + return false + } + + window.CQ.FormsCoreComponents.editorhooks.viewXfaScripts = function (editable) { + fetch(Granite.HTTP.externalize(editable.path + ".json")).then(async function (resp) { + const json = await resp.json(); + // Assuming `resp` contains the JSON string with `fd:xfaScripts` + var xfaScripts = JSON.parse(json['fd:xfaScripts']); + var dialogContent = document.createElement('div'); + + // Create a Coral Table + var table = document.createElement('coral-table'); + + // Create the header + var thead = document.createElement('coral-table-head'); + var headerRow = document.createElement('coral-table-row'); + + var eventNameHeader = document.createElement('coral-table-headercell'); + eventNameHeader.textContent = 'Event Name'; + var eventContentHeader = document.createElement('coral-table-headercell'); + eventContentHeader.textContent = 'Event Content'; + var disableHeader = document.createElement('coral-table-headercell'); + disableHeader.textContent = 'Disable'; + + headerRow.appendChild(eventNameHeader); + headerRow.appendChild(eventContentHeader); + headerRow.appendChild(disableHeader); + thead.appendChild(headerRow); + table.appendChild(thead); + + // Populate the table with data from xfaScripts + var tbody = document.createElement('coral-table-body'); + xfaScripts.forEach(function(script) { + var row = document.createElement('coral-table-row'); + + var nameCell = document.createElement('coral-table-cell'); + nameCell.textContent = script.runAt === "server" ? `${script.activity}(server)` : script.activity; + var contentCell = document.createElement('coral-table-cell'); + contentCell.innerHTML = script.value.replaceAll("\n", "
"); + + var checkboxCell = document.createElement('coral-table-cell'); + var checkbox = new Coral.Checkbox(); + checkbox.name = 'disableCheckbox'; + checkbox.on('change', function() { + script.disabled = this.checked; + }); + checkboxCell.appendChild(checkbox); + checkbox.checked = !!script.disabled; + if (script.runAt === "server") { + checkbox.disabled = true; + } + row.appendChild(nameCell); + row.appendChild(contentCell); + row.appendChild(checkboxCell); + + tbody.appendChild(row); + }); + table.appendChild(tbody); + + dialogContent.appendChild(table); + + // Create the dialog + var dialog = new Coral.Dialog().set({ + id: 'xfaScriptsDialog', + header: { + innerHTML: 'XFA Scripts' + }, + content: { + innerHTML: '' + }, + footer: {}, + closable: "on" + }); + + // Add the table to the dialog content + //dialog.content.appendChild(dialogContent); + + var okButton = new Coral.Button(); + okButton.label.textContent = 'OK'; + okButton.variant = Coral.Button.variant.PRIMARY; + okButton.addEventListener('click', function() { + // Prepare the modified xfaScripts for POST request + var modifiedXfaScripts = JSON.stringify({ 'fd:xfaScripts': JSON.stringify(xfaScripts) }); + $.ajax({ + url: editable.path, + type: 'POST', + data: { + "_charset_" : "UTF-8", + ':operation': 'import', + ':contentType': 'json', + ':content': modifiedXfaScripts, + ':replaceProperties': true + }, + success: function(response) { + console.log('Successfully posted the data'); + dialog.remove(); + }, + error: function(xhr, status, error) { + console.error('Error posting the data', error); + dialog.remove(); + } + }); + }); + dialog.footer.appendChild(okButton); + +// Append and show the dialog + document.body.appendChild(dialog); + + // add a listener on dialog show event + dialog.on('coral-overlay:open', function() { + dialog.content.appendChild(dialogContent); + }); + dialog.show(); + + }) + return true; + }; + +})(window, Granite.author, Coral); diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datepicker/v1/datepicker/clientlibs/site/js/datepickerview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datepicker/v1/datepicker/clientlibs/site/js/datepickerview.js index 86f65a2ab5..c4df1c1302 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datepicker/v1/datepicker/clientlibs/site/js/datepickerview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/datepicker/v1/datepicker/clientlibs/site/js/datepickerview.js @@ -99,10 +99,12 @@ this.widgetObject.setDisplayValue(this._model.value); this.widgetObject.setCalendarWidgetValue(this._model.value); this.setInactive(); + this.triggerExit(); }, this.getWidget()); this.widgetObject.addEventListener('focus', (e) => { this.widgetObject.setValue(e.target.value); this.setActive(); + this.triggerEnter(); }, this.getWidget()); this.widgetObject.addEventListener('input', (e) => { if( e.target.value === '') { @@ -117,9 +119,11 @@ this.widget.addEventListener('blur', (e) => { this.setModelValue(e.target.value); this.setInactive(); + this.triggerExit(); }); this.widget.addEventListener('focus', (e) => { this.setActive(); + this.triggerEnter(); }); } } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/dropdown/v1/dropdown/clientlibs/site/js/dropdownview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/dropdown/v1/dropdown/clientlibs/site/js/dropdownview.js index d32907b7d7..1c95f33839 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/dropdown/v1/dropdown/clientlibs/site/js/dropdownview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/dropdown/v1/dropdown/clientlibs/site/js/dropdownview.js @@ -206,9 +206,11 @@ }); this.widget.addEventListener('focus', (e) => { this.setActive(); + this.triggerEnter(); }); this.widget.addEventListener('blur', (e) => { this.setInactive(); + this.triggerExit(); }); } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/emailinput/v1/emailinput/clientlibs/site/js/emailinputview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/emailinput/v1/emailinput/clientlibs/site/js/emailinputview.js index 41662f809c..b8974c5c7c 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/emailinput/v1/emailinput/clientlibs/site/js/emailinputview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/emailinput/v1/emailinput/clientlibs/site/js/emailinputview.js @@ -74,10 +74,12 @@ this.setModelValue(e.target.value); this.setWidgetValueToDisplayValue(); this.setInactive(); + this.triggerExit(); }); this.widget.addEventListener('focus', (e) => { this.setActive(); this.setWidgetValueToModelValue(); + this.triggerEnter(); }); } } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/numberinput/v1/numberinput/clientlibs/site/js/numberinputview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/numberinput/v1/numberinput/clientlibs/site/js/numberinputview.js index 8d737e0a0c..a81994501f 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/numberinput/v1/numberinput/clientlibs/site/js/numberinputview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/numberinput/v1/numberinput/clientlibs/site/js/numberinputview.js @@ -100,12 +100,14 @@ this.setModelValue(e.target.value); if(this.element) { this.setInactive(); + this.triggerExit(); } }); } this.getWidget().addEventListener('focus', (e) => { if (this.element) { this.setActive(); + this.triggerEnter(); } }); } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/panelcontainer/v1/panelcontainer/_cq_editConfig.xml b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/panelcontainer/v1/panelcontainer/_cq_editConfig.xml index b9cf9ad1bb..428607e492 100755 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/panelcontainer/v1/panelcontainer/_cq_editConfig.xml +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/panelcontainer/v1/panelcontainer/_cq_editConfig.xml @@ -25,5 +25,11 @@ handler="CQ.FormsCoreComponents.editorhooks.viewQualifiedName" icon="viewSOMExpression" text="View Qualified Name"/> + diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/telephoneinput/v1/telephoneinput/clientlibs/site/js/telephoneinputview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/telephoneinput/v1/telephoneinput/clientlibs/site/js/telephoneinputview.js index 7fe8a2d048..ea43ca183f 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/telephoneinput/v1/telephoneinput/clientlibs/site/js/telephoneinputview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/telephoneinput/v1/telephoneinput/clientlibs/site/js/telephoneinputview.js @@ -74,10 +74,12 @@ this.setModelValue(e.target.value); this.setWidgetValueToDisplayValue(); this.setInactive(); + this.triggerExit(); }); this.widget.addEventListener('focus', (e) => { this.setActive(); this.setWidgetValueToModelValue(); + this.triggerEnter(); }); } } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/textinput/v1/textinput/clientlibs/site/js/textinputview.js b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/textinput/v1/textinput/clientlibs/site/js/textinputview.js index e2119a07df..2c075f12c1 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/textinput/v1/textinput/clientlibs/site/js/textinputview.js +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/form/textinput/v1/textinput/clientlibs/site/js/textinputview.js @@ -74,10 +74,12 @@ this.setModelValue(e.target.value); this.setWidgetValueToDisplayValue(); this.setInactive(); + this.triggerExit(); }); this.widget.addEventListener('focus', (e) => { this.setActive(); this.setWidgetValueToModelValue(); + this.triggerEnter(); }); } } diff --git a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/page/v1/page/customfooterlibs.html b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/page/v1/page/customfooterlibs.html index 268a57ac5c..c1152c89c8 100644 --- a/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/page/v1/page/customfooterlibs.html +++ b/ui.af.apps/src/main/content/jcr_root/apps/core/fd/components/page/v1/page/customfooterlibs.html @@ -19,6 +19,7 @@ + diff --git a/ui.apps/pom.xml b/ui.apps/pom.xml index 132c8582b3..aec0f0b258 100644 --- a/ui.apps/pom.xml +++ b/ui.apps/pom.xml @@ -20,7 +20,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml diff --git a/ui.frontend/package-lock.json b/ui.frontend/package-lock.json index 4d25a3c47d..b251272f8a 100644 --- a/ui.frontend/package-lock.json +++ b/ui.frontend/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@aemforms/af-core": "^0.22.109", + "@aemforms/af-core-xfa": "^0.1.4", "@aemforms/af-custom-functions": "1.0.10", - "@aemforms/af-formatters": "^0.22.109" + "@aemforms/af-formatters": "^0.22.114" }, "devDependencies": { "@babel/preset-env": "^7.18.2", @@ -60,13 +60,13 @@ "node": ">=16.0.0" } }, - "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==", + "node_modules/@aemforms/af-core-xfa": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@aemforms/af-core-xfa/-/af-core-xfa-0.1.4.tgz", + "integrity": "sha512-rijbb4XGIlSoCOjNnsWLmYlezNlAD5MA5Hp0pmOYanNpUPUf9c98UpGRhyVObn1jKb0wPy5vXGDBbkmyEftblA==", "dependencies": { "@adobe/json-formula": "0.1.50", - "@aemforms/af-formatters": "^0.22.109" + "@aemforms/af-formatters": "^0.22.110" } }, "node_modules/@aemforms/af-custom-functions": { @@ -75,9 +75,9 @@ "integrity": "sha512-n3w9tHkJOI5ISVYAK2cCi5k/oTu3rGgByDmMIgOH1+Ry4mL9nM3cxBTKEkPF8Y8JiKF1aUHIKM+MeP6u5PiiUA==" }, "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.114", + "resolved": "https://registry.npmjs.org/@aemforms/af-formatters/-/af-formatters-0.22.114.tgz", + "integrity": "sha512-kIrWTAzLgv2Te2sq8IQl4P0AtFAN1t3znnXXgMPp9MO6P+pB4mqaFlF+DUdE1BpbYdeEYdUxZioL/oq5NVtNag==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", @@ -11075,13 +11075,13 @@ "resolved": "https://registry.npmjs.org/@adobe/json-formula/-/json-formula-0.1.50.tgz", "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==", + "@aemforms/af-core-xfa": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@aemforms/af-core-xfa/-/af-core-xfa-0.1.4.tgz", + "integrity": "sha512-rijbb4XGIlSoCOjNnsWLmYlezNlAD5MA5Hp0pmOYanNpUPUf9c98UpGRhyVObn1jKb0wPy5vXGDBbkmyEftblA==", "requires": { "@adobe/json-formula": "0.1.50", - "@aemforms/af-formatters": "^0.22.109" + "@aemforms/af-formatters": "^0.22.110" } }, "@aemforms/af-custom-functions": { @@ -11090,9 +11090,9 @@ "integrity": "sha512-n3w9tHkJOI5ISVYAK2cCi5k/oTu3rGgByDmMIgOH1+Ry4mL9nM3cxBTKEkPF8Y8JiKF1aUHIKM+MeP6u5PiiUA==" }, "@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.114", + "resolved": "https://registry.npmjs.org/@aemforms/af-formatters/-/af-formatters-0.22.114.tgz", + "integrity": "sha512-kIrWTAzLgv2Te2sq8IQl4P0AtFAN1t3znnXXgMPp9MO6P+pB4mqaFlF+DUdE1BpbYdeEYdUxZioL/oq5NVtNag==" }, "@ampproject/remapping": { "version": "2.2.1", diff --git a/ui.frontend/package.json b/ui.frontend/package.json index 68ac54f75c..238cbc9c9b 100644 --- a/ui.frontend/package.json +++ b/ui.frontend/package.json @@ -13,18 +13,18 @@ "devDependencies": { "@babel/preset-env": "^7.18.2", "aem-clientlib-generator": "^1.8.0", + "babel-jest": "^26.6.0", "cross-env": "^7.0.3", "html-webpack-plugin": "^5.5.0", "jest": "^28.1.1", - "babel-jest": "^26.6.0", "jest-environment-jsdom": "^28.1.1", "webpack": "^5.73.0", "webpack-cli": "^4.10.0", "webpack-merge": "^5.8.0" }, "dependencies": { - "@aemforms/af-core": "^0.22.109", - "@aemforms/af-formatters": "^0.22.109", - "@aemforms/af-custom-functions": "1.0.10" + "@aemforms/af-core-xfa": "^0.1.4", + "@aemforms/af-custom-functions": "1.0.10", + "@aemforms/af-formatters": "^0.22.114" } } diff --git a/ui.frontend/pom.xml b/ui.frontend/pom.xml index 33d7b8de5c..529836ce5a 100644 --- a/ui.frontend/pom.xml +++ b/ui.frontend/pom.xml @@ -12,13 +12,11 @@ governing permissions and limitations under the License. --> - + com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/ui.frontend/src/GuideBridge.js b/ui.frontend/src/GuideBridge.js index 694e8a09db..83530adaa8 100644 --- a/ui.frontend/src/GuideBridge.js +++ b/ui.frontend/src/GuideBridge.js @@ -17,7 +17,7 @@ import {Constants} from "./constants.js"; import Response from "./Response.js"; import AfFormData from "./FormData.js"; -import {readAttachments} from "@aemforms/af-core"; +import {readAttachments} from "@aemforms/af-core-xfa"; /** * The GuideBridge class represents the bridge between an adaptive form and JavaScript APIs. diff --git a/ui.frontend/src/LanguageUtils.js b/ui.frontend/src/LanguageUtils.js index e4081262c5..b795f27a0c 100644 --- a/ui.frontend/src/LanguageUtils.js +++ b/ui.frontend/src/LanguageUtils.js @@ -16,7 +16,7 @@ import {Constants} from "./constants.js"; import HTTPAPILayer from "./HTTPAPILayer.js"; -import {setCustomDefaultConstraintTypeMessages} from "@aemforms/af-core"; +import {setCustomDefaultConstraintTypeMessages} from "@aemforms/af-core-xfa"; /** * @module FormView diff --git a/ui.frontend/src/handleXfa.js b/ui.frontend/src/handleXfa.js new file mode 100644 index 0000000000..f1a6468b58 --- /dev/null +++ b/ui.frontend/src/handleXfa.js @@ -0,0 +1,31 @@ +/******************************************************************************* + * 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. + ******************************************************************************/ + +export function loadXfa(formdom, renderContext) { + if (window.xfalib) { + formBridge.registerConfig("disabledServerScripts", ["initialize", "$formready", "$layoutready"]) + const xfaJson = JSON.parse(JSON.parse(JSON.stringify(formdom))); + xfalib.runtime.renderContext = JSON.parse(JSON.parse(JSON.stringify(renderContext))); + xfalib.script.XfaModelRegistry.prototype.createModel(xfaJson); + //initialize Acrobat specific scripts + new xfalib.acrobat.Acrobat(); + return function (model) { + model._syncXfaProps(); + xfalib.runtime.xfa.form._initialize(true); + $(window).trigger("XfaInitialized"); + } + } +} diff --git a/ui.frontend/src/index.js b/ui.frontend/src/index.js index 8ac52985ff..63a1b55abc 100644 --- a/ui.frontend/src/index.js +++ b/ui.frontend/src/index.js @@ -15,13 +15,13 @@ ******************************************************************************/ import Utils from "./utils.js"; import LanguageUtils from "./LanguageUtils.js"; -import {createFormInstance, FileObject, extractFileInfo, readAttachments, Click, Change, Submit, Save, Blur, AddItem, RemoveItem, CustomEvent, UIChange} from "@aemforms/af-core"; +import {createFormInstance, FileObject, extractFileInfo, readAttachments, Click, Change, Submit, Save, Blur, AddItem, RemoveItem, CustomEvent, UIChange} from "@aemforms/af-core-xfa"; import {FormField, FormContainer, FormFieldBase, FormPanel, FormTabs, FormFileInput, FormOptionFieldBase, FormCheckBox, FormFileInputWidgetBase, FormFileInputWidget} from "./view/index.js"; import {Constants} from "./constants.js"; import GuideBridge from "./GuideBridge.js"; import HTTPAPILayer from "./HTTPAPILayer.js"; import {formatDate, parseDate} from "@aemforms/af-formatters"; -import {FunctionRuntime} from '@aemforms/af-core'; +import {FunctionRuntime} from '@aemforms/af-core-xfa'; import {customFunctions} from "./customFunctions"; /** diff --git a/ui.frontend/src/utils.js b/ui.frontend/src/utils.js index 16e03a285a..b5afedf218 100644 --- a/ui.frontend/src/utils.js +++ b/ui.frontend/src/utils.js @@ -17,7 +17,8 @@ import {Constants} from "./constants.js"; import HTTPAPILayer from "./HTTPAPILayer.js"; import {customFunctions} from "./customFunctions.js"; -import {FunctionRuntime} from '@aemforms/af-core' +import {FunctionRuntime} from '@aemforms/af-core-xfa'; +import {loadXfa} from "./handleXfa"; /** * @module FormView @@ -332,7 +333,18 @@ class Utils { if (_path == null) { console.error(`data-${Constants.NS}-${formContainerClass}-path attribute is not present in the HTML element. Form cannot be initialized` ) } else { - const _formJson = await HTTPAPILayer.getFormDefinition(_path, _pageLang); + const loader = elements[i].parentElement?.querySelector('[data-cmp-adaptiveform-container-loader]'); + let _formJson, callback; + if (loader) { + const id = loader.getAttribute('data-cmp-adaptiveform-container-loader'); + const response = await fetch(`/adobe/forms/af/${id}`) + _formJson = (await response.json()).afModelDefinition; + _formJson.id = id; + //window.formJson = _formJson + callback = loadXfa(_formJson.formdom, _formJson.xfaRenderContext); + } else { + _formJson = await HTTPAPILayer.getFormDefinition(_path, _pageLang); + } console.debug("fetched model json", _formJson); await this.registerCustomFunctionsV2( _formJson); await this.registerCustomFunctionsByUrl(customFunctionUrl); @@ -344,6 +356,14 @@ class Utils { _prefillData = await HTTPAPILayer.getJson(_formJson.properties['fd:dataUrl'] + "?" + Object.keys(params).map(p => p+"="+params[p]).join("&")) _prefillData = _prefillData || {}; _prefillData = Utils.stripIfWrapped(_prefillData); + if(window.formBridge){ + window.formBridge.restoreFormState({ + formState : {xfaDom: _prefillData.data.xfaDom, xfaRenderContext: _prefillData.data.xfaRenderContext}, + context : this, + error : function() {}, + success : function () {} + }); + } } const formContainer = await createFormContainer({ _formJson, @@ -351,6 +371,9 @@ class Utils { _path, _element: elements[i] }); + if (typeof callback === 'function') { + callback(formContainer.getModel()); + } Utils.initializeAllFields(formContainer); const event = new CustomEvent(Constants.FORM_CONTAINER_INITIALISED, { "detail": formContainer }); document.dispatchEvent(event); diff --git a/ui.frontend/src/view/FormCheckBox.js b/ui.frontend/src/view/FormCheckBox.js index 6c47438cd4..9eee73e711 100644 --- a/ui.frontend/src/view/FormCheckBox.js +++ b/ui.frontend/src/view/FormCheckBox.js @@ -46,7 +46,14 @@ class FormCheckBox extends FormFieldBase { const value = this.widget.checked ? this._onValue : this._offValue; this._model.dispatch(new FormView.Actions.UIChange({'value': value})); }) - + this.widget.addEventListener('focus', (e) => { + this.setActive(); + this.triggerEnter(); + }); + this.widget.addEventListener('blur', (e) => { + this.setInactive(); + this.triggerExit(); + }); } } diff --git a/ui.frontend/src/view/FormContainer.js b/ui.frontend/src/view/FormContainer.js index 3c44ae9c8b..ad9d8f8153 100644 --- a/ui.frontend/src/view/FormContainer.js +++ b/ui.frontend/src/view/FormContainer.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ -import {createFormInstance} from "@aemforms/af-core"; +import {createFormInstance} from "@aemforms/af-core-xfa"; /** * @module FormView diff --git a/ui.frontend/src/view/FormField.js b/ui.frontend/src/view/FormField.js index 22afc7ad75..fb38a5aebe 100644 --- a/ui.frontend/src/view/FormField.js +++ b/ui.frontend/src/view/FormField.js @@ -102,6 +102,14 @@ class FormField { return this.element.getAttribute(Constants.DATA_ATTRIBUTE_ACTIVE) === 'true'; } + triggerExit() { + this._model.dispatch(new FormView.Actions.CustomEvent('xfaexit')); + } + + triggerEnter() { + this._model.dispatch(new FormView.Actions.CustomEvent('xfaenter')); + } + /** * Returns the form container path of the form field. * @returns {string} The form container path. diff --git a/ui.tests/pom.xml b/ui.tests/pom.xml index 314c93de23..9b3af755aa 100644 --- a/ui.tests/pom.xml +++ b/ui.tests/pom.xml @@ -24,7 +24,7 @@ com.adobe.aem core-forms-components-parent - 3.0.100-SNAPSHOT + 3.0.100-xfaB003-SNAPSHOT ../parent/pom.xml