From ecb9d1ebc9d6c6d2afba50eaaec5e94fae56b116 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Sat, 23 Jan 2021 15:36:40 -0500 Subject: [PATCH] SearchKit - improve handling of dynamic tags for search displays The searchDisplay.type option list now includes tags instead of downstream code needing to construct them, And the standalone pages for search displays now use server-generated partials instead of an ad-hoc switch on the client side. --- ext/search/Civi/Search/Admin.php | 2 +- .../Civi/Search/AfformSearchMetadataInjector.php | 7 +++---- ext/search/Civi/Search/Display.php | 14 ++++++++------ .../crmSearchAdmin/crmSearchAdmin.component.js | 2 +- .../crmSearchAdminDisplay.component.js | 6 +++--- ext/search/ang/crmSearchAdmin/tabs.html | 2 +- ext/search/ang/crmSearchPage.ang.php | 5 +---- ext/search/ang/crmSearchPage.module.js | 15 ++------------- ext/search/managed/SearchDisplayType.mgd.php | 4 ++-- 9 files changed, 22 insertions(+), 35 deletions(-) diff --git a/ext/search/Civi/Search/Admin.php b/ext/search/Civi/Search/Admin.php index 7a558ef19e..cfdd1a06ba 100644 --- a/ext/search/Civi/Search/Admin.php +++ b/ext/search/Civi/Search/Admin.php @@ -27,7 +27,7 @@ class Admin { 'joins' => self::getJoins(array_column($schema, NULL, 'name')), 'operators' => \CRM_Utils_Array::makeNonAssociative(self::getOperators()), 'functions' => \CRM_Api4_Page_Api4Explorer::getSqlFunctions(), - 'displayTypes' => Display::getDisplayTypes(['name', 'label', 'description', 'icon']), + 'displayTypes' => Display::getDisplayTypes(['id', 'name', 'label', 'description', 'icon']), ]; } diff --git a/ext/search/Civi/Search/AfformSearchMetadataInjector.php b/ext/search/Civi/Search/AfformSearchMetadataInjector.php index e86b796bc8..e304f53f17 100644 --- a/ext/search/Civi/Search/AfformSearchMetadataInjector.php +++ b/ext/search/Civi/Search/AfformSearchMetadataInjector.php @@ -26,11 +26,10 @@ class AfformSearchMetadataInjector { public static function preprocess($e) { $changeSet = \Civi\Angular\ChangeSet::create('searchSettings') ->alterHtml(';\\.aff\\.html$;', function($doc, $path) { - $displayTypes = array_column(\Civi\Search\Display::getDisplayTypes(['name']), 'name'); + $displayTags = array_column(\Civi\Search\Display::getDisplayTypes(['name']), 'name'); - if ($displayTypes) { - $displayTypeTags = 'crm-search-display-' . implode(', crm-search-display-', $displayTypes); - foreach (pq($displayTypeTags, $doc) as $component) { + if ($displayTags) { + foreach (pq(implode(',', $displayTags), $doc) as $component) { $searchName = pq($component)->attr('search-name'); $displayName = pq($component)->attr('display-name'); if ($searchName && $displayName) { diff --git a/ext/search/Civi/Search/Display.php b/ext/search/Civi/Search/Display.php index aa23ac4bd8..ccfe437118 100644 --- a/ext/search/Civi/Search/Display.php +++ b/ext/search/Civi/Search/Display.php @@ -20,20 +20,22 @@ class Display { /** * @return array */ - public static function getPageSettings():array { - return [ - 'displayTypes' => self::getDisplayTypes(['name']), - ]; + public static function getPartials($moduleName, $module) { + $partials = []; + foreach (self::getDisplayTypes(['id', 'name']) as $type) { + $partials["~/$moduleName/displayType/{$type['id']}.html"] = + '<' . $type['name'] . ' api-entity="$ctrl.apiEntity" api-params="$ctrl.apiParams" settings="$ctrl.display.settings">'; + } + return $partials; } /** - * @param array $props * @return array */ public static function getDisplayTypes(array $props):array { try { return \Civi\Api4\SearchDisplay::getFields(FALSE) - ->setLoadOptions($props) + ->setLoadOptions(array_diff($props, ['tag'])) ->addWhere('name', '=', 'type') ->execute() ->first()['options']; diff --git a/ext/search/ang/crmSearchAdmin/crmSearchAdmin.component.js b/ext/search/ang/crmSearchAdmin/crmSearchAdmin.component.js index 7f82c23886..cc927aa8e4 100644 --- a/ext/search/ang/crmSearchAdmin/crmSearchAdmin.component.js +++ b/ext/search/ang/crmSearchAdmin/crmSearchAdmin.component.js @@ -15,7 +15,7 @@ this.selectedRows = []; this.limit = CRM.cache.get('searchPageSize', 30); this.page = 1; - this.displayTypes = _.indexBy(CRM.crmSearchAdmin.displayTypes, 'name'); + this.displayTypes = _.indexBy(CRM.crmSearchAdmin.displayTypes, 'id'); // After a search this.results is an object of result arrays keyed by page, // Initially this.results is an empty string because 1: it's falsey (unlike an empty object) and 2: it doesn't throw an error if you try to access undefined properties (unlike null) this.results = ''; diff --git a/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js b/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js index 8ab7a1cd30..27ba2ae469 100644 --- a/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js +++ b/ext/search/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js @@ -13,8 +13,8 @@ '
\n'; _.each(CRM.crmSearchAdmin.displayTypes, function(type) { html += - '
\n' + - ' \n' + + '
\n' + + ' \n' + '
\n' + ' \n' + '
\n' + '
\n' + - ' \n' + + ' <' + type.name + ' api-entity="$ctrl.savedSearch.api_entity" api-params="$ctrl.savedSearch.api_params" settings="$ctrl.display.settings">\n' + '
\n' + '
\n'; }); diff --git a/ext/search/ang/crmSearchAdmin/tabs.html b/ext/search/ang/crmSearchAdmin/tabs.html index 7fb2382545..5257f189c3 100644 --- a/ext/search/ang/crmSearchAdmin/tabs.html +++ b/ext/search/ang/crmSearchAdmin/tabs.html @@ -35,7 +35,7 @@
  • - + {{:: type.label }} diff --git a/ext/search/ang/crmSearchPage.ang.php b/ext/search/ang/crmSearchPage.ang.php index 12508ec61b..5125ba7315 100644 --- a/ext/search/ang/crmSearchPage.ang.php +++ b/ext/search/ang/crmSearchPage.ang.php @@ -6,10 +6,7 @@ return [ 'ang/crmSearchPage/*.js', 'ang/crmSearchPage/*/*.js', ], - 'partials' => [ - 'ang/crmSearchPage', - ], 'basePages' => ['civicrm/search'], 'requires' => ['ngRoute', 'api4', 'crmUi'], - 'settingsFactory' => ['\Civi\Search\Display', 'getPageSettings'], + 'partialsCallback' => ['\Civi\Search\Display', 'getPartials'], ]; diff --git a/ext/search/ang/crmSearchPage.module.js b/ext/search/ang/crmSearchPage.module.js index 8eafa0e169..d890d95c6b 100644 --- a/ext/search/ang/crmSearchPage.module.js +++ b/ext/search/ang/crmSearchPage.module.js @@ -9,19 +9,8 @@ $routeProvider.when('/display/:savedSearchName/:displayName', { controller: 'crmSearchPageDisplay', // Dynamic template generates the directive for each display type - template: function() { - var html = - '

    {{:: $ctrl.display.label }}

    \n' + - '
    \n'; - _.each(CRM.crmSearchPage.displayTypes, function(type) { - html += - '
    \n' + - ' \n' + - '
    \n'; - }); - html += '
    '; - return html; - }, + template: '

    {{:: $ctrl.display.label }}

    \n' + + '
    ', resolve: { // Load saved search display display: function($route, crmApi4) { diff --git a/ext/search/managed/SearchDisplayType.mgd.php b/ext/search/managed/SearchDisplayType.mgd.php index 0e7930adf5..ed54c8fe83 100644 --- a/ext/search/managed/SearchDisplayType.mgd.php +++ b/ext/search/managed/SearchDisplayType.mgd.php @@ -15,8 +15,8 @@ return [ 'entity' => 'OptionValue', 'params' => [ 'option_group_id' => 'search_display_type', - 'name' => 'table', 'value' => 'table', + 'name' => 'crm-search-display-table', 'label' => 'Table', 'icon' => 'fa-table', ], @@ -26,8 +26,8 @@ return [ 'entity' => 'OptionValue', 'params' => [ 'option_group_id' => 'search_display_type', - 'name' => 'list', 'value' => 'list', + 'name' => 'crm-search-display-list', 'label' => 'List', 'icon' => 'fa-list', ], -- 2.25.1