Browse Source

RC1 changes

merge-requests/28/head
Mike Koch 5 years ago
parent
commit
e35dc66756
  1. 53
      admin/admin_settings.php
  2. 4
      admin/admin_settings_save.php
  3. 25
      admin/custom_fields.php
  4. 26
      admin/export.php
  5. 26
      admin/manage_knowledgebase.php
  6. 4
      admin/service_messages.php
  7. 4
      css/mods-for-hesk-new.css
  8. 50
      inc/admin_functions.inc.php
  9. 46
      inc/common.inc.php
  10. 4
      inc/custom_fields.inc.php
  11. 22
      language/en/text.php
  12. 11
      ticket.php

53
admin/admin_settings.php

@ -465,6 +465,31 @@ $modsForHesk_settings = mfh_getSettings();
?>
</td>
</tr>
<tr>
<td class="text-right">
/<?php echo $hesk_settings['cache_dir']; ?>
</td>
<?php
$attachmentsExist = is_dir(HESK_PATH . $hesk_settings['cache_dir']);
$attachmentsWritable = is_writable(HESK_PATH . $hesk_settings['cache_dir']);
$cellClass = $attachmentsExist && $attachmentsWritable ? 'success' : 'danger';
?>
<td class="pad-right-10 <?php echo $cellClass; ?>">
<?php
if ($attachmentsExist) {
echo '<span class="success">' . $hesklang['exists'] . '</span>, ';
if ($attachmentsWritable) {
$enable_use_attachments = 1;
echo '<span class="success">' . $hesklang['writable'] . '</span>';
} else {
echo '<span class="error">' . $hesklang['not_writable'] . '</span><br>' . $hesklang['e_cdir'];
}
} else {
echo '<span class="error">' . $hesklang['no_exists'] . '</span>, <span class="error">' . $hesklang['not_writable'] . '</span><br>' . $hesklang['e_cdir'];
}
?>
</td>
</tr>
</table>
</div>
</div>
@ -798,6 +823,20 @@ $modsForHesk_settings = mfh_getSettings();
value="<?php echo $hesk_settings['attach_dir']; ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_cache_dir"
class="col-sm-3 control-label"><?php echo $hesklang['cf']; ?> <a
href="Javascript:void(0)"
onclick="Javascript:hesk_window('<?php echo $help_folder; ?>helpdesk.html#77','400','500')"><i
class="fa fa-question-circle settingsquestionmark"></i></a></label>
<div class="col-sm-9">
<input type="text" class="form-control"
placeholder="<?php echo htmlspecialchars($hesklang['ticket_attach_dir']); ?>"
name="s_cache_dir" size="40" maxlength="255"
value="<?php echo $hesk_settings['cache_dir']; ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_max_listings"
class="col-sm-3 control-label"><?php echo $hesklang['max_listings']; ?> <a
@ -3676,8 +3715,8 @@ $modsForHesk_settings = mfh_getSettings();
global $hesk_settings;
// Do we have a cached version file?
if (file_exists(HESK_PATH . $hesk_settings['attach_dir'] . '/__latest.txt')) {
if (preg_match('/^(\d+)\|([\d.]+)+$/', @file_get_contents(HESK_PATH . $hesk_settings['attach_dir'] . '/__latest.txt'), $matches) && (time() - intval($matches[1])) < 3600) {
if (file_exists(HESK_PATH . $hesk_settings['cache_dir'] . '/__latest.txt')) {
if (preg_match('/^(\d+)\|([\d.]+)+$/', @file_get_contents(HESK_PATH . $hesk_settings['cache_dir'] . '/__latest.txt'), $matches) && (time() - intval($matches[1])) < 3600) {
return $matches[2];
}
}
@ -3710,7 +3749,7 @@ $modsForHesk_settings = mfh_getSettings();
{
global $hesk_settings;
@file_put_contents(HESK_PATH . $hesk_settings['attach_dir'] . '/__latest.txt', time() . '|' . $latest);
@file_put_contents(HESK_PATH . $hesk_settings['cache_dir'] . '/__latest.txt', time() . '|' . $latest);
return $latest;
@ -3736,8 +3775,8 @@ $modsForHesk_settings = mfh_getSettings();
global $hesk_settings;
// Do we have a cached version file?
if (file_exists(HESK_PATH . $hesk_settings['attach_dir'] . '/__latest-mfh.txt')) {
if (preg_match('/^(\d+)\|([\d.]+)+$/', @file_get_contents(HESK_PATH . $hesk_settings['attach_dir'] . '/__latest-mfh.txt'), $matches) && (time() - intval($matches[1])) < 3600) {
if (file_exists(HESK_PATH . $hesk_settings['cache_dir'] . '/__latest-mfh.txt')) {
if (preg_match('/^(\d+)\|([\d.]+)+$/', @file_get_contents(HESK_PATH . $hesk_settings['cache_dir'] . '/__latest-mfh.txt'), $matches) && (time() - intval($matches[1])) < 3600) {
return $matches[2];
}
}
@ -3769,7 +3808,7 @@ $modsForHesk_settings = mfh_getSettings();
{
global $hesk_settings;
@file_put_contents(HESK_PATH . $hesk_settings['attach_dir'] . '/__latest-mfh.txt', time() . '|' . $latest);
@file_put_contents(HESK_PATH . $hesk_settings['cache_dir'] . '/__latest-mfh.txt', time() . '|' . $latest);
return $latest;
@ -3832,7 +3871,7 @@ $modsForHesk_settings = mfh_getSettings();
}
/* Check if language file is for current version */
if (strpos($tmp, '$hesklang[\'rcheck\']') === false) {
if (strpos($tmp, '$hesklang[\'refresh_page\']') === false) {
$err .= " |----> WRONG VERSION (not " . $hesk_settings['hesk_version'] . ")\n";
}

4
admin/admin_settings_save.php

@ -122,6 +122,7 @@ if ( ! is_writable(HESK_PATH . $set['attach_dir']) )
}
*/
$set['cache_dir'] = isset($_POST['s_cache_dir']) && ! is_array($_POST['s_cache_dir']) ? preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['s_cache_dir']) : 'cache';
$set['max_listings'] = hesk_checkMinMax(intval(hesk_POST('s_max_listings')), 1, 999, 10);
$set['print_font_size'] = hesk_checkMinMax(intval(hesk_POST('s_print_font_size')), 1, 99, 12);
$set['autoclose'] = hesk_checkMinMax(intval(hesk_POST('s_autoclose')), 0, 999, 7);
@ -584,6 +585,7 @@ $hesk_settings[\'hesk_title\']=\'' . $set['hesk_title'] . '\';
$hesk_settings[\'hesk_url\']=\'' . $set['hesk_url'] . '\';
$hesk_settings[\'admin_dir\']=\'' . $set['admin_dir'] . '\';
$hesk_settings[\'attach_dir\']=\'' . $set['attach_dir'] . '\';
$hesk_settings[\'cache_dir\']=\'' . $set['cache_dir'] . '\';
$hesk_settings[\'max_listings\']=' . $set['max_listings'] . ';
$hesk_settings[\'print_font_size\']=' . $set['print_font_size'] . ';
$hesk_settings[\'autoclose\']=' . $set['autoclose'] . ';
@ -835,7 +837,7 @@ function hesk_getLanguagesArray($returnArray = 0)
$add = 0;
} elseif (!preg_match('/\$hesklang\[\'EMAIL_HR\'\]\=\'(.*)\'\;/', $tmp, $hr)) {
$add = 0;
} elseif (!preg_match('/\$hesklang\[\'rcheck\'\]/', $tmp)) {
} elseif (!preg_match('/\$hesklang\[\'refresh_page\'\]/', $tmp)) {
$add = 0;
}
} else {

25
admin/custom_fields.php

@ -884,7 +884,7 @@ function save_cf()
WHERE `id`={$id}");
// Clear cache
clear_cf_cache();
hesk_purge_cache('cf');
// Show success
$_SESSION['cford'] = $id;
@ -947,7 +947,7 @@ function order_cf()
update_cf_order();
// Clear cache
clear_cf_cache();
hesk_purge_cache('cf');
// Finish
header('Location: custom_fields.php');
@ -998,7 +998,7 @@ function remove_cf()
update_cf_order();
// Clear cache
clear_cf_cache();
hesk_purge_cache('cf');
// Delete custom field data from tickets
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `custom{$id}`=''");
@ -1308,26 +1308,9 @@ function new_cf()
update_cf_order();
// Clear cache
clear_cf_cache();
hesk_purge_cache('cf');
// Show success
hesk_process_messages($hesklang['cf_added'],'custom_fields.php','SUCCESS');
} // End new_cf()
function clear_cf_cache()
{
global $hesk_settings;
$cache_dir = dirname(dirname(__FILE__)).'/'.$hesk_settings['attach_dir'].'/cf/';
if (is_dir($cache_dir))
{
$files = preg_grep('/index\.htm$/', glob($cache_dir.'*', GLOB_NOSORT), PREG_GREP_INVERT);
array_walk($files, 'hesk_unlink');
}
return true;
} // END clear_cf_cache()

26
admin/export.php

@ -48,6 +48,13 @@ hesk_isLoggedIn();
hesk_checkPermission('can_export');
$modsForHesk_settings = mfh_getSettings();
// Just a delete file action?
$delete = hesk_GET('delete');
if (strlen($delete) && preg_match('/^hesk_export_[0-9_\-]+$/', $delete)) {
hesk_unlink(HESK_PATH.$hesk_settings['cache_dir'].'/'.$delete.'.zip');
hesk_process_messages($hesklang['fd'], 'export.php','SUCCESS');
}
// Set default values
define('CALENDAR', 1);
define('MAIN_PAGE', 1);
@ -317,7 +324,7 @@ if (isset($_GET['w'])) {
}
// This will be the export directory
$export_dir = HESK_PATH . $hesk_settings['attach_dir'] . '/export/';
$export_dir = HESK_PATH.$hesk_settings['cache_dir'].'/';
// This will be the name of the export and the XML file
$export_name = 'hesk_export_' . date('Y-m-d_H-i-s') . '_' . mt_rand(10000, 99999);
@ -331,12 +338,7 @@ if (isset($_GET['w'])) {
}
// Cleanup old files
$files = preg_grep('/index\.htm$/', glob($export_dir.'*', GLOB_NOSORT), PREG_GREP_INVERT);
if (is_array($files) && count($files)) {
foreach ($files as $file) {
hesk_unlink($file, 86400);
}
}
hesk_purge_cache('export', 86400);
} else {
hesk_error($hesklang['ede']);
}
@ -348,6 +350,7 @@ if (isset($_GET['w'])) {
}
// Start generating the report message and generating the export
$success_msg = '';
$flush_me = '<br /><br />';
$flush_me .= hesk_date() . " | {$hesklang['inite']} ";
@ -648,7 +651,10 @@ if (isset($_GET['w'])) {
// We're done!
$flush_me .= hesk_date() . " | {$hesklang['fZIP']}<br /><br />";
$flush_me .= '<a href="' . $save_to_zip . '">' . $hesklang['ch2d'] . "</a>\n";
// Success message
$success_msg .= $hesk_settings['debug_mode'] ? $flush_me : '<br /><br />';
$success_msg .= $hesklang['step1'] . ': <a href="' . $save_to_zip . '">' . $hesklang['ch2d'] . '</a><br /><br />' . $hesklang['step2'] . ': <a href="export.php?delete='.urlencode($export_name).'">' . $hesklang['dffs'] . '</a>';
} // No tickets exported, cleanup
else {
hesk_unlink($save_to);
@ -684,9 +690,9 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
hesk_handle_messages();
// If an export was generated, show the link to download
if (isset($flush_me)) {
if (isset($success_msg)) {
if ($tickets_exported > 0) {
hesk_show_success($flush_me);
hesk_show_success($success_msg);
} else {
hesk_show_notice($hesklang['n2ex']);
}

26
admin/manage_knowledgebase.php

@ -1140,8 +1140,8 @@ function save_article()
$content = hesk_getHTML( hesk_POST('content') );
// Clean the HTML code
require(HESK_PATH . 'inc/htmlpurifier/HTMLPurifier.php');
$purifier = new HeskHTMLPurifier();
require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php');
$purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']);
$content = $purifier->heskPurify($content);
}
else
@ -1404,11 +1404,6 @@ function edit_article()
require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
?>
</td>
</tr>
<tr>
<td>
<ol class="breadcrumb">
<li><a href="manage_knowledgebase.php"><?php echo $hesklang['kb']; ?></a></li>
<li><a href="manage_knowledgebase.php?a=manage_cat&amp;catid=<?php echo $catid; ?>"><?php echo $hesklang['kb_cat_man']; ?></a></li>
@ -1548,14 +1543,15 @@ function edit_article()
</div>
<?php endif; //End attachments ?>
<div class="form-group">
<input type="hidden" name="a" value="save_article" />
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="hidden" name="old_type" value="<?php echo $article['type']; ?>" />
<input type="hidden" name="old_catid" value="<?php echo $catid; ?>" />
<input type="hidden" name="token" value="<?php hesk_token_echo(); ?>" /><br>
<div class="btn-group">
<input type="hidden" name="a" value="save_article">
<input type="hidden" name="id" value="<?php echo $id; ?>">
<input type="hidden" name="old_type" value="<?php echo $article['type']; ?>">
<input type="hidden" name="old_catid" value="<?php echo $catid; ?>">
<input type="hidden" name="token" value="<?php hesk_token_echo(); ?>">
<div class="btn-group-vertical full-width">
<input type="submit" value="<?php echo $hesklang['kb_save']; ?>" class="btn btn-primary" />
<a class="btn btn-default" href="manage_knowledgebase.php?a=manage_cat&amp;catid=<?php echo $catid; ?>"><?php echo $hesklang['cancel']; ?></a>
<a class="btn btn-danger" href="manage_knowledgebase.php?a=remove_article&amp;id=<?php echo $article['id']; ?>&amp;token=<?php hesk_token_echo(); ?>" onclick="return hesk_confirmExecute('<?php echo hesk_makeJsString($hesklang['del_art']); ?>');"><?php echo $hesklang['del_kbaa']; ?></a>
</div>
</div>
</div>
@ -2015,8 +2011,8 @@ function new_article()
$content = hesk_getHTML( hesk_POST('content') );
// Clean the HTML code
require(HESK_PATH . 'inc/htmlpurifier/HTMLPurifier.php');
$purifier = new HeskHTMLPurifier();
require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php');
$purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']);
$content = $purifier->heskPurify($content);
}
else

4
admin/service_messages.php

@ -492,7 +492,7 @@ function save_sm()
// Clean the HTML code
require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php');
$purifier = new HeskHTMLPurifier();
$purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']);
$message = $purifier->heskPurify($message);
// Any errors?
@ -661,7 +661,7 @@ function new_sm()
// Clean the HTML code
require(HESK_PATH . 'inc/htmlpurifier/HeskHTMLPurifier.php');
$purifier = new HeskHTMLPurifier();
$purifier = new HeskHTMLPurifier($hesk_settings['cache_dir']);
$message = $purifier->heskPurify($message);
// Any errors?

4
css/mods-for-hesk-new.css

@ -172,4 +172,8 @@ button.dropdown-submit {
.timeline-header.header-info {
font-size: 14px !important;
}
.full-width {
width: 100%;
}

50
inc/admin_functions.inc.php

@ -709,3 +709,53 @@ function hesk_checkPermission($feature, $showerror = 1)
}
} // END hesk_checkPermission()
function hesk_purge_cache($type = '', $expire_after_seconds = 0)
{
global $hesk_settings;
$cache_dir = dirname(dirname(__FILE__)).'/'.$hesk_settings['cache_dir'].'/';
if ( ! is_dir($cache_dir))
{
return false;
}
switch ($type)
{
case 'export':
$files = glob($cache_dir.'hesk_export_*', GLOB_NOSORT);
break;
case 'status':
$files = glob($cache_dir.'status_*', GLOB_NOSORT);
break;
case 'cf':
$files = glob($cache_dir.'cf_*', GLOB_NOSORT);
break;
default:
hesk_rrmdir(trim($cache_dir, '/'), true);
return true;
}
if (is_array($files))
{
array_walk($files, 'hesk_unlink_callable', $expire_after_seconds);
}
return true;
} // END hesk_purge_cache()
function hesk_rrmdir($dir, $keep_top_level=false)
{
$files = $keep_top_level ? array_diff(scandir($dir), array('.','..','index.htm')) : array_diff(scandir($dir), array('.','..'));
foreach ($files as $file)
{
(is_dir("$dir/$file")) ? hesk_rrmdir("$dir/$file") : @unlink("$dir/$file");
}
return $keep_top_level ? true : @rmdir($dir);
} // END hesk_rrmdir()

46
inc/common.inc.php

@ -246,6 +246,12 @@ function hesk_unlink($file, $older_than = 0)
} // END hesk_unlink()
function hesk_unlink_callable($file, $key, $older_than=0)
{
return hesk_unlink($file, $older_than);
} // END hesk_unlink_callable()
function hesk_utf8_urldecode($in)
{
$in = preg_replace("/%u([0-9a-f]{3,4})/i", "&#x\\1;", urldecode($in));
@ -1726,9 +1732,43 @@ function hesk_check_maintenance($dodie = true)
<div class="alert alert-warning" style="margin: 20px">
<i class="fa fa-exclamation-triangle"></i>
<b><?php echo $hesklang['mm1']; ?></b><br/><br/>
<?php echo $hesklang['mm2']; ?><br/><br/>
<?php echo $hesklang['mm3']; ?>
<?php
// Has the help desk been installed yet?
if (
$hesk_settings['maintenance_mode'] == 0 &&
$hesk_settings['question_ans'] == 'PB6YM' &&
$hesk_settings['site_title'] == 'My Web site' &&
$hesk_settings['site_url'] == 'http://www.example.com' &&
$hesk_settings['webmaster_mail'] == 'support@example.com' &&
$hesk_settings['noreply_mail'] == 'support@example.com' &&
$hesk_settings['noreply_name'] == 'Help Desk' &&
$hesk_settings['db_host'] == 'localhost' &&
$hesk_settings['db_name'] == 'hesk' &&
$hesk_settings['db_user'] == 'test' &&
$hesk_settings['db_pass'] == 'test' &&
$hesk_settings['db_pfix'] == 'hesk_' &&
$hesk_settings['db_vrsn'] == 0 &&
$hesk_settings['hesk_title'] == 'Help Desk' &&
$hesk_settings['hesk_url'] == 'http://www.example.com/helpdesk'
)
{
echo "
<b>{$hesklang['hni1']}</b><br /><br />
{$hesklang['hni2']}<br /><br />
{$hesklang['hni3']}";
}
// Hesk appears to be installed, show a "Maintenance in progress" message
else
{
echo "
<b>{$hesklang['mm1']}</b><br /><br />
{$hesklang['mm2']}<br /><br />
{$hesklang['mm3']}";
}
?>
</div>
<?php
require_once(HESK_PATH . 'inc/footer.inc.php');

4
inc/custom_fields.inc.php

@ -38,8 +38,8 @@ function hesk_load_custom_fields($category=0, $use_cache=1)
global $hesk_settings, $hesklang;
// Do we have a cached version available
$cache_dir = dirname(dirname(__FILE__)).'/'.$hesk_settings['attach_dir'].'/cf/';
$cache_file = $cache_dir . sha1($hesk_settings['language']).'.cache.php';
$cache_dir = dirname(dirname(__FILE__)).'/'.$hesk_settings['cache_dir'].'/';
$cache_file = $cache_dir . 'cf_' . sha1($hesk_settings['language']).'.cache.php';
if ($use_cache && file_exists($cache_file))
{

22
language/en/text.php

@ -1400,7 +1400,6 @@ $hesklang['import']='You are importing a <i>private ticket</i> into a <i>public
$hesklang['tab_1']='General';
$hesklang['tab_2']='Help Desk';
$hesklang['tab_3']='Knowledgebase';
$hesklang['tab_4']='Custom Fields';
$hesklang['tab_5']='Misc';
$hesklang['disable']='Disable';
$hesklang['dat']='Date &amp; Time';
@ -1766,7 +1765,6 @@ $hesklang['mm3']='We apologize for the inconvenience and ask that you please try
$hesklang['mma1']='Maintenance mode is active!';
$hesklang['mma2']='Customers are not able to use the help desk.';
$hesklang['tools']='Tools';
$hesklang['banemail']='Banned Emails';
$hesklang['banemail_intro']='Prevent certain email addresses from submitting tickets to your help desk.';
$hesklang['no_banemails']='<i>No emails are being banned.</i>';
$hesklang['eperm']='Permanent email bans:';
@ -1786,7 +1784,6 @@ $hesklang['can_ban_emails']='Can ban emails';
$hesklang['can_unban_emails']='Can unban emails (enables Can ban emails)';
$hesklang['eisban']='This email address is banned.';
$hesklang['click_unban']='Click here to unban.';
$hesklang['banip']='Banned IPs';
$hesklang['banip_intro']='Visitors from banned IP addresses will not be able to view or submit tickets and login into the help desk.';
$hesklang['ipperm']='Permanent IP bans:';
$hesklang['iptemp']='Login failure bans:';
@ -2029,11 +2026,11 @@ $hesklang['clr_view']='Color preview on text';
$hesklang['cbc']='Changeable by customers';
$hesklang['ccc']='Can customers change this status?';
$hesklang['del_status']='Delete this status?';
$hesklang['ex_status']='Existing Statuses';
$hesklang['ex_status']='Existing statuses';
$hesklang['status_hesk']='Built-in Statuses (cannot be modified here)';
$hesklang['status_custom']='Custom Statuses';
$hesklang['status_custom_none']='No custom statuses. You can add them using the form above.';
$hesklang['status_save']='Save Status';
$hesklang['status_save']='Save status';
$hesklang['list_tkt_status']='List all tickets with this status';
$hesklang['new_status']='New custom status';
$hesklang['edit_status']='Edit custom status';
@ -2051,6 +2048,21 @@ $hesklang['frames2']='Prevent loading HESK in frames on third party domains';
$hesklang['numsub']='Submitted tickets'; // Will show how many tickets this user submitted
$hesklang['hidf']='Hidden inputs are not visible to customers on the Submit a ticket form (the value will still be visible on ticket details page if they are set as public). They behave as normal text fields for staff members.';
$hesklang['rcheck']='Do not select a default option';
$hesklang['refresh_page']='Refresh this page';
$hesklang['banemail']='Ban emails';
$hesklang['banip']='Ban IPs';
$hesklang['tab_4']='Custom fields';
$hesklang['del_kba']='Delete this article';
$hesklang['del_kbaa']='Permanently delete this article';
$hesklang['hni1']='HESK not installed yet?';
$hesklang['hni2']='It appears that this help desk has not been properly installed and configured yet.';
$hesklang['hni3']='To install HESK, follow <a href="docs/">Instructions in the documentation</a>';
$hesklang['cf']='Cache folder';
$hesklang['e_cdir']='Hesk will not be able to parse emails or cache results unless the cache folder exists and is writable.';
$hesklang['step1']='Step 1';
$hesklang['step2']='Step 2';
$hesklang['dffs']='When download completes, delete the file from server';
$hesklang['fd']='Export file deleted from server';
// DO NOT CHANGE BELOW
if (!defined('IN_SCRIPT')) die('PHP syntax OK!');

11
ticket.php

@ -259,9 +259,15 @@ if (!$show['show']) {
<div class="blankSpace"></div>
<div class="table-bordered">
<div class="row">
<div class="col-md-12">
<div class="col-md-10">
<h2><?php echo $ticket['subject']; ?></h2>
</div>
<div class="col-md-2 pull-right pad-down-20">
<a href="ticket.php?track=<?php echo $trackingID.$hesk_settings['e_query']; ?>">
<i class="fa fa-refresh"></i>
<?php echo $hesklang['refresh_page']; ?>
</a>
</div>
</div>
<div class="row">
<div class="col-md-3 col-sm-12">
@ -284,7 +290,8 @@ if (!$show['show']) {
echo '<a href="change_status.php?track=' . $trackingID . $hesk_settings['e_query'] . '&amp;s=3&amp;Refresh=' . $random . '&amp;token=' . hesk_token_echo(0) . '" title="' . $hesklang['close_action'] . '">' . $hesklang['close_action'] . '</a>';
}
}
?></p>
?>
</p>
</div>
</div>
<div class="row medLowPriority">

Loading…
Cancel
Save