SearchKit - Fix selecting operators and values in clauses
authorColeman Watts <coleman@civicrm.org>
Fri, 28 Jan 2022 14:54:34 +0000 (09:54 -0500)
committerColeman Watts <coleman@civicrm.org>
Fri, 28 Jan 2022 15:31:49 +0000 (10:31 -0500)
Fixes dev/core#3046 which was caused by incomplete refactoring in
https://github.com/civicrm/civicrm-core/pull/22604

ext/search_kit/ang/crmSearchAdmin/crmSearchCondition.component.js
ext/search_kit/ang/crmSearchAdmin/crmSearchCondition.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/boolean.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/date.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/entityRef.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/float.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/integer.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/select.html
ext/search_kit/ang/crmSearchTasks/crmSearchInput/text.html

index c30f72e7e742366d08eb0b5287c343aa41b5879e..2e112b612048d15c8dd0ba0335a72527c6dd6ace 100644 (file)
@@ -7,10 +7,10 @@
       clause: '<',
       format: '<',
       optionKey: '<',
-      offset: '@'
+      offset: '<'
     },
     templateUrl: '~/crmSearchAdmin/crmSearchCondition.html',
-    controller: function ($scope, $element, searchMeta) {
+    controller: function ($scope) {
       var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'),
         ctrl = this;
       this.operators = {};
         }
       }
 
+      function getValue() {
+        return ctrl.clause[1 + ctrl.offset];
+      }
+
+      function setValue(val) {
+        ctrl.clause[1 + ctrl.offset] = val;
+      }
+
+      // Getter/setter for use with ng-model
+      this.getSetOperator = function(op) {
+        if (arguments.length) {
+          setOperator(op);
+        }
+        return getOperator();
+      };
+
+      // Getter/setter for use with ng-model
+      this.getSetValue = function(val) {
+        if (arguments.length) {
+          setValue(val);
+        }
+        return getValue();
+      };
+
       // Return a list of operators allowed for the current field
       this.getOperators = function() {
         var field = ctrl.field || {},
           }
           // Change multi/single value to/from an array
           var shouldBeArray = _.includes(['IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'], getOperator());
-          if (!_.isArray(ctrl.clause[ctrl.offset + 1]) && shouldBeArray) {
-            ctrl.clause[ctrl.offset + 1] = [];
-          } else if (_.isArray(ctrl.clause[ctrl.offset + 1]) && !shouldBeArray) {
-            ctrl.clause[ctrl.offset + 1] = '';
+          if (!_.isArray(getValue()) && shouldBeArray) {
+            setValue([]);
+          } else if (_.isArray(getValue()) && !shouldBeArray) {
+            setValue('');
           }
           if (_.includes(['BETWEEN', 'NOT BETWEEN'], getOperator())) {
-            ctrl.clause[ctrl.offset + 1].length = 2;
+            getValue().length = 2;
           }
         }
       };
index e58bac413c2df1e2c85187c1f7f951e39ff952f5..f1c149de3a5e6b9b77423b04e6395afc5d52392c 100644 (file)
@@ -1,2 +1,2 @@
-<select class="form-control api4-operator" ng-model="$ctrl.clause[$ctrl.offset]" ng-options="o.key as o.value for o in $ctrl.getOperators()" ng-change="$ctrl.changeClauseOperator()" ></select>
-<crm-search-input ng-if="$ctrl.operatorTakesInput()" ng-model="$ctrl.clause[$ctrl.offset + 1]" field="$ctrl.field" option-key="$ctrl.optionKey" op="$ctrl.clause[$ctrl.offset]" format="$ctrl.format" class="form-group"></crm-search-input>
+<select class="form-control api4-operator" ng-model="$ctrl.getSetOperator" ng-model-options="{getterSetter: true}" ng-options="o.key as o.value for o in $ctrl.getOperators()" ng-change="$ctrl.changeClauseOperator()" ></select>
+<crm-search-input ng-if="$ctrl.operatorTakesInput()" ng-model="$ctrl.getSetValue" ng-model-options="{getterSetter: true}" field="$ctrl.field" option-key="$ctrl.optionKey" op="$ctrl.getSetOperator()" format="$ctrl.format" class="form-group"></crm-search-input>
index 61ed9000e660e9362e99f69c1525f7a1c9368b9d..597071979e108fdea2e0cfb5f08473c2b040a0df 100644 (file)
@@ -1,8 +1,8 @@
-<div class="form-group" ng-if="!$ctrl.multi" >
+<div class="form-group" ng-if="!$ctrl.isMulti()" >
   <label class="radio-inline"><input type="radio" ng-value="true" ng-model="$ctrl.value"> {{:: ts('Yes') }}</label>
   <label class="radio-inline"><input type="radio" ng-value="false" ng-model="$ctrl.value"> {{:: ts('No') }}</label>
 </div>
-<div class="form-group" ng-if="$ctrl.multi" >
+<div class="form-group" ng-if="$ctrl.isMulti()" >
   <label class="checkbox-inline"><input type="checkbox" checklist-value="true" checklist-model="$ctrl.value"> {{:: ts('Yes') }}</label>
   <label class="checkbox-inline"><input type="checkbox" checklist-value="false" checklist-model="$ctrl.value"> {{:: ts('No') }}</label>
 </div>
index 29d89573e58a2c3fc17b229dc34a0099d719643f..f5c7508be3e60f83e8176ea8763a6dbdb6015e7f 100644 (file)
@@ -1,5 +1,5 @@
 <div class="form-group">
-  <select class="form-control" ng-if="$ctrl.multi === false" ng-model="$ctrl.dateType" ng-change="$ctrl.changeDateType()">
+  <select class="form-control" ng-if="$ctrl.isMulti() === false" ng-model="$ctrl.dateType" ng-change="$ctrl.changeDateType()">
     <option value="fixed">{{:: ts('Pick Date') }}</option>
     <option value="range">{{:: ts('Date Range') }}</option>
     <option value="now">{{:: ts('Now') }}</option>
@@ -10,8 +10,8 @@
   <div class="form-group" ng-switch="$ctrl.dateType">
 
     <div class="form-group" ng-switch-when="fixed">
-      <input class="form-control" crm-ui-datepicker="{time: $ctrl.field.data_type === 'Timestamp'}" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="!$ctrl.multi">
-      <input class="form-control" crm-multi-select-date ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="$ctrl.multi">
+      <input class="form-control" crm-ui-datepicker="{time: $ctrl.field.data_type === 'Timestamp'}" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="!$ctrl.isMulti()">
+      <input class="form-control" crm-multi-select-date ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" ng-if="$ctrl.isMulti()">
     </div>
 
     <div class="form-group" ng-switch-when="range">
index 731e8df9ad1f3e21749481c7356f126508910d1e..eabd9d72b972039b7647c5b6893f691acee02c9e 100644 (file)
@@ -1,6 +1,6 @@
-<div class="form-group" ng-if="!$ctrl.multi">
+<div class="form-group" ng-if="!$ctrl.isMulti()">
   <input class="form-control" ng-model="$ctrl.value" crm-entityref="{entity: $ctrl.entity, select:{allowClear: true, placeholder: ts('Select')}, static: $ctrl.entity === 'Contact' ? ['user_contact_id'] : []}">
 </div>
-<div class="form-group" ng-if="$ctrl.multi">
+<div class="form-group" ng-if="$ctrl.isMulti()">
   <input class="form-control" ng-model="$ctrl.value" crm-entityref="{entity: $ctrl.entity, select: {multiple: true}, static: $ctrl.entity === 'Contact' ? ['user_contact_id'] : []}" ng-list >
 </div>
index f34a1184a9f03e7339bbdb97bff8bc6bada09136..e6da4f7c9f32f86e5688155cda367f24e37f16f5 100644 (file)
@@ -1,6 +1,6 @@
-<div class="form-group" ng-if="!$ctrl.multi" >
+<div class="form-group" ng-if="!$ctrl.isMulti()" >
   <input type="number" step="any" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
 </div>
-<div class="form-group" ng-if="$ctrl.multi" >
+<div class="form-group" ng-if="$ctrl.isMulti()" >
   <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>
index 3f480c2b14e2d129b097a4b804205d0f1fe01434..d578956db527ac93a407ac91005f4d20abc9abaa 100644 (file)
@@ -1,6 +1,6 @@
-<div class="form-group" ng-if="!$ctrl.multi" >
+<div class="form-group" ng-if="!$ctrl.isMulti()" >
   <input type="number" step="1" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
 </div>
-<div class="form-group" ng-if="$ctrl.multi" >
+<div class="form-group" ng-if="$ctrl.isMulti()" >
   <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>
index b46e8014b31b1c27d01d11810d1ef874abbc06ca..c98500db37981e389c459fceffcf0a1a5367d8c8 100644 (file)
@@ -1,9 +1,9 @@
 <div class="form-group" ng-if="$ctrl.field.options === true">
   <input disabled class="form-control loading" crm-ui-select="{data: []}">
 </div>
-<div class="form-group" ng-if="!$ctrl.multi && $ctrl.field.options !== true">
+<div class="form-group" ng-if="!$ctrl.isMulti() && $ctrl.field.options !== true">
   <input class="form-control" ng-model="$ctrl.value" crm-ui-select="{data: $ctrl.getFieldOptions, allowClear: $ctrl.field.nullable, placeholder: $ctrl.field.nullable ? ts('None') : ts('Select')}">
 </div>
-<div class="form-group" ng-if="$ctrl.multi && $ctrl.field.options !== true">
+<div class="form-group" ng-if="$ctrl.isMulti() && $ctrl.field.options !== true">
   <input class="form-control" ng-model="$ctrl.value" crm-ui-select="{data: $ctrl.getFieldOptions, multiple: true}" ng-list >
 </div>
index 3718a11da75a6d77f6b0068f2b9a5af6b7453e90..71a043d276078475b4bb7b28758b73e018eb2cfd 100644 (file)
@@ -1,6 +1,6 @@
-<div class="form-group" ng-if="!$ctrl.multi" >
+<div class="form-group" ng-if="!$ctrl.isMulti()" >
   <input type="text" class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable">
 </div>
-<div class="form-group" ng-if="$ctrl.multi" >
+<div class="form-group" ng-if="$ctrl.isMulti()" >
   <input class="form-control" ng-model="$ctrl.value" ng-required="!$ctrl.field.nullable" crm-ui-select="{multiple: true, tags: [], tokenSeparators: [','], formatNoMatches: ''}" ng-list>
 </div>