[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.