From c57a0ce7cd6670529d59103776277cef56109987 Mon Sep 17 00:00:00 2001
From: colemanw <coleman@civicrm.org>
Date: Sun, 30 Jul 2023 18:00:28 -0400
Subject: [PATCH] ActionMapping - Add icons

---
 CRM/Core/BAO/ActionSchedule.php                 |  1 +
 ...vider.php => ActionScheduleSpecProvider.php} | 17 ++++++++++-------
 .../api/v4/Entity/ActionScheduleTest.php        |  6 +++---
 3 files changed, 14 insertions(+), 10 deletions(-)
 rename Civi/Api4/Service/Spec/Provider/{ActionScheduleCreationSpecProvider.php => ActionScheduleSpecProvider.php} (54%)

diff --git a/CRM/Core/BAO/ActionSchedule.php b/CRM/Core/BAO/ActionSchedule.php
index 761f0f7311..c38607f793 100644
--- a/CRM/Core/BAO/ActionSchedule.php
+++ b/CRM/Core/BAO/ActionSchedule.php
@@ -64,6 +64,7 @@ class CRM_Core_BAO_ActionSchedule extends CRM_Core_DAO_ActionSchedule implements
         'id' => $mapping->getId(),
         'name' => $mapping->getName(),
         'label' => $mapping->getLabel(),
+        'icon' => \Civi\Api4\Utils\CoreUtil::getInfoItem($mapping->getEntityName(), 'icon'),
       ];
     }
     usort($mappings, function($m1, $m2) {
diff --git a/Civi/Api4/Service/Spec/Provider/ActionScheduleCreationSpecProvider.php b/Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php
similarity index 54%
rename from Civi/Api4/Service/Spec/Provider/ActionScheduleCreationSpecProvider.php
rename to Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php
index 32173c1ca7..d0f13c162e 100644
--- a/Civi/Api4/Service/Spec/Provider/ActionScheduleCreationSpecProvider.php
+++ b/Civi/Api4/Service/Spec/Provider/ActionScheduleSpecProvider.php
@@ -18,24 +18,27 @@ use Civi\Api4\Service\Spec\RequestSpec;
  * @service
  * @internal
  */
-class ActionScheduleCreationSpecProvider extends \Civi\Core\Service\AutoService implements Generic\SpecProviderInterface {
+class ActionScheduleSpecProvider extends \Civi\Core\Service\AutoService implements Generic\SpecProviderInterface {
 
   /**
    * @inheritDoc
    */
   public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('title')->setRequired(TRUE);
-    $spec->getFieldByName('mapping_id')->setRequired(TRUE);
-    $spec->getFieldByName('entity_value')->setRequired(TRUE);
-    $spec->getFieldByName('start_action_date')->setRequiredIf('empty($values.absolute_date)');
-    $spec->getFieldByName('absolute_date')->setRequiredIf('empty($values.start_action_date)');
+    if ($spec->getAction() === 'create') {
+      $spec->getFieldByName('title')->setRequired(TRUE);
+      $spec->getFieldByName('mapping_id')->setRequired(TRUE);
+      $spec->getFieldByName('entity_value')->setRequired(TRUE);
+      $spec->getFieldByName('start_action_date')->setRequiredIf('empty($values.absolute_date)');
+      $spec->getFieldByName('absolute_date')->setRequiredIf('empty($values.start_action_date)');
+    }
+    $spec->getFieldByName('mapping_id')->setSuffixes(['name', 'label', 'icon']);
   }
 
   /**
    * @inheritDoc
    */
   public function applies($entity, $action) {
-    return $entity === 'ActionSchedule' && $action === 'create';
+    return $entity === 'ActionSchedule';
   }
 
 }
diff --git a/tests/phpunit/api/v4/Entity/ActionScheduleTest.php b/tests/phpunit/api/v4/Entity/ActionScheduleTest.php
index aa76767ba9..54709fdab7 100644
--- a/tests/phpunit/api/v4/Entity/ActionScheduleTest.php
+++ b/tests/phpunit/api/v4/Entity/ActionScheduleTest.php
@@ -24,12 +24,12 @@ class ActionScheduleTest extends Api4TestBase {
 
   public function testGetOptionsBasic(): void {
     $fields = ActionSchedule::getFields(FALSE)
-      ->setLoadOptions(['id', 'name', 'label'])
+      ->setLoadOptions(['id', 'name', 'label', 'icon'])
       ->execute()
       ->indexBy('name');
 
-    $this->assertContains(['id' => '1', 'name' => 'activity_type', 'label' => 'Activity'], $fields['mapping_id']['options']);
-    $this->assertContains(['id' => 'contribpage', 'name' => 'contribpage', 'label' => 'Contribution Page'], $fields['mapping_id']['options']);
+    $this->assertContains(['id' => '1', 'name' => 'activity_type', 'label' => 'Activity', 'icon' => 'fa-tasks'], $fields['mapping_id']['options']);
+    $this->assertContains(['id' => 'contribpage', 'name' => 'contribpage', 'label' => 'Contribution Page', 'icon' => 'fa-credit-card'], $fields['mapping_id']['options']);
 
     $this->assertContains(['id' => 'day', 'name' => 'day', 'label' => 'days'], $fields['start_action_unit']['options']);
     $this->assertContains(['id' => 'week', 'name' => 'week', 'label' => 'weeks'], $fields['repetition_frequency_unit']['options']);
-- 
2.25.1