Thomas Bruederli
2014-01-16 2baeac116abef9d5bcb748c687577d16dce868a0
Fix sorting and paging in cross-folder searches
3 files modified
62 ■■■■ changed files
program/lib/Roundcube/rcube_imap.php 4 ●●●● patch | view | raw | blame | history
program/steps/mail/list.inc 16 ●●●●● patch | view | raw | blame | history
program/steps/mail/search.inc 42 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap.php
@@ -952,7 +952,7 @@
            $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 @@
            // 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
program/steps/mail/list.inc
@@ -75,6 +75,22 @@
    && $_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'])) {
program/steps/mail/search.inc
@@ -111,7 +111,7 @@
// 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 @@
}
$_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';
    $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;
  }
    // 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', '');
}
// 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