SearchKit - Make loading task links more efficient
authorcolemanw <coleman@civicrm.org>
Sat, 15 Jul 2023 02:16:32 +0000 (22:16 -0400)
committercolemanw <coleman@civicrm.org>
Sat, 15 Jul 2023 15:09:02 +0000 (11:09 -0400)
ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js
ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php

index d8c25aa85aa4c794ebba8081b67f2acaa750e332..19b1f9a2bbd6e4f9c4d2dddd7d0247cc96c6c774 100644 (file)
@@ -474,7 +474,7 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
     }
     // Check access for edit/update/delete links
     // (presumably if a record is shown in SearchKit the user already has view access, and the check is expensive)
-    if ($link['entity'] && $link['action'] && !in_array($link['action'], ['view', 'preview'], TRUE)) {
+    if ($link['entity'] && !empty($link['action']) && !in_array($link['action'], ['view', 'preview'], TRUE)) {
       $idField = CoreUtil::getIdFieldName($link['entity']);
       $idKey = $this->getIdKeyName($link['entity']);
       $id = $data[$link['prefix'] . $idKey] ?? NULL;
@@ -578,7 +578,6 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
           $link['title'] = $link['title'] ?: $task['title'];
           // Fill in the api action if known, for the sake of $this->checkLinkAccess
           $link['action'] = $task['apiBatch']['action'] ?? NULL;
-          $link['task'] = array_intersect_key($task, ['apiBatch' => 1, 'uiDialog' => 1]);
         }
       }
     }
index d70e3357b7dca4a88d6b5eb596cd84e2ebaea531..a1f7277bfadd71af5a2616293ac2afccdf995662 100644 (file)
@@ -41,6 +41,9 @@
       this.isDisplayReady = function() {
         return !displayCtrl.loading && displayCtrl.results && displayCtrl.results.length;
       };
+      this.getTaskInfo = function(taskName) {
+        return _.findWhere(mngr.tasks, {name: taskName});
+      };
 
       this.doTask = function(task, ids) {
         var data = {
           const mngr = this.taskManager;
           event.preventDefault();
           mngr.getMetadata().then(function() {
-            mngr.doTask(_.extend({title: link.title}, link.task), [id]);
+            mngr.doTask(_.extend({title: link.title}, mngr.getTaskInfo(link.task)), [id]);
           });
         }
       },
             this.selectedRows.splice(index, 1);
           }
         }
+        else if (status === 'success' && !editedRow && apiResults.run && apiResults.run[0]) {
+          const mngr = this.taskManager;
+          // If results contain a link to a task, prefetch task info to prevent latency when clicking the link
+          _.each(apiResults.run[0].columns, function(column) {
+            if ((column.link && column.link.task) || _.find(column.links || [], 'task')) {
+              mngr.getMetadata();
+            }
+          });
+        }
       }]
 
     };
index 9212ce57521086c4d244f40f5053dc65119c64b9..63758abd54831a0a4be5fb338aac3e979d1eb7ed 100644 (file)
@@ -299,7 +299,7 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface {
     $this->assertStringContainsString('id=' . $contributions[0]['id'] . '&qfKey=', $result[0]['columns'][1]['links'][0]['url']);
     // 2nd link is to the native SK bulk-update task
     $this->assertArrayNotHasKey('url', $result[0]['columns'][1]['links'][1]);
-    $this->assertArrayHasKey('uiDialog', $result[0]['columns'][1]['links'][1]['task']);
+    $this->assertEquals('update', $result[0]['columns'][1]['links'][1]['task']);
     // 3rd link is a popup link to the delete contribution quickform
     $this->assertStringContainsString('action=delete&id=' . $contributions[0]['id'], $result[0]['columns'][1]['links'][2]['url']);
     $this->assertEquals('crm-popup', $result[0]['columns'][1]['links'][2]['target']);