From 8d0bafa435d7b2eed771cd2dd2c180e566063592 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Tue, 13 Sep 2022 22:38:25 -0400 Subject: [PATCH] SearchKit - Support an "Add New" button at the top of displays --- ext/search_kit/Civi/Search/Admin.php | 5 +++++ ext/search_kit/ang/crmSearchAdmin.module.js | 3 +++ .../crmSearchAdminDisplay.component.js | 19 +++++++++++++++++++ .../displays/common/searchButtonConfig.html | 9 +++++++++ .../ang/crmSearchDisplay/AddButton.html | 4 ++++ .../traits/searchDisplayBaseTrait.service.js | 4 ++++ .../crmSearchDisplayGrid.html | 5 ++++- .../crmSearchDisplayList.html | 5 ++++- .../crmSearchDisplayTable.html | 1 + 9 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 ext/search_kit/ang/crmSearchDisplay/AddButton.html diff --git a/ext/search_kit/Civi/Search/Admin.php b/ext/search_kit/Civi/Search/Admin.php index f8b2bef442..a0f8b7c280 100644 --- a/ext/search_kit/Civi/Search/Admin.php +++ b/ext/search_kit/Civi/Search/Admin.php @@ -17,6 +17,7 @@ use Civi\Api4\Query\SqlEquation; use Civi\Api4\Query\SqlFunction; use Civi\Api4\SearchDisplay; use Civi\Api4\Tag; +use Civi\Api4\Utils\CoreUtil; use CRM_Search_ExtensionUtil as E; /** @@ -136,6 +137,10 @@ class Admin { if ($links) { $entity['links'] = array_values($links); } + $paths = CoreUtil::getInfoItem($entity['name'], 'paths'); + if (!empty($paths['add'])) { + $entity['addPath'] = $paths['add']; + } $getFields = civicrm_api4($entity['name'], 'getFields', [ 'select' => ['name', 'title', 'label', 'description', 'type', 'options', 'input_type', 'input_attrs', 'data_type', 'serialize', 'entity', 'fk_entity', 'readonly', 'operators', 'suffixes', 'nullable'], 'where' => [['name', 'NOT IN', ['api_key', 'hash']]], diff --git a/ext/search_kit/ang/crmSearchAdmin.module.js b/ext/search_kit/ang/crmSearchAdmin.module.js index bfcfa54092..1669081dcb 100644 --- a/ext/search_kit/ang/crmSearchAdmin.module.js +++ b/ext/search_kit/ang/crmSearchAdmin.module.js @@ -343,6 +343,9 @@ } return { getEntity: getEntity, + getBaseEntity: function() { + return getEntity(searchEntity); + }, getField: function(fieldName, entityName) { return getFieldAndJoin(fieldName, entityName || searchEntity).field; }, diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js index 88ce9ce155..9299cd79ab 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdminDisplay.component.js @@ -271,6 +271,25 @@ }); }; + this.toggleAddButton = function() { + if (ctrl.display.settings.addButton && ctrl.display.settings.addButton.path) { + delete ctrl.display.settings.addButton; + } else { + var entity = searchMeta.getBaseEntity(); + ctrl.display.settings.addButton = { + path: entity.addPath || 'civicrm/', + text: ts('Add %1', {1: entity.title}), + icon: 'fa-plus' + }; + } + }; + + this.onChangeAddButtonPath = function() { + if (!ctrl.display.settings.addButton.path) { + delete ctrl.display.settings.addButton; + } + }; + // Helper function to sort active from hidden columns and initialize each column with defaults this.initColumns = function(defaults) { if (!ctrl.display.settings.columns) { diff --git a/ext/search_kit/ang/crmSearchAdmin/displays/common/searchButtonConfig.html b/ext/search_kit/ang/crmSearchAdmin/displays/common/searchButtonConfig.html index 790c3cdaaf..1424ee30dd 100644 --- a/ext/search_kit/ang/crmSearchAdmin/displays/common/searchButtonConfig.html +++ b/ext/search_kit/ang/crmSearchAdmin/displays/common/searchButtonConfig.html @@ -11,3 +11,12 @@ +
+
+ +
+
+ diff --git a/ext/search_kit/ang/crmSearchDisplay/AddButton.html b/ext/search_kit/ang/crmSearchDisplay/AddButton.html new file mode 100644 index 0000000000..29c6b72536 --- /dev/null +++ b/ext/search_kit/ang/crmSearchDisplay/AddButton.html @@ -0,0 +1,4 @@ + + + {{:: $ctrl.settings.addButton.text }} + diff --git a/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js b/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js index cdb572b998..5bfdafcecb 100644 --- a/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js +++ b/ext/search_kit/ang/crmSearchDisplay/traits/searchDisplayBaseTrait.service.js @@ -27,6 +27,10 @@ this.placeholders.push({}); } + if (this.settings.addButton && this.settings.addButton.path) { + this.settings.addButton.url = CRM.url(this.settings.addButton.path); + } + this.getResults = _.debounce(function() { $scope.$apply(function() { ctrl.runSearch(); diff --git a/ext/search_kit/ang/crmSearchDisplayGrid/crmSearchDisplayGrid.html b/ext/search_kit/ang/crmSearchDisplayGrid/crmSearchDisplayGrid.html index 46c09304ed..710f0dfa69 100644 --- a/ext/search_kit/ang/crmSearchDisplayGrid/crmSearchDisplayGrid.html +++ b/ext/search_kit/ang/crmSearchDisplayGrid/crmSearchDisplayGrid.html @@ -1,5 +1,8 @@
-
+
+
+
+
-
+
+
+
+
      diff --git a/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html b/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html index 82e9e03cc4..3d57aedf18 100644 --- a/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html +++ b/ext/search_kit/ang/crmSearchDisplayTable/crmSearchDisplayTable.html @@ -2,6 +2,7 @@
      +
      -- 2.25.1