diff --git a/.gitignore b/.gitignore index 05965a6e..bdfa288b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,8 @@ admin/admin_suggest_articles.php admin/archive.php admin/assign_owner.php -admin/delete_tickets.php admin/generate_spam_question.php admin/move_category.php -admin/options.php admin/priority.php admin/test_connection.php attachments/index.htm @@ -13,7 +11,6 @@ docs/docs_style.css docs/index.html docs/quick-guide.html docs/step-by-step-guide.html -download_attachment.php file_limits.php footer.txt header.txt @@ -149,7 +146,6 @@ img/tag_off.png img/unlock.png img/vertical.jpg img/view.png -inc/admin_functions.inc.php inc/assignment_search.inc.php inc/attachments.inc.php inc/calendar/img/cal.gif @@ -164,7 +160,6 @@ inc/calendar/tcal.js inc/calendar/tcal.php inc/database.inc.php inc/database_mysqli.inc.php -inc/email_functions.inc.php inc/footer.inc.php inc/index.htm inc/mail/email_parser.php @@ -183,10 +178,8 @@ inc/mail/sasl/ntlm_sasl_client.php inc/mail/sasl/plain_sasl_client.php inc/mail/sasl/sasl.php 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 @@ -199,52 +192,52 @@ inc/tabs/tabber-minimized.js inc/tabs/tabber.css inc/timer/hesk_timer.js inc/timer/index.htm -inc/tiny_mce/3.5.10/langs/en.js -inc/tiny_mce/3.5.10/license.txt -inc/tiny_mce/3.5.10/themes/advanced/about.htm -inc/tiny_mce/3.5.10/themes/advanced/anchor.htm -inc/tiny_mce/3.5.10/themes/advanced/charmap.htm -inc/tiny_mce/3.5.10/themes/advanced/color_picker.htm -inc/tiny_mce/3.5.10/themes/advanced/editor_template.js -inc/tiny_mce/3.5.10/themes/advanced/image.htm -inc/tiny_mce/3.5.10/themes/advanced/img/colorpicker.jpg -inc/tiny_mce/3.5.10/themes/advanced/img/flash.gif -inc/tiny_mce/3.5.10/themes/advanced/img/icons.gif -inc/tiny_mce/3.5.10/themes/advanced/img/iframe.gif -inc/tiny_mce/3.5.10/themes/advanced/img/pagebreak.gif -inc/tiny_mce/3.5.10/themes/advanced/img/quicktime.gif -inc/tiny_mce/3.5.10/themes/advanced/img/realmedia.gif -inc/tiny_mce/3.5.10/themes/advanced/img/shockwave.gif -inc/tiny_mce/3.5.10/themes/advanced/img/trans.gif -inc/tiny_mce/3.5.10/themes/advanced/img/video.gif -inc/tiny_mce/3.5.10/themes/advanced/img/windowsmedia.gif -inc/tiny_mce/3.5.10/themes/advanced/js/about.js -inc/tiny_mce/3.5.10/themes/advanced/js/anchor.js -inc/tiny_mce/3.5.10/themes/advanced/js/charmap.js -inc/tiny_mce/3.5.10/themes/advanced/js/color_picker.js -inc/tiny_mce/3.5.10/themes/advanced/js/image.js -inc/tiny_mce/3.5.10/themes/advanced/js/link.js -inc/tiny_mce/3.5.10/themes/advanced/js/source_editor.js -inc/tiny_mce/3.5.10/themes/advanced/langs/en.js -inc/tiny_mce/3.5.10/themes/advanced/langs/en_dlg.js -inc/tiny_mce/3.5.10/themes/advanced/link.htm -inc/tiny_mce/3.5.10/themes/advanced/shortcuts.htm -inc/tiny_mce/3.5.10/themes/advanced/skins/default/content.css -inc/tiny_mce/3.5.10/themes/advanced/skins/default/dialog.css -inc/tiny_mce/3.5.10/themes/advanced/skins/default/img/buttons.png -inc/tiny_mce/3.5.10/themes/advanced/skins/default/img/items.gif -inc/tiny_mce/3.5.10/themes/advanced/skins/default/img/menu_arrow.gif -inc/tiny_mce/3.5.10/themes/advanced/skins/default/img/menu_check.gif -inc/tiny_mce/3.5.10/themes/advanced/skins/default/img/progress.gif -inc/tiny_mce/3.5.10/themes/advanced/skins/default/img/tabs.gif -inc/tiny_mce/3.5.10/themes/advanced/skins/default/ui.css -inc/tiny_mce/3.5.10/themes/advanced/source_editor.htm -inc/tiny_mce/3.5.10/tiny_mce.js -inc/tiny_mce/3.5.10/tiny_mce_popup.js -inc/tiny_mce/3.5.10/utils/editable_selects.js -inc/tiny_mce/3.5.10/utils/form_utils.js -inc/tiny_mce/3.5.10/utils/mctabs.js -inc/tiny_mce/3.5.10/utils/validate.js +inc/tiny_mce/3.5.11/langs/en.js +inc/tiny_mce/3.5.11/license.txt +inc/tiny_mce/3.5.11/themes/advanced/about.htm +inc/tiny_mce/3.5.11/themes/advanced/anchor.htm +inc/tiny_mce/3.5.11/themes/advanced/charmap.htm +inc/tiny_mce/3.5.11/themes/advanced/color_picker.htm +inc/tiny_mce/3.5.11/themes/advanced/editor_template.js +inc/tiny_mce/3.5.11/themes/advanced/image.htm +inc/tiny_mce/3.5.11/themes/advanced/img/colorpicker.jpg +inc/tiny_mce/3.5.11/themes/advanced/img/flash.gif +inc/tiny_mce/3.5.11/themes/advanced/img/icons.gif +inc/tiny_mce/3.5.11/themes/advanced/img/iframe.gif +inc/tiny_mce/3.5.11/themes/advanced/img/pagebreak.gif +inc/tiny_mce/3.5.11/themes/advanced/img/quicktime.gif +inc/tiny_mce/3.5.11/themes/advanced/img/realmedia.gif +inc/tiny_mce/3.5.11/themes/advanced/img/shockwave.gif +inc/tiny_mce/3.5.11/themes/advanced/img/trans.gif +inc/tiny_mce/3.5.11/themes/advanced/img/video.gif +inc/tiny_mce/3.5.11/themes/advanced/img/windowsmedia.gif +inc/tiny_mce/3.5.11/themes/advanced/js/about.js +inc/tiny_mce/3.5.11/themes/advanced/js/anchor.js +inc/tiny_mce/3.5.11/themes/advanced/js/charmap.js +inc/tiny_mce/3.5.11/themes/advanced/js/color_picker.js +inc/tiny_mce/3.5.11/themes/advanced/js/image.js +inc/tiny_mce/3.5.11/themes/advanced/js/link.js +inc/tiny_mce/3.5.11/themes/advanced/js/source_editor.js +inc/tiny_mce/3.5.11/themes/advanced/langs/en.js +inc/tiny_mce/3.5.11/themes/advanced/langs/en_dlg.js +inc/tiny_mce/3.5.11/themes/advanced/link.htm +inc/tiny_mce/3.5.11/themes/advanced/shortcuts.htm +inc/tiny_mce/3.5.11/themes/advanced/skins/default/content.css +inc/tiny_mce/3.5.11/themes/advanced/skins/default/dialog.css +inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/buttons.png +inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/items.gif +inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/menu_arrow.gif +inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/menu_check.gif +inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/progress.gif +inc/tiny_mce/3.5.11/themes/advanced/skins/default/img/tabs.gif +inc/tiny_mce/3.5.11/themes/advanced/skins/default/ui.css +inc/tiny_mce/3.5.11/themes/advanced/source_editor.htm +inc/tiny_mce/3.5.11/tiny_mce.js +inc/tiny_mce/3.5.11/tiny_mce_popup.js +inc/tiny_mce/3.5.11/utils/editable_selects.js +inc/tiny_mce/3.5.11/utils/form_utils.js +inc/tiny_mce/3.5.11/utils/mctabs.js +inc/tiny_mce/3.5.11/utils/validate.js inc/treemenu/TreeMenu.php inc/treemenu/index.htm inc/users_online.inc.php @@ -256,7 +249,6 @@ install/update.php language/en/emails/category_moved.txt language/en/emails/forgot_ticket_id.txt language/en/emails/index.htm -language/en/emails/new_note.txt language/en/emails/new_pm.txt language/en/emails/new_reply_by_customer.txt language/en/emails/new_reply_by_staff.txt @@ -270,3 +262,5 @@ rate.php readme.html robots.txt .idea/ +attachments/__latest.txt +attachments diff --git a/README.md b/README.md index 23121fcf..c6e37e35 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,28 @@ -[![Analytics](https://ga-beacon.appspot.com/UA-49251479-1/hesk/README)](https://github.com/mkoch227/Hesk) +[![Stories in Ready](https://badge.waffle.io/mkoch227/Mods-For-Hesk.png?label=waffle:ready&title=Ready)](https://waffle.io/mkoch227/Mods-For-Hesk) +

Mods for HESK v1.6.1

-

NuMods v1.2.1

- -This branch contains all files modified from the base version of HESK to become NuMods, a set of modifications for HESK v2.x +Mods for HESK is a set of modifications for HESK v2.5.5, a free and popular helpdesk solution.

Features

-

Currently, the two major features of NuMods are:

Download

-You can download this tweak via two ways: +You can download Mods for HESK via two ways:
  1. Stable Releases: Releases that have a release tag associated with a commit are considered releases. You can click on "releases" on the top of the repo, and then click "zip" or "tar.gz" to download the repo at that stage.
  2. -
  3. Bleeding-edge Releases: You can also download the latest, bleeding-edge version of NuMods by simply clicking "download as zip" to the right of the repository. This will download an exact copy of this branch in its current state, which may be contain bugs/other issues. This is not recommended for a production use.
  4. +
  5. Bleeding-edge Releases: You can also download the latest, bleeding-edge version of Mods for HESK by simply clicking "download as zip" to the right of the repository. This will download an exact copy of this branch in its current state, which may be contain bugs/other issues. This is not recommended for a production use.

Installation

@@ -25,18 +30,18 @@ You can download this tweak via two ways:
  1. Download HESK from http://www.hesk.com/download.php.
  2. Extract the contents of HESK to a directory of your choice.
  3. -
  4. Download NuMods from one of the two methods described above.
  5. +
  6. Download Mods for HESK from one of the two methods described above.
  7. Copy and paste the contents of the zip/tar.gz bundle and overwrite any files in the original HESK 2.x folder.
  8. Upload the resulting folder to your webserver.
  9. -
  10. Go to the /install directory in your web browser and click on "Install/Update NuMods Installation"
  11. +
  12. Go to the /install directory in your web browser and click on "Install/Update Mods for HESK Installation"
-

Please consult the official HESK Documentation on how to install HESK, as it is the same for both HESK and NuMods.

+

Please consult the official HESK Documentation on how to install HESK, as it is the same for both HESK and Mods for HESK.

Languages

-

As of current, only English is a supported language, as there have been several language items that have been edited/created. If you want to translate NuMods to your own language, it is recommended to download the original HESK language file for your language, and then add/edit the lines listed under //Added or modified in HESK UI and //Added or modified in NuMods X.X.X (where X.X.X is a version number) for your language.

-

If you create a translation for NuMods, please submit it via a pull request or via the PHP Junkyards forum, where it will be committed to this branch.

+

As of current, only English is a supported language, as there have been several language items that have been edited/created. If you want to translate Mods for HESK to your own language, it is recommended to download the original HESK language file for your language, and then add/edit the lines listed under //Added or modified in Mods for HESK X.X.X (where X.X.X is a version number) for your language.

+

Mods for HESK translations are available at http://mods-for-hesk.mkochcs.com/download.php.

-

Browser Compability

+

Browser Compatibility

This list may be incomplete. Please leave a note on the PHP Junkyard forums for additional browser compatibility information.

-

There are no intentions of making NuMods compatible with Internet Explorer 6 or 7, or any browser that is 2 or more major revisions older than its latest version.

+

There are no intentions of making Mods for HESK compatible with Internet Explorer 6 or 7, or any browser that is 2 or more major revisions older than its latest version.

Versioning

-

NuMods will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered with the following format:

+

Mods for HESK will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered with the following format:

<major>.<minor>.<patch> @@ -63,6 +68,5 @@ You can download this tweak via two ways:

For more information on SemVer, please visit http://semver.org.

Credits

-

Mike Koch - Creator of NuMods

+

Mike Koch - Creator of Mods for HESK

Klemen Stirn - Creator of HESK

-

lupolo from PHPJunkyard Scripts - diligent bug reporting on the PHPJunkyard Scripts Forum

diff --git a/admin/admin_main.php b/admin/admin_main.php index 052a0f57..4b72cc43 100644 --- a/admin/admin_main.php +++ b/admin/admin_main.php @@ -1,7 +1,7 @@
-
+
-
 
-

'.$hesklang['open_tickets'].'

-
 
-
- '; +
+
+

'.$hesklang['open_tickets'].' '.$hesklang['nti'].'

+
'; // The rest of the panel will be printed by print_tickets.inc.php } /* Reset default settings? */ diff --git a/admin/admin_reply_ticket.php b/admin/admin_reply_ticket.php index b8e0f8eb..c4b11321 100644 --- a/admin/admin_reply_ticket.php +++ b/admin/admin_reply_ticket.php @@ -1,7 +1,7 @@ $ticket['subject'], 'message' => stripslashes($message), 'attachments' => $myattachments, -'dt' => hesk_date($ticket['dt']), -'lastchange' => hesk_date($ticket['lastchange']), +'dt' => hesk_date($ticket['dt'], true), +'lastchange' => hesk_date($ticket['lastchange'], true), ); // 2. Add custom fields to the array diff --git a/admin/admin_settings.php b/admin/admin_settings.php index ea8032b2..f9ebd8b2 100644 --- a/admin/admin_settings.php +++ b/admin/admin_settings.php @@ -1,7 +1,7 @@ install folder // Get all the required files and functions require(HESK_PATH . 'hesk_settings.inc.php'); -require(HESK_PATH . 'nuMods_settings.inc.php'); +require(HESK_PATH . 'modsForHesk_settings.inc.php'); // Save the default language for the settings page before choosing user's preferred one $hesk_settings['language_default'] = $hesk_settings['language']; @@ -56,7 +56,7 @@ hesk_dbConnect(); hesk_isLoggedIn(); // Check permissions for this feature -hesk_checkPermission('can_man_settings'); +hesk_checkPermission('can_manage_settings'); // Test languages function if (isset($_GET['test_languages'])) @@ -77,14 +77,14 @@ require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); // Print main manage users page require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); +// Get the current version of Mods for Hesk +$modsForHeskVersionRS = hesk_dbQuery("SELECT `Value` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."settings` WHERE `Key` = 'modsForHeskVersion'"); +$modsForHeskVersionArray = hesk_dbFetchAssoc($modsForHeskVersionRS); +$modsForHeskVersion = $modsForHeskVersionArray['Value']; + // Demo mode? Hide values of sensitive settings if ( defined('HESK_DEMO') ) { - $hesk_settings['db_host'] = $hesklang['hdemo']; - $hesk_settings['db_name'] = $hesklang['hdemo']; - $hesk_settings['db_user'] = $hesklang['hdemo']; - $hesk_settings['db_pass'] = $hesklang['hdemo']; - $hesk_settings['db_pfix'] = $hesklang['hdemo']; $hesk_settings['smtp_host_name'] = $hesklang['hdemo']; $hesk_settings['smtp_user'] = $hesklang['hdemo']; $hesk_settings['smtp_password'] = $hesklang['hdemo']; @@ -97,814 +97,771 @@ if ( defined('HESK_DEMO') ) ?> -
-
-
-
- -
-
- - - - - - - - - - - - - - - - -
- : - - - ' . $hesklang['hud'] . ' '; - } - elseif ($latest != -1) - { - // Is this a beta/dev version? - if ( strpos($hesk_settings['hesk_version'], 'beta') || strpos($hesk_settings['hesk_version'], 'dev') ) - { - echo ' ' . $hesklang['beta'] . ' '; ?> ' . $hesklang['hnw'] . ' '; ?> - - -
- : - - -
- : - - -
- /hesk_settings.inc.php - - '.$hesklang['exists'].', '.$hesklang['writable'].''; - } else { - echo ''.$hesklang['exists'].', '.$hesklang['not_writable'].'
'.$hesklang['e_settings']; - } - ?> -
- / - - '.$hesklang['exists'].', '; - if (is_writable(HESK_PATH . $hesk_settings['attach_dir'])) - { - $enable_use_attachments=1; - echo ''.$hesklang['writable'].''; - } - else - { - echo ''.$hesklang['not_writable'].'
'.$hesklang['e_attdir']; - } - } - else - { - echo ''.$hesklang['no_exists'].', '.$hesklang['not_writable'].'
'.$hesklang['e_attdir']; - } - ?> -
-
-
-
-
-
- =') && @ini_get('max_file_uploads') && @ini_get('max_file_uploads') < $hesk_settings['attachments']['max_number'] ) - { - hesk_show_notice($hesklang['fatte1']); - } - - // Check max attachment size - $tmp = @ini_get('upload_max_filesize'); - if ($tmp) - { - $last = strtoupper(substr($tmp,-1)); - - switch ($last) - { - case 'K': - $tmp = $tmp * 1024; - break; - case 'M': - $tmp = $tmp * 1048576; - break; - case 'G': - $tmp = $tmp * 1073741824; - break; - default: - $tmp = $tmp; - } - - if ($tmp < $hesk_settings['attachments']['max_size']) - { - hesk_show_notice($hesklang['fatte2']); - } - } - - // Check max post size - $tmp = @ini_get('post_max_size'); - if ($tmp) - { - $last = strtoupper(substr($tmp,-1)); - - switch ($last) - { - case 'K': - $tmp = $tmp * 1024; - break; - case 'M': - $tmp = $tmp * 1048576; - break; - case 'G': - $tmp = $tmp * 1073741824; - break; - default: - $tmp = $tmp; - } - - if ($tmp < ( $hesk_settings['attachments']['max_size'] * $hesk_settings['attachments']['max_number'] + 524288 ) ) - { - hesk_show_notice($hesklang['fatte3']); - } - } - } - - - $hesklang['err_custname'] = addslashes($hesklang['err_custname']); +
+
+
+
+
+ + + -
+ : + + + - - -

-
- -
- - - - -
- -
-
-
- -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
+ return i; + } + //--> + + +

+
+ + + + + + +
+ +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +   +
-
- -
- -
+
+
+ +
+
+
'; + ?>
+
-
-
-
- -
- -   - -
-
-
- -
-
-
'; - ?> -
+
+
+ +
+ +
+
- -
-
- -
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- +
+
+
+ + + -
-
-
- - - - - -
-
-
- - -
-
-
- -
- -
- -
+ + xmlHttp.send(params); + } + + +
+
+
+ + +
+
+
+ +
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
-
-
'; - ?> -
+
+
+ +
+
+
'; + ?>
-
- -
-
-
'; - ?> -
+
+
+ +
+
+
'; + ?>
- -
-
-
-
-
- -
-
    -
'; - ?> -
+
+ +
+
+
+
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
- -
-
- -
-
    -
'; - ?> -
+
+ +
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
- -
-
- -
- -
-
    -
    -
- '; - - ?> -
- -  
- - :
- - - -

-

+
-
+
+
-  
+
+ +
+ -
-  
+ echo ' +
    +
    +
+ '; - -
-  
+ ?> +
- -
    -
'; - ?> +  
-
+ :
-
-
-
-
- -
    -
'; ?> - -
-  
-
-
-
-  
+

+

-
-
-  
+
+ +  
+ + +
+  
+ + +
+  
+ + +
    +
'; + ?> + +
-
-
-
-
- -
- -
- +
+
+ +
+
    +
'; + ?> + +
+  
+
+ +
+
+  
+ +
+
+  
+
-
- -
- -
+
+
+
+
+ +
+ +
+
-
- -
-
- -
+
+
+ +
+ +
+
+
+ +
+
+
-
-
-
- -
- -
+
+
+
+
+ +
+ +
+ +
    +
+ -
    -
+   () + + + '.$hesklang['e_attach'].''; + } + ?> +
+
+
+ +
+ /> +
+
+
+ $hesklang['B'] . ' (' . $hesklang['bytes'] . ')', + 'kB' => $hesklang['kB'] . ' (' . $hesklang['kilobytes'] . ')', + 'MB' => $hesklang['MB'] . ' (' . $hesklang['megabytes'] . ')', + 'GB' => $hesklang['GB'] . ' (' . $hesklang['gigabytes'] . ')', + ); + $tmp = hesk_formatBytes($hesk_settings['attachments']['max_size'], 0); + list($size, $unit) = explode(' ', $tmp); + ?> + +
+ /> +
+
+ '.$hesklang['e_attach'].''; + if ($k == $unit) + { + echo ''; + } + else + { + echo ''; + } } - ?> -
+ ?> + />
+
+ +
+ +
+
+
+
- -
- /> + +
+
    +
'; + ?>
- $hesklang['B'] . ' (' . $hesklang['bytes'] . ')', - 'kB' => $hesklang['kB'] . ' (' . $hesklang['kilobytes'] . ')', - 'MB' => $hesklang['MB'] . ' (' . $hesklang['megabytes'] . ')', - 'GB' => $hesklang['GB'] . ' (' . $hesklang['gigabytes'] . ')', - ); - $tmp = hesk_formatBytes($hesk_settings['attachments']['max_size'], 0); - list($size, $unit) = explode(' ', $tmp); - ?> - -
- /> -
-
- + +
+
    +
'; + ?>
- -
- /> + +
+
    +
'; + ?>
- -
+
+ +
+
    +
'; + ?> +
+
+
+ +
+
    +
'; + ?> +
+
+
+ +
+
    +
'; + ?> +
+
+
+ +
+ -
-
- + echo ' +
    +
    +
+ '; + ?> +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+

+
+
+
+
+ +
+
+

+
+
+
+ +
+ +
+
+

+
+
+
+
+ +
+
+

+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + '; + } // End FOR + ?> +
+ +
+ +
+

+
+
+ + + '.$hesklang['opt'].' +
+
+ + + +
+
+
+ +
+ +
+
    +
'; + ?> + + + + + + + + + + + +
+
+
- -
-
    -
'; - ?> + +
+ />
- -
-
    -
'; - ?> + +
+ />
- -
-
    -
'; - ?> + +
+ />
- +
    -
'; - ?> +
    +
'; + ?>
- +
    -
'; +
    +
'; ?>
- -
-
    -
'; - ?> + +
+ autocomplete="off" />
- -
-
    -
    -
- '; - ?> + +
+ autocomplete="off" />
- -
- -
+
+ +
+
+ + + + + + + +
+ +
+
+ +
+ +
+
    +
'; + ?> +
+
+ +
+
+ +
+ +
+
    +
'; + ?> + + + + + +
+
+
- -
- + +
+ />
- +
- + />
- -
- + +
+
    +
'; + ?>
- -
- -
-
-

+ +
+
+
'; + ?>
-
- -
-
-

+ +
+ autocomplete="off" />
- -
- -
-
-

+ +
+ autocomplete="off" />
-
- -
-
-

+
+
-
- - -
-
- - +
+ + + + - - - - - - + + +
 
- + + + + + +
- - -
-
+
- + +
+ +
+ +
+
+
+ +
+ +
+
+

+
+
+ +
+
+
- +
    -
'; - ?> - - - - - - - - - - - +
    +
'; + ?>
-
+
- +
- /> +
-
- -
- /> -
+ + + + + +
+
+
+
+ +
+ +
+
+ +
-
- -
- /> -
+
+
+ +
+
+ +
-
- -
+
+
+ +
+
    -
'; + if ($modsForHesk_settings['customer_email_verification_required']) + { ?> -
-
-
- -
+ +
    -
'; - ?> -
-
-
- -
- autocomplete="off" /> -
-
-
- -
- autocomplete="off" /> -
-
-
-
- -
-
- - - - - - - -
- -
-
- -
- -
-
    -
'; - ?> + ?> +
- -
-
-
- -
-
    -
'; - ?> - - - - - - -
-
-
-
- -
- /> -
-
-
- -
- /> -
-
-
- -
-
    -
'; - ?> -
-
-
- -
-
-
'; - ?> -
-
-
- -
- autocomplete="off" /> -
-
-
- -
- autocomplete="off" /> -
-
-
-
- + +
+
+
- - - - - - - - - -
 
- - - +
+ +
+
+ +
+
+
- - - -
- -
-
- -
- -
- -
-
-
- -
- -
-
-

-
-
- -
-
- -
- -
-
    -
'; - ?> -
-
-
-
- -
- -
-
- - - - - -
-
-
-
- -
- -
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
- -
-
-
-
- -
-
- -
-
+ +
+
+
+
+
+
-
- - -
-
-
- -
- -
-

'.$server_time.'' ; ?>

- +
+

-
-
-
- -
-
-

-
+
+
+
-
-
- -
-
-

-
+
+

-
- -
-
    -
'; - ?> -
+
+
+ +
+
    +
'; + ?>
-
- -
- -
+
+
+ +
+
- -
-
- -
- -
-
- -
+
+ +
+
+ +
+ +
+
+
-
- -
-
- -
-
+
+
+ +
+
+ +
-
- -
-
- -
-
-
- +
+
+ +
+
+
-
- -
-
- -
-
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
-
-
-
- -
- - - - - - - - - - - - - fetch_assoc()) +
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+ +
+
+
+ + +
+
+
+ +
+
+ + + + + + + + + + + + fetch_assoc()) + { + $checkedEcho = ($row['IsClosed'] == 1) ? 'checked="checked"' : ''; + $isDisabled = false; + if ($row['IsNewTicketStatus'] || $row['IsClosedByClient'] || $row['IsCustomerReplyStatus'] || + $row['IsStaffClosedOption'] || $row['IsStaffReopenedStatus'] || $row['IsDefaultStaffReplyStatus'] + || $row['LockedTicketStatus']) { - $checkedEcho = ($row['IsClosed'] == 1) ? 'checked="checked"' : ''; - $isDisabled = false; - if ($row['IsNewTicketStatus'] || $row['IsClosedByClient'] || $row['IsCustomerReplyStatus'] || - $row['IsStaffClosedOption'] || $row['IsStaffReopenedStatus'] || $row['IsDefaultStaffReplyStatus'] - || $row['LockedTicketStatus']) - { - $isDisabled = true; - } - - echo ''; - echo ''; //Name - echo ''; // Short Name Language File - echo ''; // Long Name Language File - echo ''; // Text Color - echo ''; // Resolved Status? - echo ''; //Delete status? - echo ''; + $isDisabled = true; } - //Print out an additional blank space for adding a status - echo ''; - echo ''; - echo ''; // Short Name Language File - echo ''; // Long Name Language File - echo ''; // Text Color - echo ''; // Resolved Status? - echo ''; //Empty placeholder where the delete row is. + echo ''; + echo ''; //Name + echo ''; // Short Name Language File + echo ''; // Long Name Language File + echo ''; // Text Color + echo ''; // Resolved Status? + echo ''; //Delete status? echo ''; + } + + //Print out an additional blank space for adding a status + echo ''; + echo ''; + echo ''; // Short Name Language File + echo ''; // Long Name Language File + echo ''; // Text Color + echo ''; // Resolved Status? + echo ''; //Empty placeholder where the delete row is. + echo ''; + ?> + +
'.$hesklang[$row['ShortNameContentKey']].''; - if ($isDisabled) - { - echo ''; - } else - { - echo ''; - } - echo '
'.$hesklang['addNew'].'
'.$hesklang[$row['ShortNameContentKey']].''; + if ($isDisabled) + { + echo ''; + } else + { + echo ''; + } + echo '
'.$hesklang['addNew'].'
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
-
-
-
- -
- +
+
+ +
+
+
+
+
+
+ +
+ +
-
- -
- +
+
+ +
+ +
-
- -
- +
+
+
+
+ +
+ +
-
- -
- +
+
+ +
+ +
-
- -
- +
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
-
- -
- +
+
+
+
+ +
+ +
-
- -
- +
+
+ +
+ +
-
-
-
- - '; - } - else - { - echo '
'.$hesklang['e_save_settings'].''; - } - ?> -
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + fetch_assoc()) { + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + } + + ?> + + + + + + + +
+ + + +
+
+
+
+
+
+ + + + + + + + + fetch_assoc()) { + echo ''; + echo ''; + echo ''; + echo ''; + } + ?> + + + + + + + +
+ +
+
+
+
+
+
+ + '; + } + else + { + echo '
'.$hesklang['e_save_settings'].''; + } + ?>
- -
+
+ +
; } p diff --git a/admin/admin_settings_save.php b/admin/admin_settings_save.php index dce698cd..def711ce 100644 --- a/admin/admin_settings_save.php +++ b/admin/admin_settings_save.php @@ -1,7 +1,7 @@ fetch_assoc()) $stmt = hesk_dbConnect()->prepare($delete); $stmt->bind_param('i', $row['ID']); $stmt->execute(); - - //-- In case we deleted a status in the middle, we now need to re-index the other IDs. - $reIndexQuery = 'SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'statuses` WHERE `ID` > '.$row['ID']; - $reIndexRS = hesk_dbQuery($reIndexQuery); - //-- Update each ID by subtracting 1 - $reIndexQuery = 'UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'statuses` SET `ID` = ? WHERE `ID` = ?'; - while ($row = $reIndexRS->fetch_assoc()) - { - $stmt = hesk_dbConnect()->prepare($reIndexQuery); - $newID = $row['ID'] - 1; - $stmt->bind_param('ii', $newID, $row['ID']); - $stmt->execute(); - } + $wasStatusDeleted = true; } else { //-- Update the information in the database with what is on the page @@ -438,6 +428,16 @@ while ($row = $results->fetch_assoc()) } } +//-- If any statuses were deleted, re-index them before adding a new one +if ($wasStatusDeleted) { + //-- First drop and re-add the ID column + hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses` DROP COLUMN `ID`"); + hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses` ADD `ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST"); + + //-- Since statuses should be zero-based, but are now one-based, subtract one from each ID + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses` SET `ID` = `ID`-1"); +} + //-- Insert the addition if there is anything to add if ($_POST['sN_shortName'] != null && $_POST['sN_longName'] != null && $_POST['sN_textColor'] != null) { @@ -496,8 +496,105 @@ $stmt = hesk_dbConnect()->prepare($updateQuery); $stmt->bind_param('i', $_POST['lockedTicketStatus']); $stmt->execute(); +//-- IP Bans +$ipBanSql = hesk_dbQuery('SELECT * FROM `'.$hesk_settings['db_pfix'].'denied_ips`'); +while ($row = $ipBanSql->fetch_assoc()) { + if (isset($_POST['ipDelete'][$row['ID']])) { + hesk_dbQuery('DELETE FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_ips` WHERE ID = '.hesk_dbEscape($row['ID'])); + } else { + $ipAddressFrom = ip2long($_POST['ipFrom'][$row['ID']]); + $ipAddressTo = ip2long($_POST['ipTo'][$row['ID']]); + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_ips` + SET `RangeStart` = \''.hesk_dbEscape($ipAddressFrom).'\', + `RangeEnd` = \''.hesk_dbEscape($ipAddressTo).'\' + WHERE ID = '.hesk_dbEscape($row['ID'])); + } +} +if (!empty($_POST['addIpFrom']) && !empty($_POST['addIpTo'])) { + $ipAddressFrom = ip2long($_POST['addIpFrom']); + $ipAddressTo = ip2long($_POST['addIpTo']); + hesk_dbQuery('INSERT INTO `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_ips` (`RangeStart`, `RangeEnd`) + VALUES (\''.hesk_dbEscape($ipAddressFrom).'\', \''.hesk_dbEscape($ipAddressTo).'\')'); +} + +//-- Email Bans +$emailBanSql = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_emails`'); +while ($row = $emailBanSql->fetch_assoc()) { + if (isset($_POST['emailDelete'][$row['ID']])) { + hesk_dbQuery('DELETE FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_emails` WHERE ID = '.hesk_dbEscape($row['ID'])); + } else { + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_emails` + SET Email = \''.hesk_dbEscape($_POST['email'][$row['ID']]).'\' + WHERE ID = '.hesk_dbEscape($row['ID'])); + } +} +if (!empty($_POST['addEmail'])) { + hesk_dbQuery('INSERT INTO `'.hesk_dbEscape($hesk_settings['db_pfix']).'denied_emails` (Email) VALUES (\''.hesk_dbEscape($_POST['addEmail']).'\')'); +} + $set['hesk_version'] = $hesk_settings['hesk_version']; +// Save the modsForHesk_settings.inc.php file +$set['rtl'] = empty($_POST['rtl']) ? 0 : 1; +$set['show-icons'] = empty($_POST['show-icons']) ? 0 : 1; +$set['maintenance-mode'] = empty($_POST['maintenance-mode']) ? 0 : 1; +$set['custom-field-setting'] = empty($_POST['custom-field-setting']) ? 0 : 1; +$set['customer-email-verification-required'] = empty($_POST['email-verification']) ? 0 : 1; + +if ($set['customer-email-verification-required']) +{ + //-- Don't allow multiple emails if verification is required + $set['multi_eml'] = 0; +} + +$set['navbarBackgroundColor'] = hesk_input(hesk_POST('navbarBackgroundColor')); +$set['navbarBrandColor'] = hesk_input(hesk_POST('navbarBrandColor')); +$set['navbarBrandHoverColor'] = hesk_input(hesk_POST('navbarBrandHoverColor')); +$set['navbarItemTextColor'] = hesk_input(hesk_POST('navbarItemTextColor')); +$set['navbarItemTextHoverColor'] = hesk_input(hesk_POST('navbarItemTextHoverColor')); +$set['navbarItemTextSelectedColor'] = hesk_input(hesk_POST('navbarItemTextSelectedColor')); +$set['navbarItemSelectedBackgroundColor'] = hesk_input(hesk_POST('navbarItemSelectedBackgroundColor')); +$set['dropdownItemTextColor'] = hesk_input(hesk_POST('dropdownItemTextColor')); +$set['dropdownItemTextHoverColor'] = hesk_input(hesk_POST('dropdownItemTextHoverColor')); +$set['questionMarkColor'] = hesk_input(hesk_POST('questionMarkColor')); +$set['dropdownItemTextHoverBackgroundColor'] = hesk_input(hesk_POST('dropdownItemTextHoverBackgroundColor')); +$modsForHesk_file_content='$v) { if ($v['use'] && isset($_POST[$k])) { - if (is_array($_POST[$k])) + // Date will be handled by the jQuery datepicker + if( $v['type'] == 'date' && $_POST[$k] != '') + { + $tmpvar[$k] = strtotime($_POST[$k]); + } else if (is_array($_POST[$k])) { $tmpvar[$k]=''; foreach ($_POST[$k] as $myCB) @@ -178,7 +182,7 @@ elseif (hesk_checkPermission('can_assign_self',0) && hesk_okCategory($tmpvar['ca } // Notify customer of the ticket? -$notify = ! empty($_POST['notify']) ? 1 : 0; +$notify = (!empty($_POST['notify']) && !empty($tmpvar['email']) ) ? 1 : 0; // Show ticket after submission? $show = ! empty($_POST['show']) ? 1 : 0; diff --git a/admin/admin_ticket.php b/admin/admin_ticket.php index 8543c9cc..eff4dac9 100644 --- a/admin/admin_ticket.php +++ b/admin/admin_ticket.php @@ -1,7 +1,7 @@ $ticket['email'], - 'category' => $ticket['category'], - 'priority' => $ticket['priority'], - 'owner' => $ticket['owner'], - 'trackid' => $ticket['trackid'], - 'status' => $ticket['status'], - 'name' => $_SESSION['name'], - 'lastreplier' => $ticket['lastreplier'], - 'subject' => $ticket['subject'], - 'message' => stripslashes($msg), - 'dt' => hesk_date($ticket['dt']), - 'lastchange' => hesk_date($ticket['lastchange']), - ); - - // 2. Add custom fields to the array - foreach ($hesk_settings['custom_fields'] as $k => $v) - { - $info[$k] = $v['use'] ? $ticket[$k] : ''; - } - // 3. Make sure all values are properly formatted for email - $ticket = hesk_ticketToPlain($info, 1, 0); + /* Notify assigned staff that a note has been added if needed */ + $users = hesk_dbQuery("SELECT `email`, `notify_note` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE (`id`='".intval($ticket['owner'])."' OR (`isadmin` = '1' AND `notify_note_unassigned` = '1')) AND `id` <> '".intval($_SESSION['id'])."'"); - /* Get email functions */ - require(HESK_PATH . 'inc/email_functions.inc.php'); + if (hesk_dbNumRows($users) > 0) + { + // 1. Generate the array with ticket info that can be used in emails + $info = array( + 'email' => $ticket['email'], + 'category' => $ticket['category'], + 'priority' => $ticket['priority'], + 'owner' => $ticket['owner'], + 'trackid' => $ticket['trackid'], + 'status' => $ticket['status'], + 'name' => $_SESSION['name'], + 'lastreplier' => $ticket['lastreplier'], + 'subject' => $ticket['subject'], + 'message' => stripslashes($msg), + 'dt' => hesk_date($ticket['dt'], true), + 'lastchange' => hesk_date($ticket['lastchange'], true), + ); + + // 2. Add custom fields to the array + foreach ($hesk_settings['custom_fields'] as $k => $v) + { + $info[$k] = $v['use'] ? $ticket[$k] : ''; + } - /* Format email subject and message for staff */ - $subject = hesk_getEmailSubject('new_note',$ticket); - $message = hesk_getEmailMessage('new_note',$ticket,1); + // 3. Make sure all values are properly formatted for email + $ticket = hesk_ticketToPlain($info, 1, 0); - /* Send email to staff */ - hesk_mail($owner['email'], $subject, $message); - } - } + /* Get email functions */ + require(HESK_PATH . 'inc/email_functions.inc.php'); + + /* Format email subject and message for staff */ + $subject = hesk_getEmailSubject('new_note',$ticket); + $message = hesk_getEmailMessage('new_note',$ticket,1); + /* Send email to staff */ + while ($user = hesk_dbFetchAssoc($users)) { + hesk_mail($user['email'], $subject, $message); + } + } } header('Location: admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999)); exit(); @@ -309,6 +331,51 @@ if ( ($can_reply || $can_edit) && isset($_POST['h']) && isset($_POST['m']) && is hesk_process_messages($hesklang['twu'],'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999),'SUCCESS'); } +/* Add child action */ +if (($can_reply || $can_edit) && isset($_POST['childTrackingId'])) { + //-- Make sure this isn't the same ticket or one of its merged tickets. + $mergedTickets = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` WHERE `trackid` = + \''.hesk_dbEscape($trackingID).'\' AND `merged` LIKE \'%#'.hesk_dbEscape($_POST['childTrackingId']).'#%\''); + if ($_POST['childTrackingId'] == $trackingID || $mergedTickets->num_rows > 0) { + hesk_process_messages($hesklang['child_is_itself'], 'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999)); + } + + //-- Does the child exist? + $existRs = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` WHERE `trackid` = \''.hesk_dbEscape($_POST['childTrackingId']).'\''); + if ($existRs->num_rows == 0) { + //-- Maybe it was merged? + $existRs = hesk_dbQuery('SELECT `trackid` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` WHERE `merged` LIKE \'#'.hesk_dbEscape($_POST['childTrackingId']).'#\''); + if ($existRs->num_rows > 0) { + //-- Yes, it was merged. Set the child to the "new" ticket; not the merged one. + $exist = $existRs->fetch_assoc(); + $_POST['childTrackingId'] = $exist['trackid']; + } else { + hesk_process_messages(sprintf($hesklang['child_does_not_exist'], $_POST['childTrackingId']), 'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999)); + } + } + + //-- Check if the ticket is already a child. + $childRs = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` WHERE `parent` = '.$ticket['id'].' AND `trackid` = \''.$_POST['childTrackingId'].'\''); + if ($childRs->num_rows > 0) { + hesk_process_messages(sprintf($hesklang['is_child_already'], $_POST['childTrackingId']), 'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999), 'NOTICE'); + } + + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` SET `parent` = '.$ticket['id'].' WHERE `trackid` = \''.$_POST['childTrackingId'].'\''); + hesk_process_messages(sprintf($hesklang['child_added'], $_POST['childTrackingId']), 'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999), 'SUCCESS'); +} + +/* Delete child action */ +if (($can_reply || $can_edit) && isset($_GET['deleteChild'])) { + //-- Delete the relationship + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` SET `parent` = NULL WHERE `ID` = '.hesk_dbEscape($_GET['deleteChild'])); + hesk_process_messages($hesklang['relationship_deleted'], 'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999), 'SUCCESS'); + +} elseif (($can_reply || $can_edit) && isset($_GET['deleteParent'])) { + //-- Delete the relationship + hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix']).'tickets` SET `parent` = NULL WHERE `ID` = '.hesk_dbEscape($ticket['id'])); + hesk_process_messages($hesklang['relationship_deleted'], 'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999), 'SUCCESS'); +} + /* Delete attachment action */ if (isset($_GET['delatt']) && hesk_token_check()) { @@ -360,6 +427,63 @@ if (isset($_GET['delatt']) && hesk_token_check()) hesk_process_messages($hesklang['kb_att_rem'],'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999),'SUCCESS'); } +/* Delete note attachment option */ +if (isset($_GET['delete-note-att']) && hesk_token_check()) { + if ( ! $can_delete || ! $can_edit) + { + hesk_process_messages($hesklang['no_permission'],'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999)); + } + + $att_id = intval( hesk_GET('delete-note-att') ) or hesk_error($hesklang['inv_att_id']); + + $reply = intval( hesk_GET('reply', 0) ); + if ($reply < 1) + { + $reply = 0; + } + + /* Get attachment info */ + $res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."attachments` WHERE `att_id`='".intval($att_id)."' LIMIT 1"); + if (hesk_dbNumRows($res) != 1) + { + hesk_process_messages($hesklang['id_not_valid'].' (att_id)','admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999)); + } + $att = hesk_dbFetchAssoc($res); + + /* Is note ID valid for this attachment? */ + if (!isset($_GET['note_id']) || $att['note_id'] != $_GET['note_id']) + { + hesk_process_messages($hesklang['trackID_not_found'],'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999)); + } + + /* Delete file from server */ + hesk_unlink(HESK_PATH.$hesk_settings['attach_dir'].'/'.$att['saved_name']); + + /* Delete attachment from database */ + hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."attachments` WHERE `att_id`='".intval($att_id)."'"); + + hesk_process_messages($hesklang['kb_att_rem'],'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999),'SUCCESS'); +} + + +if (isset($_POST['note_message'])) { + $n = $_POST['note_id']; + if ($can_del_notes) + { + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."notes` + SET `edit_date` = NOW(), `message` = '".hesk_dbEscape($_POST['note_message'])."', `number_of_edits` = `number_of_edits` + 1 + WHERE `id`='".intval($n)."' LIMIT 1"); + } + else + { + hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."notes` + SET `edit_date` = NOW(), `message` = '".hesk_dbEscape($_POST['note_message'])."', `number_of_edits` = `number_of_edits` + 1 + WHERE `id`='".intval($n)."' AND `who`='".intval($_SESSION['id'])."' LIMIT 1"); + } + hesk_process_messages($hesklang['note_edit_successful'],'admin_ticket.php?track='.$trackingID.'&Refresh='.mt_rand(10000,99999),'SUCCESS'); +} + + /* Print header */ require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); @@ -368,13 +492,14 @@ $result = hesk_dbQuery("SELECT `id`,`name` FROM `".hesk_dbEscape($hesk_settings[ $categories_options=''; while ($row=hesk_dbFetchAssoc($result)) { - if ($row['id'] == $ticket['category']) {continue;} - $categories_options.=''; + $selected = ''; + if ($row['id'] == $ticket['category']) {$selected='selected';} + $categories_options.=''; } /* List of users */ $admins = array(); -$result = hesk_dbQuery("SELECT `id`,`name`,`isadmin`,`categories`,`heskprivileges` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` ORDER BY `id` ASC"); +$result = hesk_dbQuery("SELECT `id`,`name`,`isadmin`,`categories`,`heskprivileges` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `active` = '1' ORDER BY `id` ASC"); while ($row=hesk_dbFetchAssoc($result)) { /* Is this an administrator? */ @@ -443,11 +568,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');

  • - +

  • - +

  • @@ -500,6 +625,57 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); } ?>
  • +
  • + +

    fetch_assoc(); + echo ' + '; + echo ' '.$parent['trackid'].''; + } else { + echo $hesklang['none']; + } + ?>

    +
  • +
  • + +

    fetch_assoc()) { + $hasRows = true; + echo ' + '; + echo ' '.$row['trackid'].''; + echo '
    '; + } + if (!$hasRows) { + echo $hesklang['none']; + } + ?>

    + +

    '.$hesklang['add_child'].''; ?>

    + + +
  • @@ -514,12 +690,11 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); echo hesk_getAdminButtons(); ?>
    - - - - - - - - - - - - - - - - - - + $linkText = 'new_ticket.php?name='.$ticket['name'].'&email='.$ticket['email'].'&catid='.$category['id'].'&priority='.$ticket['priority']; + foreach ($hesk_settings['custom_fields'] as $k=>$v) + { + if ($v['use'] == 1) + { + + if ($v['type'] == 'checkbox') + { + $value = str_replace('
    ', '-CHECKBOX-', $ticket[$k]); + } else { + $value = $ticket[$k]; + } + $linkText .= '&c_'.$k.'='.$value; + } + } + + echo ' + '.$hesklang['create_based_on_contact'].' + '; + echo ''; + ?> + + +
    -
    - '', - 1 => '', - 2 => '', - 3 => '' - ); + $priorityLanguages = array( + 0 => $hesklang['critical'], + 1 => $hesklang['high'], + 2 => $hesklang['medium'], + 3 => $hesklang['low'] + ); + $options = array(); + for ($i = 0; $i < 4; $i++) { + $selected = $ticket['priority'] == $i ? 'selected' : ''; + array_push($options, ''); + } + + echo '
    ';} + elseif ($ticket['priority'] == 1) {echo 'highPriority">';} + else {echo 'medLowPriority">';} + + echo '

    '.$hesklang['priority'].'

    '; + + echo '
    + + + + + + + + + + +
    '; + + echo '

    '.$hesklang['status'].'

    '; + $status_options = array(); + $results = hesk_dbQuery("SELECT `ID`, `ShortNameContentKey` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses`"); + while ($row = $results->fetch_assoc()) + { + $selected = $ticket['status'] == $row['ID'] ? 'selected' : ''; + $status_options[$row['ID']] = ''; + } + + echo ' +
    + + - echo '
    '; - - echo ''; - echo ''; - echo ''; - ?> - - -
    -

    + +
    +
    +
    +

    -

         - + +
    +
    +

    +
    +
    +

    +
    +
    + fetch_assoc(); $isTicketClosed = $isTicketClosedRow['IsClosed']; + echo '
    '; if ($isTicketClosed == 0) // Ticket is still open { echo ''.$hesklang['close_action'].''; + class="btn btn-default btn-sm" href="change_status.php?track='.$trackingID.'&s='.$staffClosedOptionStatus['ID'].'&Refresh='.$random.'&token='.hesk_token_echo(0).'"> + '.$hesklang['close_action'].''; } else { echo ''.$hesklang['open_action'].''; + class="btn btn-default btn-sm" href="change_status.php?track='.$trackingID.'&s='.$staffReopenedStatus['ID'].'&Refresh='.$random.'&token='.hesk_token_echo(0).'"> + '.$hesklang['open_action'].''; } - ?> -
    - : - -   - - -
    -

    Delete Note

    -

    -

    -

    -
    ';} - elseif ($ticket['priority'] == 1) {echo 'class="highPriority">';} - else {echo 'class="medLowPriority">';} + + + + + '; + echo '

    '.$hesklang['owner'].'

    '; - echo '

    '.$hesklang['priority'].'

    '; + if (hesk_checkPermission('can_assign_others',0)) + { + echo' +
    + + + + + + '; + } else + { + echo '

    '; + echo isset($admins[$ticket['owner']]) ? $admins[$ticket['owner']] : + ($can_assign_self ? $hesklang['unas'].' ['.$hesklang['asss'].']' : $hesklang['unas']); + echo '

    '; + } + echo '
    '; + echo '

    '.$hesklang['category'].'

    '; + if ($can_change_cat) + { + echo ' - if ($ticket['priority']==0) {echo '

    '.$hesklang['critical'].'

    ';} - elseif ($ticket['priority']==1) {echo '

    '.$hesklang['high'].'

    ';} - elseif ($ticket['priority']==2) {echo '

    '.$hesklang['medium'].'

    ';} - else {echo '

    '.$hesklang['low'].'

    ';} - echo '
    -
    + - + '.$categories_options.' +
    '; + } else + { + echo '

    '.$category['name'].'

    '; + } + echo '
    '; + ?> + + + +
    +
    + +
    + + +   + + + +
    + +

    -

    +
    +
    +

    + + - -

    '.$hesklang['status'].'

    '; - $status_options = array(); - $results = hesk_dbQuery("SELECT `ID`, `ShortNameContentKey` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses`"); - while ($row = $results->fetch_assoc()) - { - $status_options[$row['ID']] = ''; - } + + + + 0) { ?> +

    + + + + +
    +
    + +   + - $ticketStatus = hesk_dbFetchAssoc(hesk_dbQuery("SELECT `TicketViewContentKey` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."statuses` WHERE ID = " .$ticket['status'])); - echo '

    '.$hesklang[$ticketStatus['TicketViewContentKey']].'

    '; - echo '
    - -
    - - - - - - -
    -

    '.$hesklang['owner'].'

    -

    '; - - echo isset($admins[$ticket['owner']]) ? $admins[$ticket['owner']] : - ($can_assign_self ? $hesklang['unas'].' ['.$hesklang['asss'].']' : $hesklang['unas']); - - echo '


    '; - - if (hesk_checkPermission('can_assign_others',0)) - { - echo' -
    - - + +
    +
    +
    + +
    + > '.$hesklang['unas'].' < '; + echo '
    '; } - foreach ($admins as $k=>$v) - { - if ($k != $ticket['owner']) - { - echo ''; - } - } - echo ' - - - - '; - } - echo '

    '.$hesklang['category'].'

    -

    '.$category['name'].'

    '; - - if ($can_change_cat) - { - echo ' - -
    -
    - - - - - - - - -
    '; } - - echo '
    + echo '' . $hesklang['ful'] . ''; + ?> +
    +
    +
    +
    +
    + + + +
    +
    + +
    +
    +
    +
    -
    :
    +
    : '.$ticket['ip'].''; ?>
    @@ -773,7 +1028,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); -


    : +


    : '.$v['name'].': '.$ticket[$k].'

    '; + if ($modsForHesk_settings['custom_field_setting']) + { + $v['name'] = $hesklang[$v['name']]; + } + + echo '

    '.$v['name'].': '; + if ($v['type'] == 'date' && !empty($ticket[$k])) + { + $dt = date('Y-m-d h:i:s', $ticket[$k]); + echo hesk_dateToString($dt, 0); + } else + { + echo $ticket[$k]; + } + echo '

    '; } } ?> @@ -799,8 +1067,21 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); { if ($v['use'] && $v['place']) { - echo ' -

    '.$v['name'].': '.$ticket[$k].'

    '; + if ($modsForHesk_settings['custom_field_setting']) + { + $v['name'] = $hesklang[$v['name']]; + } + + echo '

    '.$v['name'].': '; + if ($v['type'] == 'date' && !empty($ticket[$k])) + { + $dt = date('Y-m-d h:i:s', $ticket[$k]); + echo hesk_dateToString($dt, 0); + } else + { + echo $ticket[$k]; + } + echo '

    '; } } /* Attachments */ @@ -970,7 +1251,7 @@ function hesk_getAdminButtonsInTicket($reply=0,$white=1) { global $hesk_settings, $hesklang, $ticket, $reply, $trackingID, $can_edit, $can_archive, $can_delete; - $options = '
    '; + $options = '
    '; /* Style and mousover/mousout */ $tmp = $white ? 'White' : 'Blue'; @@ -1100,7 +1381,7 @@ function hesk_printTicketReplies() { { $color = 'class="ticketMessageContainer"'; - $reply['dt'] = hesk_date($reply['dt']); + $reply['dt'] = hesk_date($reply['dt'], true); ?>
    @@ -1153,7 +1434,7 @@ function hesk_printReplyForm() { ?> -

    +

    @@ -1179,7 +1460,7 @@ function hesk_printReplyForm() {
    -
    +
    @@ -1262,8 +1543,12 @@ function hesk_printReplyForm() {

    ()
    -

    - + +

    + + +

    + diff --git a/admin/change_status.php b/admin/change_status.php index 8601f591..8f0448ee 100644 --- a/admin/change_status.php +++ b/admin/change_status.php @@ -1,7 +1,7 @@ diff --git a/admin/edit_post.php b/admin/edit_post.php index 07b48e08..f75c02b9 100644 --- a/admin/edit_post.php +++ b/admin/edit_post.php @@ -1,7 +1,7 @@ '; break; + case 'date': + if (strlen($k_value) != 0) + { + $v['value'] = $k_value; + } + echo ' +
    + +
    + +
    +
    '; + break; + case 'multiselect': + echo '
    +
    +
    + + +
    '; + break; + /* Default text input */ default: if (strlen($k_value) != 0) @@ -407,11 +453,6 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
    - -

    - -

     

    - '.$v['name'].'' . "\n"; } } @@ -523,16 +528,17 @@ if (isset($_GET['w'])) $ticket['message'] = hesk_msgToPlain($ticket['message'], 1); $ticket['subject'] = hesk_msgToPlain($ticket['subject'], 1); $ticket['owner'] = isset($admins[$ticket['owner']]) ? $admins[$ticket['owner']] : ''; - $ticket['dt'] = date("Y-m-d\TH:i:s\.000", strtotime($ticket['dt'])); - $ticket['lastchange'] = date("Y-m-d\TH:i:s\.000", strtotime($ticket['lastchange'])); + + // Format for export dates + $hesk_settings['timeformat'] = "Y-m-d\TH:i:s\.000"; // Create row for the XML file $tmp .= ' '.$ticket['id'].' -'.$ticket['dt'].' -'.$ticket['lastchange'].' +'.hesk_date($ticket['dt'], true).' +'.hesk_date($ticket['lastchange'], true).' @@ -567,6 +573,9 @@ if (isset($_GET['w'])) $tickets_exported++; $this_round++; } // End of while loop + + // Go back to the HH:MM:SS format for hesk_date() + $hesk_settings['timeformat'] = 'H:i:s'; // Append any remaining rows into the file if ($this_round > 0) @@ -697,25 +706,22 @@ require_once(HESK_PATH . 'inc/headerAdmin.inc.php'); require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> -
    -
    -
    -
    - -
    -
    -

    -
    -
    -
    +
    +
    +
    +
    + + +
    - -

    +
    +
    +
    +
    +

    +
    -
    -