Search ext: use crmRouteBinder to expose params for new searches as url arguments
authorColeman Watts <coleman@civicrm.org>
Mon, 16 Nov 2020 00:00:58 +0000 (19:00 -0500)
committerColeman Watts <coleman@civicrm.org>
Mon, 16 Nov 2020 00:00:58 +0000 (19:00 -0500)
ext/search/ang/crmSearchAdmin.ang.php
ext/search/ang/crmSearchAdmin.module.js
ext/search/ang/crmSearchAdmin/crmSearchAdmin.component.js
ext/search/ang/crmSearchAdmin/searchList.controller.js
ext/search/ang/crmSearchAdmin/searchList.html

index d582bd0708e916bebea2b2a6ad8e2b82bb7a06df..2a3b21d6b9e8899b625da273a67fc419ffac89b7 100644 (file)
@@ -13,6 +13,6 @@ return [
     'ang/crmSearchAdmin',
   ],
   'basePages' => ['civicrm/admin/search'],
-  'requires' => ['crmUi', 'crmUtil', 'ngRoute', 'ui.sortable', 'ui.bootstrap', 'api4', 'crmSearchDisplay', 'crmSearchActions', 'crmSearchKit'],
+  'requires' => ['crmUi', 'crmUtil', 'ngRoute', 'ui.sortable', 'ui.bootstrap', 'api4', 'crmSearchDisplay', 'crmSearchActions', 'crmSearchKit', 'crmRouteBinder'],
   'settingsFactory' => ['\Civi\Search\Admin', 'getAdminSettings'],
 ];
index a497f7b5994f669b7d2a90e807b603bb3c109e3f..c0e15b14537796f9c305e1b5834edc9277ef31d5 100644 (file)
@@ -21,7 +21,7 @@
                 'name',
                 'label',
                 'api_entity',
-                'form_values',
+                'api_params',
                 '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',
index 2e7d617cf08b055fe0ac1e626d2fc30b1328f25c..f9f72af6b82f7b45cad0ae89ee1aebd44eda79e4 100644 (file)
@@ -6,7 +6,7 @@
       savedSearch: '<'
     },
     templateUrl: '~/crmSearchAdmin/crmSearchAdmin.html',
-    controller: function($scope, $element, $timeout, crmApi4, dialogService, searchMeta, formatForSelect2) {
+    controller: function($scope, $element, $location, $timeout, crmApi4, dialogService, searchMeta, formatForSelect2) {
       var ts = $scope.ts = CRM.ts(),
         ctrl = this;
 
         this.savedSearch.groups = this.savedSearch.groups || [];
         this.groupExists = !!this.savedSearch.groups.length;
 
-        if (!this.savedSearch.api_params) {
-          this.savedSearch.api_params = {
-            version: 4,
-            select: getDefaultSelect(),
-            orderBy: {},
-            where: [],
-          };
+        if (!this.savedSearch.id) {
+          $scope.$bindToRoute({
+            param: 'params',
+            expr: '$ctrl.savedSearch.api_params',
+            default: {
+              version: 4,
+              select: getDefaultSelect(),
+              orderBy: {},
+              where: [],
+            }
+          });
         }
 
         $scope.$watchCollection('$ctrl.savedSearch.api_params.select', onChangeSelect);
         delete params.displays;
         apiCalls.saved = ['SavedSearch', 'save', {records: [params], chain: chain}, 0];
         crmApi4(apiCalls).then(function(results) {
+          // After saving a new search, redirect to the edit url
+          if (!ctrl.savedSearch.id) {
+            $location.url('edit/' + results.saved.id);
+          }
           // Set new status to saved unless the user changed something in the interim
           var newStatus = $scope.status === 'unsaved' ? 'unsaved' : 'saved';
-          ctrl.savedSearch.id = results.saved.id;
           if (results.saved.groups && results.saved.groups.length) {
             ctrl.savedSearch.groups[0].id = results.saved.groups[0].id;
           }
index aebfc761cb5f04722de09f6fde8b9368cdec0d88..01c27da97fc3cb4fc2e623fffd990406946f287c 100644 (file)
 
     this.searchPath = window.location.href.split('#')[0].replace('civicrm/admin/search', 'civicrm/search');
 
+    this.encode = function(params) {
+      return encodeURI(angular.toJson(params));
+    };
+
     this.deleteSearch = function(search) {
       var index = _.findIndex(savedSearches, {id: search.id});
       if (index > -1) {
index 3622112bf5c8ec4ec076c691cf291219ed4c41bd..cb97d13a628b7c0775936d60fa562c244431c4a1 100644 (file)
@@ -39,7 +39,8 @@
         </td>
         <td>{{ search.groups.join(', ') }}</td>
         <td class="text-right">
-          <a class="btn btn-xs btn-default" href="#/edit/{{ search.id }}">{{:: ts('Edit') }}</a>
+          <a class="btn btn-xs btn-default" href="#/edit/{{:: search.id }}">{{:: ts('Edit') }}</a>
+          <a class="btn btn-xs btn-default" href="#/create/{{:: search.api_entity + '?params=' + $ctrl.encode(search.api_params) }}">{{:: ts('Clone') }}</a>
           <a href class="btn btn-xs btn-danger" crm-confirm="{type: 'delete', obj: search}" on-yes="$ctrl.deleteSearch(search)">{{:: ts('Delete') }}</a>
         </td>
       </tr>