diff --git a/include/ajax.tickets.php b/include/ajax.tickets.php index 6d726f5a189631861aa7986970284563bc52e573..18aa44c4a066e5032fcf64989429cbc29501ceed 100644 --- a/include/ajax.tickets.php +++ b/include/ajax.tickets.php @@ -405,31 +405,44 @@ class TicketsAjaxAPI extends AjaxController { } - function assign($tid, $to=null) { + function assign($tid, $target=null) { global $thisstaff; if (!($ticket=Ticket::lookup($tid))) Http::response(404, __('No such ticket')); - if (!$ticket->checkStaffPerm($thisstaff, Ticket::PERM_ASSIGN)) + if (!$ticket->checkStaffPerm($thisstaff, Ticket::PERM_ASSIGN) + || !($form = $ticket->getAssignmentForm($_POST, + array('target' => $target)))) Http::response(403, __('Permission Denied')); $errors = array(); $info = array( ':title' => sprintf(__('Ticket #%s: %s'), $ticket->getNumber(), - $ticket->isAssigned() ? __('Reassign') : __('Assign')), + sprintf('%s %s', + $ticket->isAssigned() ? + __('Reassign') : __('Assign'), + !strcasecmp($target, 'agents') ? + __('to an Agent') : __('to a Team') + )), ':action' => sprintf('#tickets/%d/assign%s', $ticket->getId(), - ($to ? "/$to": '')), + ($target ? "/$target": '')), ); + if ($ticket->isAssigned()) { - $info['notice'] = sprintf(__('%s is currently assigned to %s'), - __('Ticket'), - $ticket->getAssigned()); + if ($ticket->getStaffId() == $thisstaff->getId()) + $assigned = __('you'); + else + $assigned = $ticket->getAssigned(); + + $info['notice'] = sprintf(__('%s is currently assigned to <b>%s</b>'), + __('This ticket'), + Format::htmlchars($assigned) + ); } - $form = $ticket->getAssignmentForm($_POST); if ($_POST && $form->isValid()) { if ($ticket->assign($form, $errors)) { $_SESSION['::sysmsgs']['msg'] = sprintf( diff --git a/include/class.forms.php b/include/class.forms.php index 019d0cae21484c5917be13c577427a3504ba7603..7d163f361cc77000a8437d694b457313dc2c5671 100644 --- a/include/class.forms.php +++ b/include/class.forms.php @@ -2233,6 +2233,10 @@ class AssigneeField extends ChoiceField { return true; } + function setChoices($choices) { + $this->_choices = $choices; + } + function getChoices() { global $cfg; @@ -3952,14 +3956,8 @@ class AssignmentForm extends Form { static $id = 'assign'; var $_assignee = null; - var $_dept = null; + var $_assignees = array(); - function __construct($source=null, $options=array()) { - parent::__construct($source, $options); - // Department of the object -- if necessary to limit assinees - if (isset($options['dept'])) - $this->_dept = $options['dept']; - } function getFields() { @@ -3977,7 +3975,6 @@ class AssignmentForm extends Form { 'criteria' => array( 'available' => true, ), - 'dept' => $this->_dept ?: null, ), ) ), @@ -3995,6 +3992,11 @@ class AssignmentForm extends Form { ), ); + + if ($this->_assignees) + $fields['assignee']->setChoices($this->_assignees); + + $this->setFields($fields); return $this->fields; @@ -4035,6 +4037,15 @@ class AssignmentForm extends Form { include $inc; } + function setAssignees($assignees) { + $this->_assignees = $assignees; + $this->_fields = array(); + } + + function getAssignees() { + return $this->_assignees; + } + function getAssignee() { if (!isset($this->_assignee)) @@ -4043,11 +4054,9 @@ class AssignmentForm extends Form { return $this->_assignee; } - function assigneeCriteria() { - $dept = $this->id; - return function () use($dept) { - return array('dept_id' =>$dept); - }; + function getComments() { + return $this->getField('comments')->getClean(); + } } diff --git a/include/class.ticket.php b/include/class.ticket.php index 3fe355de2a1e8f807e59d3d447e5513626c526c3..a03d3bcbeb91cd87675fb34594afeef6281ae6c4 100644 --- a/include/class.ticket.php +++ b/include/class.ticket.php @@ -852,12 +852,48 @@ implements RestrictedAccess, Threadable { function getAssignmentForm($source=null, $options=array()) { + $prompt = $assignee = ''; + // Possible assignees + $assignees = array(); + switch (strtolower($options['target'])) { + case 'agents': + $dept = $this->getDept(); + $criteria = array('available' => true); + if (($members = $dept->getMembers($criteria))) { + foreach ($members as $member) + $assignees['s'.$member->getId()] = $member; + } + + if (!$source && $this->isOpen() && $this->staff) + $assignee = sprintf('s%d', $this->staff->getId()); + $prompt = __('Select an Agent'); + break; + case 'teams': + if (($teams = Team::getTeams())) + foreach ($teams as $id => $name) + $assignees['t'.$id] = $name; + + if (!$source && $this->isOpen() && $this->team) + $assignee = sprintf('s%d', $this->team->getId()); + $prompt = __('Select a Team'); + break; + } + + // Default to current assignee if source is not set if (!$source) - $source = array('assignee' => array($this->getAssigneeId())); + $source = array('assignee' => array($assignee)); + + $form = AssignmentForm::instantiate($source, $options); + + if ($assignees) + $form->setAssignees($assignees); + + if ($prompt && ($f=$form->getField('assignee'))) + $f->configure('prompt', $prompt); + - $options += array('dept' => $this->getDept()); + return $form; - return AssignmentForm::instantiate($source, $options); } function getTransferForm($source=null) { @@ -2118,9 +2154,7 @@ implements RestrictedAccess, Threadable { $this->logEvent('assigned', $evd); - $this->onAssign($assignee, - $form->getField('comments')->getClean(), - $alert); + $this->onAssign($assignee, $form->getComments(), $alert); return true; } diff --git a/include/staff/ticket-view.inc.php b/include/staff/ticket-view.inc.php index 156b2c323556a57f4de5771baae88a64eb123fc0..d89a4d5e34da99bfdc3616234cc9df39814f5632 100644 --- a/include/staff/ticket-view.inc.php +++ b/include/staff/ticket-view.inc.php @@ -86,13 +86,13 @@ if($ticket->isOverdue()) <?php // Assign - if ($role->hasPerm(TicketModel::PERM_ASSIGN)) {?> + if ($ticket->isOpen() && $role->hasPerm(TicketModel::PERM_ASSIGN)) {?> <span class="action-button pull-right" data-dropdown="#action-dropdown-assign"> <i class="icon-caret-down pull-right"></i> <a class="ticket-action" id="ticket-assign" data-redirect="tickets.php" href="#tickets/<?php echo $ticket->getId(); ?>/assign"><i class="icon-user"></i> <?php - echo $ticket->isAssigned() ? __('Assign') : __('Reassign'); ?></a> + echo $ticket->isAssigned() ? __('Reassign') : __('Assign'); ?></a> </span> <div id="action-dropdown-assign" class="action-dropdown anchor-right"> <ul>