[TikiWiki-commits] [Git][tikiwiki/tiki][master] [ENH] Webmail: adding restore button for tracker item messages in tracker folder
"Victor Emanouilov \(@kroky\) via TikiWiki-cvs" <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <696667e3685bc_2c18139895421@gitlab-sidekiq-low-urgency-cpu-bound-v2-6878c7b954-j8nnk.mail> |
Victor Emanouilov pushed to branch master at Tiki Wiki CMS Groupware / Tiki
Commits:
46338e6e by christer77 at 2026-01-13T15:34:07+00:00
[ENH] Webmail: adding restore button for tracker item messages in tracker folder
---
* [ENH] EmailFolder: adding restore field
* [ENH] Webmail: adding restore button for tracker item messages in tracker folder
See merge request tikiwiki/tiki!9015
- - - - -
5 changed files:
- lib/core/Tracker/Field/EmailFolder.php
- lib/cypht/modules/tiki/functions.php
- lib/cypht/modules/tiki/setup.php
- lib/cypht/modules/tiki/site.js
- lib/cypht/modules/tiki/tracker_modules.php
Changes:
=====================================
lib/core/Tracker/Field/EmailFolder.php
=====================================
@@ -347,6 +347,8 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements \Tracker\
$this->deleteEmail($existing, $value['delete'], $value['skip_trash'] ?? false);
} elseif (isset($value['archive'])) {
$this->archiveEmail($existing, $value['archive']);
+ } elseif (isset($value['restore'])) {
+ $this->restoreEmail($existing, $value['restore']);
} elseif (isset($value['replace'])) {
$this->updateDraftEmail($value['replace']);
} elseif (isset($value['newFolder'])) {
@@ -637,6 +639,23 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements \Tracker\
}
}
+ protected function restoreEmail(&$existing, $fileId)
+ {
+
+ if (! $this->getOption('useFolders')) {
+ Feedback::error(tr('%0 field: not configured to use folders but message was tried to be archived.', $this->getConfiguration('name')));
+ return;
+ }
+ foreach ($existing as $folder => $_) {
+ if (($key = array_search($fileId, $existing[$folder])) !== false) {
+ unset($existing[$folder][$key]);
+ $existing[$folder] = array_values($existing[$folder]);
+ $existing['inbox'][] = $fileId;
+ break;
+ }
+ }
+ }
+
protected function updateDraftEmail($file)
{
$filegallib = TikiLib::lib('filegal');
=====================================
lib/cypht/modules/tiki/functions.php
=====================================
@@ -60,7 +60,10 @@ if (! hm_exists('tiki_parse_message')) {
}
}
if ($email) {
- $email['show_archive'] = $handler->getOption('useFolders') && $folder != 'archive';
+ if ($handler->getOption('useFolders')) {
+ $email['show_archive'] = $folder != 'archive';
+ $email['is_tiki_tracker_trash_folder'] = $folder == 'trash';
+ }
break;
}
}
@@ -398,6 +401,18 @@ if (! hm_exists('tiki_move_to_tracker_dropdown')) {
}
}
+/**
+ * @subpackage tiki/functions
+ * @return string Restore message button
+ */
+if (! hm_exists('tiki_restore_message')) {
+ function tiki_restore_message($mod)
+ {
+ $res = "<div class='d-inline-block' id='restore_message' style='display: none'><a href='#' title='" . $mod->trans("Restore message to inbox") . "' class='restore_message hlink text-decoration-none btn btn-sm btn-outline-secondary' >" . $mod->trans("Restore") . "</a></div>";
+ return $res;
+ }
+}
+
/**
* @subpackage tiki/functions
* @return string array message and headers
=====================================
lib/cypht/modules/tiki/setup.php
=====================================
@@ -70,6 +70,7 @@ add_output('ajax_imap_message_content', 'add_rsvp_actions', true, 'imap', 'filte
add_output('ajax_imap_message_content', 'filter_message_headers_mpdf', true, 'imap', 'filter_message_headers', 'after');
add_output('ajax_imap_message_content', 'add_move_to_trackers', true, 'imap', 'filter_message_headers', 'after');
add_output('ajax_imap_message_content', 'tiki_get_create_item_trackers_output', true, 'imap', 'filter_message_headers', 'after');
+add_output('ajax_imap_message_content', 'add_restore_message', true, 'imap', 'filter_message_headers', 'after');
/* message page rsvp actions to an event */
setup_base_ajax_page('ajax_rsvp_action', 'core');
@@ -154,6 +155,7 @@ add_output('ajax_tiki_message_content', 'filter_message_body', true, 'imap');
add_output('ajax_tiki_message_content', 'filter_message_struct', true, 'imap');
add_output('ajax_tiki_message_content', 'forward_variables', true);
add_output('ajax_tiki_message_content', 'add_move_to_trackers', true);
+add_output('ajax_tiki_message_content', 'add_restore_message', true);
setup_base_ajax_page('ajax_tiki_delete_message', 'core');
add_handler('ajax_tiki_delete_message', 'message_list_type', true, 'core');
add_handler('ajax_tiki_delete_message', 'tracker_message_list_type', true);
@@ -176,6 +178,11 @@ add_handler('ajax_tiki_flag_message', 'flag_tiki_message', true);
add_output('ajax_tiki_flag_message', 'forward_variables', true);
setup_base_ajax_page('ajax_tiki_message_action', 'core');
add_handler('ajax_tiki_message_action', 'tiki_message_action', true);
+setup_base_ajax_page('ajax_tiki_restore_message', 'core');
+add_handler('ajax_tiki_restore_message', 'message_list_type', true, 'core');
+add_handler('ajax_tiki_restore_message', 'tracker_message_list_type', true);
+add_handler('ajax_tiki_restore_message', 'close_session_early', true, 'core');
+add_handler('ajax_tiki_restore_message', 'tiki_restore_message', true);
/* get trackers script */
setup_base_ajax_page('ajax_tiki_get_trackers', 'core');
@@ -253,6 +260,7 @@ return [
'info',
'ajax_tiki_msg_tracker_items',
'ajax_tiki_auto_move_reply_to_tracker',
+ 'ajax_tiki_restore_message',
],
'allowed_get' => [
'tiki_download_message' => FILTER_VALIDATE_BOOLEAN,
@@ -268,7 +276,9 @@ return [
'msg_next_subject' => [FILTER_SANITIZE_FULL_SPECIAL_CHARS, false],
'delete_error' => [FILTER_VALIDATE_BOOLEAN, false],
'archive_error' => [FILTER_VALIDATE_BOOLEAN, false],
+ 'restore_error' => [FILTER_VALIDATE_BOOLEAN, false],
'show_archive' => [FILTER_VALIDATE_BOOLEAN, false],
+ 'show_restore' => [FILTER_VALIDATE_BOOLEAN, false],
'flag_state' => [FILTER_SANITIZE_FULL_SPECIAL_CHARS, false],
'trackers' => [FILTER_DEFAULT, false],
'tracker_data' => [FILTER_DEFAULT, false],
=====================================
lib/cypht/modules/tiki/site.js
=====================================
@@ -408,7 +408,7 @@ var tiki_get_message_content = function(msg_part, uid, images) {
$('.msg_text').append(res.msg_parts);
document.title = $('.header_subject th').text();
imap_message_view_finished();
- tiki_message_view_finished(res.show_archive);
+ tiki_message_view_finished(res.show_archive, res.show_restore);
tiki_prev_next_links(res.msg_prev_link, res.msg_prev_subject, res.msg_next_link, res.msg_next_subject);
window.dispatchEvent(new CustomEvent('message-loaded'));
},
@@ -419,7 +419,7 @@ var tiki_get_message_content = function(msg_part, uid, images) {
return false;
};
-var tiki_message_view_finished = function(show_archive) {
+var tiki_message_view_finished = function(show_archive, show_restore) {
$('.msg_part_link').off("click").on("click", function() {
$('.header_subject')[0].scrollIntoView();
$('.msg_text_inner').css('visibility', 'hidden');
@@ -430,11 +430,22 @@ var tiki_message_view_finished = function(show_archive) {
$('#delete_message').off("click").on("click", function() { return tiki_delete_message(); });
$('#move_message').off("click").on("click", function(e) { return tiki_move_copy(e, 'move', 'message');});
$('#copy_message').off("click").on("click", function(e) { return tiki_move_copy(e, 'copy', 'message');});
+
+ // Manage Restore button visibility
+ if (typeof show_restore !== 'undefined' && show_restore) {
+ $('#restore_message').off("click").on("click", function(e) { return tiki_restore_message(e);});
+ $('#restore_message').css('display', 'block');
+ } else {
+ $('#restore_message').remove();
+ }
+
+ // Manage Archive button visibility
if (typeof show_archive !== 'undefined' && show_archive) {
$('#archive_message').off("click").on("click", function() { return tiki_archive_message(); });
} else {
$('#archive_message').remove();
}
+
$('#unread_message').off('click').on("click", function() { return tiki_unread_message();});
$('#delete_message').parent().contents().filter(function() { return this.nodeType == 3 && this.previousSibling.nodeType == 3; }).remove();
};
@@ -525,7 +536,7 @@ var tiki_flag_message = function() {
$('#flag_msg').show();
$('#unflag_msg').hide();
}
- tiki_message_view_finished(res.show_archive);
+ tiki_message_view_finished(res.show_archive, res.show_restore);
}
);
}
@@ -594,6 +605,36 @@ var tiki_perform_move_copy = function(dest_id, move_to) {
}
};
+var tiki_restore_message = function(e) {
+ e.preventDefault();
+ var uid = getMessageUidParam();
+ var list_path = getListPathParam();
+ if (list_path && uid) {
+ Hm_Ajax.request(
+ [
+ {'name': 'hm_ajax_hook', 'value': 'ajax_tiki_restore_message'},
+ {'name': 'imap_msg_uid', 'value': uid},
+ {'name': 'list_path', 'value': list_path}
+ ],
+ function(res) {
+ if (!res.restore_error) {
+ if (Hm_Utils.get_from_global('msg_uid', false)) {
+ return;
+ }
+ var nlink = $('.nlink');
+ if (nlink.length) {
+ window.location.href = nlink.attr('href');
+ } else {
+ window.location.href = "?page=message_list&list_path="+getListPathParam();
+ }
+ }
+ }
+ );
+ }
+ return false;
+};
+
+
var tiki_send_archive = function() {
$('.compose_post_archive').val(0).before('<input type="hidden" name="tiki_archive_replied" value="1">');
$('.smtp_send').trigger("click");
=====================================
lib/cypht/modules/tiki/tracker_modules.php
=====================================
@@ -853,6 +853,10 @@ class Hm_Handler_tiki_message_content extends Hm_Handler_Module
}
$this->out('show_archive', $email['show_archive']);
+ if (preg_match("/tracker_folder_(\d+)_(\d+)/", $this->request->post['list_path'], $m) && $email['is_tiki_tracker_trash_folder']) {
+ $this->out('show_restore', true);
+ }
+
clear_existing_reply_details($this->session);
if ($part_num == 0) {
$msg_struct_current['type'] = 'text';
@@ -1039,6 +1043,54 @@ class Hm_Handler_tiki_process_imap_unread extends Hm_Handler_Module
}
}
+
+class Hm_Handler_tiki_restore_message extends Hm_Handler_Module
+{
+ /**
+ * Restore message from archive or trash to inbox folder
+ */
+ public function process()
+ {
+ list($success, $form) = $this->process_form(['imap_msg_uid', 'list_path']);
+ if ($success) {
+ // Remove archive and deleted flags to restore to inbox
+ tiki_flag_message($form['imap_msg_uid'], 'remove', 'archive');
+ tiki_flag_message($form['imap_msg_uid'], 'remove', 'deleted');
+
+ $path = str_replace('tracker_folder_', '', $form['list_path']);
+ list ($itemId, $fieldId) = explode('_', $path);
+
+ $trk = TikiLib::lib('trk');
+ $item = $trk->get_item_info($itemId);
+ if (! $item) {
+ Hm_Msgs::add('Tracker item not found', 'danger');
+ $this->out('restore_error', true);
+ return;
+ }
+
+ $field = $trk->get_field_info($fieldId);
+ if (! $field) {
+ Hm_Msgs::add('Tracker field not found', 'danger');
+ $this->out('restore_error', true);
+ return;
+ }
+
+ // Move message back to inbox by updating the field value
+ $field['value'] = [
+ 'restore' => $form['imap_msg_uid']
+ ];
+
+ $trk->replace_item($item['trackerId'], $item['itemId'], [
+ 'data' => [$field]
+ ]);
+
+ Hm_Msgs::add('Message restored to inbox');
+ $this->out('restore_error', false);
+ }
+ }
+}
+
+
/**
* Add Move to trackers button
* @subpackage tiki/output
@@ -1063,6 +1115,20 @@ class Hm_Output_tiki_get_create_item_trackers_output extends Hm_Output_Module
}
}
+/**
+ * Add Restore Message button in tracker folders
+ * @subpackage tiki/output
+ */
+class Hm_Output_add_restore_message extends Hm_Output_Module
+{
+ protected function output()
+ {
+ $res = tiki_restore_message($this);
+ $headers = append_to_msg_headers($this->get('msg_headers'), $res);
+ $this->out('msg_headers', $headers, false);
+ }
+}
+
/**
* Add move/copy dialog to the message list controls
* @subpackage imap/output
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/46338e6e3fdb3f4bc9a26deeec0ae3624f2d3566
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/46338e6e3fdb3f4bc9a26deeec0ae3624f2d3566
You're receiving this email because of your account on gitlab.com.
_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs