From 26b5200322dbb1b52333f7e2db1c303ef0ace1f4 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 18 Apr 2014 16:39:41 +0200 Subject: Consider search scope (and changes) for filter searches + disable folder operation commands in multi-folder search mode (#1485234) --- program/js/app.js | 25 +++++++++++++++++++------ program/lib/Roundcube/rcube_imap.php | 4 +++- program/steps/mail/list.inc | 3 ++- program/steps/mail/search.inc | 20 ++++++++++++-------- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 4a5200028..48ec99615 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -1300,6 +1300,11 @@ function rcube_webmail() } }; + this.command_enabled = function(cmd) + { + return this.commands[cmd]; + } + // lock/unlock interface this.set_busy = function(a, message, id) { @@ -2193,6 +2198,7 @@ function rcube_webmail() // 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 @@ function rcube_webmail() 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 @@ function rcube_webmail() // 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 @@ function rcube_webmail() 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); diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index baca052b8..b3ae9608c 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -1492,7 +1492,7 @@ class rcube_imap extends rcube_storage * @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 @@ class rcube_imap extends rcube_storage $this->set_search_set(array($str, $results, $charset, $sort_field, $this->threading || $this->search_sorted ? true : false)); + + return $results; } diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc index 36c79fb29..c4a6df57b 100644 --- a/program/steps/mail/list.inc +++ b/program/steps/mail/list.inc @@ -60,11 +60,12 @@ $RCMAIL->storage->folder_sync($mbox_name); // 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 diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc index c97e3ac5a..813e8c492 100644 --- a/program/steps/mail/search.inc +++ b/program/steps/mail/search.inc @@ -41,7 +41,7 @@ $scope = rcube_utils::get_input_value('_scope', rcube_utils::INPUT_GET); $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 @@ if (!empty($subject)) { 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 (!empty($subject)) { 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 if ($err_code = $RCMAIL->storage->get_error_code()) { } 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())); -- cgit v1.2.3