From feeb60b7739989a8411e2a475206f81fd29dc2e6 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Tue, 7 Dec 2021 16:16:07 -0500 Subject: [PATCH] SearchKit - Add Export dialog --- .../crmSearchAdminExport.component.js | 69 +++++++++++++++++++ .../crmSearchAdmin/crmSearchAdminExport.html | 38 ++++++++++ .../crmSearchAdmin/searchListing/buttons.html | 6 ++ .../crmSearchAdminSearchListing.component.js | 11 ++- .../crmSearchAdmin/searchListing/export.html | 1 + ext/search_kit/css/crmSearchAdmin.css | 4 ++ 6 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.component.js create mode 100644 ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.html create mode 100644 ext/search_kit/ang/crmSearchAdmin/searchListing/export.html diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.component.js new file mode 100644 index 0000000000..2124fca3c2 --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.component.js @@ -0,0 +1,69 @@ +(function(angular, $, _) { + "use strict"; + + angular.module('crmSearchAdmin').component('crmSearchAdminExport', { + bindings: { + savedSearchId: '<', + savedSearchName: '<', + displayNames: '<' + }, + templateUrl: '~/crmSearchAdmin/crmSearchAdminExport.html', + controller: function ($scope, $element, crmApi4) { + var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), + ctrl = this; + this.afformEnabled = CRM.crmSearchAdmin.afformEnabled; + + this.types = [ + {entity: 'SavedSearch', title: ts('Saved Search')}, + {entity: 'SearchDisplay', title: ts('1 Display'), plural: ts('%1 Displays')}, + {entity: 'Group', title: ts('Smart Group'), plural: ts('%1 Smart Groups')}, + ]; + + this.$onInit = function() { + this.apiExplorerLink = CRM.url('civicrm/api4#/explorer/SavedSearch/export?id=' + ctrl.savedSearchId); + + var findDisplays = _.transform(ctrl.displayNames, function(findDisplays, displayName) { + findDisplays.push(['search_displays', 'CONTAINS', ctrl.savedSearchName + '.' + displayName]); + }, [['search_displays', 'CONTAINS', ctrl.savedSearchName]]); + var apiCalls = [ + ['SavedSearch', 'export', {id: ctrl.savedSearchId}], + ]; + if (ctrl.afformEnabled) { + apiCalls.push(['Afform', 'get', {layoutFormat: 'html', where: [['type', '=', 'search'], ['OR', findDisplays]]}]); + } + crmApi4(apiCalls) + .then(function(result) { + _.each(ctrl.types, function (type) { + type.values = _.pluck(_.pluck(_.where(result[0], {entity: type.entity}), 'params'), 'values'); + type.enabled = !!type.values.length; + }); + // Afforms are not included in the export and are fetched separately + if (ctrl.afformEnabled) { + ctrl.types.push({entity: 'Afform', enabled: !!result[1].length, values: _.toArray(result[1]), title: ts('1 Form'), plural: ts('%1 Forms')}); + } + ctrl.refreshOutput(); + }); + }; + + this.refreshOutput = function() { + var data = []; + _.each(ctrl.types, function(type) { + if (type.enabled) { + _.each(type.values, function(values) { + data.push([type.entity, 'create', {values: values}]); + }); + } + }); + ctrl.output = JSON.stringify(data, null, 2); + ctrl.copied = false; + }; + + this.copyToClipboard = function() { + document.getElementById('crm-search-admin-export-output-code').select(); + document.execCommand('copy'); + ctrl.copied = true; + }; + } + }); + +})(angular, CRM.$, CRM._); diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.html b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.html new file mode 100644 index 0000000000..9de448ddbc --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminExport.html @@ -0,0 +1,38 @@ +
+
+

+ + {{:: ts('Search configuration can be copied from here, then pasted into "Import" to e.g. transfer between sites.') }} +

+

+ + {{:: ts('Note: to package for distribution in an extension, use:') }} + + {{:: ts('API Explorer Export') }} + + +

+
+

{{:: ts('Include in output') }}

+
+
+
+
+
+
+
+ +
+
+ +
+ +
+
diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/buttons.html b/ext/search_kit/ang/crmSearchAdmin/searchListing/buttons.html index 8f663afe6d..af8fde59a1 100644 --- a/ext/search_kit/ang/crmSearchAdmin/searchListing/buttons.html +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/buttons.html @@ -19,6 +19,12 @@ {{:: ts('Clone...') }} +
  • + + + {{:: ts('Export...') }} + +
  • diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js b/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js index dde44a4470..519557734c 100644 --- a/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js @@ -8,7 +8,7 @@ tabCount: '=' }, templateUrl: '~/crmSearchDisplayTable/crmSearchDisplayTable.html', - controller: function($scope, $q, crmApi4, crmStatus, searchMeta, searchDisplayBaseTrait, searchDisplaySortableTrait) { + controller: function($scope, $q, crmApi4, crmStatus, searchMeta, searchDisplayBaseTrait, searchDisplaySortableTrait, dialogService) { var ts = $scope.ts = CRM.ts('org.civicrm.search_kit'), // Mix in traits to this controller ctrl = angular.extend(this, searchDisplayBaseTrait, searchDisplaySortableTrait), @@ -160,6 +160,15 @@ ); }; + this.export = function(row) { + var options = CRM.utils.adjustDialogDefaults({ + autoOpen: false, + height: 600, + title: ts('Export %1', {1: row.data.label}) + }); + dialogService.open('crmSearchAdminExport', '~/crmSearchAdmin/searchListing/export.html', row, options); + }; + function buildDisplaySettings() { ctrl.display = { type: 'table', diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/export.html b/ext/search_kit/ang/crmSearchAdmin/searchListing/export.html new file mode 100644 index 0000000000..e75e5e3e4a --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/export.html @@ -0,0 +1 @@ + diff --git a/ext/search_kit/css/crmSearchAdmin.css b/ext/search_kit/css/crmSearchAdmin.css index a6bb86ab70..39ea083717 100644 --- a/ext/search_kit/css/crmSearchAdmin.css +++ b/ext/search_kit/css/crmSearchAdmin.css @@ -252,3 +252,7 @@ min-width: 200px; text-align: left; } + +crm-search-admin-export { + display: block; +} -- 2.25.1