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&amp;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 &lt;form&gt; and &lt;grid&gt; 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);

Reply via email to