(dev/core/91) Search Builder Improvements
authordeb.monish <monish.deb@jmaconsulting.biz>
Mon, 30 Apr 2018 07:45:19 +0000 (13:15 +0530)
committerdeb.monish <monish.deb@jmaconsulting.biz>
Mon, 30 Apr 2018 08:15:04 +0000 (13:45 +0530)
CRM/Contact/Form/Search/Builder.php
CRM/Core/SelectValues.php
templates/CRM/Contact/Form/Search/Builder.js

index 6da450868009f10e6c7422b2b9cddd9ec2f7e9a0..2a5dd79351b47a673a22bb98d082df6fcaf8f324 100644 (file)
@@ -91,18 +91,22 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
    */
   public function buildQuickForm() {
     $fields = self::fields();
-    // Get fields of type date
-    // FIXME: This is a hack until our fields contain this meta-data
-    $dateFields = array();
-    $stringFields = array();
     $searchByLabelFields = array();
+    // This array contain list of available fields and their corresponding data type,
+    //  later assigned as json string, to be used to filter list of mysql operators
+    $fieldNameTypes = [];
+    $dataType = [
+      CRM_Utils_Type::T_STRING => 'String',
+      CRM_Utils_Type::T_TEXT => 'String',
+      CRM_Utils_Type::T_LONGTEXT => 'String',
+      CRM_Utils_Type::T_BOOLEAN => 'Boolean',
+      CRM_Utils_Type::T_DATE => 'Date',
+      CRM_Utils_Type::T_TIMESTAMP => 'Date',
+    ];
     foreach ($fields as $name => $field) {
-      if (strpos($name, '_date') || CRM_Utils_Array::value('data_type', $field) == 'Date') {
-        $dateFields[] = $name;
-      }
-      // it's necessary to know which of the fields are from string data type
-      if (isset($field['type']) && $field['type'] === CRM_Utils_Type::T_STRING) {
-        $stringFields[] = $name;
+      // Assign date type to respective field name, which will be later used to modify operator list
+      if (isset($field['type']) && array_key_exists($field['type'], $dataType)) {
+        $fieldNameTypes[$name] = $dataType[$field['type']];
       }
       // it's necessary to know which of the fields are searchable by label
       if (isset($field['searchByLabel']) && $field['searchByLabel']) {
@@ -116,12 +120,10 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
         'searchBuilder' => array(
           // Index of newly added/expanded block (1-based index)
           'newBlock' => $this->get('newBlock'),
-          'dateFields' => $dateFields,
           'fieldOptions' => self::fieldOptions(),
-          'stringFields' => $stringFields,
           'searchByLabelFields' => $searchByLabelFields,
+          'fieldTypes' => $fieldNameTypes,
           'generalOperators' => array('' => ts('-operator-')) + CRM_Core_SelectValues::getSearchBuilderOperators(),
-          'stringOperators' => array('' => ts('-operator-')) + CRM_Core_SelectValues::getSearchBuilderOperators(CRM_Utils_Type::T_STRING),
         ),
       ));
     //get the saved search mapping id
index 07c11e022c4055882860b596f562a38ed47b7889..73d92562d0f61cdaae7eb8265944c21316c1a47b 100644 (file)
@@ -896,7 +896,7 @@ class CRM_Core_SelectValues {
    * @return array
    */
   public static function getSearchBuilderOperators($fieldType = NULL) {
-    $builderOperators = array(
+    return [
       '=' => '=',
       '!=' => '≠',
       '>' => '>',
@@ -912,18 +912,7 @@ class CRM_Core_SelectValues {
       'IS NOT EMPTY' => ts('Not Empty'),
       'IS NULL' => ts('Is Null'),
       'IS NOT NULL' => ts('Not Null'),
-    );
-    if ($fieldType) {
-      switch ($fieldType) {
-        case CRM_Utils_Type::T_STRING:
-          unset($builderOperators['>']);
-          unset($builderOperators['<']);
-          unset($builderOperators['>=']);
-          unset($builderOperators['<=']);
-          break;
-      }
-    }
-    return $builderOperators;
+    ];
   }
 
   /**
index 171ccf39668210d122ecdf14178a9c8deb858238..7ec210b2b99f613d9764cce62cca1ab72f326dc0 100644 (file)
@@ -1,5 +1,5 @@
 // http://civicrm.org/licensing
-(function($, CRM) {
+(function($, CRM, _) {
   'use strict';
 
   /* jshint validthis: true */
     var field = $('select[id^=mapper][id$="_1"]', row).val();
     var operator = $('select[id^=operator]', row);
     var op = operator.val();
-    
+
     var patt = /_1$/; // pattern to check if the change event came from field name
     if (field !== null && patt.test(this.id)) {
-      if ($.inArray(field, CRM.searchBuilder.stringFields) >= 0) {
-        // string operators
-        buildOperator(operator, CRM.searchBuilder.stringOperators);
-      } else {
-        // general operators
-        buildOperator(operator, CRM.searchBuilder.generalOperators);
+      // based on data type remove invalid operators e.g. IS EMPTY doesn't work with Boolean type column
+      if ((field in CRM.searchBuilder.fieldTypes) === true) {
+        if (CRM.searchBuilder.fieldTypes[field] == 'Boolean') {
+          CRM.searchBuilder.generalOperators = _.omit(CRM.searchBuilder.generalOperators, ['IS NOT EMPTY', 'IS EMPTY']);
+        }
+        else if (CRM.searchBuilder.fieldTypes[field] == 'String') {
+          CRM.searchBuilder.generalOperators = _.omit(CRM.searchBuilder.generalOperators, ['>', '<', '>=', '<=']);
+        }
       }
+      buildOperator(operator, CRM.searchBuilder.generalOperators);
     }
 
     // These Ops don't get any input field.
       buildSelect(row, field, op);
     }
 
-    if ($.inArray(field, CRM.searchBuilder.dateFields) < 0) {
-      removeDate(row);
+    if ((field in CRM.searchBuilder.fieldTypes) === true &&
+      CRM.searchBuilder.fieldTypes[field] == 'Date'
+    ) {
+      buildDate(row, op);
     }
     else {
-      buildDate(row, op);
+      removeDate(row);
     }
   }
 
       $('select[id^=mapper][id$="_1"]', '#Builder').each(handleUserInputField);
     }
   });
-})(cj, CRM);
+})(cj, CRM, CRM._);