diff --git a/ext/afform/mock/ang/testContactEmailSearchForm.aff.html b/ext/afform/mock/ang/testContactEmailSearchForm.aff.html
index 390be362f67d..90de6fee163d 100644
--- a/ext/afform/mock/ang/testContactEmailSearchForm.aff.html
+++ b/ext/afform/mock/ang/testContactEmailSearchForm.aff.html
@@ -1,9 +1,8 @@
diff --git a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
index aaf693fb9d00..ade9286e2609 100644
--- a/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
+++ b/ext/search_kit/Civi/Api4/Action/SearchDisplay/AbstractRunAction.php
@@ -779,8 +779,9 @@ protected function formatViewValue($key, $rawValue) {
*/
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 @@ protected function applyFilters() {
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 @@ private function hasValue($value) {
}
/**
- * 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] === '{') {