From 29fd4c156631081091f9e0aa320f17bd432a5ac7 Mon Sep 17 00:00:00 2001 From: colemanw Date: Mon, 11 Sep 2023 15:52:14 -0400 Subject: [PATCH] SearchKit - Support aggregated styles in links --- .../Action/SearchDisplay/AbstractRunAction.php | 17 ++++++++++++++--- .../ang/crmSearchDisplay/colType/field.html | 2 +- .../api/v4/SearchDisplay/SearchRunTest.php | 5 +++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php index 80bd24c4d3..0c56f6be29 100644 --- a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php +++ b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php @@ -278,7 +278,11 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { if (isset($column['title']) && strlen($column['title'])) { $out['title'] = $this->replaceTokens($column['title'], $data, 'view'); } - $cssClass = $this->getCssStyles($column['cssRules'] ?? [], $data); + $cssClass = []; + // Style rules get applied to entire column if not a link + if (empty($column['link']) && !empty($column['cssRules'])) { + $cssClass = $this->getCssStyles($column['cssRules'], $data); + } if (!empty($column['alignment'])) { $cssClass[] = $column['alignment']; } @@ -316,15 +320,16 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { * * @param array[] $styleRules * @param array $data + * @param int $index * @return array */ - protected function getCssStyles(array $styleRules, array $data) { + protected function getCssStyles(array $styleRules, array $data, int $index = NULL) { $classes = []; foreach ($styleRules as $clause) { $cssClass = $clause[0] ?? ''; if ($cssClass) { $condition = $this->getRuleCondition(array_slice($clause, 1)); - if (is_null($condition[0]) || (self::filterCompare($data, $condition))) { + if (is_null($condition[0]) || (self::filterCompare($data, $condition, $index))) { $classes[] = $cssClass; } } @@ -467,6 +472,12 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction { foreach ((array) $value as $index => $val) { $link = $this->formatLink($column['link'], $data, $val, $index); if ($link) { + // Style rules get appled to each link + if (!empty($column['cssRules'])) { + $link += ['style' => '']; + $css = $this->getCssStyles($column['cssRules'], $data, $index); + $link['style'] = trim($link['style'] . ' ' . implode(' ', $css)); + } $links[] = $link; } } diff --git a/ext/search_kit/ang/crmSearchDisplay/colType/field.html b/ext/search_kit/ang/crmSearchDisplay/colType/field.html index c4b66bbd30..a2ffc7293d 100644 --- a/ext/search_kit/ang/crmSearchDisplay/colType/field.html +++ b/ext/search_kit/ang/crmSearchDisplay/colType/field.html @@ -15,7 +15,7 @@ - + {{:: link.text }} , 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 23537d6987..ba60ed7c87 100644 --- a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php +++ b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunTest.php @@ -1998,6 +1998,9 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface { 'if' => ['Note_EntityFile_File_01.is_image'], ], ], + 'cssRules' => [ + ['crm-image-popup', 'Note_EntityFile_File_01.is_image', '=', TRUE], + ], ], ], 'sort' => [ @@ -2012,6 +2015,8 @@ class SearchRunTest extends Api4TestBase implements TransactionalInterface { $this->assertCount(2, $result); $this->assertEquals(['fa-file-text-o', 'fa-file-image-o', 'fa-file-image-o'], $result[0]['columns'][1]['icons']['left']); $this->assertEquals([NULL, 'fa-search', NULL], $result[0]['columns'][1]['icons']['right']); + $this->assertEquals(['', 'crm-image-popup', ''], array_column($result[0]['columns'][1]['links'], 'style')); + $this->assertEquals(['test_file.txt', 'test_file.png', 'test_file_foo.unknown'], array_column($result[0]['columns'][1]['links'], 'text')); } /** -- 2.25.1