This is an automated email from the ASF dual-hosted git repository. jleroux pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push: new dbf611d222 Improved: Add auto-parameters-form option to on-event-update-area link in xml form (OFBIZ-12684) dbf611d222 is described below commit dbf611d222c3dc6abb40b01b26a84514da70f67d Author: Jacques Le Roux <jacques.le.r...@les7arts.com> AuthorDate: Mon Aug 29 10:18:52 2022 +0200 Improved: Add auto-parameters-form option to on-event-update-area link in xml form (OFBIZ-12684) As we have an auto-parameters-entity and an auto-parameters-service option in xml forms on-event-update-area tags, it could be useful to have an auto-parameters-form option that will propagate current form fields as parameters to the paginate or submit action link (for instance in modal "tunnel" processes) Currently, if you want to propagate the parameters of a form to a zone that is refreshed in ajax after the submit you have to write specific javascript code or to return all the parameters sent to the request through a service as OUT parameters and/or redirect-parameter. This feature will add automatically the form parameters on the generated on-event-update-area link jleroux: fixed 3 checkstyle issues: > Task :checkstyleMain [ant:checkstyle] [ERROR] CommonWidgetModels.java:385:17: Il y a une espace de trop après '!'. [NoWhitespaceAfter] [ant:checkstyle] [ERROR] CommonWidgetModels.java:398:77: Il manque une espace après 'conversion de type'. [WhitespaceAfter] [ant:checkstyle] [ERROR] ModelForm.java:2326: La ligne excède 150 caractères (trouvé 155). [LineLength] Thanks: Leila --- applications/product/widget/catalog/StoreForms.xml | 5 ++++- framework/widget/dtd/widget-common.xsd | 5 +++++ framework/widget/dtd/widget-form.xsd | 3 +++ .../ofbiz/widget/model/CommonWidgetModels.java | 22 +++++++++++++----- .../org/apache/ofbiz/widget/model/ModelForm.java | 26 +++++++++++++++------- .../webapp/common-theme/js/util/OfbizUtil.js | 14 ++++++++++++ 6 files changed, 60 insertions(+), 15 deletions(-) diff --git a/applications/product/widget/catalog/StoreForms.xml b/applications/product/widget/catalog/StoreForms.xml index f99f0553b5..1110736e55 100644 --- a/applications/product/widget/catalog/StoreForms.xml +++ b/applications/product/widget/catalog/StoreForms.xml @@ -713,6 +713,7 @@ under the License. target="addProductStoreFacility" title="" default-map-name="productStoreFacility" > <alt-target target="updateProductStoreFacility" use-when="productStoreFacility != null"/> + <field name="portalPortletId"><hidden value="PrdStoreFacilityMgmt"/></field> <field name="productStoreId"><hidden /></field> <field name="facilityId" use-when="productStoreFacility != null"><display/></field> <field name="facilityId" use-when="productStoreFacility == null"> @@ -727,7 +728,9 @@ under the License. <field name="submitButton" title="${groovy: productStoreFacility == null ? uiLabelMap.CommonAdd : uiLabelMap.CommonUpdate}" widget-style="smallSubmit"> <submit button-type="button"/> </field> - <on-event-update-area event-type="submit" area-id="PP_ProductStoreFacilityPrdStoreFacilityMgmt00001" area-target="ListProductStoreFacilityFormOnly?portalPortletId=PrdStoreFacilityMgmt&productStoreId=${parameters.productStoreId}"/> + <on-event-update-area area-target="ListProductStoreFacilityFormOnly" event-type="submit" area-id="PP_ProductStoreFacilityPrdStoreFacilityMgmt00001"> + <auto-parameters-form/> + </on-event-update-area> </form> <!-- ProductStoreGroup Forms --> diff --git a/framework/widget/dtd/widget-common.xsd b/framework/widget/dtd/widget-common.xsd index d6ddd11db5..5595ebc87e 100644 --- a/framework/widget/dtd/widget-common.xsd +++ b/framework/widget/dtd/widget-common.xsd @@ -522,6 +522,11 @@ under the License. <xs:attribute name="send-if-empty" type="xs:boolean" default="true"/> </xs:complexType> </xs:element> + <xs:element name="auto-parameters-form"> + <xs:complexType> + <xs:attribute name="form-name" type="xs:string"/> + </xs:complexType> + </xs:element> <xs:element name="exclude"> <xs:complexType> <xs:attribute name="field-name" type="xs:string" use="required" /> diff --git a/framework/widget/dtd/widget-form.xsd b/framework/widget/dtd/widget-form.xsd index 50c779e573..6351f0c813 100644 --- a/framework/widget/dtd/widget-form.xsd +++ b/framework/widget/dtd/widget-form.xsd @@ -586,6 +586,7 @@ under the License. <xs:sequence> <xs:element minOccurs="0" ref="auto-parameters-service"/> <xs:element minOccurs="0" ref="auto-parameters-entity"/> + <xs:element minOccurs="0" ref="auto-parameters-form"/> <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter" /> </xs:sequence> <xs:attribute name="event-type" use="required"> @@ -617,6 +618,7 @@ under the License. </xs:attribute> </xs:complexType> </xs:element> + <xs:element name="auto-parameters-form"/> <!-- ================== FIELDS ==================== --> <xs:element name="AllFields" abstract="true"/> @@ -1549,6 +1551,7 @@ under the License. <xs:sequence> <xs:element minOccurs="0" ref="auto-parameters-service"/> <xs:element minOccurs="0" ref="auto-parameters-entity"/> + <xs:element minOccurs="0" ref="auto-parameters-form"/> <xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter" /> </xs:sequence> <xs:attribute name="event-type" use="required"> diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java index b05c6314b0..94f3695fc6 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/CommonWidgetModels.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -46,6 +47,7 @@ import org.apache.ofbiz.service.LocalDispatcher; import org.apache.ofbiz.service.ModelParam; import org.apache.ofbiz.service.ModelService; import org.w3c.dom.Element; +import org.w3c.dom.Node; /** * A collection of shared/reused widget models. @@ -379,16 +381,24 @@ public final class CommonWidgetModels { this.linkType = linkElement.getAttribute("link-type"); } List<? extends Element> parameterElementList = UtilXml.childElementList(linkElement, "parameter"); - if (parameterElementList.isEmpty()) { - this.parameterList = Collections.emptyList(); - } else { - List<Parameter> parameterList = new ArrayList<>( - parameterElementList.size()); + List<Parameter> parameterList = new LinkedList<>(); + if (!parameterElementList.isEmpty()) { for (Element parameterElement : parameterElementList) { parameterList.add(new Parameter(parameterElement)); } - this.parameterList = Collections.unmodifiableList(parameterList); } + Element autoFormParamsElement = UtilXml.firstChildElement(linkElement, "auto-parameters-form"); + if (autoFormParamsElement != null) { + Node formElement = autoFormParamsElement; + while (formElement != null + && formElement.getLocalName() != "form") { + formElement = formElement.getParentNode(); + } + if (formElement.getLocalName() != null) { + parameterList.add(new Parameter("_FORM_NAME_", ((Element) formElement).getAttribute("name") + "_AS_PARAM_", false)); + } + } + this.parameterList = Collections.unmodifiableList(parameterList); Element autoServiceParamsElement = UtilXml.firstChildElement(linkElement, "auto-parameters-service"); if (autoServiceParamsElement != null) { this.autoServiceParameters = new AutoServiceParameters(autoServiceParamsElement); diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java index 889ba40916..a7d1cdf19a 100644 --- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java +++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelForm.java @@ -30,8 +30,8 @@ import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; - import java.util.stream.Collectors; + import org.apache.ofbiz.base.conversion.ConversionException; import org.apache.ofbiz.base.conversion.JSONConverters; import org.apache.ofbiz.base.lang.JSON; @@ -61,6 +61,7 @@ import org.apache.ofbiz.widget.renderer.FormStringRenderer; import org.apache.ofbiz.widget.renderer.VisualTheme; import org.codehaus.groovy.control.CompilationFailedException; import org.w3c.dom.Element; +import org.w3c.dom.Node; /** * Abstract base class for the <form> and <grid> elements. @@ -2309,15 +2310,24 @@ public abstract class ModelForm extends ModelWidget { this.defaultServiceName = defaultServiceName; this.defaultEntityName = defaultEntityName; List<? extends Element> parameterElementList = UtilXml.childElementList(updateAreaElement, "parameter"); - if (parameterElementList.isEmpty()) { - this.parameterList = Collections.emptyList(); - } else { - List<CommonWidgetModels.Parameter> parameterList = new ArrayList<>(parameterElementList.size()); - for (Element parameterElement : parameterElementList) { - parameterList.add(new CommonWidgetModels.Parameter(parameterElement)); + + List<CommonWidgetModels.Parameter> parameterList = new ArrayList<>(parameterElementList.size()); + for (Element parameterElement : parameterElementList) { + parameterList.add(new CommonWidgetModels.Parameter(parameterElement)); + } + Element autoFormParamsElement = UtilXml.firstChildElement(updateAreaElement, "auto-parameters-form"); + if (autoFormParamsElement != null) { + Node formElement = autoFormParamsElement; + while (formElement != null + && formElement.getLocalName() != "form") { + formElement = formElement.getParentNode(); + } + if (formElement.getLocalName() != null) { + parameterList.add(new CommonWidgetModels.Parameter("_FORM_NAME_", ((Element) formElement).getAttribute("name") + "_AS_PARAM_", + false)); } - this.parameterList = Collections.unmodifiableList(parameterList); } + this.parameterList = Collections.unmodifiableList(parameterList); Element autoServiceParamsElement = UtilXml.firstChildElement(updateAreaElement, "auto-parameters-service"); if (autoServiceParamsElement != null) { this.autoServiceParameters = new CommonWidgetModels.AutoServiceParameters(autoServiceParamsElement); diff --git a/themes/common-theme/webapp/common-theme/js/util/OfbizUtil.js b/themes/common-theme/webapp/common-theme/js/util/OfbizUtil.js index 3921c75275..35b21fe780 100644 --- a/themes/common-theme/webapp/common-theme/js/util/OfbizUtil.js +++ b/themes/common-theme/webapp/common-theme/js/util/OfbizUtil.js @@ -629,6 +629,16 @@ function confirmActionFormLink(msg, formName) { } } +function serializeFormFromParameters(targetParams) { + const beginName = targetParams.indexOf("_FORM_NAME_="); + targetParams = targetParams.replace("_FORM_NAME_=", ""); + const endName = targetParams.indexOf("_AS_PARAM_"); + const formName = targetParams.substring(beginName, endName); + var $form = $("form[name='" + formName + "']"); + + return targetParams.replace(formName + "_AS_PARAM_", $form.serialize()) +} + // ===== Ajax Functions - based on jQuery.js ===== // /** Update an area (HTML container element). @@ -638,6 +648,10 @@ function confirmActionFormLink(msg, formName) { */ function ajaxUpdateArea(areaId, target, targetParams) { + if (targetParams.indexOf("_FORM_NAME_") !== -1) { + targetParams = serializeFormFromParameters(targetParams) + } + if (areaId == "window") { targetUrl = target + "?" + targetParams.replace('?',''); window.location.assign(targetUrl);