From 9f03cc78581247b983fa886aaf5f76ea2ec0b368 Mon Sep 17 00:00:00 2001
From: Peter Rotich <peter@osticket.com>
Date: Thu, 28 Aug 2014 20:40:58 +0000
Subject: [PATCH] Add statuses and flags selection to advanced search

Fix search backend to use the new statuses
---
 include/ajax.tickets.php      | 46 ++++++++++++++-------------
 include/class.search.php      | 12 +++++--
 include/staff/tickets.inc.php | 60 +++++++++++++++++++++--------------
 scp/js/scp.js                 | 25 ++++++++++-----
 4 files changed, 86 insertions(+), 57 deletions(-)

diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php
index 84e939550..ad52b5c9b 100644
--- a/include/ajax.tickets.php
+++ b/include/ajax.tickets.php
@@ -132,28 +132,30 @@ class TicketsAjaxAPI extends AjaxController {
             $criteria['topic_id'] = $req['topicId'];
         }
 
-        //Status
-        switch(strtolower($req['status'])) {
-            case 'open':
-                $where.=' AND status.state="open" ';
-                $criteria['status'] = 'open';
-                break;
-            case 'answered':
-                $where.=' AND status.state="open" AND ticket.isanswered=1 ';
-                $criteria += array('status' => 'open', 'isanswered'=>1);
-                break;
-            case 'overdue':
-                $where.=' AND status.state="open" AND ticket.isoverdue=1 ';
-                $criteria += array('status' => 'open', 'isoverdue'=>1);
-                break;
-            case 'resolved':
-                $where.=' AND status.state="resolved" ';
-                $criteria += array('status' => 'resolved', 'isoverdue'=>1);
-                break;
-            case 'closed':
-                $where.=' AND status.state="closed" ';
-                $criteria['status'] = 'closed';
-                break;
+        // Status
+        if ($req['statusId']
+                && ($status=TicketStatus::lookup($req['statusId']))) {
+            $where .= sprintf(' AND status.state="%s" ',
+                    $status->getState());
+            $criteria['status_id'] = $status->getId();
+        }
+
+        // Flags
+        if ($req['flag']) {
+            switch (strtolower($req['flag'])) {
+                case 'answered':
+                    $where .= ' AND ticket.isanswered =1 ';
+                    $criteria['isanswered'] = 1;
+                    $criteria['state'] = 'open';
+                    $where .= ' AND status.state="open" ';
+                    break;
+                case 'overdue':
+                    $where .= ' AND ticket.isoverdue =1 ';
+                    $criteria['isoverdue'] = 1;
+                    $criteria['state'] = 'open';
+                    $where .= ' AND status.state="open" ';
+                    break;
+            }
         }
 
         //Assignee
diff --git a/include/class.search.php b/include/class.search.php
index c6449156b..270e03220 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -295,13 +295,19 @@ class MysqlSearchBackend extends SearchBackend {
             ) B4 ON (B4.org_id = search.object_id and search.object_type = 'O')";
             $key = 'COALESCE(B1.ticket_id, B2.ticket_id, B3.ticket_id, B4.ticket_id)';
             $tables[] = "{$P}ticket A1 ON (A1.ticket_id = {$key})";
+            $tables[] = "{$P}ticket_status A2 ON (A1.status_id = A2.id)";
             $cdata_search = false;
             $where = array();
 
             if ($criteria) {
                 foreach ($criteria as $name=>$value) {
                     switch ($name) {
-                    case 'status':
+                    case 'status_id':
+                        $where[] = 'A2.id = '.db_input($value);
+                        break;
+                    case 'state':
+                        $where[] = 'A2.state = '.db_input($value);
+                        break;
                     case 'topic_id':
                     case 'staff_id':
                     case 'dept_id':
@@ -338,7 +344,7 @@ class MysqlSearchBackend extends SearchBackend {
             $thisstaff->getDepts();
             $access = array();
             $access[] = '(A1.staff_id=' . db_input($thisstaff->getId())
-                .' AND A1.status="open")';
+                .' AND A2.state="open")';
 
             if (!$thisstaff->showAssignedOnly() && ($depts=$thisstaff->getDepts()))
                 $access[] = 'A1.dept_id IN ('
@@ -348,7 +354,7 @@ class MysqlSearchBackend extends SearchBackend {
             if (($teams = $thisstaff->getTeams()) && count(array_filter($teams)))
                 $access[] = 'A1.team_id IN ('
                     .implode(',', db_input(array_filter($teams)))
-                    .') AND A1.status="open"';
+                    .') AND A2.state="open"';
 
             $where[] = '(' . implode(' OR ', $access) . ')';
 
diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php
index 5bd1df943..184856270 100644
--- a/include/staff/tickets.inc.php
+++ b/include/staff/tickets.inc.php
@@ -541,21 +541,21 @@ if ($results) {
             <input type="input" id="query" name="query" size="20" placeholder="<?php echo __('Keywords') . ' &mdash; ' . __('Optional'); ?>">
         </fieldset>
         <fieldset class="span6">
-            <label for="status"><?php echo __('Status');?>:</label>
-            <select id="status" name="status">
-                <option value="">&mdash; <?php echo __('Any Status');?> &mdash;</option>
-                <option value="open"><?php echo _P('ticket-status', 'Open');?></option>
+            <label for="statusId"><?php echo __('Statuses');?>:</label>
+            <select id="statusId" name="statusId">
+                 <option value="">&mdash; <?php echo __('Any Status');?> &mdash;</option>
                 <?php
-                if(!$cfg->showAnsweredTickets()) {?>
-                <option value="answered"><?php echo __('Answered');?></option>
-                <?php
-                } ?>
-                <option value="overdue"><?php echo __('Overdue');?></option>
-                <option value="closed"><?php echo __('Closed');?></option>
+                foreach (TicketStatusList::getStatuses(
+                            array('states' =>
+                                array('open', 'resolved', 'closed'))) as $s) {
+                    echo sprintf('<option data-state="%s" value="%d">%s</option>',
+                            $s->getState(), $s->getId(), __($s->getName()));
+                }
+                ?>
             </select>
         </fieldset>
         <fieldset class="span6">
-            <label for="deptId"><?php echo __('Dept');?>:</label>
+            <label for="deptId"><?php echo __('Departments');?>:</label>
             <select id="deptId" name="deptId">
                 <option value="">&mdash; <?php echo __('All Departments');?> &mdash;</option>
                 <?php
@@ -568,6 +568,18 @@ if ($results) {
                 ?>
             </select>
         </fieldset>
+        <fieldset class="span6">
+            <label for="flag"><?php echo __('Flags');?>:</label>
+            <select id="flag" name="flag">
+                 <option value="">&mdash; <?php echo __('Any Flags');?> &mdash;</option>
+                 <?php
+                 if (!$cfg->showAnsweredTickets()) { ?>
+                 <option data-state="open" value="answered"><?php echo __('Answered');?></option>
+                 <?php
+                 } ?>
+                 <option data-state="open" value="overdue"><?php echo __('Overdue');?></option>
+            </select>
+        </fieldset>
         <fieldset class="owner span6">
             <label for="assignee"><?php echo __('Assigned To');?>:</label>
             <select id="assignee" name="assignee">
@@ -595,6 +607,18 @@ if ($results) {
                 ?>
             </select>
         </fieldset>
+        <fieldset class="span6">
+            <label for="topicId"><?php echo __('Help Topics');?>:</label>
+            <select id="topicId" name="topicId">
+                <option value="" selected >&mdash; <?php echo __('All Help Topics');?> &mdash;</option>
+                <?php
+                if($topics=Topic::getHelpTopics()) {
+                    foreach($topics as $id =>$name)
+                        echo sprintf('<option value="%d" >%s</option>', $id, $name);
+                }
+                ?>
+            </select>
+        </fieldset>
         <fieldset class="owner span6">
             <label for="staffId"><?php echo __('Closed By');?>:</label>
             <select id="staffId" name="staffId">
@@ -608,20 +632,8 @@ if ($results) {
                 ?>
             </select>
         </fieldset>
-        <fieldset class="span6">
-            <label for="topicId"><?php echo __('Help Topic');?>:</label>
-            <select id="topicId" name="topicId">
-                <option value="" selected >&mdash; <?php echo __('All Help Topics');?> &mdash;</option>
-                <?php
-                if($topics=Topic::getHelpTopics()) {
-                    foreach($topics as $id =>$name)
-                        echo sprintf('<option value="%d" >%s</option>', $id, $name);
-                }
-                ?>
-            </select>
-        </fieldset>
         <fieldset class="date_range">
-            <label><?php echo __('Date Range');?>:</label>
+            <label><?php echo __('Date Range').' &mdash; '.__('Create Date');?>:</label>
             <input class="dp" type="input" size="20" name="startDate">
             <span class="between"><?php echo __('TO');?></span>
             <input class="dp" type="input" size="20" name="endDate">
diff --git a/scp/js/scp.js b/scp/js/scp.js
index 953712f43..4f33f6b50 100644
--- a/scp/js/scp.js
+++ b/scp/js/scp.js
@@ -370,23 +370,32 @@ var scp_prep = function() {
     });
 
 
-    $('#advanced-search').delegate('#status', 'change', function() {
-        switch($(this).val()) {
+    $('#advanced-search').delegate('#statusId, #flag', 'change', function() {
+        switch($(this).children('option:selected').data('state')) {
             case 'closed':
-                $('select#assignee').find('option:first').attr('selected', 'selected').parent('select');
-                $('select#assignee').attr('disabled','disabled');
+                $('select#assignee')
+                .attr('disabled','disabled')
+                .find('option:first')
+                .attr('selected', 'selected');
+                $('select#flag')
+                .attr('disabled','disabled')
+                .find('option:first')
+                .attr('selected', 'selected');
                 $('select#staffId').removeAttr('disabled');
                 break;
             case 'open':
-            case 'overdue':
-            case 'answered':
-                $('select#staffId').find('option:first').attr('selected', 'selected').parent('select');
-                $('select#staffId').attr('disabled','disabled');
+            case 'resolved':
+                $('select#staffId')
+                .attr('disabled','disabled')
+                .find('option:first')
+                .attr('selected', 'selected');
                 $('select#assignee').removeAttr('disabled');
+                $('select#flag').removeAttr('disabled');
                 break;
             default:
                 $('select#staffId').removeAttr('disabled');
                 $('select#assignee').removeAttr('disabled');
+                $('select#flag').removeAttr('disabled');
         }
     });
 
-- 
GitLab