From 843643b1bdcbf4aede7efd1570256128318e41b4 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Fri, 17 Jul 2015 18:25:02 +0200 Subject: [PATCH] Fix multi-folder search result sorting by arrival date (#1490450) --- CHANGELOG | 1 + program/lib/Roundcube/rcube_imap_generic.php | 85 ++++++++++++-------- 2 files changed, 52 insertions(+), 34 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index aba612cf9..7847106d5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,7 @@ CHANGELOG Roundcube Webmail - Fix so links with href == content aren't added to links list on html to text conversion (#1490434) - Fix handling of non-break spaces in html to text conversion (#1490436) - Fix self-reply detection issues (#1490439) +- Fix multi-folder search result sorting by arrival date (#1490450) RELEASE 1.1.2 ------------- diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 4118db5d3..7686b565a 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -2438,7 +2438,16 @@ class rcube_imap_generic return false; } - function sortHeaders($a, $field, $flag) + /** + * Sort messages by specified header field + * + * @param array $messages Array of rcube_message_header objects + * @param string $field Name of the property to sort by + * @param string $flag Sorting order (ASC|DESC) + * + * @return array Sorted input array + */ + public static function sortHeaders($messages, $field, $flag) { if (empty($field)) { $field = 'uid'; @@ -2447,57 +2456,65 @@ class rcube_imap_generic $field = strtolower($field); } - if ($field == 'date' || $field == 'internaldate') { - $field = 'timestamp'; - } - if (empty($flag)) { $flag = 'ASC'; - } else { + } + else { $flag = strtoupper($flag); } - $c = count($a); - if ($c > 0) { - // Strategy: - // First, we'll create an "index" array. - // Then, we'll use sort() on that array, - // and use that to sort the main array. + // Strategy: First, we'll create an "index" array. + // Then, we'll use sort() on that array, and use that to sort the main array. - // create "index" array - $index = array(); - reset($a); - while (list($key, $val) = each($a)) { - if ($field == 'timestamp') { - $data = $this->strToTime($val->date); - if (!$data) { - $data = $val->timestamp; - } - } else { - $data = $val->$field; - if (is_string($data)) { - $data = str_replace('"', '', $data); - if ($field == 'subject') { - $data = preg_replace('/^(Re: \s*|Fwd:\s*|Fw:\s*)+/i', '', $data); - } - $data = strtoupper($data); + $index = array(); + $result = array(); + + reset($messages); + + while (list($key, $headers) = each($messages)) { + $value = null; + + switch ($field) { + case 'arrival': + $field = 'internaldate'; + case 'date': + case 'internaldate': + case 'timestamp': + $value = self::strToTime($headers->$field); + if (!$value && $field != 'timestamp') { + $value = $headers->timestamp; + } + + break; + + default: + // @TODO: decode header value, convert to UTF-8 + $value = $headers->$field; + if (is_string($value)) { + $value = str_replace('"', '', $value); + if ($field == 'subject') { + $value = preg_replace('/^(Re:\s*|Fwd:\s*|Fw:\s*)+/i', '', $value); } + + $data = strtoupper($value); } - $index[$key] = $data; } + $index[$key] = $value; + } + + if (!empty($index)) { // sort index if ($flag == 'ASC') { asort($index); - } else { + } + else { arsort($index); } // form new array based on index - $result = array(); - reset($index); while (list($key, $val) = each($index)) { - $result[$key] = $a[$key]; + $result[$key] = $messages[$key]; } }