From 2245b1b0c9c26e0ae18ff17616cbc3cbb93ae575 Mon Sep 17 00:00:00 2001 From: colemanw Date: Sat, 19 Aug 2023 18:50:54 -0400 Subject: [PATCH] SearchKit - Add column for scheduled communications to savedSearch listing --- .../searchListing/communications.html | 20 +++++++++++ .../crmSearchAdminSearchListing.component.js | 34 +++++++++++++++---- 2 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 ext/search_kit/ang/crmSearchAdmin/searchListing/communications.html diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/communications.html b/ext/search_kit/ang/crmSearchAdmin/searchListing/communications.html new file mode 100644 index 0000000000..5041de124f --- /dev/null +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/communications.html @@ -0,0 +1,20 @@ +
+ + +
diff --git a/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js b/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js index 977e965f69..9278b133a2 100644 --- a/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/searchListing/crmSearchAdminSearchListing.component.js @@ -14,11 +14,13 @@ ctrl = angular.extend(this, _.cloneDeep(searchDisplayBaseTrait), _.cloneDeep(searchDisplaySortableTrait)), afformLoad; + $scope.crmUrl = CRM.url; this.searchDisplayPath = CRM.url('civicrm/search'); this.afformPath = CRM.url('civicrm/admin/afform'); this.afformEnabled = 'org.civicrm.afform' in CRM.crmSearchAdmin.modules; this.afformAdminEnabled = (CRM.checkPerm('administer CiviCRM') || CRM.checkPerm('administer afform')) && 'org.civicrm.afform_admin' in CRM.crmSearchAdmin.modules; + const scheduledCommunicationsEnabled = 'scheduled_communications' in CRM.crmSearchAdmin.modules; this.apiEntity = 'SavedSearch'; this.search = { @@ -45,13 +47,16 @@ 'DATE(created_date) AS date_created', 'DATE(modified_date) AS date_modified', 'DATE(expires_date) AS expires', - 'GROUP_CONCAT(display.name ORDER BY display.id) AS display_name', - 'GROUP_CONCAT(display.label ORDER BY display.id) AS display_label', - 'GROUP_CONCAT(display.type:icon ORDER BY display.id) AS display_icon', - 'GROUP_CONCAT(display.acl_bypass ORDER BY display.id) AS display_acl_bypass', + // Get all search displays + 'GROUP_CONCAT(UNIQUE display.name ORDER BY display.label) AS display_name', + 'GROUP_CONCAT(UNIQUE display.label ORDER BY display.label) AS display_label', + 'GROUP_CONCAT(UNIQUE display.type:icon ORDER BY display.label) AS display_icon', + 'GROUP_CONCAT(UNIQUE display.acl_bypass ORDER BY display.label) AS display_acl_bypass', 'tags', // Not a selectable field but this hacks around the requirement that filters be in the select clause - 'GROUP_CONCAT(DISTINCT entity_tag.tag_id) AS tag_id', - 'GROUP_CONCAT(DISTINCT group.title) AS groups' + 'GROUP_CONCAT(UNIQUE entity_tag.tag_id) AS tag_id', + // Really there can only be 1 smart group per saved-search; aggregation is just for the sake of the query + 'GROUP_CONCAT(UNIQUE group.id) AS group_id', + 'GROUP_CONCAT(UNIQUE group.title) AS groups' ], join: [ ['SearchDisplay AS display', 'LEFT', ['id', '=', 'display.saved_search_id']], @@ -63,6 +68,13 @@ } }; + // Add scheduled communication to query if extension is enabled + if (scheduledCommunicationsEnabled) { + this.search.api_params.select.push('GROUP_CONCAT(UNIQUE schedule.id ORDER BY schedule.title) AS schedule_id'); + this.search.api_params.select.push('GROUP_CONCAT(UNIQUE schedule.title ORDER BY schedule.title) AS schedule_title'); + this.search.api_params.join.push(['ActionSchedule AS schedule', 'LEFT', ['schedule.mapping_id', '=', '"saved_search"'], ['id', '=', 'schedule.entity_value']]); + } + this.$onInit = function() { buildDisplaySettings(); this.initializeDisplay($scope, $element); @@ -228,8 +240,16 @@ path: '~/crmSearchAdmin/searchListing/afforms.html' }); } + // Add scheduled communication column if extension is enabled + if (scheduledCommunicationsEnabled) { + ctrl.display.settings.columns.push({ + type: 'include', + label: ts('Communications'), + path: '~/crmSearchAdmin/searchListing/communications.html' + }); + } ctrl.display.settings.columns.push( - searchMeta.fieldToColumn('GROUP_CONCAT(DISTINCT group.title) AS groups', { + searchMeta.fieldToColumn('GROUP_CONCAT(UNIQUE group.title) AS groups', { label: ts('Smart Group') }) ); -- 2.25.1