Merge pull request #19426 from colemanw/searchCount
authorEileen McNaughton <emcnaughton@wikimedia.org>
Fri, 22 Jan 2021 22:08:44 +0000 (11:08 +1300)
committerGitHub <noreply@github.com>
Fri, 22 Jan 2021 22:08:44 +0000 (11:08 +1300)
dev/core#2312 SearchKit - Improve results loading time in admin UI

ext/search/ang/crmSearchAdmin/compose/pager.html
ext/search/ang/crmSearchAdmin/compose/results.html
ext/search/ang/crmSearchAdmin/crmSearchAdmin.component.js
ext/search/ang/crmSearchAdmin/crmSearchAdmin.html

index 2c4a2b4ba1ba1e54710278d9096f99326c70c45f..0932e7b4d084323963174e260e0ae9a19467f174 100644 (file)
@@ -1,7 +1,7 @@
 <div class="crm-flex-box">
   <div>
     <div class="form-inline">
-      <label ng-if="loading && $ctrl.rowCount === false"><i class="crm-i fa-spin fa-spinner"></i></label>
+      <label ng-if="$ctrl.rowCount === false"><i class="crm-i fa-spin fa-spinner"></i></label>
       <label ng-if="$ctrl.rowCount === 1">
         {{ $ctrl.selectedRows.length ? ts('%1 selected of 1 result', {1: $ctrl.selectedRows.length}) : ts('1 result') }}
       </label>
index 4a00a8b1aea82cd6853453ec285b92361b3926d2..1d760406abce5af810fdb7f351cd91bcb0a21c4b 100644 (file)
@@ -2,7 +2,7 @@
   <thead>
     <tr ng-model="$ctrl.savedSearch.api_params.select" ui-sortable="sortableColumnOptions">
       <th class="crm-search-result-select">
-        <input type="checkbox" ng-checked="$ctrl.allRowsSelected" ng-click="selectAllRows()" ng-disabled="!(loading === false && !loadingAllRows && $ctrl.results[$ctrl.page] && $ctrl.results[$ctrl.page][0].id)">
+        <input type="checkbox" ng-checked="$ctrl.allRowsSelected" ng-click="selectAllRows()" ng-disabled="!($ctrl.rowCount && loading === false && !loadingAllRows && $ctrl.results[$ctrl.page] && $ctrl.results[$ctrl.page][0].id)">
       </th>
       <th ng-repeat="col in $ctrl.savedSearch.api_params.select" ng-click="setOrderBy(col, $event)" title="{{$index || !$ctrl.groupExists ? ts('Drag to reorder columns, click to sort results (shift-click to sort by multiple).') : ts('Column reserved for smart group.')}}">
         <i class="crm-i {{ getOrderBy(col) }}"></i>
index 353851435ff2b3e1a3f255bfa4f87cb6a1dab10f..7f82c23886ec7c0214cf3b313fb473fa47fff0db 100644 (file)
           ctrl.page = 1;
           ctrl.rowCount = false;
         }
-        if (ctrl.rowCount === false) {
-          params.select.push('row_count');
-        }
         params.offset = ctrl.limit * (ctrl.page - 1);
         crmApi4(ctrl.savedSearch.api_entity, 'get', params).then(function(success) {
           if (ctrl.stale) {
             ctrl.results = {};
-          }
-          if (ctrl.rowCount === false) {
-            ctrl.rowCount = success.count;
+            // Get row count for pager
+            // Select is only needed needed by HAVING
+            params.select = params.having && params.having.length ? params.select : [];
+            params.select.push('row_count');
+            delete params.debug;
+            crmApi4(ctrl.savedSearch.api_entity, 'get', params).then(function(result) {
+              ctrl.rowCount = result.count;
+            });
           }
           ctrl.debug = success.debug;
           // populate this page & the next
         // If more than one page of results, use ajax to fetch all ids
         $scope.loadingAllRows = true;
         var params = _.cloneDeep(ctrl.savedSearch.api_params);
-        params.select = ['id'];
+        // Select is only needed needed by HAVING
+        params.select = params.having && params.having.length ? params.select : [];
+        params.select.push('id');
         crmApi4(ctrl.savedSearch.api_entity, 'get', params, ['id']).then(function(ids) {
           $scope.loadingAllRows = false;
           ctrl.selectedRows = _.toArray(ids);
index 3b9eb17d2db45119c68377289ff338bf0cd51f11..994a4fb1d8f9d6013ffc770240b20fb45f06e50f 100644 (file)
@@ -37,7 +37,7 @@
           <div ng-include="'~/crmSearchAdmin/compose/controls.html'"></div>
           <div ng-include="'~/crmSearchAdmin/compose/debug.html'" ng-if="$ctrl.debug"></div>
           <div ng-include="'~/crmSearchAdmin/compose/results.html'" class="crm-search-results"></div>
-          <div ng-include="'~/crmSearchAdmin/compose/pager.html'"></div>
+          <div ng-include="'~/crmSearchAdmin/compose/pager.html'" ng-if="$ctrl.results"></div>
         </div>
         <div ng-switch-when="group">
           <fieldset ng-include="'~/crmSearchAdmin/group.html'"></fieldset>