From 74b942c932a17e00064e2d8851ffb2b965c4dceb Mon Sep 17 00:00:00 2001 From: christer kahasha <62720246+christer77@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:02:37 +0200 Subject: [PATCH] [ENH]message list: Preview of message when viewing message list --- modules/core/message_list_functions.php | 12 ++++++-- modules/imap/functions.php | 9 ++++-- modules/imap/handler_modules.php | 13 ++++++-- modules/imap/hm-imap.php | 30 +++++++++++++++---- modules/imap/output_modules.php | 15 ++++++++++ modules/imap/setup.php | 3 ++ modules/imap/site.js | 2 +- .../modules/core/message_list_functions.php | 4 +-- 8 files changed, 73 insertions(+), 15 deletions(-) diff --git a/modules/core/message_list_functions.php b/modules/core/message_list_functions.php index eac7e95a2f..793bc398d9 100644 --- a/modules/core/message_list_functions.php +++ b/modules/core/message_list_functions.php @@ -295,15 +295,21 @@ function checkbox_callback($vals, $style, $output_mod) { if (!hm_exists('subject_callback')) { function subject_callback($vals, $style, $output_mod) { $img = ''; - if (count($vals) == 4 && $vals[3]) { + $subject = ''; + $preview_msg = ''; + if (isset($vals[3]) && $vals[3]) { $img = ''; } $subject = $output_mod->html_safe($vals[0]); + if (isset($vals[4]) && $vals[4]) { + $preview_msg = $output_mod->html_safe($vals[4]); + } + $hl_subject = preg_replace("/^(\[[^\]]+\])/", '$1', $subject); if ($style == 'news') { - return sprintf('
%s %s
', $output_mod->html_safe(implode(' ', $vals[2])), $subject, $img, $output_mod->html_safe($vals[1]), $hl_subject); + return sprintf('
%s %s

%s

', $output_mod->html_safe(implode(' ', $vals[2])), $subject, $img, $output_mod->html_safe($vals[1]), $hl_subject, $preview_msg); } - return sprintf('
%s
', $output_mod->html_safe(implode(' ', $vals[2])), $subject, $output_mod->html_safe($vals[1]), $hl_subject); + return sprintf('
%s

%s

', $output_mod->html_safe(implode(' ', $vals[2])), $subject, $output_mod->html_safe($vals[1]), $hl_subject, $preview_msg); }} /** diff --git a/modules/imap/functions.php b/modules/imap/functions.php index 107f95daec..6114af9cd2 100644 --- a/modules/imap/functions.php +++ b/modules/imap/functions.php @@ -216,6 +216,11 @@ function format_imap_message_list($msg_list, $output_module, $parent_list=false, $msg['subject'] = '[No Subject]'; } $subject = $msg['subject']; + $preview_msg = ""; + if (isset($msg['preview_msg'])) { + $preview_msg = $msg['preview_msg']; + } + if ($parent_list == 'sent') { $icon = 'sent'; $from = $msg['to']; @@ -291,7 +296,7 @@ function format_imap_message_list($msg_list, $output_module, $parent_list=false, $res[$id] = message_list_row(array( array('checkbox_callback', $id), array('icon_callback', $flags), - array('subject_callback', $subject, $url, $flags, $icon), + array('subject_callback', $subject, $url, $flags, $icon, $preview_msg), array('safe_output_callback', 'source', $source), array('safe_output_callback', 'from'.$nofrom, $from, null, str_replace(array($from, '<', '>'), '', $msg['from'])), array('date_callback', $date, $timestamp), @@ -307,7 +312,7 @@ function format_imap_message_list($msg_list, $output_module, $parent_list=false, array('checkbox_callback', $id), array('safe_output_callback', 'source', $source, $icon), array('safe_output_callback', 'from'.$nofrom, $from, null, str_replace(array($from, '<', '>'), '', $msg['from'])), - array('subject_callback', $subject, $url, $flags), + array('subject_callback', $subject, $url, $flags, null, $preview_msg), array('date_callback', $date, $timestamp, $is_snoozed), array('icon_callback', $flags) ), diff --git a/modules/imap/handler_modules.php b/modules/imap/handler_modules.php index 9008f4e99a..4df0528904 100644 --- a/modules/imap/handler_modules.php +++ b/modules/imap/handler_modules.php @@ -819,6 +819,7 @@ public function process() { $offset = 0; $msgs = array(); $list_page = 1; + $include_preview = $this->user_config->get('active_preview_message_setting', false); list($success, $form) = $this->process_form(array('imap_server_id', 'folder')); if ($success) { @@ -844,9 +845,9 @@ public function process() { $existingEmails = array_map(function($c){ return $c->value('email_address'); },$contact_list); - list($total, $results) = $imap->get_mailbox_page(hex2bin($form['folder']), $sort, $rev, $filter, $offset, $limit, $keyword, $existingEmails); + list($total, $results) = $imap->get_mailbox_page(hex2bin($form['folder']), $sort, $rev, $filter, $offset, $limit, $keyword, $existingEmails, $include_preview); } else { - list($total, $results) = $imap->get_mailbox_page(hex2bin($form['folder']), $sort, $rev, $filter, $offset, $limit, $keyword); + list($total, $results) = $imap->get_mailbox_page(hex2bin($form['folder']), $sort, $rev, $filter, $offset, $limit, $keyword, null, $include_preview); } foreach ($results as $msg) { $msg['server_id'] = $form['imap_server_id']; @@ -2191,3 +2192,11 @@ function process_move_messages_in_screen_email_enabled_callback($val) { return $ process_site_setting('move_messages_in_screen_email', $this, 'process_move_messages_in_screen_email_enabled_callback', true, true); } } +class Hm_Handler_process_setting_active_preview_message extends Hm_Handler_Module { + public function process() { + function process_active_preview_message_callback($val) { return $val; } + process_site_setting('active_preview_message', $this, 'process_active_preview_message_callback', true, true); + } +} + + diff --git a/modules/imap/hm-imap.php b/modules/imap/hm-imap.php index 26fb8cfe78..fda5ce42e9 100644 --- a/modules/imap/hm-imap.php +++ b/modules/imap/hm-imap.php @@ -761,7 +761,7 @@ public function poll() { * @param bool $raw flag to disable decoding header values * @return array list of headers and values for the specified uids */ - public function get_message_list($uids, $raw=false) { + public function get_message_list($uids, $raw=false, $include_preview = false) { if (is_array($uids)) { sort($uids); $sorted_string = implode(',', $uids); @@ -776,7 +776,11 @@ public function get_message_list($uids, $raw=false) { if ($this->is_supported( 'X-GM-EXT-1' )) { $command .= 'X-GM-MSGID X-GM-THRID X-GM-LABELS '; } - $command .= "BODY.PEEK[HEADER.FIELDS (SUBJECT X-AUTO-BCC FROM DATE CONTENT-TYPE X-PRIORITY TO LIST-ARCHIVE REFERENCES MESSAGE-ID X-SNOOZED)])\r\n"; + $command .= "BODY.PEEK[HEADER.FIELDS (SUBJECT X-AUTO-BCC FROM DATE CONTENT-TYPE X-PRIORITY TO LIST-ARCHIVE REFERENCES MESSAGE-ID X-SNOOZED)]"; + if ($include_preview) { + $command .= " BODY[0.1]"; + } + $command .= ")\r\n"; $cache_command = $command.(string)$raw; $cache = $this->check_cache($cache_command); if ($cache !== false) { @@ -787,8 +791,9 @@ public function get_message_list($uids, $raw=false) { $status = $this->check_response($res, true); $tags = array('X-GM-MSGID' => 'google_msg_id', 'X-GM-THRID' => 'google_thread_id', 'X-GM-LABELS' => 'google_labels', 'UID' => 'uid', 'FLAGS' => 'flags', 'RFC822.SIZE' => 'size', 'INTERNALDATE' => 'internal_date'); $junk = array('X-AUTO-BCC', 'MESSAGE-ID', 'REFERENCES', 'X-SNOOZED', 'LIST-ARCHIVE', 'SUBJECT', 'FROM', 'CONTENT-TYPE', 'TO', '(', ')', ']', 'X-PRIORITY', 'DATE'); - $flds = array('x-auto-bcc' => 'x_auto_bcc', 'message-id' => 'message_id', 'references' => 'references', 'x-snoozed' => 'x_snoozed', 'list-archive' => 'list_archive', 'date' => 'date', 'from' => 'from', 'to' => 'to', 'subject' => 'subject', 'content-type' => 'content_type', 'x-priority' => 'x_priority'); + $flds = array('x-auto-bcc' => 'x_auto_bcc', 'message-id' => 'message_id', 'references' => 'references', 'x-snoozed' => 'x_snoozed', 'list-archive' => 'list_archive', 'date' => 'date', 'from' => 'from', 'to' => 'to', 'subject' => 'subject', 'content-type' => 'content_type', 'x-priority' => 'x_priority', 'body' => 'content_body'); $headers = array(); + foreach ($res as $n => $vals) { if (isset($vals[0]) && $vals[0] == '*') { $uid = 0; @@ -812,6 +817,7 @@ public function get_message_list($uids, $raw=false) { $count = count($vals); for ($i=0;$i<$count;$i++) { if ($vals[$i] == 'BODY[HEADER.FIELDS') { + $i++; while(isset($vals[$i]) && in_array(mb_strtoupper($vals[$i]), $junk)) { $i++; @@ -829,6 +835,17 @@ public function get_message_list($uids, $raw=false) { } } } + elseif ($vals[$i] == 'BODY[0.1') { + $content = ''; + $i++; + $i++; + while(isset($vals[$i]) && $vals[$i] != ')') { + $content .= $vals[$i]; + $i++; + } + $i++; + $flds['body'] = $content; + } elseif (isset($tags[mb_strtoupper($vals[$i])])) { if (isset($vals[($i + 1)])) { if (($tags[mb_strtoupper($vals[$i])] == 'flags' || $tags[mb_strtoupper($vals[$i])] == 'google_labels' ) && $vals[$i + 1] == '(') { @@ -846,6 +863,7 @@ public function get_message_list($uids, $raw=false) { } } } + if ($uid) { $cset = ''; if (mb_stristr($content_type, 'charset=')) { @@ -859,6 +877,7 @@ public function get_message_list($uids, $raw=false) { 'google_thread_id' => $google_thread_id, 'google_labels' => $google_labels, 'list_archive' => $list_archive, 'references' => $references, 'message_id' => $message_id, 'x_auto_bcc' => $x_auto_bcc, 'x_snoozed' => $x_snoozed); + $headers[$uid]['preview_msg'] = $flds['body'] != "content_body" ? $flds['body'] : ""; if ($raw) { $headers[$uid] = array_map('trim', $headers[$uid]); @@ -867,6 +886,7 @@ public function get_message_list($uids, $raw=false) { $headers[$uid] = array_map(array($this, 'decode_fld'), $headers[$uid]); } + } } } @@ -2141,7 +2161,7 @@ public function get_first_message_part($uid, $type, $subtype=false, $struct=fals * @return array list of headers */ - public function get_mailbox_page($mailbox, $sort, $rev, $filter, $offset=0, $limit=0, $keyword=false, $trusted_senders=array()) { + public function get_mailbox_page($mailbox, $sort, $rev, $filter, $offset=0, $limit=0, $keyword=false, $trusted_senders=array(), $include_preview = false) { $result = array(); /* select the mailbox if need be */ @@ -2181,7 +2201,7 @@ public function get_mailbox_page($mailbox, $sort, $rev, $filter, $offset=0, $lim /* get the headers and build a result array by UID */ if (!empty($uids)) { - $headers = $this->get_message_list($uids); + $headers = $this->get_message_list($uids, false, $include_preview); foreach($uids as $uid) { if (isset($headers[$uid])) { $result[$uid] = $headers[$uid]; diff --git a/modules/imap/output_modules.php b/modules/imap/output_modules.php index c1190f2481..cc8a3eb113 100644 --- a/modules/imap/output_modules.php +++ b/modules/imap/output_modules.php @@ -1463,3 +1463,18 @@ protected function output() { return $res; } } +class Hm_Output_setting_active_preview_message extends Hm_Output_Module { + protected function output() { + $settings = $this->get('user_settings', array()); + $checked = ""; + if (array_key_exists('active_preview_message', $settings) && $settings['active_preview_message']) { + if ($settings['active_preview_message']) { + $checked = "checked"; + } + } + $res = ''; + return $res; + } +} + diff --git a/modules/imap/setup.php b/modules/imap/setup.php index 5056817aba..b5b99cf0e6 100644 --- a/modules/imap/setup.php +++ b/modules/imap/setup.php @@ -45,6 +45,7 @@ add_handler('settings', 'process_auto_advance_email_setting', true, 'imap', 'date', 'after'); add_handler('settings', 'process_first_time_screen_emails_per_page_setting', true, 'imap', 'date', 'after'); add_handler('settings', 'process_setting_move_messages_in_screen_email', true, 'imap', 'process_first_time_screen_emails_per_page_setting', 'after'); +add_handler('settings', 'process_setting_active_preview_message', true, 'imap', 'process_setting_move_messages_in_screen_email', 'after'); add_output('settings', 'imap_server_ids', true, 'imap', 'page_js', 'before'); add_output('settings', 'start_sent_settings', true, 'imap', 'end_settings_form', 'before'); add_output('settings', 'sent_since_setting', true, 'imap', 'start_sent_settings', 'after'); @@ -62,6 +63,7 @@ add_output('settings', 'imap_auto_advance_email', true, 'imap', 'imap_pagination_links', 'after'); add_output('settings', 'first_time_screen_emails_per_page_setting', true, 'imap', 'imap_auto_advance_email', 'after'); add_output('settings', 'setting_move_messages_in_screen_email', true, 'imap', 'first_time_screen_emails_per_page_setting', 'after'); +add_output('settings', 'setting_active_preview_message', true, 'imap', 'setting_move_messages_in_screen_email', 'after'); /* compose page data */ add_output('compose', 'imap_server_ids', true, 'imap', 'page_js', 'before'); @@ -437,5 +439,6 @@ 'tag_id' => FILTER_DEFAULT, 'first_time_screen_emails' => FILTER_VALIDATE_INT, 'move_messages_in_screen_email' => FILTER_VALIDATE_BOOLEAN, + 'active_preview_message' => FILTER_VALIDATE_BOOLEAN, ) ); diff --git a/modules/imap/site.js b/modules/imap/site.js index 5017f139dc..0723c1e1a7 100644 --- a/modules/imap/site.js +++ b/modules/imap/site.js @@ -1378,7 +1378,7 @@ var add_email_in_contact_trusted = function(list_email) { } ); } - }; +}; $('.screen-email-unlike').on("click", function() { imap_screen_email(); return false; }); diff --git a/tests/phpunit/modules/core/message_list_functions.php b/tests/phpunit/modules/core/message_list_functions.php index f27acb3ffb..9d8330ec35 100644 --- a/tests/phpunit/modules/core/message_list_functions.php +++ b/tests/phpunit/modules/core/message_list_functions.php @@ -80,8 +80,8 @@ public function test_checkbox_callback() { */ public function test_subject_callback() { $mod = new Hm_Output_Test(array('foo' => 'bar', 'bar' => 'foo'), array('bar')); - $this->assertEquals('
foo
', subject_callback(array('foo', 'bar', array()), 'email', $mod)); - $this->assertEquals('
foo
', subject_callback(array('foo', 'bar', array(), 'code'), 'news', $mod)); + $this->assertEquals('
foo

', subject_callback(array('foo', 'bar', array()), 'email', $mod)); + $this->assertEquals('
foo

', subject_callback(array('foo', 'bar', array(), 'code'), 'news', $mod)); } /** * @preserveGlobalState disabled