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') . ' — ' . __('Optional'); ?>"> </fieldset> <fieldset class="span6"> - <label for="status"><?php echo __('Status');?>:</label> - <select id="status" name="status"> - <option value="">— <?php echo __('Any Status');?> —</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="">— <?php echo __('Any Status');?> —</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="">— <?php echo __('All Departments');?> —</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="">— <?php echo __('Any Flags');?> —</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 >— <?php echo __('All Help Topics');?> —</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 >— <?php echo __('All Help Topics');?> —</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').' — '.__('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