SearchKit - Only add filter values to Afform title if passed internally
authorColeman Watts <coleman@civicrm.org>
Wed, 15 Jun 2022 21:49:51 +0000 (17:49 -0400)
committerColeman Watts <coleman@civicrm.org>
Thu, 16 Jun 2022 15:36:46 +0000 (11:36 -0400)
This narrows the scope of contextual titles from #22319 to
only those filters passed internally, as used in drilldown forms.

It makes sense to exclude values from exposed filters because that
can lead to a confusing UI.

ext/afform/mock/ang/testContactEmailSearchForm.aff.html
ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php

index 390be362f67d59238af2142aebc6346e7418333d..90de6fee163d4ab35923387fef1d5d7276645ff2 100644 (file)
@@ -1,9 +1,8 @@
 <div af-fieldset="">
   <af-field name="source" />
-  <af-field name="contact_type" />
   <div class="af-container af-layout-inline">
     <af-field name="Contact_Email_contact_id_01.email" />
     <af-field name="Contact_Email_contact_id_01.location_type_id" defn="{input_attrs: {multiple: true}}" />
   </div>
-  <crm-search-display-table filters="{last_name: 'AfformTest'}" search-name="TestContactEmailSearch" display-name="TestContactEmailDisplay"></crm-search-display-table>
+  <crm-search-display-table filters="{last_name: 'AfformTest', contact_type: dummy_var}" search-name="TestContactEmailSearch" display-name="TestContactEmailDisplay"></crm-search-display-table>
 </div>
index aaf693fb9d0068aa517ff3c043279d77a27b9b9e..ade9286e2609a10ff8b117cd324493ce585afbd7 100644 (file)
@@ -779,8 +779,9 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
    */
   protected function applyFilters() {
     // Allow all filters that are included in SELECT clause or are fields on the Afform.
-    $afformFilters = $this->getAfformFilters();
-    $allowedFilters = array_merge($this->getSelectAliases(), $afformFilters);
+    $fieldFilters = $this->getAfformFilterFields();
+    $directiveFilters = $this->getAfformDirectiveFilters();
+    $allowedFilters = array_merge($this->getSelectAliases(), $fieldFilters, $directiveFilters);
 
     // Ignore empty strings
     $filters = array_filter($this->filters, [$this, 'hasValue']);
@@ -793,7 +794,8 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
       if (in_array($key, $allowedFilters, TRUE) || !array_diff($fieldNames, $allowedFilters)) {
         $this->applyFilter($fieldNames, $value);
       }
-      if (in_array($key, $afformFilters, TRUE)) {
+      // Filter labels are used to set the page title for drilldown forms
+      if (in_array($key, $directiveFilters, TRUE)) {
         $this->addFilterLabel($key, $value);
       }
     }
@@ -1051,22 +1053,36 @@ abstract class AbstractRunAction extends \Civi\Api4\Generic\AbstractAction {
   }
 
   /**
-   * Returns a list of filter fields and directive filters
+   * Returns a list of afform fields used as search filters
    *
-   * Automatically applies directive filters
+   * Limited to the current display
    *
-   * @return array
+   * @return string[]
+   */
+  private function getAfformFilterFields() {
+    $afform = $this->loadAfform();
+    if ($afform) {
+      return array_column(\CRM_Utils_Array::findAll(
+        $afform['searchDisplay']['fieldset'],
+        ['#tag' => 'af-field']
+      ), 'name');
+    }
+    return [];
+  }
+
+  /**
+   * Finds all directive filters and applies the ones with a literal value
+   *
+   * Returns the list of filters that did not get auto-applied (value was passed via js)
+   *
+   * @return string[]
    */
-  private function getAfformFilters() {
+  private function getAfformDirectiveFilters() {
     $afform = $this->loadAfform();
     if (!$afform) {
       return [];
     }
-    // Get afform field filters
-    $filterKeys = array_column(\CRM_Utils_Array::findAll(
-      $afform['searchDisplay']['fieldset'],
-      ['#tag' => 'af-field']
-    ), 'name');
+    $filterKeys = [];
     // Get filters passed into search display directive from Afform markup
     $filterAttr = $afform['searchDisplay']['filters'] ?? NULL;
     if ($filterAttr && is_string($filterAttr) && $filterAttr[0] === '{') {