This is an automated email from the ASF dual-hosted git repository.

nmalin 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 9ea7afe  Fixed: Attribute default-field-type hidden doesn't work for 
auto-fields-service element (OFBIZ-12555)
9ea7afe is described below

commit 9ea7afe97af4e23a5b5694961cc482d653db08b7
Author: Nicolas Malin <nicolas.ma...@nereide.fr>
AuthorDate: Wed Feb 2 18:07:37 2022 +0100

    Fixed: Attribute default-field-type hidden doesn't work for 
auto-fields-service element (OFBIZ-12555)
    
    When you define a widget form and wish populate hidden fields with the 
element auto-fields-service, OFBiz rendering each as edit field type.
    
        <form name="ListPartyQuals" ...>
            <auto-fields-service service-name="updatePartyQual" 
default-field-type="hidden"/>
        </form>
    
    The problem came from the function 
ModelFormFieldBuilder.induceFieldInfoFromServiceParam didn't manage the case 
"hidden"
    
    By the way, this function is "if" forest, and simplify reading.
---
 .../ofbiz/widget/model/ModelFormFieldBuilder.java  | 107 ++++++++++++---------
 1 file changed, 61 insertions(+), 46 deletions(-)

diff --git 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormFieldBuilder.java
 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormFieldBuilder.java
index d01a8e6..cfbefab 100644
--- 
a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormFieldBuilder.java
+++ 
b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelFormFieldBuilder.java
@@ -20,10 +20,12 @@ package org.apache.ofbiz.widget.model;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.ofbiz.base.util.Debug;
+import org.apache.ofbiz.base.util.StringUtil;
 import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.base.util.UtilXml;
@@ -852,55 +854,68 @@ public class ModelFormFieldBuilder {
         }
         this.serviceName = modelService.getName();
         this.attributeName = modelParam.getName();
-        if ("find".equals(defaultFieldType)) {
-            if (modelParam.getType().indexOf("Double") != -1 || 
modelParam.getType().indexOf("Float") != -1
-                    || modelParam.getType().indexOf("Long") != -1 || 
modelParam.getType().indexOf("Integer") != -1) {
-                ModelFormField.RangeFindField textField = new 
ModelFormField.RangeFindField(FieldInfo.SOURCE_AUTO_SERVICE, 6,
-                        null);
-                this.setFieldInfo(textField);
-            } else if (modelParam.getType().indexOf("Timestamp") != -1) {
-                ModelFormField.DateFindField dateTimeField = new 
ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE,
-                        "timestamp");
-                this.setFieldInfo(dateTimeField);
-            } else if (modelParam.getType().indexOf("Date") != -1) {
-                ModelFormField.DateFindField dateTimeField = new 
ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE,
-                        "date");
-                this.setFieldInfo(dateTimeField);
-            } else if (modelParam.getType().indexOf("Time") != -1) {
-                ModelFormField.DateFindField dateTimeField = new 
ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE,
-                        "time");
-                this.setFieldInfo(dateTimeField);
-            } else {
-                ModelFormField.TextFindField textField = new 
ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_SERVICE, null);
-                this.setFieldInfo(textField);
+        String modelParamFieldType = 
computeFieldTypeToUse(modelParam.getType());
+        FieldInfo fieldInfo = null;
+        switch (defaultFieldType) {
+        case "display":
+            fieldInfo = new 
ModelFormField.DisplayField(FieldInfo.SOURCE_AUTO_SERVICE, null);
+            break;
+        case "hidden":
+            fieldInfo = new 
ModelFormField.HiddenField(FieldInfo.SOURCE_AUTO_SERVICE, null);
+            break;
+        case "find":
+            if ("text".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_SERVICE, null);
+            } else if ("numeric".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.RangeFindField(FieldInfo.SOURCE_AUTO_SERVICE, 6, null);
+            } else if ("timestamp".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE, "timestamp");
+            } else if ("date".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE, "date");
+            } else if ("time".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_SERVICE, "time");
             }
-        } else if ("display".equals(defaultFieldType)) {
-            ModelFormField.DisplayField displayField = new 
ModelFormField.DisplayField(FieldInfo.SOURCE_AUTO_SERVICE, null);
-            this.setFieldInfo(displayField);
-        } else {
-            // default to "edit"
-            if (modelParam.getType().indexOf("Double") != -1 || 
modelParam.getType().indexOf("Float") != -1
-                    || modelParam.getType().indexOf("Long") != -1 || 
modelParam.getType().indexOf("Integer") != -1) {
-                ModelFormField.TextField textField = new 
ModelFormField.TextField(FieldInfo.SOURCE_AUTO_SERVICE, 6, null, null);
-                this.setFieldInfo(textField);
-            } else if (modelParam.getType().indexOf("Timestamp") != -1) {
-                ModelFormField.DateTimeField dateTimeField = new 
ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE,
-                        "timestamp");
-                this.setFieldInfo(dateTimeField);
-            } else if (modelParam.getType().indexOf("Date") != -1) {
-                ModelFormField.DateTimeField dateTimeField = new 
ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE,
-                        "date");
-                this.setFieldInfo(dateTimeField);
-            } else if (modelParam.getType().indexOf("Time") != -1) {
-                ModelFormField.DateTimeField dateTimeField = new 
ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE,
-                        "time");
-                this.setFieldInfo(dateTimeField);
-            } else {
-                ModelFormField.TextField textField = new 
ModelFormField.TextField(FieldInfo.SOURCE_AUTO_SERVICE, null);
-                this.setFieldInfo(textField);
+            break;
+        default: // default to "edit"
+            if ("text".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.TextField(FieldInfo.SOURCE_AUTO_SERVICE, null);
+            } else if ("numeric".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.TextField(FieldInfo.SOURCE_AUTO_SERVICE, 6, null, null);
+            } else if ("timestamp".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE, "timestamp");
+            } else if ("date".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE, "date");
+            } else if ("time".equals(modelParamFieldType)) {
+                fieldInfo = new 
ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_SERVICE, "time");
             }
         }
-        return true;
+        this.setFieldInfo(fieldInfo);
+        return fieldInfo != null;
+    }
+
+    /**
+     * For a service model parameter type, return the logique field type to use
+     * If nothing found, return text
+     * @param modelParamType
+     * @return
+     */
+    private String computeFieldTypeToUse(String modelParamType) {
+        final Map<String, String> switchType = Map.of("Double", "numeric",
+                "Float", "numeric",
+                "Long", "numeric",
+                "Integer", "numeric",
+                "BigDecimal", "numeric",
+                "Timestamp", "timestamp",
+                "Date", "date",
+                "Time", "time");
+        String typeToConvert = "";
+        if (modelParamType.contains(".")) {
+            LinkedList<String> splitString = new 
LinkedList<>(StringUtil.split(modelParamType, "."));
+            typeToConvert = splitString.getLast();
+        } else {
+            typeToConvert = modelParamType;
+        }
+        return switchType.containsKey(typeToConvert) ? 
switchType.get(typeToConvert) : "text";
     }
 
     private boolean induceFieldInfoFromServiceParam(String defaultFieldType, 
ModelReader entityModelReader,

Reply via email to