From 009c1b6171a64b5eaf836f80d676c6b89bac39e4 Mon Sep 17 00:00:00 2001 From: colemanw Date: Mon, 10 Jul 2023 22:54:25 -0400 Subject: [PATCH] SearchKit - Support legacy tasks as links --- .../SearchDisplay/AbstractRunAction.php | 49 ++++++++++++++++++- .../Action/SearchDisplay/GetSearchTasks.php | 2 + 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php index f2f60e68c0..82cf40997e 100644 --- a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php +++ b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php @@ -4,6 +4,7 @@ namespace Civi\Api4\Action\SearchDisplay; use Civi\API\Exception\UnauthorizedException; use Civi\Api4\Query\SqlField; +use Civi\Api4\SearchDisplay; use Civi\Api4\Utils\CoreUtil; use Civi\Api4\Utils\FormattingUtil; @@ -75,6 +76,11 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { */ private $_afform; + /** + * @var array + */ + private $tasks; + /** * Override execute method to change the result object type * @return \Civi\Api4\Result\SearchDisplayRunResult @@ -492,7 +498,7 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { * @param int $index * @return string|null */ - private function getLinkPath($link, $data = NULL, $index = 0) { + private function getLinkPath($link, $data = NULL, $index = 0): ?string { $path = $link['path'] ?? NULL; if (!$path && !empty($link['entity']) && !empty($link['action'])) { $entity = $link['entity']; @@ -536,9 +542,50 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { } } } + elseif (!$path && !empty($link['entity']) && !empty($link['task'])) { + $task = $this->getTask($link['task']); + // Convert legacy tasks (which have to a url) + if (!empty($task['crmPopup'])) { + $idField = CoreUtil::getIdFieldName($link['entity']); + $path = \CRM_Utils_JS::decode($task['crmPopup']['path']); + $amp = strpos($path, '?') ? '&' : '?'; + $data = \CRM_Utils_JS::getRawProps($task['crmPopup']['data']); + // Find the special key that combines selected ids and replace it with id token + $idsKey = array_search("ids.join(',')", $data); + unset($data[$idsKey]); + $path .= $amp . $idsKey . '=[' . $idField . ']'; + // Add the rest of the data items + foreach ($data as $dataKey => $dataRaw) { + $path .= '&' . $dataKey . '=' . \CRM_Utils_JS::decode($dataRaw); + } + } + } return $path; } + /** + * Returns information about a task, but only if user has permission to use it. + * + * @param string $taskName + * @return array|null + */ + private function getTask(string $taskName): ?array { + if (!isset($this->tasks)) { + try { + $this->tasks = SearchDisplay::getSearchTasks() + ->setCheckPermissions($this->getCheckPermissions()) + ->setSavedSearch($this->getSavedSearch()) + ->setDisplay($this->getDisplay()) + ->execute() + ->indexBy('name'); + } + catch (\CRM_Core_Exception $e) { + $this->tasks = []; + } + } + return $this->tasks[$taskName] ?? NULL; + } + /** * @param string $path * @param array $query diff --git a/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php b/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php index ef6fe74dd7..c8c36f386a 100644 --- a/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php +++ b/ext/search_kit/Civi/Api4/Action/SearchDisplay/GetSearchTasks.php @@ -9,6 +9,8 @@ use Civi\Api4\Entity; /** * Load the available tasks for a given entity. * + * @method $this setDisplay(array|string $display) + * @method array|string|null getDisplay() * @package Civi\Api4\Action\SearchDisplay */ class GetSearchTasks extends \Civi\Api4\Generic\AbstractAction { -- 2.25.1