Afform - Filter autocomplete fields belonging to a search display
authorColeman Watts <coleman@civicrm.org>
Wed, 22 Feb 2023 21:01:07 +0000 (16:01 -0500)
committerColeman Watts <coleman@civicrm.org>
Wed, 22 Feb 2023 21:01:07 +0000 (16:01 -0500)
Fixes dev/core#4138

ext/afform/core/Civi/Api4/Subscriber/AfformAutocompleteSubscriber.php
ext/afform/core/ang/af/fields/EntityRef.html

index c94d392e50190feac60e35ef5124cced717be5a2..70a1bc05ef02d1f8d3da3dde8b98c1b771a44a68 100644 (file)
@@ -78,8 +78,15 @@ class AfformAutocompleteSubscriber extends AutoService implements EventSubscribe
     [$entityName, $joinEntity] = array_pad(explode('+', $entityName), 2, NULL);
     $entity = $formDataModel->getEntity($entityName);
 
+    // If no model entity, it's a search display
+    if (!$entity) {
+      $searchDisplay = $formDataModel->getSearchDisplay($entityName);
+      $apiEntity = civicrm_api4('SavedSearch', 'get', ['where' => [['name', '=', $searchDisplay['searchName']]]])
+        ->first()['api_entity'] ?? NULL;
+      $formField = $searchDisplay['fields'][$fieldName]['defn'] ?? [];
+    }
     // If using a join (e.g. Contact -> Email)
-    if ($joinEntity) {
+    elseif ($joinEntity) {
       $apiEntity = $joinEntity;
       $isId = FALSE;
       $formField = $entity['joins'][$joinEntity]['fields'][$fieldName]['defn'] ?? [];
@@ -97,7 +104,7 @@ class AfformAutocompleteSubscriber extends AutoService implements EventSubscribe
     // For the "Existing Entity" selector,
     // Look up the "type" fields (e.g. contact_type, activity_type_id, case_type_id, etc)
     // And apply it as a filter if specified on the form.
-    if ($isId) {
+    if ($isId && $entity) {
       if ($entity['type'] === 'Contact') {
         $typeFields = ['contact_type', 'contact_sub_type'];
       }
index 1b783ff44c3470df2d7fdf1427d466590c6da363..38447c8eaf555ec71fb1317702951b2408ce6085 100644 (file)
@@ -5,7 +5,7 @@
        ng-model="getSetSelect"
        ng-model-options="{getterSetter: true}"
        crm-autocomplete="$ctrl.defn.fk_entity"
-       crm-autocomplete-params="{formName: 'afform:' + $ctrl.afFieldset.getFormName(), fieldName: $ctrl.afFieldset.modelName + ':' + $ctrl.fieldName}"
+       crm-autocomplete-params="{formName: 'afform:' + $ctrl.afFieldset.getFormName(), fieldName: $ctrl.afFieldset.getName() + ':' + $ctrl.fieldName}"
        multi="$ctrl.defn.input_attrs.multiple"
        auto-open="$ctrl.defn.input_attrs.autoOpen"
        placeholder="{{:: $ctrl.defn.input_attrs.placeholder }}"