Skip to content
Snippets Groups Projects
Commit 85a4a99a authored by Jared Hancock's avatar Jared Hancock
Browse files

Merge pull request #1250 from protich/issue/status-change


Ticket status change

Reviewed-By: default avatarJared Hancock <jared@osticket.com>
parents 61d8dde4 d367a12e
Branches
Tags
No related merge requests found
......@@ -715,6 +715,7 @@ class TicketsAjaxAPI extends AjaxController {
Http::response(404, 'Unknown ticket #');
$info = array();
$state = null;
switch($status) {
case 'open':
case 'reopen':
......@@ -732,36 +733,19 @@ class TicketsAjaxAPI extends AjaxController {
if (!$thisstaff->canDeleteTickets())
Http::response(403, 'Access denied');
$state = 'deleted';
$info = array(
'warn' => sprintf(__('Are you sure you want to DELETE %s?'),
__('this ticket')),
//TODO: remove message below once we ship data retention plug
'extra' => sprintf('<strong>%s</strong>',
__('Deleted tickets CANNOT be recovered,
including any associated attachments.')));
break;
default:
$state = $ticket->getStatus()->getState();
$info['warn'] = sprintf('%s %s',
__('Unknown or invalid'), __('status'));
}
$verb = TicketStateField::getVerb($state);
$info['action'] = sprintf('#tickets/%d/status/%s', $ticket->getId(), $status);
$info['title'] = sprintf(__(
/* 1$ will be a verb, like 'open', 2$ will be the ticket number */
'%1$s Ticket #%2$s'),
$verb ?: $state,
$ticket->getNumber()
);
$info['status_id'] = $_REQUEST['status_id'] ?: $id ?: $ticket->getStatusId();
$info['status_id'] = $id ?: $ticket->getStatusId();
return self::_setStatus($state, $info);
return self::_changeTicketStatus($ticket, $state, $info);
}
function setTicketStatus($tid, $state) {
function setTicketStatus($tid) {
global $thisstaff, $ost;
if (!$thisstaff)
......@@ -772,7 +756,8 @@ class TicketsAjaxAPI extends AjaxController {
Http::response(404, 'Unknown ticket #');
$errors = $info = array();
if (!($status= TicketStatus::lookup($_REQUEST['status_id'])))
if (!$_POST['status_id']
|| !($status= TicketStatus::lookup($_POST['status_id'])))
$errors['status_id'] = sprintf('%s %s',
__('Unknown or invalid'), __('status'));
elseif ($status->getId() == $ticket->getStatusId())
......@@ -804,33 +789,41 @@ class TicketsAjaxAPI extends AjaxController {
}
}
$state = strtolower($status->getState());
if (!$errors && $ticket->setStatus($status, $_REQUEST['comments'])) {
$_SESSION['::sysmsgs']['msg'] = sprintf(
__('Successfully updated status to %s'),
$status->getName());
if ($state == 'deleted') {
$msg = sprintf('%s %s',
sprintf(__('Ticket #%s'), $ticket->getNumber()),
__('deleted sucessfully')
);
} elseif ($state != 'open') {
$msg = sprintf(__('%s status changed to %s'),
sprintf(__('Ticket #%s'), $ticket->getNumber()),
$status->getName());
} else {
$msg = sprintf(
__('%s status changed to %s'),
__('Ticket'),
$status->getName());
}
$_SESSION['::sysmsgs']['msg'] = $msg;
Http::response(201, 'Successfully processed');
} elseif (!$errors['err']) {
$errors['err'] = __('Error updating ticket status');
}
$state = $state ?: $ticket->getStatus()->getState();
$info['status_id'] = $status
? $status->getId() : $ticket->getStatusId();
$state = $status ? $status->getState() : $state;
$verb = TicketStateField::getVerb($state);
$info['action'] = sprintf('#tickets/%d/status/%s', $ticket->getId(), $state);
$info['title'] = sprintf(__(
/* 1$ will be a verb, like 'open', 2$ will be the ticket number */
'%1$s Ticket #%2$s'),
$verb ?: $state,
$ticket->getNumber()
);
$info['status_id'] = $_REQUEST['status_id'] ?: 0;
$info['comments'] = Format::htmlchars($_REQUEST['comments']);
$info['errors'] = $errors;
return self::_setStatus($state, $info);
return self::_changeTicketStatus($ticket, $state, $info, $errors);
}
function changeTicketsStatus($status, $id=0) {
function changeSelectedTicketsStatus($status, $id=0) {
global $thisstaff, $cfg;
if (!$thisstaff)
......@@ -856,33 +849,18 @@ class TicketsAjaxAPI extends AjaxController {
Http::response(403, 'Access denied');
$state = 'deleted';
$info = array(
'warn' => sprintf(__('Are you sure you want to DELETE %s?'),
_N('selected ticket', 'selected tickets', $_REQUEST['count'])),
//TODO: remove message below once we ship data retention plug
'extra' => sprintf('<strong>%s</strong>',
__('Deleted tickets CANNOT be recovered,
including any associated attachments.')));
break;
default:
$info['warn'] = sprintf('%s %s',
__('Unknown or invalid'), __('status'));
}
$info['title'] = sprintf('%s %s',
TicketStateField::getVerb($state),
__('Tickets'));
if ($_REQUEST['count'])
$info['title'] .= sprintf(' &mdash; %d %s',
$_REQUEST['count'], __('selected'));
$info['status_id'] = $id;
return self::_setStatus($state, $info);
return self::_changeSelectedTicketsStatus($state, $info);
}
function setTicketsStatus($state) {
function setSelectedTicketsStatus($state) {
global $thisstaff, $ost;
$errors = $info = array();
......@@ -941,45 +919,116 @@ class TicketsAjaxAPI extends AjaxController {
else {
// Assume success
if ($i==$count) {
$_SESSION['::sysmsgs']['msg'] = sprintf(
if (!strcasecmp($status->getState(), 'deleted')) {
$msg = sprintf(__( 'Successfully deleted %s.'),
_N('selected ticket', 'selected tickets',
$count));
} else {
$msg = sprintf(
__(
/* 1$ will be 'selected ticket(s)', 2$ is the new status */
'Successfully updated status of %1$s to %2$s'),
'Successfully changed status of %1$s to %2$s'),
_N('selected ticket', 'selected tickets',
$count),
$status->getName());
}
$_SESSION['::sysmsgs']['msg'] = $msg;
} else {
$_SESSION['::sysmsgs']['warn'] = sprintf(
__('%1$d of %2$d %3$s status updated to %4$s'),$i, $count,
_N('selected ticket', 'selected tickets',
$count),
$status->getName());
if (!strcasecmp($status->getState(), 'deleted')) {
$warn = sprintf(__('Successfully deleted %s.'),
sprintf(__('%1$d of %2$d selected tickets'),
$i, $count)
);
} else {
$warn = sprintf(
__('%1$d of %2$d %3$s status changed to %4$s'),$i, $count,
_N('selected ticket', 'selected tickets',
$count),
$status->getName());
}
$_SESSION['::sysmsgs']['warn'] = $warn;
}
Http::response(201, 'Successfully processed');
}
}
$info['title'] = sprintf('%s %s',
return self::_changeSelectedTicketsStatus($state, $info, $errors);
}
private function _changeSelectedTicketsStatus($state, $info=array(), $errors=array()) {
$count = $_REQUEST['count'] ?:
($_REQUEST['tids'] ? count($_REQUEST['tids']) : 0);
$info['title'] = sprintf(__('%1$s Tickets &mdash; %2$d selected'),
TicketStateField::getVerb($state),
__('Tickets'));
$count);
if ($count)
$info['title'] .= sprintf(' &mdash; %d %s',
$count, __('selected'));
if (!strcasecmp($state, 'deleted')) {
$info['warn'] = sprintf(__(
'Are you sure you want to DELETE %s?'),
_N('selected ticket', 'selected tickets', $count)
);
$info['status_id'] = $_REQUEST['status_id'];
$info['extra'] = sprintf('<strong>%s</strong>', __(
'Deleted tickets CANNOT be recovered, including any associated attachments.')
);
$info['placeholder'] = sprintf(__(
'Optional reason for deleting %s'),
_N('selected ticket', 'selected tickets', $count));
}
$info['status_id'] = $info['status_id'] ?: $_REQUEST['status_id'];
$info['comments'] = Format::htmlchars($_REQUEST['comments']);
$info['errors'] = $errors;
return self::_setStatus($state, $info);
return self::_changeStatus($state, $info, $errors);
}
function _setStatus($state, $info=array()) {
private function _changeTicketStatus($ticket, $state, $info=array(), $errors=array()) {
$verb = TicketStateField::getVerb($state);
$info['action'] = sprintf('#tickets/%d/status', $ticket->getId());
$info['title'] = sprintf(__(
/* 1$ will be a verb, like 'open', 2$ will be the ticket number */
'%1$s Ticket #%2$s'),
$verb ?: $state,
$ticket->getNumber()
);
// Deleting?
if (!strcasecmp($state, 'deleted')) {
$info['placeholder'] = sprintf(__(
'Optional reason for deleting %s'),
__('this ticket'));
$info[ 'warn'] = sprintf(__(
'Are you sure you want to DELETE %s?'),
__('this ticket'));
//TODO: remove message below once we ship data retention plug
$info[ 'extra'] = sprintf('<strong>%s</strong>',
__('Deleted tickets CANNOT be recovered, including any associated attachments.')
);
}
$info['status_id'] = $info['status_id'] ?: $ticket->getStatusId();
$info['comments'] = Format::htmlchars($_REQUEST['comments']);
return self::_changeStatus($state, $info, $errors);
}
private function _changeStatus($state, $info=array(), $errors=array()) {
$errors = array();
if ($info && isset($info['errors']))
$errors = $info['errors'];
$errors = array_merge($errors, $info['errors']);
if (!$info['error'] && isset($errors['err']))
$info['error'] = $errors['err'];
......
......@@ -4,11 +4,13 @@ global $thisstaff, $ticket;
$actions= array(
'closed' => array(
'icon' => 'icon-repeat',
'action' => 'close'
'action' => 'close',
'href' => 'tickets.php'
),
'resolved' => array(
'icon' => 'icon-ok-circle',
'action' => 'resolve'
'action' => 'resolve',
'href' => 'tickets.php'
),
'open' => array(
'icon' => 'icon-undo',
......@@ -49,7 +51,14 @@ $actions= array(
echo sprintf('#%s/status/%s/%d',
$ticket ? ('tickets/'.$ticket->getId()) : 'tickets',
$actions[$status->getState()]['action'],
$status->getId()); ?>"><i class=" aaa <?php
$status->getId()); ?>"
<?php
if (isset($actions[$status->getState()]['href']))
echo sprintf('data-href="%s"',
$actions[$status->getState()]['href']);
?>
><i class="<?php
echo $actions[$status->getState()]['icon'] ?: 'icon-tag';
?>"></i> <?php
echo __($status->getName()); ?></a>
......
......@@ -80,7 +80,7 @@ $action = $info['action'] ?: ('#tickets/status/'. $state);
<tr>
<td colspan="2">
<?php
$placeholder = __('Optional reason for status change (internal note)');
$placeholder = $info['placeholder'] ?: __('Optional reason for status change (internal note)');
?>
<textarea name="comments" id="comments"
cols="50" rows="3" wrap="soft" style="width:100%"
......
......@@ -141,9 +141,9 @@ $dispatcher = patterns('',
url_post('^(?P<tid>\d+)/forms/manage$', 'updateForms'),
url_get('^(?P<tid>\d+)/canned-resp/(?P<cid>\w+).(?P<format>json|txt)', 'cannedResponse'),
url_get('^(?P<tid>\d+)/status/(?P<status>\w+)(?:/(?P<sid>\d+))?$', 'changeTicketStatus'),
url_post('^(?P<tid>\d+)/status/(?P<status>\w+)$', 'setTicketStatus'),
url_get('^status/(?P<status>\w+)(?:/(?P<sid>\d+))?$', 'changeTicketsStatus'),
url_post('^status/(?P<state>\w+)$', 'setTicketsStatus'),
url_post('^(?P<tid>\d+)/status$', 'setTicketStatus'),
url_get('^status/(?P<status>\w+)(?:/(?P<sid>\d+))?$', 'changeSelectedTicketsStatus'),
url_post('^status/(?P<state>\w+)$', 'setSelectedTicketsStatus'),
url_get('^lookup', 'lookup'),
url_get('^search', 'search')
)),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment