[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