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 <[email protected]>
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);