#25 Dashboard columns can now be added/removed via JavaScript!

merge-requests/2/head
Mike Koch 10 years ago
parent 8cd7aebaae
commit 8398efa538

1
.gitignore vendored

@ -186,7 +186,6 @@ inc/mail/smtp.php
inc/pipe_functions.inc.php
inc/posting_functions.inc.php
inc/prepare_ticket_export.inc.php
inc/prepare_ticket_search.inc.php
inc/print_group.inc.php
inc/recaptcha/LICENSE
inc/recaptcha/index.htm

@ -65,8 +65,12 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
</tr>
<tr>
<td>
<h3 align="center"><?php echo $hesklang['tickets_found']; ?></h3>
<div class="row" style="padding-top: 20px">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">
<h4><?php echo $hesklang['tickets_found']; ?> <span style="float: right; margin-top: -7px;"><a href="new_ticket.php" class="btn btn-success"><?php echo $hesklang['nti']; ?></a></span></h4>
</div>
<?php
@ -237,8 +241,6 @@ if ($handle !== FALSE)
}
?>
<hr />
<?php
/* Clean unneeded session variables */

@ -0,0 +1,177 @@
<?php
/*******************************************************************************
* Title: Help Desk Software HESK
* Version: 2.5.5 from 5th August 2014
* Author: Klemen Stirn
* Website: http://www.hesk.com
********************************************************************************
* COPYRIGHT AND TRADEMARK NOTICE
* Copyright 2005-2014 Klemen Stirn. All Rights Reserved.
* HESK is a registered trademark of Klemen Stirn.
* The HESK may be used and modified free of charge by anyone
* AS LONG AS COPYRIGHT NOTICES AND ALL THE COMMENTS REMAIN INTACT.
* By using this code you agree to indemnify Klemen Stirn from any
* liability that might arise from it's use.
* Selling the code for this program, in part or full, without prior
* written consent is expressly forbidden.
* Using this code, in part or full, to create derivate work,
* new scripts or products is expressly forbidden. Obtain permission
* before redistributing this software over the Internet or in
* any other medium. In all cases copyright and header must remain intact.
* This Copyright is in full effect in any country that has International
* Trade Agreements with the United States of America or
* with the European Union.
* Removing any of the copyright notices without purchasing a license
* is expressly forbidden. To remove HESK copyright notice you must purchase
* a license for this script. For more information on how to obtain
* a license please visit the page below:
* https://www.hesk.com/buy.php
*******************************************************************************/
/* Check if this is a valid include */
if (!defined('IN_SCRIPT')) {die('Invalid attempt');}
$tmp = intval( hesk_GET('limit') );
$maxresults = ($tmp > 0) ? $tmp : $hesk_settings['max_listings'];
$tmp = intval( hesk_GET('page', 1) );
$page = ($tmp > 1) ? $tmp : 1;
/* Acceptable $sort values and default asc(1)/desc(0) setting */
$sort_possible = array(
'trackid' => 1,
'lastchange' => 0,
'name' => 1,
'subject' => 1,
'status' => 1,
'lastreplier' => 1,
'priority' => 1,
'category' => 1,
'dt' => 0,
'id' => 1,
'owner' => 1,
'custom1' => 1,
'custom2' => 1,
'custom3' => 1,
'custom4' => 1,
'custom5' => 1,
'custom6' => 1,
'custom7' => 1,
'custom8' => 1,
'custom9' => 1,
'custom10' => 1,
'custom11' => 1,
'custom12' => 1,
'custom13' => 1,
'custom14' => 1,
'custom15' => 1,
'custom16' => 1,
'custom17' => 1,
'custom18' => 1,
'custom19' => 1,
'custom20' => 1
);
/* These values should have collate appended in SQL */
$sort_collation = array(
'name',
'subject',
);
/* Acceptable $group values and default asc(1)/desc(0) setting */
$group_possible = array(
'owner' => 1,
'priority' => 1,
'category' => 1,
);
/* Start the order by part of the SQL query */
$sql .= " ORDER BY ";
/* Group tickets? Default: no */
if (isset($_GET['g']) && ! is_array($_GET['g']) && isset($group_possible[$_GET['g']]))
{
$group = hesk_input($_GET['g']);
if ($group == 'priority' && isset($_GET['sort']) && ! is_array($_GET['sort']) && $_GET['sort'] == 'priority')
{
// No need to group by priority if we are already sorting by priority
}
elseif ($group == 'owner')
{
// If group by owner place own tickets on top
$sql .= " CASE WHEN `owner` = '".intval($_SESSION['id'])."' THEN 1 ELSE 0 END DESC, `owner` ASC, ";
}
else
{
$sql .= ' `'.hesk_dbEscape($group).'` ';
$sql .= $group_possible[$group] ? 'ASC, ' : 'DESC, ';
}
}
else
{
$group = '';
}
/* Show critical tickets always on top? Default: yes */
$cot = (isset($_GET['cot']) && intval($_GET['cot']) == 1) ? 1 : 0;
if (!$cot)
{
$sql .= " CASE WHEN `priority` = '0' THEN 1 ELSE 0 END DESC , ";
}
/* Sort by which field? */
if (isset($_GET['sort']) && ! is_array($_GET['sort']) && isset($sort_possible[$_GET['sort']]))
{
$sort = hesk_input($_GET['sort']);
$sql .= $sort == 'lastreplier' ? " CASE WHEN `lastreplier` = '0' THEN 0 ELSE 1 END DESC, COALESCE(`replierid`, NULLIF(`lastreplier`, '0'), `name`) " : ' `'.hesk_dbEscape($sort).'` ';
// Need to set MySQL collation?
if ( in_array($_GET['sort'], $sort_collation) )
{
$sql .= " COLLATE '" . hesk_dbEscape($hesklang['_COLLATE']) . "' ";
}
}
else
{
/* Default sorting by ticket status */
$sql .= ' `status` ';
$sort = 'status';
}
/* Ascending or Descending? */
if (isset($_GET['asc']) && intval($_GET['asc'])==0)
{
$sql .= ' DESC ';
$asc = 0;
$asc_rev = 1;
$sort_possible[$sort] = 1;
}
else
{
$sql .= ' ASC ';
$asc = 1;
$asc_rev = 0;
if (!isset($_GET['asc']))
{
$is_default = 1;
}
$sort_possible[$sort] = 0;
}
/* In the end same results should always be sorted by priority */
if ($sort != 'priority')
{
$sql .= ' , `priority` ASC ';
}
# Uncomment for debugging purposes
# echo "SQL: $sql<br>";

@ -314,17 +314,32 @@ if ($total > 0)
$ticket['archive'] = !($ticket['archive']) ? $hesklang['no'] : $hesklang['yes'];
$ticket['message'] = $first_line . substr(strip_tags($ticket['message']),0,200).'...';
$ownerColumn = $ticket['owner'] != 0 ? $admins[$ticket['owner']] : '('.$hesklang['unas'].')';
$customFieldsHtml = '';
for ($i = 0; $i <= 20; $i++) {
if ($hesk_settings['custom_fields']['custom'.$i]['use']) {
$display = 'display: none';
if ((isset($_GET['sort']) && $_GET['sort'] == 'custom'.$i) || (isset($_GET['what']) && $_GET['what'] == 'custom'.$i)) {
$display = '';
}
$customFieldsHtml .= '<td style="'.$display.'" class="column_columnCustom'.$i.'">'.$ticket['custom'.$i].'</td>';
}
}
echo <<<EOC
<tr class="$color" id="$ticket[id]" title="$ticket[message]">
<td><input type="checkbox" id="check$ticket[id]" name="id[]" value="$ticket[id]" />&nbsp;</td>
<td><a href="admin_ticket.php?track=$ticket[trackid]&amp;Refresh=$random">$ticket[trackid]</a></td>
<td>$ticket[lastchange]</td>
<td>$ticket[name]</td>
<td>$tagged$owner<a href="admin_ticket.php?track=$ticket[trackid]&amp;Refresh=$random">$ticket[subject]</a></td>
<td>$ticket[status]&nbsp;</td>
<td>$ticket[repliername]</td>
<td>$ticket[priority]&nbsp;</td>
<td class="column_trackID"><a href="admin_ticket.php?track=$ticket[trackid]&amp;Refresh=$random">$ticket[trackid]</a></td>
<td class="column_last_update">$ticket[lastchange]</td>
<td class="column_name">$ticket[name]</td>
<td class="column_subject">$tagged$owner<a href="admin_ticket.php?track=$ticket[trackid]&amp;Refresh=$random">$ticket[subject]</a></td>
<td class="column_status">$ticket[status]&nbsp;</td>
<td class="column_lastreplier">$ticket[repliername]</td>
<td class="column_priority">$ticket[priority]</td>
<td class="column_owner" style="display: none">$ownerColumn</td>
$customFieldsHtml
</tr>
EOC;
@ -334,9 +349,98 @@ EOC;
</div>
&nbsp;<br />
<?php
$columnOneCheckboxes = array();
$columnTwoCheckboxes = array();
$columnThreeCheckboxes = array();
$currentColumn = 3;
for ($i = 1; $i <= 20; $i++) {
if ($hesk_settings['custom_fields']['custom'.$i]['use']) {
if ($currentColumn == 1) {
array_push($columnOneCheckboxes, $i);
$currentColumn = 2;
} elseif ($currentColumn == 2) {
array_push($columnTwoCheckboxes, $i);
$currentColumn = 3;
} else {
array_push($columnThreeCheckboxes, $i);
$currentColumn = 1;
}
}
}
?>
<table border="0" width="100%">
<tr>
<td width="50%" style="vertical-align:top">
<h6 id="showFiltersText" style="font-weight: bold"><a href="javascript:void(0)" onclick="toggleFilterCheckboxes(true)"><?php echo $hesklang['show_filters']; ?></a></h6>
<h6 id="hideFiltersText" style="font-weight: bold; display: none"><a href="javascript:void(0)" onclick="toggleFilterCheckboxes(false)"><?php echo $hesklang['hide_filters']; ?></a></h6>
<div id="filterCheckboxes" style="display: none" class="row">
<div class="col-md-4 col-sm-12">
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_trackID')" checked> <?php echo $hesklang['trackID']; ?>
</div><br>
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_subject')" checked> <?php echo $hesklang['subject']; ?>
</div><br>
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_priority')" checked> <?php echo $hesklang['priority']; ?>
</div>
<?php
foreach ($columnOneCheckboxes as $i) {
$checked = '';
if ((isset($_GET['sort']) && $_GET['sort'] == 'custom'.$i) || (isset($_GET['what']) && $_GET['what'] == 'custom'.$i)) {
$checked = 'checked';
}
echo '<br><div class="checkbox">
<input type="checkbox" onclick="toggleColumn(\'column_columnCustom'.$i.'\')" '.$checked.'>
'.$hesk_settings['custom_fields']['custom'.$i]['name'].'</div>';
}
?>
</div>
<div class="col-md-4 col-sm-12">
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_last_update')" checked> <?php echo $hesklang['last_update']; ?>
</div><br>
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_status')" checked> <?php echo $hesklang['status']; ?>
</div><br>
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_owner')"> <?php echo $hesklang['owner']; ?>
</div>
<?php
foreach ($columnTwoCheckboxes as $i) {
$checked = '';
if ((isset($_GET['sort']) && $_GET['sort'] == 'custom'.$i) || (isset($_GET['what']) && $_GET['what'] == 'custom'.$i)) {
$checked = 'checked';
}
echo '<br><div class="checkbox">
<input type="checkbox" onclick="toggleColumn(\'column_columnCustom'.$i.'\')" '.$checked.'>
'.$hesk_settings['custom_fields']['custom'.$i]['name'].'</div>';
}
?>
</div>
<div class="col-md-4 col-sm-12">
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_name')" checked> <?php echo $hesklang['name']; ?>
</div><br>
<div class="checkbox">
<input type="checkbox" onclick="toggleColumn('column_lastreplier')" checked> <?php echo $hesklang['last_replier']; ?>
</div>
<?php
foreach ($columnThreeCheckboxes as $i) {
$checked = '';
if ((isset($_GET['sort']) && $_GET['sort'] == 'custom'.$i) || (isset($_GET['what']) && $_GET['what'] == 'custom'.$i)) {
$checked = 'checked';
}
echo '<br><div class="checkbox">
<input type="checkbox" onclick="toggleColumn(\'column_columnCustom'.$i.'\')" '.$checked.'>
'.$hesk_settings['custom_fields']['custom'.$i]['name'].'</div>';
}
?>
</div>
</div>
</td>
<td width="50%" style="text-align:right;vertical-align:top">
<select class="form-control" name="a">
<option value="close" selected="selected"><?php echo $hesklang['close_selected']; ?></option>
@ -399,20 +503,33 @@ else
function hesk_print_list_head()
{
global $href, $query, $sort_possible, $hesklang;
global $href, $query, $sort_possible, $hesklang, $hesk_settings;
?>
<div align="center">
<table id="ticket-table" class="table table-hover">
<thead>
<tr>
<th><input type="checkbox" id="checkall" name="checkall" value="2" onclick="hesk_changeAll(this)" /></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['trackid'] . '&amp;sort='; ?>trackid"><?php echo $hesklang['trackID']; ?></a></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['lastchange'] . '&amp;sort='; ?>lastchange"><?php echo $hesklang['last_update']; ?></a></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['name'] . '&amp;sort='; ?>name"><?php echo $hesklang['name']; ?></a></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['subject'] . '&amp;sort='; ?>subject"><?php echo $hesklang['subject']; ?></a></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['status'] . '&amp;sort='; ?>status"><?php echo $hesklang['status']; ?></a></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['lastreplier'] . '&amp;sort='; ?>lastreplier"><?php echo $hesklang['last_replier']; ?></a></th>
<th><a href="<?php echo $href . '?' . $query . $sort_possible['priority'] . '&amp;sort='; ?>priority"><i class="fa fa-sort-<?php echo (($sort_possible['priority']) ? 'asc' : 'desc'); ?>"></i></a></th>
<th class="column_trackID"><a href="<?php echo $href . '?' . $query . $sort_possible['trackid'] . '&amp;sort='; ?>trackid"><?php echo $hesklang['trackID']; ?></a></th>
<th class="column_last_update"><a href="<?php echo $href . '?' . $query . $sort_possible['lastchange'] . '&amp;sort='; ?>lastchange"><?php echo $hesklang['last_update']; ?></a></th>
<th class="column_name"><a href="<?php echo $href . '?' . $query . $sort_possible['name'] . '&amp;sort='; ?>name"><?php echo $hesklang['name']; ?></a></th>
<th class="column_subject"><a href="<?php echo $href . '?' . $query . $sort_possible['subject'] . '&amp;sort='; ?>subject"><?php echo $hesklang['subject']; ?></a></th>
<th class="column_status"><a href="<?php echo $href . '?' . $query . $sort_possible['status'] . '&amp;sort='; ?>status"><?php echo $hesklang['status']; ?></a></th>
<th class="column_lastreplier"><a href="<?php echo $href . '?' . $query . $sort_possible['lastreplier'] . '&amp;sort='; ?>lastreplier"><?php echo $hesklang['last_replier']; ?></a></th>
<th class="column_priority"><a href="<?php echo $href . '?' . $query . $sort_possible['priority'] . '&amp;sort='; ?>priority"><i class="fa fa-sort-<?php echo (($sort_possible['priority']) ? 'asc' : 'desc'); ?>"></i></a></th>
<!-- All other fields, hidden by default. -->
<th class="column_owner" style="display: none"><a href="<?php echo $href . '?' . $query . $sort_possible['priority'] . '&amp;sort='; ?>owner"><?php echo $hesklang['owner']; ?></a></th>
<?php
for ($i = 1; $i <= 20; $i++) {
if ($hesk_settings['custom_fields']['custom'.$i]['use']) {
$display = 'display: none';
if ((isset($_GET['sort']) && $_GET['sort'] == 'custom'.$i) || (isset($_GET['what']) && $_GET['what'] == 'custom'.$i)) {
$display = '';
}
echo '<th style="'.$display.'" class="column_columnCustom'.$i.'"><a href="'.$href . '?' . $query . $sort_possible['priority'] . '&amp;sort=custom'.$i.'">'.$hesk_settings['custom_fields']['custom'.$i]['name'].'</a></th>';
}
}
?>
</tr>
</thead>
<?php

@ -20,5 +20,24 @@ function toggleRow(id) {
}
}
function toggleColumn(className) {
if ($('.' + className).css('display') == 'none') {
$('.' + className).show();
} else {
$('.' + className).hide();
}
}
function toggleFilterCheckboxes(show) {
if (show) {
$('#filterCheckboxes').show();
$('#showFiltersText').hide();
$('#hideFiltersText').show();
} else {
$('#filterCheckboxes').hide();
$('#showFiltersText').show();
$('#hideFiltersText').hide();
}
}
jQuery(document).ready(loadJquery);

@ -21,6 +21,10 @@ $hesklang['_COLLATE']='utf8_unicode_ci';
// This is the email break line that will be used in email piping
$hesklang['EMAIL_HR']='------ Reply above this line ------';
// ADDED OR MODIFIED IN NuMods 1.2.5
$hesklang['show_filters'] = 'Show Column Filters';
$hesklang['hide_filters'] = 'Hide Column Filters';
// ADDED OR MODIFIED IN NuMods 1.2.2
$hesklang['changeLanguage'] = 'Change language to';

Loading…
Cancel
Save