summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2014-01-16 14:17:08 +0100
committerThomas Bruederli <thomas@roundcube.net>2014-01-16 14:17:08 +0100
commit2baeac116abef9d5bcb748c687577d16dce868a0 (patch)
tree448611cf8b0fdc435d6456350b6f831cb6fdbb92
parent25a244908b21b097f744c7194e4862ca6ebda391 (diff)
Fix sorting and paging in cross-folder searches
-rw-r--r--program/lib/Roundcube/rcube_imap.php4
-rw-r--r--program/steps/mail/list.inc16
-rw-r--r--program/steps/mail/search.inc44
3 files changed, 31 insertions, 33 deletions
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index 0cf34b2ca..e265946f2 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/program/lib/Roundcube/rcube_imap.php
@@ -952,7 +952,7 @@ class rcube_imap extends rcube_storage
$search_set = $this->search_set;
$this->sort_field = null;
- $this->page_size = 100; // limit to 100 messages per folder
+ $this->page_size = 1000; // fetch up to 1000 matching messages per folder
$a_msg_headers = array();
foreach ($search_set->sets as $resultset) {
@@ -970,7 +970,7 @@ class rcube_imap extends rcube_storage
// sort headers
if (!$this->threading && !empty($a_msg_headers)) {
- $a_msg_headers = $this->conn->sortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
+ $a_msg_headers = $this->conn->sortHeaders($a_msg_headers, $sort_field, $this->sort_order);
}
// only return the requested part of the set
diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc
index 277564c38..4b2a955b7 100644
--- a/program/steps/mail/list.inc
+++ b/program/steps/mail/list.inc
@@ -75,6 +75,22 @@ if (!empty($_REQUEST['_search']) && isset($_SESSION['search'])
&& $_SESSION['search_request'] == $_REQUEST['_search']
) {
$_SESSION['search'] = $RCMAIL->storage->get_search_set();
+
+ // multi-folder search
+ if ($_SESSION['search'][1]->multi) {
+ if (empty($cols))
+ $cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
+ if (!in_array('folder', $cols))
+ $cols[] = 'folder'; // Add 'folder' column to list
+
+ // make message UIDs unique by appending the folder name
+ foreach ($a_headers as $i => $header) {
+ $header->uid .= '-'.$header->folder;
+ $header->flags['skip_mbox_check'] = true;
+ if ($header->parent_uid)
+ $header->parent_uid .= '-'.$header->folder;
+ }
+ }
}
// remove old search data
else if (empty($_REQUEST['_search']) && isset($_SESSION['search'])) {
diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc
index 67fee755d..5ce9fe6e2 100644
--- a/program/steps/mail/search.inc
+++ b/program/steps/mail/search.inc
@@ -111,7 +111,7 @@ $mboxes = $RCMAIL->storage->list_folders_subscribed('', '*', 'mail');
// execute IMAP search
if ($search_str) {
- $RCMAIL->storage->search($mbox, $search_str, $imap_charset, $sort_column);
+ $RCMAIL->storage->search($mboxes, $search_str, $imap_charset, $sort_column);
}
// save search results in session
@@ -125,43 +125,25 @@ if ($search_str) {
}
$_SESSION['search_request'] = $search_request;
-
// Get the headers
$result_h = $RCMAIL->storage->list_messages($mbox, 1, $sort_column, rcmail_sort_order());
$count = $RCMAIL->storage->count($mbox, $RCMAIL->storage->get_threading() ? 'THREADS' : 'ALL');
// Add 'folder' column to list
if ($_SESSION['search'][1]->multi) {
- $a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
- if (!in_array('folder', $a_show_cols))
- $a_show_cols[] = 'folder';
-
- // make message UIDs unique by appending the folder name
- foreach ($result_h as $i => $header) {
- $header->uid .= '-'.$header->folder;
- $header->flags['skip_mbox_check'] = true;
- if ($header->parent_uid)
- $header->parent_uid .= '-'.$header->folder;
- }
-
- $OUTPUT->command('select_folder', '');
-}
+ $a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
+ if (!in_array('folder', $a_show_cols))
+ $a_show_cols[] = 'folder';
+
+ // make message UIDs unique by appending the folder name
+ foreach ($result_h as $i => $header) {
+ $header->uid .= '-'.$header->folder;
+ $header->flags['skip_mbox_check'] = true;
+ if ($header->parent_uid)
+ $header->parent_uid .= '-'.$header->folder;
+ }
-// Add 'folder' column to list
-if ($_SESSION['search'][1]->multi) {
- $a_show_cols = $_SESSION['list_attrib']['columns'] ? $_SESSION['list_attrib']['columns'] : (array)$CONFIG['list_cols'];
- if (!in_array('folder', $a_show_cols))
- $a_show_cols[] = 'folder';
-
- // make message UIDs unique by appending the folder name
- foreach ($result_h as $i => $header) {
- $header->uid .= '-'.$header->folder;
- $header->flags['skip_mbox_check'] = true;
- if ($header->parent_uid)
- $header->parent_uid .= '-'.$header->folder;
- }
-
- $OUTPUT->command('select_folder', '');
+ $OUTPUT->command('select_folder', '');
}
// Make sure we got the headers