From efcaae5b09ef46d5ff7961bb23d35c50d567c6de Mon Sep 17 00:00:00 2001
From: Peter Rotich <peter@enhancesoft.com>
Date: Thu, 22 Mar 2018 10:11:51 +0000
Subject: [PATCH] Advanced Search: Selection Fields

Make selection fields play well with Advanced Search
---
 include/class.dept.php   |  2 +-
 include/class.search.php | 46 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/include/class.dept.php b/include/class.dept.php
index a1a87164f..4eb0b8e22 100644
--- a/include/class.dept.php
+++ b/include/class.dept.php
@@ -107,7 +107,7 @@ implements TemplateVariable, Searchable {
             'name' => new TextboxField(array(
                 'label' => __('Name'),
             )),
-            'manager' => new AgentSelectionField(array(
+            'manager' => new DepartmentManagerSelectionField(array(
                 'label' => __('Manager'),
             )),
         );
diff --git a/include/class.search.php b/include/class.search.php
index d305ab16f..f1d1510de 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -723,7 +723,33 @@ class AdvancedSearchForm extends SimpleForm {
 
 // Advanced search special fields
 
-class HelpTopicChoiceField extends ChoiceField {
+class AdvancedSearchSelectionField extends ChoiceField {
+
+    function getSearchQ($method, $value, $name=false) {
+
+
+        switch ($method) {
+            case 'includes':
+            case '!includes':
+                $Q = new Q();
+                if (count($value) > 1)
+                    $Q->add(array("{$name}__in" => array_keys($value)));
+                else
+                    $Q->add(array($name => key($value)));
+
+                if ($method == '!includes')
+                    $Q->negate();
+                return $Q;
+                break;
+            default:
+                return parent::getSearchQ($method, $value, $name);
+        }
+
+    }
+
+}
+
+class HelpTopicChoiceField extends AdvancedSearchSelectionField {
     function hasIdValue() {
         return true;
     }
@@ -734,7 +760,7 @@ class HelpTopicChoiceField extends ChoiceField {
 }
 
 require_once INCLUDE_DIR . 'class.dept.php';
-class DepartmentChoiceField extends ChoiceField {
+class DepartmentChoiceField extends AdvancedSearchSelectionField {
     var $_choices = null;
 
     function getChoices($verbose=false) {
@@ -764,6 +790,7 @@ class DepartmentChoiceField extends ChoiceField {
     }
 }
 
+
 class AssigneeChoiceField extends ChoiceField {
     function getChoices($verbose=false) {
         global $thisstaff;
@@ -902,7 +929,7 @@ trait ZeroMeansUnset {
     }
 }
 
-class AgentSelectionField extends ChoiceField {
+class AgentSelectionField extends AdvancedSearchSelectionField {
     use ZeroMeansUnset;
 
     function getChoices($verbose=false) {
@@ -940,6 +967,17 @@ class AgentSelectionField extends ChoiceField {
     }
 }
 
+class DepartmentManagerSelectionField extends AgentSelectionField {
+
+    function getChoices($verbose=false) {
+        return Staff::getStaffMembers();
+    }
+
+    function getSearchQ($method, $value, $name=false) {
+        return parent::getSearchQ($method, $value, 'dept__manager_id');
+    }
+}
+
 class TeamSelectionField extends ChoiceField {
     use ZeroMeansUnset;
 
@@ -953,7 +991,7 @@ class TeamSelectionField extends ChoiceField {
     }
 }
 
-class TicketStateChoiceField extends ChoiceField {
+class TicketStateChoiceField extends AdvancedSearchSelectionField {
     function getChoices($verbose=false) {
         return array(
             'open' => __('Open'),
-- 
GitLab