You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
8.8 KiB
277 lines
8.8 KiB
<?php
|
|
/*********************************************************************
|
|
ajax.thread.php
|
|
|
|
AJAX interface for thread
|
|
|
|
Peter Rotich <peter@osticket.com>
|
|
Copyright (c) 2015 osTicket
|
|
http://www.osticket.com
|
|
|
|
Released under the GNU General Public License WITHOUT ANY WARRANTY.
|
|
See LICENSE.TXT for details.
|
|
|
|
vim: expandtab sw=4 ts=4 sts=4:
|
|
**********************************************************************/
|
|
|
|
if(!defined('INCLUDE_DIR')) die('403');
|
|
|
|
include_once(INCLUDE_DIR.'class.ticket.php');
|
|
require_once(INCLUDE_DIR.'class.ajax.php');
|
|
require_once(INCLUDE_DIR.'class.note.php');
|
|
include_once INCLUDE_DIR . 'class.thread_actions.php';
|
|
|
|
class ThreadAjaxAPI extends AjaxController {
|
|
|
|
function lookup() {
|
|
global $thisstaff;
|
|
|
|
if(!is_numeric($_REQUEST['q']))
|
|
return self::lookupByEmail();
|
|
|
|
|
|
$limit = isset($_REQUEST['limit']) ? (int) $_REQUEST['limit']:25;
|
|
$tickets=array();
|
|
|
|
$visibility = $thisstaff->getTicketsVisibility();
|
|
$hits = Ticket::objects()
|
|
->filter(Q::any(array(
|
|
'number__startswith' => $_REQUEST['q'],
|
|
)))
|
|
->filter($visibility)
|
|
->values('number', 'user__emails__address')
|
|
->annotate(array('tickets' => SqlAggregate::COUNT('ticket_id')))
|
|
->order_by('-created')
|
|
->limit($limit);
|
|
|
|
foreach ($hits as $T) {
|
|
$tickets[] = array('id'=>$T['number'], 'value'=>$T['number'],
|
|
'info'=>"{$T['number']} — {$T['user__emails__address']}",
|
|
'matches'=>$_REQUEST['q']);
|
|
}
|
|
if (!$tickets)
|
|
return self::lookupByEmail();
|
|
|
|
return $this->json_encode($tickets);
|
|
}
|
|
|
|
|
|
function addRemoteCollaborator($tid, $type, $bk, $id) {
|
|
global $thisstaff;
|
|
|
|
if (!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(404, 'No such thread');
|
|
elseif (!$bk || !$id)
|
|
Http::response(422, 'Backend and user id required');
|
|
elseif (!($backend = StaffAuthenticationBackend::getBackend($bk)))
|
|
Http::response(404, 'User not found');
|
|
|
|
$user_info = $backend->lookup($id);
|
|
$form = UserForm::getUserForm()->getForm($user_info);
|
|
$info = array();
|
|
if (!$user_info)
|
|
$info['error'] = __('Unable to find user in directory');
|
|
|
|
return self::_addcollaborator($thread, null, $form, $type, $info);
|
|
}
|
|
|
|
//Collaborators utils
|
|
function addCollaborator($tid, $type=null, $uid=0) {
|
|
global $thisstaff;
|
|
|
|
if (!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !is_subclass_of($object, 'Threadable')
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(404, __('No such thread'));
|
|
|
|
$user = $uid? User::lookup($uid) : null;
|
|
|
|
//If not a post then assume new collaborator form
|
|
if(!$_POST)
|
|
return self::_addcollaborator($thread, $user, null, $type);
|
|
|
|
$user = $form = null;
|
|
if (isset($_POST['id']) && $_POST['id']) { //Existing user/
|
|
$user = User::lookup($_POST['id']);
|
|
} else { //We're creating a new user!
|
|
$form = UserForm::getUserForm()->getForm($_POST);
|
|
$user = User::fromForm($form);
|
|
}
|
|
|
|
$errors = $info = $vars = array();
|
|
if ($user && ($c=$object->addCollaborator($user, $vars, $errors))) {
|
|
$info = array('msg' => sprintf(__('%s added as a collaborator'),
|
|
Format::htmlchars($c->getName())));
|
|
return self::_collaborators($thread, $info);
|
|
}
|
|
|
|
if ($errors && $errors['err']) {
|
|
$info +=array('error' => $errors['err']);
|
|
} else {
|
|
$info +=array('error' =>__('Unable to add collaborator.').' '.__('Internal error occurred'));
|
|
}
|
|
|
|
return self::_addcollaborator($thread, $user, $form, $type, $info);
|
|
}
|
|
|
|
function updateCollaborator($tid, $cid) {
|
|
global $thisstaff;
|
|
|
|
if (!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(405, 'No such thread');
|
|
|
|
|
|
if (!($c=Collaborator::lookup(array(
|
|
'id' => $cid,
|
|
'thread_id' => $thread->getId())))
|
|
|| !($user=$c->getUser()))
|
|
Http::response(406, 'Unknown collaborator');
|
|
|
|
$errors = array();
|
|
if(!$user->updateInfo($_POST, $errors))
|
|
return self::_collaborator($c ,$user->getForms($_POST), $errors);
|
|
|
|
$info = array('msg' => sprintf('%s updated successfully',
|
|
Format::htmlchars($c->getName())));
|
|
|
|
return self::_collaborators($thread, $info);
|
|
}
|
|
|
|
function viewCollaborator($tid, $cid) {
|
|
global $thisstaff;
|
|
|
|
if (!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(404, 'No such thread');
|
|
|
|
|
|
if (!($collaborator=Collaborator::lookup(array(
|
|
'id' => $cid,
|
|
'thread_id' => $thread->getId()))))
|
|
Http::response(404, 'Unknown collaborator');
|
|
|
|
return self::_collaborator($collaborator);
|
|
}
|
|
|
|
function showCollaborators($tid) {
|
|
global $thisstaff;
|
|
|
|
if(!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(404, 'No such thread');
|
|
|
|
if ($thread->getCollaborators())
|
|
return self::_collaborators($thread);
|
|
|
|
return self::_addcollaborator($thread);
|
|
}
|
|
|
|
function previewCollaborators($tid, $manage=true) {
|
|
global $thisstaff;
|
|
|
|
if (!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(404, 'No such thread');
|
|
|
|
ob_start();
|
|
include STAFFINC_DIR . 'templates/collaborators-preview.tmpl.php';
|
|
$resp = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
return $resp;
|
|
}
|
|
|
|
function _addcollaborator($thread, $user=null, $form=null, $type=null, $info=array()) {
|
|
global $thisstaff;
|
|
|
|
$info += array(
|
|
'title' => __('Add a collaborator'),
|
|
'action' => sprintf('#thread/%d/add-collaborator/%s',
|
|
$thread->getId(), $type),
|
|
'onselect' => sprintf('ajax.php/thread/%d/add-collaborator/%s/',
|
|
$thread->getId(), $type),
|
|
);
|
|
|
|
ob_start();
|
|
include STAFFINC_DIR . 'templates/user-lookup.tmpl.php';
|
|
$resp = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
return $resp;
|
|
}
|
|
|
|
function updateCollaborators($tid) {
|
|
global $thisstaff;
|
|
|
|
if (!($thread=Thread::lookup($tid))
|
|
|| !($object=$thread->getObject())
|
|
|| !$object->checkStaffPerm($thisstaff))
|
|
Http::response(404, 'No such thread');
|
|
|
|
$errors = $info = array();
|
|
$thread->updateCollaborators($_POST, $errors);
|
|
|
|
if($errors && $errors['err'])
|
|
$info +=array('error' => $errors['err']);
|
|
|
|
return self::_collaborators($thread, $info);
|
|
}
|
|
|
|
|
|
|
|
function _collaborator($collaborator, $form=null, $info=array()) {
|
|
global $thisstaff;
|
|
|
|
$info += array('action' => sprintf('#thread/%d/collaborators/%d',
|
|
$collaborator->thread_id, $collaborator->getId()));
|
|
|
|
$user = $collaborator->getUser();
|
|
|
|
ob_start();
|
|
include(STAFFINC_DIR . 'templates/user.tmpl.php');
|
|
$resp = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
return $resp;
|
|
}
|
|
|
|
function _collaborators($thread, $info=array()) {
|
|
|
|
ob_start();
|
|
include(STAFFINC_DIR . 'templates/collaborators.tmpl.php');
|
|
$resp = ob_get_contents();
|
|
ob_end_clean();
|
|
|
|
return $resp;
|
|
}
|
|
|
|
function triggerThreadAction($ticket_id, $thread_id, $action) {
|
|
$thread = ThreadEntry::lookup($thread_id);
|
|
if (!$thread)
|
|
Http::response(404, 'No such ticket thread entry');
|
|
if ($thread->getThread()->getObjectId() != $ticket_id)
|
|
Http::response(404, 'No such ticket thread entry');
|
|
|
|
$valid = false;
|
|
foreach ($thread->getActions() as $group=>$list) {
|
|
foreach ($list as $name=>$A) {
|
|
if ($A->getId() == $action) {
|
|
$valid = true; break;
|
|
}
|
|
}
|
|
}
|
|
if (!$valid)
|
|
Http::response(400, 'Not a valid action for this thread');
|
|
|
|
$thread->triggerAction($action);
|
|
}
|
|
}
|
|
?>
|