[TikiWiki-commits] [Git][tikiwiki/tiki][24.x] [NEW] Cypht: Added move to trackers to message list

"Marc Laporte \(@marclaporte\) via TikiWiki-cvs" <[email protected]>
Newsgroups gmane.comp.cms.tiki.cvs
Message-ID <691e381e43c8_2aa4cbd0799b2@gitlab-sidekiq-low-urgency-cpu-bound-v2-cb98bb68b-62cnl.mail>

Marc Laporte pushed to branch 24.x at Tiki Wiki CMS Groupware / Tiki


Commits:
6d4e6847 by Josaphat Imani at 2025-11-19T21:29:05+00:00
[NEW] Cypht: Added move to trackers to message list
---
* Fix translation

* [FIX] Webmail: Fix trackers dropdown in message list

* [NEW] Cypht: Added move to trackers to message list

(cherry picked from commit 411d81d8d0861875fea6b837f5f1499fff3a6c44)

See merge request tikiwiki/tiki!8994

- - - - -


6 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.css
- lib/cypht/modules/tiki/site.js
- lib/cypht/modules/tiki/tracker_modules.php


Changes:

=====================================
lib/core/Tracker/Field/EmailFolder.php
=====================================
@@ -155,7 +155,7 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
                         TikiLib::lib('smarty')->loadPlugin('smarty_modifier_sefurl');
                         $view_path = smarty_modifier_sefurl($page_info['pageName']);
                         if (preg_match("/tiki-index\.php\?page=.*/", $view_path)) {
-                            $view_path = "tiki-index.php?page_id=".$parsed_fields['source_id'];
+                            $view_path = "tiki-index.php?page_id=" . $parsed_fields['source_id'];
                         }
                     }
                 }
@@ -164,7 +164,7 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
                 } else {
                     $view_path .= '?';
                 }
-                $view_path .= "page=message&uid=".$parsed_fields['fileId']."&list_path=tracker_folder_".$parsed_fields['itemId']."_".$parsed_fields['fieldId']."&list_parent=tracker_".$parsed_fields['trackerId'];
+                $view_path .= "page=message&uid=" . $parsed_fields['fileId'] . "&list_path=tracker_folder_" . $parsed_fields['itemId'] . "_" . $parsed_fields['fieldId'] . "&list_parent=tracker_" . $parsed_fields['trackerId'];
                 $parsed_fields['view_path'] = $view_path;
                 $emails[$folder][] = $parsed_fields;
             }
@@ -226,7 +226,7 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
             TikiLib::lib('smarty')->loadPlugin('smarty_modifier_sefurl');
             $compose_path = smarty_modifier_sefurl($compose_page);
             if (preg_match("/tiki-index\.php\?page=.*/", $compose_path)) {
-                $compose_path = "tiki-index.php?page_id=".TikiLib::lib('tiki')->get_page_id_from_name($compose_page);
+                $compose_path = "tiki-index.php?page_id=" . TikiLib::lib('tiki')->get_page_id_from_name($compose_page);
             }
         } else {
             $compose_path = "tiki-webmail.php";
@@ -236,13 +236,15 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
         } else {
             $compose_path .= '?';
         }
-        $compose_path .= "page=compose&list_path=tracker_folder_".$this->getItemId()."_".$this->getConfiguration('fieldId')."&list_parent=tracker_".$this->getTrackerDefinition()->getConfiguration('trackerId');
+        $compose_path .= "page=compose&list_path=tracker_folder_" . $this->getItemId() . "_" . $this->getConfiguration('fieldId') . "&list_parent=tracker_" . $this->getTrackerDefinition()->getConfiguration('trackerId');
 
         return $this->renderTemplate('trackeroutput/email_folder.tpl', $context, [
             'emails' => $emails,
             'count' => $this->getConfiguration('count'),
             'folders' => $this->getFolders(),
-            'opened' => array_map(function($folder) { return $this->folderHandle($folder); }, preg_split('/\s*,\s*/', $this->getOption('openedFolders'))),
+            'opened' => array_map(function ($folder) {
+                return $this->folderHandle($folder);
+            }, preg_split('/\s*,\s*/', $this->getOption('openedFolders'))),
             'compose_path' => $compose_path,
         ]);
     }
@@ -258,7 +260,13 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
         if (isset($value['new'])) {
             $folder = $value['folder'] ?? 'inbox';
             if ($this->getOption('useFolders') || $folder == 'inbox') {
-                $this->addEmail($existing[$folder], $value['new']);
+                if (array_filter($value['new'], 'is_array') === $value['new']) {
+                    foreach ($value['new'] as $new_value) {
+                        $this->addEmail($existing[$folder], $new_value);
+                    }
+                } else {
+                    $this->addEmail($existing[$folder], $value['new']);
+                }
             }
         } elseif (isset($value['delete'])) {
             $this->deleteEmail($existing, $value['delete'], $value['skip_trash'] ?? false);
@@ -339,7 +347,8 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
         return $schema;
     }
 
-    public function getFolders() {
+    public function getFolders()
+    {
         $folders = [
             'inbox' => $this->getOption('inboxName'),
             'sent' => $this->getOption('sentName'),
@@ -347,11 +356,14 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
             'archive' => $this->getOption('archiveName'),
         ];
         $custom = preg_split('/\s*,\s*/', $this->getOption('customFolders'));
-        $handles = array_map(function($folder){ return $this->folderHandle($folder); }, $custom);
+        $handles = array_map(function ($folder) {
+            return $this->folderHandle($folder);
+        }, $custom);
         return array_merge($folders, array_combine($handles, $custom));
     }
 
-    protected function folderHandle($folderName) {
+    protected function folderHandle($folderName)
+    {
         return preg_replace("/[^a-z0-9]+/", "", strtolower($folderName));
     }
 
@@ -376,7 +388,7 @@ class Tracker_Field_EmailFolder extends Tracker_Field_Files implements Tracker_F
             if (($key = array_search($fileId, $existing[$folder])) !== false) {
                 unset($existing[$folder][$key]);
                 $existing[$folder] = array_values($existing[$folder]);
-                if ($this->getOption('useFolders') && $folder != 'trash' && $folder != 'archive' && !$skip_trash) {
+                if ($this->getOption('useFolders') && $folder != 'trash' && $folder != 'archive' && ! $skip_trash) {
                     $existing['trash'][] = $fileId;
                 } else {
                     $filegallib = TikiLib::lib('filegal');


=====================================
lib/cypht/modules/tiki/functions.php
=====================================
@@ -270,18 +270,53 @@ if (! hm_exists('tiki_flag_message')) {
             $flags = '';
         }
         if ($action == 'remove') {
-            $flags = preg_replace('/\\\?'.ucfirst($flag).'/', '', $flags);
-            $state = 'un'.$flag;
+            $flags = preg_replace('/\\\?' . ucfirst($flag) . '/', '', $flags);
+            $state = 'un' . $flag;
         } elseif (! stristr($flags, $flag)) {
-            $flags .= ' \\'.ucfirst($flag);
+            $flags .= ' \\' . ucfirst($flag);
             $state = $flag;
         }
         $flags = preg_replace("/\s{2,}/", ' ', trim($flags));
         $raw = preg_replace("/Flags:.*?\r\n/", "Flags: $flags\r\n", $file->getContents(), -1, $cnt);
         if ($cnt == 0) {
-            $raw = "Flags: $flags\r\n".$raw;
+            $raw = "Flags: $flags\r\n" . $raw;
         }
         $file->replaceQuick($raw);
         return $state;
     }
 }
+
+/**
+ * @subpackage tiki/functions
+ * @param object $mod the module calling this function
+ * @return string trackers with email folder fields dropdown
+ */
+if (! hm_exists('tiki_move_to_tracker_dropdown')) {
+    function tiki_move_to_tracker_dropdown($mod)
+    {
+        $trk = TikiLib::lib('trk');
+        $fields = $trk->get_fields_by_type('EF');
+        if (! $fields) {
+            return;
+        }
+        $field_list = [];
+        foreach ($fields as $field) {
+            $tracker = $trk->get_tracker($field['trackerId']);
+            $handler = $trk->get_field_handler($field);
+            if ($handler->getOption('useFolders')) {
+                $folder_list = [];
+                foreach ($handler->getFolders() as $folder => $folderName) {
+                    $folder_list[] = "<div><a href='#' class='object_selector_trigger' data-tracker='{$field['trackerId']}' data-field='{$field['fieldId']}' data-folder='" . htmlspecialchars($folder) . "'>{$folderName}</a></div>";
+                }
+                $field_list[] = "<a href='#' class='tiki_folder_trigger'>{$tracker['name']} - {$field['name']}</a>"
+                    . "<div class='tiki_folder_container' style='display: none'>" . implode("\n", $folder_list) . "</div>";
+            } else {
+                $field_list[] = "<a href='#' class='object_selector_trigger' data-tracker='{$field['trackerId']}' data-field='{$field['fieldId']}' data-folder='inbox'>{$tracker['name']} - {$field['name']}</a>";
+            }
+        }
+        $res = "<a class=\"hlink\" id=\"move_to_trackers\" href=\"#\">" . tra('Trackers') . "</a>";
+        $res .= "<div class='move_to_trackers'><div class='move_to_title'>" . tra('Move to trackers...') . "<span><a class='close_move_to_trackers' href='#'>X</a></span></div>" . implode("<br>\n", $field_list) . "</div>";
+
+        return $res;
+    }
+}


=====================================
lib/cypht/modules/tiki/setup.php
=====================================
@@ -128,6 +128,7 @@ add_handler('compose', 'tiki_save_sent', true, 'smtp', 'tiki_mark_as_answered',
 add_handler('compose', 'tiki_archive_replied', true, 'smtp', 'tiki_save_sent', 'after');
 add_handler('compose', 'check_path_redirect_after_sent', true, 'smtp', 'tiki_archive_replied', 'after');
 add_output('ajax_imap_message_content', 'add_move_to_trackers', true, 'imap', 'filter_message_headers', 'after');
+add_output('message_list', 'add_multiple_move_to_trackers', true, 'imap', 'imap_custom_controls', 'after');
 setup_base_ajax_page('ajax_move_to_tracker', 'core');
 add_handler('ajax_move_to_tracker', 'load_imap_servers_from_config', true, 'imap');
 add_handler('ajax_move_to_tracker', 'imap_oauth2_token_check', true, 'imap');
@@ -223,6 +224,7 @@ return array(
   'allowed_post' => array(
     'imap_server_id' => FILTER_VALIDATE_INT,
     'imap_msg_uid' => FILTER_SANITIZE_STRING,
+    'imap_msg_ids' => FILTER_SANITIZE_STRING,
     'imap_msg_part' => FILTER_SANITIZE_STRING,
     'folder' => FILTER_SANITIZE_STRING,
     'msgid' => FILTER_SANITIZE_STRING,


=====================================
lib/cypht/modules/tiki/site.css
=====================================
@@ -540,7 +540,7 @@ letter-spacing: unset;
 
 .move_to_trackers {
   text-transform: none;
-  z-index: 1;
+  z-index: 100;
   position: absolute;
   display: none;
   background-color: #fff;


=====================================
lib/cypht/modules/tiki/site.js
=====================================
@@ -294,11 +294,24 @@ var tiki_setup_move_to_trackers = function() {
                     .find('.object-selector input[name=move_to_trackers]')
                     .object_selector()
                     .on('change', function() {
+                        var ids = [];
+                        if (hm_page_name() == 'message') {
+                            ids.push(hm_msg_uid());
+                        } else {
+                            $('input[type=checkbox]').each(function() {
+                                if (this.checked && this.id.search('imap') != -1) {
+                                    ids.push(this.id.split('_')[2]);
+                                }
+                            });
+                            if (ids.length == 0) {
+                                return;
+                            };
+                        }
                         Hm_Ajax.request(
                             [{'name': 'hm_ajax_hook', 'value': 'ajax_move_to_tracker'},
                             {'name': 'tracker_field_id', 'value': $el.data('field')},
                             {'name': 'tracker_item_id', 'value': $(this).val().replace('trackeritem:', '')},
-                            {'name': 'imap_msg_uid', 'value': hm_msg_uid()},
+                            {'name': 'imap_msg_ids', 'value': ids.join(',')},
                             {'name': 'list_path', 'value': hm_list_path()},
                             {'name': 'folder', 'value': $el.data('folder')}],
                             function(res) {
@@ -585,6 +598,10 @@ $(function() {
         tiki_setup_move_to_trackers();
     }
 
+    if (hm_page_name() == 'message_list') {
+        tiki_setup_move_to_trackers();
+    }
+
     if (hm_page_name() == 'sieve_filters') {
         tiki_setup_move_to_trackers(function(e) {
             $(e.target)


=====================================
lib/cypht/modules/tiki/tracker_modules.php
=====================================
@@ -96,10 +96,16 @@ class Hm_Handler_move_to_tracker extends Hm_Handler_Module
     {
         global $smarty;
 
-        list($success, $form) = $this->process_form(array('tracker_field_id', 'tracker_item_id', 'imap_msg_uid', 'list_path', 'folder'));
+        list($success, $form) = $this->process_form(array('tracker_field_id', 'tracker_item_id', 'imap_msg_ids', 'list_path', 'folder'));
         if (! $success) {
             return;
         }
+
+        $msg_ids = explode(',', $form['imap_msg_ids']);
+        $errors = 0;
+        $msgs = [];
+        $headers_array = [];
+
         if (preg_match("/^imap_(\w+)_(.+)/", $form['list_path'], $matches)) {
             $imap_server_id = $matches[1];
             $folder = hex2bin($matches[2]);
@@ -113,14 +119,20 @@ class Hm_Handler_move_to_tracker extends Hm_Handler_Module
                 Hm_Msgs::add('ERRMailbox not found');
                 return;
             }
-            $msg = $imap->get_message_content($form['imap_msg_uid'], 0);
-            $msg = str_replace("\r\n", "\n", $msg);
-            $msg = str_replace("\n", "\r\n", $msg);
-            $msg = rtrim($msg) . "\r\n";
-
-            $headers = $imap->get_message_headers($form['imap_msg_uid']);
-            if (! empty($headers['Flags'])) {
-                $msg = "Flags: " . $headers['Flags'] . "\r\n" . $msg;
+
+
+            foreach ($msg_ids as $msg_id) {
+                $msg = $imap->get_message_content($msg_id, 0);
+                $msg = str_replace("\r\n", "\n", $msg);
+                $msg = str_replace("\n", "\r\n", $msg);
+                $msg = rtrim($msg) . "\r\n";
+
+                $headers = $imap->get_message_headers($msg_id);
+                if (! empty($headers['Flags'])) {
+                    $msg = "Flags: " . $headers['Flags'] . "\r\n" . $msg;
+                }
+                $msgs[] = $msg;
+                $headers_array[] = $headers;
             }
 
             // ensure file was saved before removing it from remote mailbox
@@ -130,13 +142,12 @@ class Hm_Handler_move_to_tracker extends Hm_Handler_Module
                 $old = $args['old_values'][$form['tracker_field_id']];
                 $new = $args['values'][$form['tracker_field_id']];
                 if (substr_count($old, ',') != substr_count($new, ',')) {
-                    if ($imap->message_action('DELETE', array($form['imap_msg_uid']))) {
-                        $imap->message_action('EXPUNGE', array($form['imap_msg_uid']));
-                    }
+                    $imap->message_action('DELETE', $args['msg_ids']);
+                    $imap->message_action('EXPUNGE', $args['msg_ids']);
                 }
-            }, ['imap' => $imap, 'form' => $form]);
+            }, ['imap' => $imap, 'form' => $form, 'msg_ids' => $msg_ids]);
         } elseif (preg_match("/^tracker_folder_/", $form['list_path'], $matches)) {
-            $email = tiki_parse_message($form['list_path'], $form['imap_msg_uid']);
+            $email = tiki_parse_message($form['list_path'], $msg_ids[0]);
             if (! $email) {
                 Hm_Msgs::add('ERRMessage could not be loaded');
                 return;
@@ -155,6 +166,9 @@ class Hm_Handler_move_to_tracker extends Hm_Handler_Module
                 'Subject' => $email['subject'],
             ];
 
+            $msgs[] = $msg;
+            $headers_array[] = $headers;
+
             // ensure file was saved before removing it from Tiki
             TikiLib::events()->bind('tiki.trackeritem.update', function ($args) {
                 $email = $args['email'];
@@ -194,17 +208,23 @@ class Hm_Handler_move_to_tracker extends Hm_Handler_Module
             return;
         }
 
-        if ($this->session->get('page_id')) {
-            $msg = "X-Tiki-Source: " . $this->session->get('page_id') . "\r\n" . $msg;
-        }
+        $new_values = [];
+        foreach ($msgs as $key => $msg) {
+            $headers = $headers_array[$key];
+            if ($this->session->get('page_id')) {
+                $msg = "X-Tiki-Source: " . $this->session->get('page_id') . "\r\n" . $msg;
+            }
 
-        $field['value'] = [
-            'new' => [
+            $new_values[] = [
                 'name' => ! empty($headers['Message-ID']) ? $headers['Message-ID'] : $headers['Subject'],
                 'size' => strlen($msg),
                 'type' => 'message/rfc822',
                 'content' => $msg
-            ],
+            ];
+        }
+
+        $field['value'] = [
+            'new' => $new_values,
             'folder' => $form['folder'] ?? 'inbox'
         ];
 
@@ -212,7 +232,14 @@ class Hm_Handler_move_to_tracker extends Hm_Handler_Module
             'data' => [$field]
         ]);
 
-        Hm_Msgs::add('Message moved');
+        $total_msg_ids = count($msg_ids);
+        if ($errors > 0 && $errors < $total_msg_ids) {
+            Hm_Msgs::add('Some messages moved');
+        } else if ($total_msg_ids == $errors) {
+            Hm_Msgs::add('ERRUnable to move/copy selected messages');
+        } else {
+            Hm_Msgs::add('Messages moved');
+        }
 
         $smarty->loadPlugin('smarty_modifier_sefurl');
         $url = smarty_modifier_sefurl($item['itemId'], 'trackeritem');
@@ -697,34 +724,26 @@ class Hm_Output_add_move_to_trackers extends Hm_Output_Module
 {
     protected function output()
     {
-        $trk = TikiLib::lib('trk');
-        $fields = $trk->get_fields_by_type('EF');
-        if (! $fields) {
-            return;
-        }
-        $field_list = [];
-        foreach ($fields as $field) {
-            $tracker = $trk->get_tracker($field['trackerId']);
-            $handler = $trk->get_field_handler($field);
-            if ($handler->getOption('useFolders')) {
-                $folder_list = [];
-                foreach ($handler->getFolders() as $folder => $folderName) {
-                    $folder_list[] = "<div><a href='#' class='object_selector_trigger' data-tracker='{$field['trackerId']}' data-field='{$field['fieldId']}' data-folder='" . htmlspecialchars($folder) . "'>{$folderName}</a></div>";
-                }
-                $field_list[] = "<a href='#' class='tiki_folder_trigger'>{$tracker['name']} - {$field['name']}</a>"
-                    . "<div class='tiki_folder_container' style='display: none'>" . implode("\n", $folder_list) . "</div>";
-            } else {
-                $field_list[] = "<a href='#' class='object_selector_trigger' data-tracker='{$field['trackerId']}' data-field='{$field['fieldId']}' data-folder='inbox'>{$tracker['name']} - {$field['name']}</a>";
-            }
-        }
-        $res = "| <a class=\"hlink\" id=\"move_to_trackers\" href=\"#\">" . $this->trans('Trackers') . "</a>";
-        $res .= "<div class='move_to_trackers'><div class='move_to_title'>Move to trackers...<span><a class='close_move_to_trackers' href='#'>X</a></span></div>" . implode("<br>\n", $field_list) . "</div>";
+        $res = '| ' . tiki_move_to_tracker_dropdown($this);
         $headers = $this->get('msg_headers');
         $headers = preg_replace("#<a class=\"archive_link[^>]*>.*?</a>#", "\\0 " . $res, $headers);
         $this->out('msg_headers', $headers, false);
     }
 }
 
+/**
+ * Add move/copy dialog to the message list controls
+ * @subpackage imap/output
+ */
+class Hm_Output_add_multiple_move_to_trackers extends Hm_Output_Module
+{
+    protected function output()
+    {
+        $res = tiki_move_to_tracker_dropdown($this);
+        $this->concat('msg_controls_extra', $res);
+    }
+}
+
 /**
  * Forward handler vars to the frontend
  * @subpackage tiki/output



View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/6d4e684793f370bda7ea260fb0b4e9cdc49575a1

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/6d4e684793f370bda7ea260fb0b4e9cdc49575a1
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.