help.verua.ch/help_FR/include/staff/templates/queue-tickets.tmpl.php
2026-01-05 08:46:20 +01:00

314 lines
11 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// Calling convention (assumed global scope):
// $tickets - <QuerySet> with all columns and annotations necessary to
// render the full page
// Impose visibility constraints
// ------------------------------------------------------------
//filter if limited visibility or if unlimited visibility and in a queue
$ignoreVisibility = $queue->ignoreVisibilityConstraints($thisstaff);
if (!$ignoreVisibility || //limited visibility
($ignoreVisibility && ($queue->isAQueue() || $queue->isASubQueue())) //unlimited visibility + not a search
)
$tickets->filter($thisstaff->getTicketsVisibility());
// do not show children tickets unless agent is doing a search
if ($queue->isAQueue() || $queue->isASubQueue())
$tickets->filter(Q::any(
array('ticket_pid' => null, 'flags__hasbit' => TICKET::FLAG_LINKED)));
// Make sure the cdata materialized view is available
TicketForm::ensureDynamicDataView();
// Identify columns of output
$columns = $queue->getColumns();
// Figure out REFRESH url — which might not be accurate after posting a
// response
list($path,) = explode('?', $_SERVER['REQUEST_URI'], 2);
$args = array();
parse_str($_SERVER['QUERY_STRING'], $args);
// Remove commands from query
unset($args['id']);
if ($args['a'] !== 'search') unset($args['a']);
$refresh_url = $path . '?' . http_build_query($args);
// Establish the selected or default sorting mechanism
if (isset($_GET['sort']) && is_numeric($_GET['sort'])) {
$sort = $_SESSION['sort'][$queue->getId()] = array(
'col' => (int) $_GET['sort'],
'dir' => (int) $_GET['dir'],
);
}
elseif (isset($_GET['sort'])
// Drop the leading `qs-`
&& (strpos($_GET['sort'], 'qs-') === 0)
&& ($sort_id = substr($_GET['sort'], 3))
&& is_numeric($sort_id)
&& ($sort = QueueSort::lookup($sort_id))
) {
$sort = $_SESSION['sort'][$queue->getId()] = array(
'queuesort' => $sort,
'dir' => (int) $_GET['dir'],
);
}
elseif (isset($_SESSION['sort'][$queue->getId()])) {
$sort = $_SESSION['sort'][$queue->getId()];
}
elseif ($queue_sort = $queue->getDefaultSort()) {
$sort = $_SESSION['sort'][$queue->getId()] = array(
'queuesort' => $queue_sort,
'dir' => (int) $_GET['dir'] ?: 0,
);
}
// Handle current sorting preferences
$sorted = false;
foreach ($columns as $C) {
// Sort by this column ?
if (isset($sort['col']) && $sort['col'] == $C->id) {
$tickets = $C->applySort($tickets, $sort['dir']);
$sorted = true;
}
}
// Apply queue sort if it's not already sorted by a column
if (!$sorted) {
// Apply queue sort-dropdown selected preference
if (isset($sort['queuesort']))
$sort['queuesort']->applySort($tickets, $sort['dir']);
else // otherwise sort by created DESC
$tickets->order_by('-created');
}
// Apply pagination
$page = ($_GET['p'] && is_numeric($_GET['p']))?$_GET['p']:1;
$pageNav = new Pagenate(PHP_INT_MAX, $page, PAGE_LIMIT);
$tickets = $pageNav->paginateSimple($tickets);
if (isset($tickets->extra['tables'])) {
// Creative twist here. Create a new query copying the query criteria, sort, limit,
// and offset. Then join this new query to the $tickets query and clear the
// criteria, sort, limit, and offset from the outer query.
$criteria = clone $tickets;
$criteria->limit(500);
$criteria->annotations = $criteria->related = $criteria->aggregated =
$criteria->annotations = $criteria->ordering = [];
$tickets->constraints = $tickets->extra = [];
$criteria->extra(array('select' => array('relevance' => 'Z1.relevance')));
$tickets = $tickets->filter(['ticket_id__in' =>
$criteria->values_flat('ticket_id')]);
$tickets->order_by(new SqlCode('relevance'), QuerySet::DESC);
# Index hint should be used on the $criteria query only
$tickets->clearOption(QuerySet::OPT_INDEX_HINT);
}
$tickets->distinct('ticket_id');
$Q = $queue->getBasicQuery();
if ($Q->constraints) {
if (count($Q->constraints) > 1) {
foreach ($Q->constraints as $value) {
if (!$value->constraints)
$empty = true;
}
}
}
if (($Q->extra && isset($Q->extra['tables'])) || !$Q->constraints || $empty) {
$skipCount = true;
$count = '-';
}
$count = $count ?: $queue->getCount($thisstaff);
$pageNav->setTotal($count, true);
$pageNav->setURL('tickets.php', $args);
?>
<!-- SEARCH FORM START -->
<div id='basic_search'>
<div class="pull-right" style="height:25px">
<span class="valign-helper"></span>
<?php
require 'queue-quickfilter.tmpl.php';
if ($queue->getSortOptions())
require 'queue-sort.tmpl.php';
?>
</div>
<form action="tickets.php" method="get" onsubmit="javascript:
$.pjax({
url:$(this).attr('action') + '?' + $(this).serialize(),
container:'#pjax-container',
timeout: 2000
});
return false;">
<input type="hidden" name="a" value="search">
<input type="hidden" name="search-type" value=""/>
<div class="attached input">
<input type="text" class="basic-search" data-url="ajax.php/tickets/lookup" name="query"
autofocus size="30" value="<?php echo Format::htmlchars($_REQUEST['query'], true); ?>"
autocomplete="off" autocorrect="off" autocapitalize="off">
<button type="submit" class="attached button"><i class="icon-search"></i>
</button>
</div>
<a href="#" onclick="javascript:
$.dialog('ajax.php/tickets/search', 201);"
>[<?php echo __('advanced'); ?>]</a>
<i class="help-tip icon-question-sign" href="#advanced"></i>
</form>
</div>
<!-- SEARCH FORM END -->
<div class="clear"></div>
<div style="margin-bottom:20px; padding-top:5px;">
<div class="sticky bar opaque">
<div class="content">
<div class="pull-left flush-left">
<h2><a href="<?php echo $refresh_url; ?>"
title="<?php echo __('Refresh'); ?>"><i class="icon-refresh"></i> <?php echo
$queue->getName(); ?></a>
<?php
if (($crit=$queue->getSupplementalCriteria()))
echo sprintf('<i class="icon-filter"
data-placement="bottom" data-toggle="tooltip"
title="%s"></i>&nbsp;',
Format::htmlchars($queue->describeCriteria($crit)));
?>
</h2>
</div>
<div class="configureQ">
<i class="icon-cog"></i>
<div class="noclick-dropdown anchor-left">
<ul>
<li>
<a class="no-pjax" href="#"
data-dialog="ajax.php/tickets/search/<?php echo
urlencode($queue->getId()); ?>"><i
class="icon-fixed-width icon-pencil"></i>
<?php echo __('Edit'); ?></a>
</li>
<li>
<a class="no-pjax" href="#"
data-dialog="ajax.php/tickets/search/create?pid=<?php
echo $queue->getId(); ?>"><i
class="icon-fixed-width icon-plus-sign"></i>
<?php echo __('Add Sub Queue'); ?></a>
</li>
<?php
if ($queue->id > 0 && $queue->isOwner($thisstaff)) { ?>
<li class="danger">
<a class="no-pjax confirm-action" href="#"
data-dialog="ajax.php/queue/<?php
echo $queue->id; ?>/delete"><i
class="icon-fixed-width icon-trash"></i>
<?php echo __('Delete'); ?></a>
</li>
<?php } ?>
</ul>
</div>
</div>
<div class="pull-right flush-right">
<?php
// TODO: Respect queue root and corresponding actions
if ($count) {
Ticket::agentActions($thisstaff, array('status' => $status));
}?>
</div>
</div>
</div>
</div>
<div class="clear"></div>
<form action="?" method="POST" name='tickets' id="tickets">
<?php csrf_token(); ?>
<input type="hidden" name="a" value="mass_process" >
<input type="hidden" name="do" id="action" value="" >
<table class="list queue tickets" border="0" cellspacing="1" cellpadding="2" width="940">
<thead>
<tr>
<?php
$canManageTickets = $thisstaff->canManageTickets();
if ($canManageTickets) { ?>
<th style="width:12px"></th>
<?php
}
foreach ($columns as $C) {
$heading = Format::htmlchars($C->getLocalHeading());
if ($C->isSortable()) {
$args = $_GET;
$dir = $sort['col'] != $C->id ?: ($sort['dir'] ? 'desc' : 'asc');
$args['dir'] = $sort['col'] != $C->id ?: (int) !$sort['dir'];
$args['sort'] = $C->id;
$heading = sprintf('<a href="?%s" class="%s">%s</a>',
Http::build_query($args), $dir, $heading);
}
echo sprintf('<th width="%s" data-id="%d">%s</th>',
$C->getWidth(), $C->id, $heading);
}
?>
</tr>
</thead>
<tbody>
<?php
foreach ($tickets as $T) {
echo '<tr>';
if ($canManageTickets) { ?>
<td><input type="checkbox" class="ckb" name="tids[]"
value="<?php echo $T['ticket_id']; ?>" /></td>
<?php
}
foreach ($columns as $C) {
list($contents, $styles) = $C->render($T);
if ($style = $styles ? 'style="'.$styles.'"' : '') {
echo "<td $style><div $style>$contents</div></td>";
}
else {
echo "<td>$contents</td>";
}
}
echo '</tr>';
}
?>
</tbody>
<tfoot>
<tr>
<td colspan="<?php echo count($columns)+1; ?>">
<?php if ($count && $canManageTickets) {
echo __('Select');?>:&nbsp;
<a id="selectAll" href="#ckb"><?php echo __('All');?></a>&nbsp;&nbsp;
<a id="selectNone" href="#ckb"><?php echo __('None');?></a>&nbsp;&nbsp;
<a id="selectToggle" href="#ckb"><?php echo __('Toggle');?></a>&nbsp;&nbsp;
<?php }else{
echo '<i>';
echo $ferror?Format::htmlchars($ferror):__('Query returned 0 results.');
echo '</i>';
} ?>
</td>
</tr>
</tfoot>
</table>
<?php
if ($count > 0 || $skipCount) { //if we actually had any tickets returned.
?> <div>
<span class="faded pull-right"><?php echo $pageNav->showing(); ?></span>
<?php
echo __('Page').':'.$pageNav->getPageLinks().'&nbsp;';
?>
<a href="#tickets/export/<?php echo $queue->getId(); ?>"
id="queue-export" class="no-pjax export"
><?php echo __('Export'); ?></a>
<i class="help-tip icon-question-sign" href="#export"></i>
</div>
<?php
} ?>
</form>