Thomas Bruederli
2014-04-18 26b5200322dbb1b52333f7e2db1c303ef0ace1f4
Consider search scope (and changes) for filter searches + disable folder operation commands in multi-folder search mode (#1485234)
4 files modified
52 ■■■■■ changed files
program/js/app.js 25 ●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_imap.php 4 ●●● patch | view | raw | blame | history
program/steps/mail/list.inc 3 ●●●● patch | view | raw | blame | history
program/steps/mail/search.inc 20 ●●●●● patch | view | raw | blame | history
program/js/app.js
@@ -1300,6 +1300,11 @@
    }
  };
  this.command_enabled = function(cmd)
  {
    return this.commands[cmd];
  }
  // lock/unlock interface
  this.set_busy = function(a, message, id)
  {
@@ -2193,6 +2198,7 @@
    // reset vars
    this.env.current_page = 1;
    this.env.search_filter = filter;
    this.http_request('search', this.search_params(false, filter), lock);
  };
@@ -4198,7 +4204,11 @@
      this.env.qsearch = {lock: lock, request: r};
      this.enable_command('set-listmode', this.env.threads && (this.env.search_scope || 'base') == 'base');
      return true;
    }
    return false;
  };
  // build URL params for search
@@ -4262,8 +4272,9 @@
    // re-send search query with new scope
    if (scope != old && this.env.search_request) {
      this.qsearch(this.gui_objects.qsearchbox.value);
      if (scope == 'base')
      if (!this.qsearch(this.gui_objects.qsearchbox.value) && this.env.search_filter && this.env.search_filter != 'ALL')
        this.filter_mailbox(this.env.search_filter);
      if (scope != 'all')
        this.select_folder(this.env.mailbox, '', true);
    }
  };
@@ -7066,11 +7077,13 @@
        this.env.qsearch = null;
      case 'list':
        if (this.task == 'mail') {
          var is_multifolder = this.is_multifolder_listing();
          this.enable_command('show', 'select-all', 'select-none', this.env.messagecount > 0);
          this.enable_command('expunge', this.env.exists);
          this.enable_command('purge', this.purge_mailbox_test());
          this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount);
          this.enable_command('set-listmode', this.env.threads && !this.is_multifolder_listing());
          this.enable_command('expunge', this.env.exists && !is_multifolder);
          this.enable_command('purge', this.purge_mailbox_test() && !is_multifolder);
          this.enable_command('import-messages', !is_multifolder);
          this.enable_command('expand-all', 'expand-unread', 'collapse-all', this.env.threading && this.env.messagecount && !is_multifolder);
          this.enable_command('set-listmode', this.env.threads && !is_multifolder);
          if ((response.action == 'list' || response.action == 'search') && this.message_list) {
            this.msglist_select(this.message_list);
program/lib/Roundcube/rcube_imap.php
@@ -1492,7 +1492,7 @@
     * @param  string  $str        Search criteria
     * @param  string  $charset    Search charset
     * @param  string  $sort_field Header field to sort by
     *
     * @return rcube_result_index  Search result object
     * @todo: Search criteria should be provided in non-IMAP format, eg. array
     */
    public function search($folder='', $str='ALL', $charset=NULL, $sort_field=NULL)
@@ -1531,6 +1531,8 @@
        $this->set_search_set(array($str, $results, $charset, $sort_field,
            $this->threading || $this->search_sorted ? true : false));
        return $results;
    }
program/steps/mail/list.inc
@@ -60,11 +60,12 @@
// initialize searching result if search_filter is used
if ($_SESSION['search_filter'] && $_SESSION['search_filter'] != 'ALL') {
  $search_request = md5($mbox_name.$_SESSION['search_filter']);
  $search_request = md5($mbox_name.$_SESSION['search_scope'].$_SESSION['search_filter']);
  $RCMAIL->storage->search($mbox_name, $_SESSION['search_filter'], RCUBE_CHARSET, rcmail_sort_column());
  $_SESSION['search'] = $RCMAIL->storage->get_search_set();
  $_SESSION['search_request'] = $search_request;
  $OUTPUT->set_env('search_request', $search_request);
  $OUTPUT->set_env('search_filter', $_SESSION['search_filter']);
}
// fetch message headers
program/steps/mail/search.inc
@@ -41,7 +41,7 @@
$subject = array();
$filter         = trim($filter);
$search_request = md5($mbox.$filter.$str);
$search_request = md5($mbox.$scope.$filter.$str);
// add list filter string
$search_str = $filter && $filter != 'ALL' ? $filter : '';
@@ -105,7 +105,13 @@
    foreach ($subject as $sub) {
        $search_str .= ' ' . $sub . ' ' . rcube_imap_generic::escape($search);
    }
}
$search_str  = trim($search_str);
$sort_column = rcmail_sort_column();
// execute IMAP search
if ($search_str) {
    // search all, current or subfolders folders
    if ($scope == 'all') {
        $mboxes = $RCMAIL->storage->list_folders_subscribed('', '*', 'mail', null, true);
@@ -116,14 +122,8 @@
        if ($mbox != 'INBOX' && $mboxes[0] == 'INBOX')
            array_shift($mboxes);
    }
}
$search_str  = trim($search_str);
$sort_column = rcmail_sort_column();
// execute IMAP search
if ($search_str) {
    $RCMAIL->storage->search($mboxes, $search_str, $imap_charset, $sort_column);
    $result = $RCMAIL->storage->search($mboxes, $search_str, $imap_charset, $sort_column);
}
// Get the headers
@@ -162,10 +162,14 @@
}
else {
    $OUTPUT->show_message('searchnomatch', 'notice');
    $OUTPUT->set_env('multifolder_listing', (bool)$result->multi);
    if ($result->multi && $scope == 'all')
        $OUTPUT->command('select_folder', '');
}
// update message count display
$OUTPUT->set_env('search_request', $search_str ? $search_request : '');
$OUTPUT->set_env('search_filter', $_SESSION['search_filter']);
$OUTPUT->set_env('threading', $RCMAIL->storage->get_threading());
$OUTPUT->set_env('messagecount', $count);
$OUTPUT->set_env('pagecount', ceil($count/$RCMAIL->storage->get_pagesize()));