diff --git a/include/class.ticket.php b/include/class.ticket.php index 14e49a9e3bd1bcd17e5ec3a3e82d575c8696ce15..50e8173611715153187190c253ea98aec2a77759 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -1628,7 +1628,7 @@ class Ticket { } //Insert Internal Notes - function logNote($title, $note, $poster, $alert=true) { + function logNote($title, $note, $poster='SYSTEM', $alert=true) { return $this->postNote( array('title' => $title, 'note' => $note), diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php index b5b1a4b795c4f8f506c264547c8859ef0276daf1..c7a479cba2640495a256267718ba43780794cb9e 100644 --- a/include/staff/tickets.inc.php +++ b/include/staff/tickets.inc.php @@ -301,6 +301,7 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. <?php csrf_token(); ?> <a class="refresh" href="<?php echo $_SERVER['REQUEST_URI']; ?>">Refresh</a> <input type="hidden" name="a" value="mass_process" > + <input type="hidden" name="do" id="action" value="" > <input type="hidden" name="status" value="<?php echo $status; ?>" > <table class="list" border="0" cellspacing="1" cellpadding="2" width="940"> <caption><?php echo $showing; ?> <?php echo $results_type; ?></caption> @@ -386,7 +387,7 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. <tr id="<?php echo $row['ticket_id']; ?>"> <?php if($thisstaff->canManageTickets()) { ?> <td align="center" class="nohover"> - <input type="checkbox" name="tids[]" value="<?php echo $row['ticket_id']; ?>" onClick="highLight(this.value,this.checked);"> + <input class="ckb" type="checkbox" name="tids[]" value="<?php echo $row['ticket_id']; ?>"> </td> <?php } ?> <td align="center" title="<?php echo $row['email']; ?>" nowrap> @@ -423,11 +424,11 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. <tfoot> <tr> <td colspan="7"> - <?php if($res && $num){ ?> + <?php if($res && $num && $thisstaff->canManageTickets()){ ?> Select: - <a href="#" onclick="return select_all(document.forms['tickets'],true)">All</a> - <a href="#" onclick="return reset_all(document.forms['tickets'])">None</a> - <a href="#" onclick="return toogle_all(document.forms['tickets'],true)">Toggle</a> + <a id="selectAll" href="#ckb">All</a> + <a id="selectNone" href="#ckb">None</a> + <a id="selectToggle" href="#ckb">Toggle</a> <?php }else{ echo '<i>'; echo $ferror?Format::htmlchars($ferror):'Query returned 0 results.'; @@ -445,36 +446,30 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. ?> <?php if($thisstaff->canManageTickets()) { ?> - <p class="centered"> + <p class="centered" id="buttons"> <?php $status=$_REQUEST['status']?$_REQUEST['status']:$status; switch (strtolower($status)) { case 'closed': ?> - <input class="button" type="submit" name="reopen" value="Reopen" - onClick=' return confirm("Are you sure you want to reopen selected tickets?");'> + <input class="button" type="submit" name="reopen" value="Reopen" > <?php break; case 'open': case 'answered': case 'assigned': ?> - <input class="button" type="submit" name="overdue" value="Overdue" - onClick=' return confirm("Are you sure you want to mark selected tickets overdue/stale?");'> - <input class="button" type="submit" name="close" value="Close" - onClick=' return confirm("Are you sure you want to close selected tickets?");'> + <input class="button" type="submit" name="mark_overdue" value="Overdue" > + <input class="button" type="submit" name="close" value="Close"> <?php break; default: //search?? ?> - <input class="button" type="submit" name="close" value="Close" - onClick=' return confirm("Are you sure you want to close selected tickets?");'> - <input class="button" type="submit" name="reopen" value="Reopen" - onClick=' return confirm("Are you sure you want to reopen selected tickets?");'> + <input class="button" type="submit" name="close" value="Close" > + <input class="button" type="submit" name="reopen" value="Reopen"> <?php } if($thisstaff->canDeleteTickets()) { ?> - <input class="button" type="submit" name="delete" value="Delete" - onClick=' return confirm("Are you sure you want to DELETE selected tickets?");'> + <input class="button" type="submit" name="delete" value="Delete"> <?php } ?> </p> <?php @@ -483,6 +478,36 @@ $negorder=$order=='DESC'?'ASC':'DESC'; //Negate the sorting.. </form> </div> +<div style="display:none;" class="dialog" id="confirm-action"> + <h3>Please Confirm</h3> + <a class="close" href="">×</a> + <hr/> + <p class="confirm-action" style="display:none;" id="close-confirm"> + Are you sure want to <b>close</b> selected open tickets? + </p> + <p class="confirm-action" style="display:none;" id="reopen-confirm"> + Are you sure want to <b>reopen</b> selected closed tickets? + </p> + <p class="confirm-action" style="display:none;" id="mark_overdue-confirm"> + Are you sure want to flag the selected tickets as <font color="red"><b>overdue</b></font>? + </p> + <p class="confirm-action" style="display:none;" id="delete-confirm"> + <font color="red"><strong>Are you sure you want to DELETE selected tickets?</strong></font> + <br><br>Deleted tickets CANNOT be recovered, including any associated attachments. + </p> + <div>Please confirm to continue.</div> + <hr style="margin-top:1em"/> + <p class="full-width"> + <span class="buttons" style="float:left"> + <input type="button" value="No, Cancel" class="close"> + </span> + <span class="buttons" style="float:right"> + <input type="button" value="Yes, Do it!" class="confirm"> + </span> + </p> + <div class="clear"></div> +</div> + <div class="dialog" style="display:none;" id="advanced-search"> <h3>Advanced Ticket Search</h3> <a class="close" href="">×</a> diff --git a/scp/tickets.php b/scp/tickets.php index b2a13ceae914b2a45be39417ef199a21cf7aa719..3cf3aeae0e3327f2f3d64493a5b1a1bb8197a0e7 100644 --- a/scp/tickets.php +++ b/scp/tickets.php @@ -324,62 +324,91 @@ if($_POST && !$errors): if($ticket && is_object($ticket)) $ticket->reload();//Reload ticket info following post processing }elseif($_POST['a']) { + switch($_POST['a']) { case 'mass_process': if(!$thisstaff->canManageTickets()) $errors['err']='You do not have permission to mass manage tickets. Contact admin for such access'; elseif(!$_POST['tids'] || !is_array($_POST['tids'])) $errors['err']='No tickets selected. You must select at least one ticket.'; - elseif(($_POST['reopen'] || $_POST['close']) && !$thisstaff->canCloseTickets()) - $errors['err']='You do not have permission to close/reopen tickets'; - elseif($_POST['delete'] && !$thisstaff->canDeleteTickets()) - $errors['err']='You do not have permission to delete tickets'; - elseif(!$_POST['tids'] || !is_array($_POST['tids'])) - $errors['err']='You must select at least one ticket'; - - if(!$errors) { + else { $count=count($_POST['tids']); - if(isset($_POST['reopen'])){ - $i=0; - $note='Ticket reopened by '.$thisstaff->getName(); - foreach($_POST['tids'] as $k=>$v) { - $t = new Ticket($v); - if($t && @$t->reopen()) { - $i++; - $t->logActivity('Ticket Reopened',$note,false,'System'); + $i = 0; + switch(strtolower($_POST['do'])) { + case 'reopen': + if($thisstaff->canCloseTickets() || $thisstaff->canCreateTickets()) { + $note='Ticket reopened by '.$thisstaff->getName(); + foreach($_POST['tids'] as $k=>$v) { + if(($t=Ticket::lookup($v)) && $t->isClosed() && @$t->reopen()) { + $i++; + $t->logNote('Ticket Reopened', $note); + } + } + + if($i==$count) + $msg = "Selected tickets ($i) reopened successfully"; + else + $warn = "$i of $count selected tickets reopened"; + } else { + $errors['err'] = 'You do not have permission to reopen tickets'; } - } - $msg="$i of $count selected tickets reopened"; - }elseif(isset($_POST['close'])){ - $i=0; - $note='Ticket closed without response by '.$thisstaff->getName(); - foreach($_POST['tids'] as $k=>$v) { - $t = new Ticket($v); - if($t && @$t->close()){ - $i++; - $t->logActivity('Ticket Closed',$note,false,'System'); + break; + case 'close': + if($thisstaff->canCloseTickets()) { + $note='Ticket closed without response by '.$thisstaff->getName(); + foreach($_POST['tids'] as $k=>$v) { + if(($t=Ticket::lookup($v)) && $t->isOpen() && @$t->close()) { + $i++; + $t->logNote('Ticket Closed', $note); + } + } + + if($i==$count) + $msg ="Selected tickets ($i) closed succesfully"; + else + $warn = "$i of $count selected tickets closed"; + } else { + $errors['err'] = 'You do not have permission to close tickets'; } - } - $msg="$i of $count selected tickets closed"; - }elseif(isset($_POST['overdue'])){ - $i=0; - $note='Ticket flagged as overdue by '.$thisstaff->getName(); - foreach($_POST['tids'] as $k=>$v) { - $t = new Ticket($v); - if($t && !$t->isOverdue()) - if($t->markOverdue()) { + break; + case 'mark_overdue': + $note='Ticket flagged as overdue by '.$thisstaff->getName(); + foreach($_POST['tids'] as $k=>$v) { + if(($t=Ticket::lookup($v)) && !$t->isOverdue() && $t->markOverdue()) { $i++; - $t->logActivity('Ticket Marked Overdue',$note,false,'System'); + $t->logNote('Ticket Marked Overdue', $note); + } + } + + if($i==$count) + $msg = "Selected tickets ($i) marked overdue"; + else + $warn = "$i of $count selected tickets marked overdue"; + break; + case 'delete': + if($thisstaff->canDeleteTickets()) { + foreach($_POST['tids'] as $k=>$v) { + if(($t=Ticket::lookup($v)) && @$t->delete()) $i++; } - } - $msg="$i of $count selected tickets marked overdue"; - }elseif(isset($_POST['delete'])){ - $i=0; - foreach($_POST['tids'] as $k=>$v) { - $t = new Ticket($v); - if($t && @$t->delete()) $i++; - } - $msg="$i of $count selected tickets deleted"; + + //Log a warning + if($i) { + $log = sprintf('%s (%s) just deleted %d ticket(s)', + $thisstaff->getName(), $thisstaff->getUserName(), $i); + $ost->logWarning('Tickets deleted', $log, false); + + } + + if($i==$count) + $msg = "Selected tickets ($i) deleted successfully"; + else + $warn = "$i of $count selected tickets deleted"; + } else { + $errors['err'] = 'You do not have permission to delete tickets'; + } + break; + default: + $errors['err']='Unknown or unsupported action - get technical help'; } } break;