From cab2e6cb9409669d4f926287103a9e3968d4b847 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 8 Dec 2021 12:04:36 -0500 Subject: [PATCH] SearchKit - Add Import dialog --- ext/search_kit/ang/crmSearchAdmin.ang.php | 2 +- ext/search_kit/ang/crmSearchAdmin.module.js | 18 +++++++- .../crmSearchAdminImport.component.js | 41 +++++++++++++++++++ .../crmSearchAdmin/crmSearchAdminImport.html | 14 +++++++ .../crmSearchAdmin/searchListing/import.html | 1 + .../searchListing/searchList.html | 4 ++ ext/search_kit/css/crmSearchAdmin.css | 3 +- 7 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.component.js create mode 100644 ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.html create mode 100644 ext/search_kit/ang/crmSearchAdmin/searchListing/import.html diff --git a/ext/search_kit/ang/crmSearchAdmin.ang.php b/ext/search_kit/ang/crmSearchAdmin.ang.php index f6c673415c..346f08243a 100644 --- a/ext/search_kit/ang/crmSearchAdmin.ang.php +++ b/ext/search_kit/ang/crmSearchAdmin.ang.php @@ -15,7 +15,7 @@ return [ ], 'bundles' => ['bootstrap3'], 'basePages' => ['civicrm/admin/search'], - 'requires' => ['crmUi', 'crmUtil', 'ngRoute', 'ui.sortable', 'ui.bootstrap', 'api4', 'crmSearchTasks', 'crmRouteBinder'], + 'requires' => ['crmUi', 'crmUtil', 'ngRoute', 'ui.sortable', 'ui.bootstrap', 'api4', 'crmSearchTasks', 'crmRouteBinder', 'crmDialog'], 'settingsFactory' => ['\Civi\Search\Admin', 'getAdminSettings'], 'permissions' => ['all CiviCRM permissions and ACLs'], ]; diff --git a/ext/search_kit/ang/crmSearchAdmin.module.js b/ext/search_kit/ang/crmSearchAdmin.module.js index 5e34b1ee66..7e2edcfd6e 100644 --- a/ext/search_kit/ang/crmSearchAdmin.module.js +++ b/ext/search_kit/ang/crmSearchAdmin.module.js @@ -45,7 +45,7 @@ }) // Controller for tabbed view of SavedSearches - .controller('searchList', function($scope, searchMeta, formatForSelect2) { + .controller('searchList', function($scope, $timeout, searchMeta, formatForSelect2, dialogService) { var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), ctrl = $scope.$ctrl = this; searchEntity = 'SavedSearch'; @@ -72,6 +72,22 @@ if (!this.tab) { this.tab = this.tabs[0].name; } + + this.openImportDialog = function() { + var options = CRM.utils.adjustDialogDefaults({ + autoOpen: false, + title: ts('Import Saved Search') + }); + dialogService.open('crmSearchAdminImport', '~/crmSearchAdmin/searchListing/import.html', {}, options) + .then(function() { + // Refresh the custom tab by resetting the filters + ctrl.tabs[0].filters = {}; + // Timeout ensures the change gets noticed by the display's $watch + $timeout(function() { + ctrl.tabs[0].filters = {has_base: false}; + }, 300); + }, _.noop); + }; }) // Controller for creating a new search diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.component.js new file mode 100644 index 0000000000..cfc3b7d349 --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.component.js @@ -0,0 +1,41 @@ +(function(angular, $, _) { + "use strict"; + + angular.module('crmSearchAdmin').component('crmSearchAdminImport', { + templateUrl: '~/crmSearchAdmin/crmSearchAdminImport.html', + controller: function ($scope, dialogService, crmApi4) { + var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), + ctrl = this; + + this.values = ''; + + this.run = function() { + ctrl.running = true; + try { + var apiCalls = JSON.parse(ctrl.values); + _.each(apiCalls, function(apiCall) { + if (apiCall[1] !== 'create' || ('chain' in apiCall[2] && !_.isEmpty(apiCall[2].chain))) { + throw ts('Unsupported API action: only "create" is allowed.'); + } + }); + crmApi4(apiCalls) + .then(function(result) { + CRM.alert( + result.length === 1 ? ts('1 record successfully imported.') : ts('%1 records successfully imported.', {1: results.length}), + ts('Saved'), + 'success' + ); + dialogService.close('crmSearchAdminImport'); + }, function(error) { + ctrl.running = false; + alert(ts('Processing Error') + "\n" + error.error_message); + }); + } catch(e) { + ctrl.running = false; + alert(ts('Input Error') + "\n" + e); + } + }; + } + }); + +})(angular, CRM.$, CRM._); diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.html b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.html new file mode 100644 index 0000000000..64872d10d7 --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminImport.html @@ -0,0 +1,14 @@ +
+
+

+ + {{:: ts('A Search configuration copied from the "Export" action can be pasted here.') }} +

+

+ {{:: ts('Note: a Saved Search with the same name must not already exist.') }} +

+
+ + + +
diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/import.html b/ext/search_kit/ang/crmSearchAdmin/searchListing/import.html new file mode 100644 index 0000000000..c990104234 --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/import.html @@ -0,0 +1 @@ + diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/searchList.html b/ext/search_kit/ang/crmSearchAdmin/searchListing/searchList.html index f549ca1bca..9eaa2bfda1 100644 --- a/ext/search_kit/ang/crmSearchAdmin/searchListing/searchList.html +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/searchList.html @@ -28,6 +28,10 @@ + + + {{:: ts('Import') }} + diff --git a/ext/search_kit/css/crmSearchAdmin.css b/ext/search_kit/css/crmSearchAdmin.css index 3d159af72a..cfcb8941ba 100644 --- a/ext/search_kit/css/crmSearchAdmin.css +++ b/ext/search_kit/css/crmSearchAdmin.css @@ -262,6 +262,7 @@ text-align: left; } -crm-search-admin-export { +crm-search-admin-export, +crm-search-admin-import { display: block; } -- 2.25.1