From: colemanw Date: Sat, 15 Jul 2023 02:16:32 +0000 (-0400) Subject: SearchKit - Make loading task links more efficient X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=f5a57e718ecf56d9c26b5f5d61527183c1c4051a;p=civicrm-core.git SearchKit - Make loading task links more efficient --- diff --git a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php index d8c25aa85a..19b1f9a2bb 100644 --- a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php +++ b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php @@ -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]); } } } diff --git a/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js b/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js index d70e3357b7..a1f7277bfa 100644 --- a/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js +++ b/ext/search_kit/ang/crmSearchTasks/traits/searchDisplayTasksTrait.service.js @@ -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 = { @@ -192,7 +195,7 @@ 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]); }); } }, @@ -221,6 +224,15 @@ 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(); + } + }); + } }] }; diff --git a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php index 9212ce5752..63758abd54 100644 --- a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php +++ b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php @@ -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']);