From a3caaf9e9ef6c27658b7ed3fd36e91f888854da6 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Tue, 16 Feb 2021 08:56:01 -0500 Subject: [PATCH] SearchKit - normalize search display column keys --- ext/search/CRM/Search/Upgrader.php | 42 +++++++++++++++++++ ext/search/ang/crmSearchAdmin.module.js | 3 +- .../crmSearchAdminDisplay.component.js | 31 +++++++++++--- .../searchAdminDisplayList.component.js | 3 +- .../displays/searchAdminDisplayList.html | 4 +- .../searchAdminDisplayTable.component.js | 3 +- .../displays/searchAdminDisplayTable.html | 4 +- ext/search/ang/crmSearchDisplay.module.js | 9 ---- .../crmSearchDisplayList.component.js | 1 - .../crmSearchDisplayListItems.html | 2 +- .../crmSearchDisplayTable.component.js | 1 - .../crmSearchDisplayTable.html | 4 +- 12 files changed, 78 insertions(+), 29 deletions(-) diff --git a/ext/search/CRM/Search/Upgrader.php b/ext/search/CRM/Search/Upgrader.php index 9d314e4910..697e5bafbe 100644 --- a/ext/search/CRM/Search/Upgrader.php +++ b/ext/search/CRM/Search/Upgrader.php @@ -31,6 +31,10 @@ class CRM_Search_Upgrader extends CRM_Search_Upgrader_Base { ->execute(); } + /** + * Upgrade 1000 - install schema + * @return bool + */ public function upgrade_1000() { $this->ctx->log->info('Applying update 1000 - install schema.'); // For early, early adopters who installed the extension pre-beta @@ -41,4 +45,42 @@ class CRM_Search_Upgrader extends CRM_Search_Upgrader_Base { return TRUE; } + /** + * Upgrade 1001 - normalize search display column keys + * @return bool + */ + public function upgrade_1001() { + $this->ctx->log->info('Applying update 1001 - normalize search display columns.'); + $savedSearches = \Civi\Api4\SavedSearch::get(FALSE) + ->addWhere('api_params', 'IS NOT NULL') + ->addChain('displays', \Civi\Api4\SearchDisplay::get()->addWhere('saved_search_id', '=', '$id')) + ->execute(); + foreach ($savedSearches as $savedSearch) { + $newAliases = []; + foreach ($savedSearch['api_params']['select'] ?? [] as $i => $select) { + if (strstr($select, '(') && !strstr($select, ' AS ')) { + $alias = CRM_Utils_String::munge(str_replace(')', '', $select), '_', 256); + $newAliases[$select] = $alias; + $savedSearch['api_params']['select'][$i] = $select . ' AS ' . $alias; + } + } + if ($newAliases) { + \Civi\Api4\SavedSearch::update(FALSE) + ->setValues(array_diff_key($savedSearch, ['displays' => 0])) + ->execute(); + } + foreach ($savedSearch['displays'] ?? [] as $display) { + foreach ($display['settings']['columns'] ?? [] as $c => $column) { + $key = $newAliases[$column['expr']] ?? $column['expr']; + unset($display['settings']['columns'][$c]['expr']); + $display['settings']['columns'][$c]['key'] = explode(' AS ', $key)[1] ?? $key; + } + \Civi\Api4\SearchDisplay::update(FALSE) + ->setValues($display) + ->execute(); + } + } + return TRUE; + } + } diff --git a/ext/search/ang/crmSearchAdmin.module.js b/ext/search/ang/crmSearchAdmin.module.js index 9d4b86bca6..6839000b48 100644 --- a/ext/search/ang/crmSearchAdmin.module.js +++ b/ext/search/ang/crmSearchAdmin.module.js @@ -170,7 +170,7 @@ return; } var splitAs = expr.split(' AS '), - info = {fn: null, modifier: '', field: {}}, + info = {fn: null, modifier: '', field: {}, alias: _.last(splitAs)}, fieldName = splitAs[0], bracketPos = splitAs[0].indexOf('('); if (bracketPos >= 0) { @@ -188,7 +188,6 @@ info.suffix = !split[1] ? '' : ':' + split[1]; info.field = fieldAndJoin.field; info.join = fieldAndJoin.join; - info.alias = splitAs[1] || (info.fn ? info.fn.name + ':' + info.path : split[0]); } return info; } diff --git a/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js b/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js index 46dfde126b..3627c41a51 100644 --- a/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js +++ b/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js @@ -53,10 +53,27 @@ ctrl.hiddenColumns.splice(index, 1); }; + this.getExprFromSelect = function(key) { + var match; + _.each(ctrl.savedSearch.api_params.select, function(expr) { + var parts = expr.split(' AS '); + if (_.includes(parts, key)) { + match = parts[0]; + return false; + } + }); + return match; + }; + + this.getFieldLabel = function(key) { + var expr = ctrl.getExprFromSelect(key); + return searchMeta.getDefaultLabel(expr); + }; + function fieldToColumn(fieldExpr) { var info = searchMeta.parseExpr(fieldExpr); return { - expr: fieldExpr, + key: info.alias, label: searchMeta.getDefaultLabel(fieldExpr), dataType: (info.fn && info.fn.name === 'COUNT') ? 'Integer' : info.field.data_type }; @@ -70,14 +87,18 @@ }); ctrl.hiddenColumns = []; } else { - var activeColumns = _.collect(ctrl.display.settings.columns, 'expr'); + var activeColumns = _.collect(ctrl.display.settings.columns, 'key'), + selectAliases = _.map(ctrl.savedSearch.api_params.select, function(select) { + return _.last(select.split(' AS ')); + }); ctrl.hiddenColumns = _.transform(ctrl.savedSearch.api_params.select, function(hiddenColumns, fieldExpr) { - if (!_.includes(activeColumns, fieldExpr)) { + var key = _.last(fieldExpr.split(' AS ')); + if (!_.includes(activeColumns, key)) { hiddenColumns.push(fieldToColumn(fieldExpr)); } }); - _.each(activeColumns, function(fieldExpr, index) { - if (!_.includes(ctrl.savedSearch.api_params.select, fieldExpr)) { + _.eachRight(activeColumns, function(key, index) { + if (!_.includes(selectAliases, key)) { ctrl.display.settings.columns.splice(index, 1); } }); diff --git a/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.component.js b/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.component.js index b2d315f8ee..777191ef1a 100644 --- a/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.component.js +++ b/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.component.js @@ -11,10 +11,9 @@ parent: '^crmSearchAdminDisplay' }, templateUrl: '~/crmSearchAdmin/displays/searchAdminDisplayList.html', - controller: function($scope, searchMeta) { + controller: function($scope) { var ts = $scope.ts = CRM.ts(), ctrl = this; - this.getFieldLabel = searchMeta.getDefaultLabel; this.symbols = { ul: [ diff --git a/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.html b/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.html index 6c8f425daf..857d291316 100644 --- a/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.html +++ b/ext/search/ang/crmSearchAdmin/displays/searchAdminDisplayList.html @@ -25,7 +25,7 @@
{{:: ts('Fields') }}
- {{ $ctrl.getFieldLabel(col.expr) }} + {{ $ctrl.parent.getFieldLabel(col.key) }}
@@ -58,7 +58,7 @@
{{:: ts('Hidden Fields') }}
- {{ $ctrl.getFieldLabel(col.expr) }} + {{ $ctrl.parent.getFieldLabel(col.key) }}