diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index 648edc8256939ef0c3131e57684a73516a5d7d78..c52f999b55b427a32773b247396b5ff5c0266d55 100644 --- a/include/ajax.tickets.php +++ b/include/ajax.tickets.php @@ -88,42 +88,92 @@ class TicketsAjaxAPI extends AjaxController { global $thisstaff; $result=array(); - $sql='SELECT count(ticket_id) as tickets ' - .' FROM '.TICKET_TABLE - .' WHERE 1 '; + $select = 'SELECT count(ticket.ticket_id) as tickets '; + $from = ' FROM '.TICKET_TABLE.' ticket '; + $where = ' WHERE 1 '; //Access control. - $sql.=' AND ( staff_id='.db_input($thisstaff->getId()); + $where.=' AND ( ticket.staff_id='.db_input($thisstaff->getId()); if(($teams=$thisstaff->getTeams()) && count(array_filter($teams))) - $sql.=' OR team_id IN('.implode(',', array_filter($teams)).')'; + $where.=' OR ticket.team_id IN('.implode(',', array_filter($teams)).')'; if(!$thisstaff->showAssignedOnly() && ($depts=$thisstaff->getDepts())) - $sql.=' OR dept_id IN ('.implode(',', $depts).')'; + $where.=' OR ticket.dept_id IN ('.implode(',', $depts).')'; - $sql.=' ) '; + $where.=' ) '; //Department if($_REQUEST['deptId']) - $sql.=' AND dept_id='.db_input($_REQUEST['deptId']); + $where.=' AND ticket.dept_id='.db_input($_REQUEST['deptId']); //Status switch(strtolower($_REQUEST['status'])) { case 'open'; - $sql.=' AND status="open" '; + $where.=' AND ticket.status="open" '; break; case 'overdue': - $sql.=' AND status="open" and isoverdue=1 '; + $where.=' AND ticket.status="open" AND ticket.isoverdue=1 '; break; case 'closed': - $sql.=' AND status="closed" '; + $where.=' AND ticket.status="closed" '; break; } + + //Assignee + if($_REQUEST['assignee'] && strcasecmp($_REQUEST['status'], 'closed')) { + $id=preg_replace("/[^0-9]/", "", $_REQUEST['assignee']); + $assignee = $_REQUEST['assignee']; + $where.= ' AND ( '; + if($assignee[0]=='t') + $where.=' (ticket.team_id='.db_input($id). ' AND ticket.status="open") '; + elseif($assignee[0]=='s') + $where.=' (ticket.staff_id='.db_input($id). ' AND ticket.status="open") '; + else + $where.=' (ticket.staff_id='.db_input($id). ' AND ticket.status="open") '; + + if($_REQUEST['staffId'] && !$_REQUEST['status']) //Assigned TO + Closed By + $where.= ' OR (ticket.staff_id='.db_input($_REQUEST['staffId']). ' AND ticket.status="closed") '; + + $where.= ' ) '; + } elseif($_REQUEST['staffId']) { + $where.=' AND (ticket.staff_id='.db_input($_REQUEST['staffId']).' AND ticket.status="closed") '; + } + + //dates + $startTime =($_REQUEST['startDate'] && (strlen($_REQUEST['startDate'])>=8))?strtotime($_REQUEST['startDate']):0; + $endTime =($_REQUEST['endDate'] && (strlen($_REQUEST['endDate'])>=8))?strtotime($_REQUEST['endDate']):0; + if( ($startTime && $startTime>time()) or ($startTime>$endTime && $endTime>0)) + $startTime=$endTime=0; + + //Have fun with dates. + if($startTime) + $qwhere.=' AND ticket.created>=FROM_UNIXTIME('.$startTime.')'; + + if($endTime) + $qwhere.=' AND ticket.created<=FROM_UNIXTIME('.$endTime.')'; + + //Query + if($_REQUEST['query']) { + $queryterm=db_real_escape($_REQUEST['query'], false); + + $from.=' LEFT JOIN '.TICKET_THREAD_TABLE.' thread ON (ticket.ticket_id=thread.ticket_id )'; + $where.=" AND ( ticket.email LIKE '%$queryterm%'" + ." OR ticket.name LIKE '%$queryterm%'" + ." OR ticket.subject LIKE '%$queryterm%'" + ." OR thread.title LIKE '%$queryterm%'" + ." OR thread.body LIKE '%$queryterm%'" + .' )'; + $groupby = 'GROUP BY ticket.ticket_id '; + } + $sql="$select $from $where $groupby"; if(($tickets=db_result(db_query($sql)))) { - $result['success'] ="Search criteria matched $tickets tickets - view"; + $result['success'] =sprintf("Search criteria matched %s - <a href='tickets.php?%s'>view</a>", + ($tickets>1?"$tickets tickets":"$tickets ticket"), + str_replace(array('&', '&'), array('&', '&'), $_SERVER['QUERY_STRING'])); } else { - $result['fail']='No tickets found matching your search criteria.'.$tickets; + $result['fail']='No tickets found matching your search criteria.'; } return $this->json_encode($result); diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php index f11cf681c7dc6af352aeb57285f21ce86437009e..9d6d5c7bcf0005e315f4e6e032943c97a237c01d 100644 --- a/include/staff/tickets.inc.php +++ b/include/staff/tickets.inc.php @@ -42,6 +42,7 @@ switch(strtolower($_REQUEST['status'])){ //Status is overloaded case 'assigned': $status='open'; $staffId=$thisstaff->getId(); + $results_type='My Tickets'; break; case 'answered': $status='open'; @@ -130,15 +131,36 @@ if($search): } } //department - if($_REQUEST['dept'] && in_array($_REQUEST['dept'],$thisstaff->getDepts())) { + if($_REQUEST['deptId'] && in_array($_REQUEST['deptId'],$thisstaff->getDepts())) { //This is dept based search..perm taken care above..put the sucker in. - $qwhere.=' AND ticket.dept_id='.db_input($_REQUEST['dept']); - $qstr.='&dept='.urlencode($_REQUEST['dept']); + $qwhere.=' AND ticket.dept_id='.db_input($_REQUEST['deptId']); + $qstr.='&deptId='.urlencode($_REQUEST['deptId']); } - //Teams - if($_REQUEST['team'] && ($thisuser->isadmin() || in_array($_REQUEST['team'],$thisuser->getTeams()))) { - $qwhere.=' AND ticket.team_id='.db_input($_REQUEST['team']); - $qstr.='&team='.urlencode($_REQUEST['team']); + + //Assignee + if($_REQUEST['assignee'] && strcasecmp($_REQUEST['status'], 'closed')) { + $id=preg_replace("/[^0-9]/", "", $_REQUEST['assignee']); + $assignee = $_REQUEST['assignee']; + $qstr.='&assignee='.urlencode($_REQUEST['assignee']); + $qwhere.= ' AND ( '; + + if($assignee[0]=='t') + $qwhere.=' (ticket.team_id='.db_input($id). ' AND ticket.status="open") '; + elseif($assignee[0]=='s') + $qwhere.=' (ticket.staff_id='.db_input($id). ' AND ticket.status="open") '; + else + $qwhere.=' (ticket.staff_id='.db_input($id). ' AND ticket.status="open") '; + + + if($_REQUEST['staffId'] && !$_REQUEST['status']) { //Assigned TO + Closed By + $qwhere.= ' OR (ticket.staff_id='.db_input($_REQUEST['staffId']). ' AND ticket.status="closed") '; + $qstr.='&staffId='.urlencode($_REQUEST['staffId']); + } + + $qwhere.= ' ) '; + } elseif($_REQUEST['staffId']) { + $qwhere.=' AND (ticket.staff_id='.db_input($_REQUEST['staffId']).' AND ticket.status="closed") '; + $qstr.='&staffId='.urlencode($_REQUEST['staffId']); } //dates @@ -158,7 +180,7 @@ if($search): $qwhere.=' AND ticket.created<=FROM_UNIXTIME('.$endTime.')'; $qstr.='&endDate='.urlencode($_REQUEST['endDate']); } -} + } endif; @@ -215,9 +237,7 @@ $pageNav->setURL('tickets.php',$qstr.'&sort='.urlencode($_REQUEST['sort']).'&ord //ADD attachment,priorities, lock and other crap $qselect.=' ,count(attach.attach_id) as attachments ' - .' ,count(DISTINCT message.id) as messages ' - .' ,count(DISTINCT response.id) as responses ' - .' ,count(DISTINCT note.id) as notes ' + .' ,count(DISTINCT thread.id) as thread_count ' .' ,IF(ticket.reopened is NULL,IF(ticket.lastmessage is NULL,ticket.created,ticket.lastmessage),ticket.reopened) as effective_date ' .' ,CONCAT_WS(" ", staff.firstname, staff.lastname) as staff, team.name as team ' .' ,IF(staff.staff_id IS NULL,team.name,CONCAT_WS(" ", staff.lastname, staff.firstname)) as assigned '; @@ -226,12 +246,7 @@ $qfrom.=' LEFT JOIN '.TICKET_PRIORITY_TABLE.' pri ON (ticket.priority_id=pri.pri .' LEFT JOIN '.TICKET_LOCK_TABLE.' tlock ON (ticket.ticket_id=tlock.ticket_id AND tlock.expire>NOW() AND tlock.staff_id!='.db_input($thisstaff->getId()).') ' .' LEFT JOIN '.TICKET_ATTACHMENT_TABLE.' attach ON (ticket.ticket_id=attach.ticket_id) ' - .' LEFT JOIN '.TICKET_THREAD_TABLE.' message ON (' - .'ticket.ticket_id=message.ticket_id AND message.thread_type="M") ' - .' LEFT JOIN '.TICKET_THREAD_TABLE.' response ON (' - .'ticket.ticket_id=response.ticket_id AND response.thread_type="R") ' - .' LEFT JOIN '.TICKET_THREAD_TABLE.' note ON (' - .'ticket.ticket_id=note.ticket_id AND note.thread_type="N") ' + .' LEFT JOIN '.TICKET_THREAD_TABLE.' thread ON ( ticket.ticket_id=thread.ticket_id) ' .' LEFT JOIN '.STAFF_TABLE.' staff ON (ticket.staff_id=staff.staff_id) ' .' LEFT JOIN '.TEAM_TABLE.' team ON (ticket.team_id=team.team_id) '; @@ -241,9 +256,12 @@ $hash = md5($query); $_SESSION['search_'.$hash] = $query; $res = db_query($query); $showing=db_num_rows($res)?$pageNav->showing():""; -if(!$results_type) { - $results_type=($search)?'Search Results':ucfirst($status).' Tickets'; -} +if(!$results_type) + $results_type = ucfirst($status).' Tickets'; + +if($search) + $results_type.= ' (Search Results)'; + $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. //YOU BREAK IT YOU FIX IT. @@ -295,7 +313,7 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. title="Sort By Status <?php echo $negorder; ?>">Status</a></th> <?php } else { ?> - <th width="60" <?=$pri_sort?>> + <th width="60" <?php echo $pri_sort;?>> <a <?php echo $pri_sort; ?> href="tickets.php?sort=pri&order=<?php echo $negorder; ?><?php echo $qstr; ?>" title="Sort By Priority <?php echo $negorder; ?>">Priority</a></th> <?php @@ -305,15 +323,18 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. <th width="150"> <a <?php echo $assignee_sort; ?> href="tickets.php?sort=assignee&order=<?php echo $negorder; ?><?php echo $qstr; ?>" title="Sort By Assignee <?php echo $negorder;?>">Assigned To</a></th> - <?}elseif(!strcasecmp($status,'closed')){?> + <?php + } elseif(!strcasecmp($status,'closed')) { ?> <th width="150"> <a <?php echo $staff_sort; ?> href="tickets.php?sort=staff&order=<?php echo $negorder; ?><?php echo $qstr; ?>" title="Sort By Closing Staff Name <?php echo $negorder; ?>">Closed By</a></th> - <?}else{?> + <?php + } else { ?> <th width="150"> - <a <?=$dept_sort?> href="tickets.php?sort=dept&order=<?=$negorder?><?=$qstr?>" - title="Sort By Department <?=$negorder?>">Department</a></th> - <?}?> + <a <?php echo $dept_sort; ?> href="tickets.php?sort=dept&order=<?php echo $negorder;?><?php echo $qstr; ?>" + title="Sort By Department <?php echo $negorder; ?>">Department</a></th> + <?php + } ?> </tr> </thead> <tbody> @@ -342,7 +363,7 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. } $tid=$row['ticketID']; $subject = Format::truncate($row['subject'],40); - $threadcount=$row['messages']+$row['responses']; + $threadcount=$row['thread_count']; if(!strcasecmp($row['status'],'open') && !$row['isanswered'] && !$row['lock_id']) { $tid=sprintf('<b>%s</b>',$tid); } @@ -476,8 +497,8 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. </select> </fieldset> <fieldset class="owner"> - <label for="assigneeId">Assigned To:</label> - <select id="assigneeId" name="assigneeId"> + <label for="assignee">Assigned To:</label> + <select id="assignee" name="assignee"> <option value="0">— Anyone —</option> <?php if(($users=Staff::getStaffMembers())) { @@ -504,10 +525,8 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. <option value="0">— Anyone —</option> <?php if(($users=Staff::getStaffMembers())) { - foreach($users as $id => $name) { - $k="s$id"; - echo sprintf('<option value="%s">%s</option>', $k, $name); - } + foreach($users as $id => $name) + echo sprintf('<option value="%d">%s</option>', $id, $name); } ?> </select> @@ -518,22 +537,6 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. <span>TO</span> <input class="dp" type="input" size="20" name="endDate"><i></i> </fieldset> - <fieldset class="sorting"> - <label>Sorting:</label> - <select name="sort"> - <option value="date">Create Date</option> - </select> - <select name="order"> - <option value="desc">Descending</option> - <option value="asc">Ascending</option> - </select> - <select name="limit"> - <option value="25">25 records/page</option> - <option value="50" selected="selected">50 records/page</option> - <option value="75">75 records/page</option> - <option value="100">100 records/page</option> - </select> - </fieldset> <p> <span class="buttons"> <input type="submit" value="Search"> diff --git a/scp/css/scp.css b/scp/css/scp.css index de333413a94ad5f6fcb9a7aece5f4946b55ec0bd..fddb65ffa6c96095525c44b146bd2e96d82cde53 100644 --- a/scp/css/scp.css +++ b/scp/css/scp.css @@ -1081,7 +1081,7 @@ h2 .reload { position:absolute; padding:1em; width:640px; - height:400px; + height:360px; background:#fff; border:1px solid #2a67ac; display:none; diff --git a/scp/js/scp.js b/scp/js/scp.js index 37389d34b8f5510914c82c80115a0bbbc152af71..56f776ed6ff4ef0a6a20a54ef3837d957a487949 100644 --- a/scp/js/scp.js +++ b/scp/js/scp.js @@ -264,19 +264,19 @@ $(document).ready(function(){ }).delegate('#status', 'change', function() { switch($(this).val()) { case 'closed': - $('select#assigneeId').find('option:first').attr('selected', 'selected').parent('select'); - $('select#assigneeId').attr('disabled','disabled'); + $('select#assignee').find('option:first').attr('selected', 'selected').parent('select'); + $('select#assignee').attr('disabled','disabled'); $('select#staffId').removeAttr('disabled'); break; case 'open': case 'overdue': $('select#staffId').find('option:first').attr('selected', 'selected').parent('select'); $('select#staffId').attr('disabled','disabled'); - $('select#assigneeId').removeAttr('disabled'); + $('select#assignee').removeAttr('disabled'); break; default: $('select#staffId').removeAttr('disabled'); - $('select#assigneeId').removeAttr('disabled'); + $('select#assignee').removeAttr('disabled'); } });