[ofbiz-framework] branch trunk updated: Improved: Improve webtools/control/FindGeneric (OFBIZ-11253) Update the script to generate xml form to introduce new following features :

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[ofbiz-framework] branch trunk updated: Improved: Improve webtools/control/FindGeneric (OFBIZ-11253) Update the script to generate xml form to introduce new following features :

nmalin
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 2c58133  Improved: Improve webtools/control/FindGeneric (OFBIZ-11253) Update the script to generate xml form to introduce new following features :
2c58133 is described below

commit 2c58133e50a61c8caf57aee47e1f786a8f3eaaa8
Author: Nicolas Malin <[hidden email]>
AuthorDate: Sun Nov 10 20:14:14 2019 +0100

    Improved: Improve webtools/control/FindGeneric
    (OFBIZ-11253)
    Update the script to generate xml form to introduce new following features :
   
       * set equals as operator by default on pk instead of contains, when you use a pk on FindGeneric it's in general to resolve it on completed key.
       * add on tooltip the raw field name
       * add possibility to filter on internal field
       * add sort on column
   
    During this work I also view that the ModelFormField contains an 'IF forest' to analyze each field. I rewrote it to consolidate the analyze by type.
---
 .../groovyScripts/entity/FindGeneric.groovy        |  76 +++++++-----
 .../ofbiz/widget/model/ModelFormFieldBuilder.java  | 134 ++++++++++-----------
 2 files changed, 111 insertions(+), 99 deletions(-)

diff --git a/framework/webtools/groovyScripts/entity/FindGeneric.groovy b/framework/webtools/groovyScripts/entity/FindGeneric.groovy
index 127a94a..11bbacb 100644
--- a/framework/webtools/groovyScripts/entity/FindGeneric.groovy
+++ b/framework/webtools/groovyScripts/entity/FindGeneric.groovy
@@ -17,9 +17,6 @@
  * under the License.
  */
 
-import org.apache.ofbiz.base.util.Debug
-import org.apache.ofbiz.base.util.UtilValidate
-import org.apache.ofbiz.base.util.UtilProperties
 import org.apache.ofbiz.base.util.UtilXml
 import org.apache.ofbiz.entity.GenericEntityException
 import org.apache.ofbiz.entity.model.ModelEntity
@@ -28,7 +25,6 @@ import org.apache.ofbiz.entity.model.ModelReader
 import org.apache.ofbiz.widget.model.FormFactory
 import org.apache.ofbiz.widget.model.ModelForm
 import org.apache.ofbiz.widget.renderer.FormRenderer
-import org.apache.ofbiz.widget.renderer.VisualTheme
 import org.apache.ofbiz.widget.renderer.macro.MacroFormRenderer
 import org.w3c.dom.Document
 
@@ -36,7 +32,7 @@ ModelEntity modelEntity = null
 try {
     modelEntity = delegator.getModelEntity(parameters.entityName)
 } catch(GenericEntityException e) {
-    Debug.logError("The entityName " + parameters.entityName + " is not found", "FindGeneric.groovy")
+    logError("The entityName ${parameters.entityName} isn't found", "FindGeneric.groovy")
 }
 
 if (modelEntity) {
@@ -44,28 +40,35 @@ if (modelEntity) {
     context.entityName = entityName
     ModelReader entityModelReader = delegator.getModelReader()
     //create the search form with auto-fields-entity
-    String dynamicAutoEntityFieldSearchForm = '<?xml version="1.0" encoding="UTF-8"?><forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ofbiz.apache.org/Widget-Form" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Form http://ofbiz.apache.org/dtds/widget-form.xsd">' +
-            '<form name="FindGeneric" type="single" target="FindGeneric?entityName='+ entityName +'">' +
-            '<auto-fields-entity entity-name="' + entityName + '" default-field-type="find"/>' +
-            '<field name="noConditionFind"><hidden value="Y"/></field>' +
-            '<field name="searchOptions_collapsed" ><hidden value="true"/></field>' +
-            '<field name="searchButton" title="' + UtilProperties.getMessage("CommonUiLabels", "FormFieldTitle_searchButton", locale) + '"><submit/></field>'
+    String dynamicAutoEntityFieldSearchForm = """<?xml version="1.0" encoding="UTF-8"?><forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ofbiz.apache.org/Widget-Form" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Form http://ofbiz.apache.org/dtds/widget-form.xsd">
+        <form name="FindGeneric" type="single" target="FindGeneric?entityName=${entityName}">
+           <auto-fields-entity entity-name="${entityName}" default-field-type="find" include-internal="true"/>
+            <field name="noConditionFind"><hidden value="Y"/></field>
+            <field name="searchOptions_collapsed" ><hidden value="true"/></field>
+            <field name="searchButton"><submit/></field>"""
 
     //call modelEntity to complete information on the field type
     modelEntity.getFieldsUnmodifiable().each {
         modelField ->
             if (! modelEntity.getAutomaticFieldNames().contains(modelField.name)) {
                 ModelFieldType type = delegator.getEntityFieldType(modelEntity, modelField.getType())
-                dynamicAutoEntityFieldSearchForm = dynamicAutoEntityFieldSearchForm +
-                        '<field name="' + modelField.name + '" tooltip="' +
-                        (modelField.getIsPk() ? "* " : " ") +
-                        modelField.getType() + " (${type.getJavaType()} - ${type.getSqlType()})" +
-                        '"/>'
+                dynamicAutoEntityFieldSearchForm +=
+                        "<field name=\"${modelField.name}\" tooltip=\"${modelField.getName()}" +
+                                (modelField.getIsPk() ? '* ': ' ') +
+                                " / ${modelField.getType()} (${type.getJavaType()} - ${type.getSqlType()})\">"
+
+                //In general when your research some entity on the pk field, you check on element, so help by set as default equals comparison
+                if (modelField.getIsPk() && type.getJavaType() == 'String') {
+                    dynamicAutoEntityFieldSearchForm += '<text-find default-option="equals"/>'
+                }
+                dynamicAutoEntityFieldSearchForm += '</field>'
             }
     }
     dynamicAutoEntityFieldSearchForm = dynamicAutoEntityFieldSearchForm + '</form></forms>'
+    logVerbose(dynamicAutoEntityFieldSearchForm)
     Document dynamicAutoEntityFieldSearchFormXml = UtilXml.readXmlDocument(dynamicAutoEntityFieldSearchForm, true, true)
     Map<String, ModelForm> modelFormMap = FormFactory.readFormDocument(dynamicAutoEntityFieldSearchFormXml, entityModelReader, dispatcher.getDispatchContext(), entityName)
+    ModelForm modelForm
     if (modelFormMap) {
         Map.Entry<String, ModelForm> entry = modelFormMap.entrySet().iterator().next()
         modelForm = entry.getValue()
@@ -79,22 +82,31 @@ if (modelEntity) {
     context.dynamicAutoEntitySearchForm = writer
 
     //prepare the result list from performFind
-    String dynamicAutoEntityFieldListForm = '<?xml version="1.0" encoding="UTF-8"?><forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ofbiz.apache.org/Widget-Form" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Form http://ofbiz.apache.org/dtds/widget-form.xsd">' +
-            '<form name="ListGeneric" type="list" target="FindGeneric" list-name="listIt" ' +
-            '  odd-row-style="alternate-row" default-table-style="basic-table light-grid hover-bar">' +
-            '<actions><service service-name="performFind">' +
-            '<field-map field-name="inputFields" from-field="parameters"/>' +
-            '<field-map field-name="entityName" value="' + entityName + '"/>' +
-            '</service></actions>' +
-            '<auto-fields-entity entity-name="' + entityName + '" default-field-type="display" include-internal="true"/>' +
-            '<field name="entityName"><hidden value="' + entityName + '"/></field>' +
-            '<field name="viewGeneric" title=" "><hyperlink target="ViewGeneric" description="view">' +
-            '    <auto-parameters-entity entity-name="' + entityName + '"/>' +
-            '    <parameter param-name="entityName" value="' + entityName + '"/>' +
-            '</hyperlink></field>' +
-            '<sort-order><sort-field name="viewGeneric"/></sort-order>' +
-            '</form></forms>'
-    //Debug.logInfo(dynamicAutoEntityFieldForm, "")
+    String dynamicAutoEntityFieldListForm = """<?xml version="1.0" encoding="UTF-8"?><forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ofbiz.apache.org/Widget-Form" xsi:schemaLocation="http://ofbiz.apache.org/Widget-Form http://ofbiz.apache.org/dtds/widget-form.xsd">
+            <form name="ListGeneric" type="list" target="FindGeneric" list-name="listIt"
+              odd-row-style="alternate-row" default-table-style="basic-table light-grid hover-bar" header-row-style="header-row-2">
+            <actions>
+                <service service-name="performFind">
+                    <field-map field-name="inputFields" from-field="parameters"/>
+                    <field-map field-name="entityName" value="${entityName}"/>
+                    <field-map field-name="orderBy" from-field="parameters.sortField"/>
+                </service>
+            </actions>
+            <auto-fields-entity entity-name="${entityName}" default-field-type="display" include-internal="true"/>
+            <field name="entityName"><hidden value="${entityName}"/></field>"""
+    modelEntity.getFieldsUnmodifiable().each {
+        modelField ->
+            dynamicAutoEntityFieldListForm +=
+                    "<field name=\"${modelField.name}\" sort-field=\"true\"/>"
+    }
+    dynamicAutoEntityFieldListForm += """
+            <field name="viewGeneric" title=" "><hyperlink target="ViewGeneric" description="view">
+                <auto-parameters-entity entity-name="${entityName}"/>
+                <parameter param-name="entityName" value="${entityName}"/>
+            </hyperlink></field>
+            <sort-order><sort-field name="viewGeneric"/></sort-order>
+            </form></forms>"""
+
     Document dynamicAutoEntityFieldListFormXml = UtilXml.readXmlDocument(dynamicAutoEntityFieldListForm, true, true)
     modelFormMap = FormFactory.readFormDocument(dynamicAutoEntityFieldListFormXml, entityModelReader, dispatcher.getDispatchContext(), entityName)
     if (modelFormMap) {
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 656b99d..a59ca45 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
@@ -19,10 +19,12 @@
 package org.apache.ofbiz.widget.model;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.ofbiz.base.util.Debug;
+import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.base.util.UtilXml;
 import org.apache.ofbiz.base.util.collections.FlexibleMapAccessor;
@@ -113,6 +115,43 @@ public class ModelFormFieldBuilder {
     private String tabindex = "";
     private String conditionGroup = "";
 
+    protected static final List<String> numericFieldTypes = Collections.unmodifiableList(UtilMisc.toList(
+            "floating-point", "numeric", "fixed-point",
+            "currency-amount", "currency-precise"));
+    protected static final List<String> textFieldTypes = Collections.unmodifiableList(UtilMisc.toList(
+            "id", "id-long", "id-vlong",
+            "very-short", "name", "short-varchar",
+            "value", "comment", "description",
+            "long-varchar", "url", "email"));
+    protected static final Map<String, Integer> textSizeByFieldTypes = Collections.unmodifiableMap(UtilMisc.toMap(
+            "id", 20,
+            "id-long", 40,
+            "id-vlong", 60,
+            "very-short", 6,
+            "name", 40,
+            "short-varchar", 40,
+            "value", 60,
+            "comment", 60,
+            "description", 60,
+            "long-varchar", 60,
+            "url", 60,
+            "email", 60));
+    protected static final Map<String, Integer> textMaxSizeByFieldTypes = Collections.unmodifiableMap(UtilMisc.toMap(
+            "id", 20,
+            "id-long", 60,
+            "id-vlong", 250,
+            "very-short", 10,
+            "name", 60,
+            "short-varchar", 40,
+            "value", 250,
+            "comment", 250,
+            "description", 250,
+            "long-varchar", 250,
+            "url", 250,
+            "email", 250));
+    protected static final List<String> dateFieldTypes = Collections.unmodifiableList(UtilMisc.toList(
+            "date-time", "date", "time"));
+
     public ModelFormFieldBuilder() {
     }
 
@@ -518,41 +557,26 @@ public class ModelFormFieldBuilder {
         }
         this.entityName = modelEntity.getEntityName();
         this.fieldName = modelField.getName();
+        String fieldType = modelField.getType();
         if ("find".equals(defaultFieldType)) {
-            if ("id".equals(modelField.getType())) {
-                ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 20,
-                        20, null);
-                this.setFieldInfo(textField);
-            } else if ("id-long".equals(modelField.getType())) {
-                ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 40,
-                        60, null);
-                this.setFieldInfo(textField);
-            } else if ("id-vlong".equals(modelField.getType())) {
-                ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 60,
-                        250, null);
-                this.setFieldInfo(textField);
-            } else if ("very-short".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 6,
-                        10, null);
-                this.setFieldInfo(textField);
-            } else if ("name".equals(modelField.getType()) || "short-varchar".equals(modelField.getType())) {
-                ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 40,
-                        60, null);
-                this.setFieldInfo(textField);
-            } else if ("value".equals(modelField.getType()) || "comment".equals(modelField.getType())
-                    || "description".equals(modelField.getType()) || "long-varchar".equals(modelField.getType())
-                    || "url".equals(modelField.getType()) || "email".equals(modelField.getType())) {
-                ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY, 60,
-                        250, null);
+            if ("indicator".equals(fieldType)) {
+                List<OptionSource> optionSources = UtilMisc.toList(
+                        new ModelFormField.SingleOption("", null, null),
+                        new ModelFormField.SingleOption("Y", null, null),
+                        new ModelFormField.SingleOption("N", null, null));
+                ModelFormField.DropDownField dropDownField = new ModelFormField.DropDownField(FieldInfo.SOURCE_AUTO_ENTITY,
+                        optionSources);
+                this.setFieldInfo(dropDownField);
+            } else if (textFieldTypes.contains(fieldType)) {
+                ModelFormField.TextFindField textField = new ModelFormField.TextFindField(FieldInfo.SOURCE_AUTO_ENTITY,
+                        textSizeByFieldTypes.get(fieldType), textMaxSizeByFieldTypes.get(fieldType), null);
                 this.setFieldInfo(textField);
-            } else if ("floating-point".equals(modelField.getType()) || "currency-amount".equals(modelField.getType())
-                    || "numeric".equals(modelField.getType()) || "fixed-point".equals(modelField.getType()) || "currency-precise".equals(modelField.getType())) {
+            } else if (numericFieldTypes.contains(fieldType)) {
                 ModelFormField.RangeFindField textField = new ModelFormField.RangeFindField(FieldInfo.SOURCE_AUTO_ENTITY, 6, null);
                 this.setFieldInfo(textField);
-            } else if ("date-time".equals(modelField.getType()) || "date".equals(modelField.getType())
-                    || "time".equals(modelField.getType())) {
-                String type = modelField.getType();
-                if ("date-time".equals(modelField.getType())) {
+            } else if (dateFieldTypes.contains(fieldType)) {
+                String type = fieldType;
+                if ("date-time".equals(fieldType)) {
                     type = "timestamp";
                 }
                 ModelFormField.DateFindField dateTimeField = new ModelFormField.DateFindField(FieldInfo.SOURCE_AUTO_ENTITY, type);
@@ -568,50 +592,26 @@ public class ModelFormFieldBuilder {
             ModelFormField.HiddenField hiddenField = new ModelFormField.HiddenField(FieldInfo.SOURCE_AUTO_SERVICE, null);
             this.setFieldInfo(hiddenField);
         } else {
-            if ("id".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 20,
-                        20, null);
-                this.setFieldInfo(textField);
-            } else if ("id-long".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 40,
-                        60, null);
-                this.setFieldInfo(textField);
-            } else if ("id-vlong".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 60,
-                        250, null);
-                this.setFieldInfo(textField);
-            } else if ("indicator".equals(modelField.getType())) {
-                List<OptionSource> optionSources = new ArrayList<>();
-                optionSources.add(new ModelFormField.SingleOption("Y", null, null));
-                optionSources.add(new ModelFormField.SingleOption("N", null, null));
+            if ("indicator".equals(fieldType)) {
+                List<OptionSource> optionSources = UtilMisc.toList(
+                        new ModelFormField.SingleOption("Y", null, null),
+                        new ModelFormField.SingleOption("N", null, null));
                 ModelFormField.DropDownField dropDownField = new ModelFormField.DropDownField(FieldInfo.SOURCE_AUTO_ENTITY,
                         optionSources);
                 this.setFieldInfo(dropDownField);
-            } else if ("very-short".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 6,
-                        10, null);
-                this.setFieldInfo(textField);
-            } else if ("very-long".equals(modelField.getType())) {
+            } else if ("very-long".equals(fieldType)) {
                 ModelFormField.TextareaField textareaField = new ModelFormField.TextareaField(FieldInfo.SOURCE_AUTO_ENTITY, null);
                 this.setFieldInfo(textareaField);
-            } else if ("name".equals(modelField.getType()) || "short-varchar".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 40,
-                        60, null);
-                this.setFieldInfo(textField);
-            } else if ("value".equals(modelField.getType()) || "comment".equals(modelField.getType())
-                    || "description".equals(modelField.getType()) || "long-varchar".equals(modelField.getType())
-                    || "url".equals(modelField.getType()) || "email".equals(modelField.getType())) {
-                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 60,
-                        250, null);
+            } if (textFieldTypes.contains(fieldType)) {
+                ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY,
+                        textSizeByFieldTypes.get(fieldType), textMaxSizeByFieldTypes.get(fieldType), null);
                 this.setFieldInfo(textField);
-            } else if ("floating-point".equals(modelField.getType()) || "currency-amount".equals(modelField.getType())
-                    || "numeric".equals(modelField.getType())) {
+            } else if (numericFieldTypes.contains(fieldType)) {
                 ModelFormField.TextField textField = new ModelFormField.TextField(FieldInfo.SOURCE_AUTO_ENTITY, 6, null, null);
                 this.setFieldInfo(textField);
-            } else if ("date-time".equals(modelField.getType()) || "date".equals(modelField.getType())
-                    || "time".equals(modelField.getType())) {
-                String type = modelField.getType();
-                if ("date-time".equals(modelField.getType())) {
+            } else if (dateFieldTypes.contains(fieldType)) {
+                String type = fieldType;
+                if ("date-time".equals(fieldType)) {
                     type = "timestamp";
                 }
                 ModelFormField.DateTimeField dateTimeField = new ModelFormField.DateTimeField(FieldInfo.SOURCE_AUTO_ENTITY, type);