details:   https://code.openbravo.com/erp/devel/pi/rev/fe9816e90756
changeset: 20230:fe9816e90756
user:      Martin Taal <martin.taal <at> openbravo.com>
date:      Mon Apr 29 17:01:03 2013 +0200
summary:   Fixes issue 23530: Filtering with a multiple value is not working 
properly
If the reference is a table ref with a display column then use the display 
column (or in fact its property) as the property to show in the combo box of 
the filter item, also do the filtering in the grid using this displaycolumn.

diffstat:

 
modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/formitem/ob-formitem-fk-filter.js
 |  20 +--
 
modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
                  |   1 +
 
modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
                           |  37 ++++++-
 
modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
                           |  53 +++++++++-
 4 files changed, 89 insertions(+), 22 deletions(-)

diffs (247 lines):

diff -r 23cf0735e7c3 -r fe9816e90756 
modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/formitem/ob-formitem-fk-filter.js
--- 
a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/formitem/ob-formitem-fk-filter.js
   Mon May 06 16:17:45 2013 +0200
+++ 
b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/formitem/ob-formitem-fk-filter.js
   Mon Apr 29 17:01:03 2013 +0200
@@ -58,8 +58,8 @@
 
     // the data from the datasource will contain the id and the identifier
     // the value for the filter and the display are the same: the identifier
-    this.displayField = OB.Constants.IDENTIFIER;
-    this.valueField = OB.Constants.IDENTIFIER;
+    this.displayField = this.criteriaDisplayField || OB.Constants.IDENTIFIER;
+    this.valueField = this.criteriaDisplayField || OB.Constants.IDENTIFIER;
 
     this.pickListProperties = {
 
@@ -82,12 +82,12 @@
         var i, values = this.formItem.getValue();
         if (values.length) {
           for (i = 0; i < values.length; i++) {
-            if (record[OB.Constants.IDENTIFIER] === values[i]) {
+            if (record[me.displayField] === values[i]) {
               return true;
             }
           }
         }
-        return record[OB.Constants.IDENTIFIER] === values;
+        return record[me.displayField] === values;
       },
 
       // override data arrived to prevent the first entry from being
@@ -109,7 +109,7 @@
           }
           for (rowNum = startRow; rowNum < (endRow + 1); rowNum++) {
             record = this.getRecord(rowNum);
-            if (record && values.contains(record[OB.Constants.IDENTIFIER])) {
+            if (record && values.contains(record[me.displayField])) {
               this.selectRecord(record, true);
             }
           }
@@ -122,11 +122,7 @@
       requestProperties: {
         params: {
           // distinct forces the distinct query on the server side
-          _distinct: gridField.valueField || gridField.name,
-          // identifier is not listed here as it is always send, actually
-          // the id is also always send, but setting _selectedProperties
-          // prevents other fields from coming over
-          _selectedProperties: 'id'
+          _distinct: gridField.valueField || gridField.name
         }
       },
       fields: this.pickListFields
@@ -240,7 +236,7 @@
   },
 
   canEditCriterion: function (criterion) {
-    return criterion && criterion.fieldName === this.name;
+    return criterion && (criterion.fieldName === this.name || 
criterion.fieldName === this.criteriaField);
   },
 
   getCriterion: function (textMatchStyle) {
@@ -291,7 +287,7 @@
   // see also the setValuesAsCriteria in ob-grid-js which again translates
   // back
   getCriteriaFieldName: function () {
-    return this.name + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER;
+    return this.criteriaField || this.name + OB.Constants.FIELDSEPARATOR + 
OB.Constants.IDENTIFIER;
   },
 
   // solve a small bug in the value expressions
diff -r 23cf0735e7c3 -r fe9816e90756 
modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
--- 
a/modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
    Mon May 06 16:17:45 2013 +0200
+++ 
b/modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
    Mon Apr 29 17:01:03 2013 +0200
@@ -68,6 +68,7 @@
               referencedTable.getDisplayedColumn());
           if (prop != null && referencedProp != null) {
             criteriaField = ", criteriaField: " + "'" + prop.getName() + 
DalUtil.FIELDSEPARATOR
+                + referencedProp.getName() + "', criteriaDisplayField: '"
                 + referencedProp.getName() + "'";
           }
         }
diff -r 23cf0735e7c3 -r fe9816e90756 
modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
--- 
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
     Mon May 06 16:17:45 2013 +0200
+++ 
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DataEntityQueryService.java
     Mon Apr 29 17:01:03 2013 +0200
@@ -32,11 +32,14 @@
 import org.openbravo.base.model.Entity;
 import org.openbravo.base.model.ModelProvider;
 import org.openbravo.base.model.Property;
+import org.openbravo.base.model.domaintype.TableDomainType;
 import org.openbravo.base.structure.BaseOBObject;
 import org.openbravo.base.util.Check;
+import org.openbravo.client.kernel.KernelUtils;
 import org.openbravo.dal.core.DalUtil;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.dal.service.OBQuery;
+import org.openbravo.model.ad.datamodel.Column;
 
 /**
  * Implements a service which can handle different types of query and paging 
options. This class
@@ -56,8 +59,6 @@
 
   public static final String PARAM_DELIMITER = "@";
 
-  private static final long serialVersionUID = 1L;
-
   private String entityName;
   private Integer firstResult = null;
   private Integer maxResults = null;
@@ -135,10 +136,9 @@
       final String localDistinct = getDistinct();
       queryBuilder.addSelectClausePart(localDistinct + ".id");
 
-      final Property property = DalUtil.getPropertyFromPath(
-          ModelProvider.getInstance().getEntity(getEntityName()), 
localDistinct);
+      final List<Property> properties = getDistinctDisplayProperties();
 
-      for (Property identifierProp : 
property.getTargetEntity().getIdentifierProperties()) {
+      for (Property identifierProp : properties) {
         if (identifierProp.getTargetEntity() != null) {
           // go one level deeper
           final List<Property> nextIdentifierProps = 
JsonUtils.getIdentifierSet(identifierProp);
@@ -173,6 +173,33 @@
     return obq;
   }
 
+  // package private on purpose
+  List<Property> getDistinctDisplayProperties() {
+    final String localDistinct = getDistinct();
+    final List<Property> properties = new ArrayList<Property>();
+    final Property property = DalUtil.getPropertyFromPath(
+        ModelProvider.getInstance().getEntity(getEntityName()), localDistinct);
+
+    // now use the table reference definition or select on the identifier 
properties
+    if (property.getDomainType() instanceof TableDomainType
+        && ((TableDomainType) property.getDomainType()).getRefTable() != null) 
{
+      final TableDomainType domainType = (TableDomainType) 
property.getDomainType();
+      final Property displayProp = 
KernelUtils.getInstance().getPropertyFromColumn(
+          OBDal.getInstance()
+              .get(Column.class, 
domainType.getRefTable().getDisplayColumn().getId()));
+      if (displayProp != null) {
+        properties.add(displayProp);
+      }
+    }
+
+    if (properties.isEmpty()) {
+      for (Property identifierProp : 
property.getTargetEntity().getIdentifierProperties()) {
+        properties.add(identifierProp);
+      }
+    }
+    return properties;
+  }
+
   public int getRowNumber(String targetRecordId) {
     final String whereOrderBy = queryBuilder.getJoinClause() + 
queryBuilder.getWhereClause()
         + queryBuilder.getOrderByClause();
diff -r 23cf0735e7c3 -r fe9816e90756 
modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
--- 
a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
     Mon May 06 16:17:45 2013 +0200
+++ 
b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
     Mon Apr 29 17:01:03 2013 +0200
@@ -85,6 +85,8 @@
       Check.isNotNull(entityName, "The name of the service/entityname should 
not be null");
       Check.isNotNull(parameters, "The parameters should not be null");
 
+      String selectedProperties = 
parameters.get(JsonConstants.SELECTEDPROPERTIES_PARAMETER);
+
       final JSONObject jsonResult = new JSONObject();
       final JSONObject jsonResponse = new JSONObject();
       List<BaseOBObject> bobs;
@@ -174,9 +176,32 @@
           final Property distinctProperty = 
DalUtil.getPropertyFromPath(ModelProvider.getInstance()
               .getEntity(entityName), distinct);
           final Entity distinctEntity = distinctProperty.getTargetEntity();
+
           final List<Property> properties = new ArrayList<Property>();
           properties.addAll(distinctEntity.getIdProperties());
-          properties.addAll(distinctEntity.getIdentifierProperties());
+          properties.addAll(queryService.getDistinctDisplayProperties());
+
+          // filter the json serialization later on
+          final StringBuilder selectedSb = new StringBuilder();
+          for (Property prop : properties) {
+            if (selectedSb.length() > 0) {
+              selectedSb.append(",");
+            }
+            if (prop.getTargetEntity() != null) {
+              // go one level deeper
+              final List<Property> nextIdentifierProps = 
JsonUtils.getIdentifierSet(prop);
+              for (Property nextIdentifierProp : nextIdentifierProps) {
+                selectedSb.append(prop.getName() + "." + nextIdentifierProp);
+              }
+            } else {
+              selectedSb.append(prop.getName());
+            }
+          }
+          if (selectedProperties == null) {
+            selectedProperties = selectedSb.toString();
+          } else {
+            selectedProperties += "," + selectedSb.toString();
+          }
 
           bobs = new ArrayList<BaseOBObject>();
 
@@ -255,8 +280,7 @@
       final DataToJsonConverter toJsonConverter = OBProvider.getInstance().get(
           DataToJsonConverter.class);
       
toJsonConverter.setAdditionalProperties(JsonUtils.getAdditionalProperties(parameters));
-      toJsonConverter.setSelectedProperties(parameters
-          .get(JsonConstants.SELECTEDPROPERTIES_PARAMETER));
+      toJsonConverter.setSelectedProperties(selectedProperties);
       final List<JSONObject> jsonObjects = toJsonConverter.toJsonObjects(bobs);
 
       addWritableAttribute(jsonObjects);
@@ -381,8 +405,7 @@
         && parameters.get(JsonConstants.DISTINCT_PARAMETER).trim().length() > 
0) {
       
queryService.setDistinct(parameters.get(JsonConstants.DISTINCT_PARAMETER).trim());
       // sortby the distinct's identifier
-      orderBy = queryService.getDistinct() + DalUtil.DOT + 
JsonConstants.IDENTIFIER + ","
-          + queryService.getDistinct() + DalUtil.DOT + JsonConstants.ID;
+      orderBy = getOrderByForDistinct(entityName, queryService);
     } else {
       // Always append id to the orderby to make a predictable sorting
       orderBy += (orderBy.isEmpty() ? "" : ",") + "id";
@@ -418,6 +441,26 @@
     return queryService;
   }
 
+  private String getOrderByForDistinct(String entityName, 
DataEntityQueryService queryService) {
+    final String localDistinct = queryService.getDistinct();
+    final List<Property> properties = 
queryService.getDistinctDisplayProperties();
+    final StringBuilder sb = new StringBuilder();
+    for (Property identifierProp : properties) {
+      if (identifierProp.getTargetEntity() != null) {
+        // go one level deeper
+        final List<Property> nextIdentifierProps = 
JsonUtils.getIdentifierSet(identifierProp);
+        for (Property nextIdentifierProp : nextIdentifierProps) {
+          sb.append(localDistinct + DalUtil.DOT + identifierProp.getName() + 
"."
+              + nextIdentifierProp + ",");
+        }
+      } else {
+        sb.append(localDistinct + DalUtil.DOT + identifierProp.getName() + 
",");
+      }
+    }
+    sb.append(localDistinct + DalUtil.DOT + JsonConstants.ID);
+    return sb.toString();
+  }
+
   private void addWritableAttribute(List<JSONObject> jsonObjects) throws 
JSONException {
     for (JSONObject jsonObject : jsonObjects) {
       if (!jsonObject.has("client") || !jsonObject.has("organization")) {

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to