From d2a29ebafe75469e3993a9a94bc169b10c5280d6 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Thu, 26 May 2022 09:38:46 -0400 Subject: [PATCH] SearchKit - Add proximity search to UI Fixes dev/core#3163 --- CRM/Utils/Address.php | 9 ++++++++ Civi/Api4/Generic/BasicGetFieldsAction.php | 1 + .../Spec/Provider/AddressGetSpecProvider.php | 1 + .../Contact/Form/Search/Custom/Proximity.php | 15 +++++-------- ext/search_kit/Civi/Search/Admin.php | 1 + .../crmSearchClause.component.js | 4 ++++ .../ang/crmSearchAdmin/crmSearchClause.html | 2 +- .../crmSearchAdmin/crmSearchCondition.html | 2 +- .../crmSearchInputVal.component.js | 22 ++++++++++++++++++- .../crmSearchInput/location.html | 8 +++++++ 10 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 ext/search_kit/ang/crmSearchTasks/crmSearchInput/location.html diff --git a/CRM/Utils/Address.php b/CRM/Utils/Address.php index ff30f95cb1..ff54a5b83b 100644 --- a/CRM/Utils/Address.php +++ b/CRM/Utils/Address.php @@ -598,4 +598,13 @@ class CRM_Utils_Address { return CRM_Utils_Address::format($addressFields); } + /** + * @return string + */ + public static function getDefaultDistanceUnit() { + $countryDefault = Civi::settings()->get('defaultContactCountry'); + // US, UK use miles. Everything else is Km + return ($countryDefault == '1228' || $countryDefault == '1226') ? 'miles' : 'km'; + } + } diff --git a/Civi/Api4/Generic/BasicGetFieldsAction.php b/Civi/Api4/Generic/BasicGetFieldsAction.php index afaee7fa07..494af4829c 100644 --- a/Civi/Api4/Generic/BasicGetFieldsAction.php +++ b/Civi/Api4/Generic/BasicGetFieldsAction.php @@ -340,6 +340,7 @@ class BasicGetFieldsAction extends BasicGetAction { 'Radio' => ts('Radio Buttons'), 'Select' => ts('Select'), 'Text' => ts('Text'), + 'Location' => ts('Address Location'), ], ], [ diff --git a/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php b/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php index 42765f3b15..65e891bde9 100644 --- a/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php +++ b/Civi/Api4/Service/Spec/Provider/AddressGetSpecProvider.php @@ -27,6 +27,7 @@ class AddressGetSpecProvider implements Generic\SpecProviderInterface { $field = new FieldSpec('proximity', 'Address', 'Boolean'); $field->setLabel(ts('Address Proximity')) ->setTitle(ts('Address Proximity')) + ->setInputType('Location') ->setColumnName('geo_code_1') ->setDescription(ts('Address is within a given distance to a location')) ->setType('Filter') diff --git a/ext/legacycustomsearches/CRM/Contact/Form/Search/Custom/Proximity.php b/ext/legacycustomsearches/CRM/Contact/Form/Search/Custom/Proximity.php index e572e99f5e..d33c0731a4 100644 --- a/ext/legacycustomsearches/CRM/Contact/Form/Search/Custom/Proximity.php +++ b/ext/legacycustomsearches/CRM/Contact/Form/Search/Custom/Proximity.php @@ -237,7 +237,7 @@ class CRM_Contact_Form_Search_Custom_Proximity extends CRM_Contact_Form_Search_C } /** - * @return array|null + * @return array */ public function setDefaultValues() { if (!empty($this->_formValues)) { @@ -246,22 +246,17 @@ class CRM_Contact_Form_Search_Custom_Proximity extends CRM_Contact_Form_Search_C $config = CRM_Core_Config::singleton(); $countryDefault = $config->defaultContactCountry; $stateprovinceDefault = $config->defaultContactStateProvince; - $defaults = []; + $defaults = [ + 'prox_distance_unit' => CRM_Utils_Address::getDefaultDistanceUnit(), + ]; if ($countryDefault) { - if ($countryDefault == '1228' || $countryDefault == '1226') { - $defaults['prox_distance_unit'] = 'miles'; - } - else { - $defaults['prox_distance_unit'] = 'km'; - } $defaults['country_id'] = $countryDefault; if ($stateprovinceDefault) { $defaults['state_province_id'] = $stateprovinceDefault; } - return $defaults; } - return NULL; + return $defaults; } /** diff --git a/ext/search_kit/Civi/Search/Admin.php b/ext/search_kit/Civi/Search/Admin.php index 5a652474b3..5eb3d4601a 100644 --- a/ext/search_kit/Civi/Search/Admin.php +++ b/ext/search_kit/Civi/Search/Admin.php @@ -47,6 +47,7 @@ class Admin { 'defaultDisplay' => SearchDisplay::getDefault(FALSE)->setSavedSearch(['id' => NULL])->execute()->first(), 'modules' => $extensions, 'defaultContactType' => \CRM_Contact_BAO_ContactType::basicTypeInfo()['Individual']['name'] ?? NULL, + 'defaultDistanceUnit' => \CRM_Utils_Address::getDefaultDistanceUnit(), 'tags' => Tag::get() ->addSelect('id', 'name', 'color', 'is_selectable', 'description') ->addWhere('used_for', 'CONTAINS', 'civicrm_saved_search') diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.component.js index cd235a7312..4b7b4b05ee 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.component.js @@ -61,6 +61,10 @@ return expr.indexOf('(') > -1; }; + this.areFunctionsAllowed = function(expr) { + return this.allowFunctions && ctrl.getField(expr).type !== 'Filter'; + }; + this.addGroup = function(op) { ctrl.clauses.push([op, []]); }; diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.html b/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.html index b5a3ef25fb..5baaaa7bd1 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.html +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchClause.html @@ -15,7 +15,7 @@
- + diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchCondition.html b/ext/search_kit/ang/crmSearchAdmin/crmSearchCondition.html index f1c149de3a..ed54a75a28 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchCondition.html +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchCondition.html @@ -1,2 +1,2 @@ - + diff --git a/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js b/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js index a249019898..5cc68b77d2 100644 --- a/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js +++ b/ext/search_kit/ang/crmSearchTasks/crmSearchInput/crmSearchInputVal.component.js @@ -9,7 +9,7 @@ }, require: {ngModel: 'ngModel'}, template: '
', - controller: function($scope, formatForSelect2) { + controller: function($scope, formatForSelect2, crmApi4) { var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), ctrl = this; @@ -95,6 +95,21 @@ } }; + this.lookupAddress = function() { + ctrl.value.geo_code_1 = null; + ctrl.value.geo_code_2 = null; + if (ctrl.value.address) { + crmApi4('Address', 'getCoordinates', { + address: ctrl.value.address + }).then(function(coordinates) { + if (coordinates[0]) { + ctrl.value.geo_code_1 = coordinates[0].geo_code_1; + ctrl.value.geo_code_2 = coordinates[0].geo_code_2; + } + }); + } + }; + this.getTemplate = function() { var field = ctrl.field || {}; @@ -102,6 +117,11 @@ return '~/crmSearchTasks/crmSearchInput/text.html'; } + if (field.input_type === 'Location') { + ctrl.value = ctrl.value || {distance_unit: CRM.crmSearchAdmin.defaultDistanceUnit}; + return '~/crmSearchTasks/crmSearchInput/location.html'; + } + if (isDateField(field)) { return '~/crmSearchTasks/crmSearchInput/date.html'; } diff --git a/ext/search_kit/ang/crmSearchTasks/crmSearchInput/location.html b/ext/search_kit/ang/crmSearchTasks/crmSearchInput/location.html new file mode 100644 index 0000000000..8e59598084 --- /dev/null +++ b/ext/search_kit/ang/crmSearchTasks/crmSearchInput/location.html @@ -0,0 +1,8 @@ +
+ + + +
-- 2.25.1