Consider search scope (and changes) for filter searches + disable folder operation commands in multi-folder search mode (#1485234)
| | |
| | | } |
| | | }; |
| | | |
| | | this.command_enabled = function(cmd) |
| | | { |
| | | return this.commands[cmd]; |
| | | } |
| | | |
| | | // lock/unlock interface |
| | | this.set_busy = function(a, message, id) |
| | | { |
| | |
| | | |
| | | // reset vars |
| | | this.env.current_page = 1; |
| | | this.env.search_filter = filter; |
| | | this.http_request('search', this.search_params(false, filter), lock); |
| | | }; |
| | | |
| | |
| | | |
| | | 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 |
| | |
| | | |
| | | // 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); |
| | | } |
| | | }; |
| | |
| | | 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); |
| | |
| | | * @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) |
| | |
| | | |
| | | $this->set_search_set(array($str, $results, $charset, $sort_field, |
| | | $this->threading || $this->search_sorted ? true : false)); |
| | | |
| | | return $results; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | // 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 |
| | |
| | | $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 : ''; |
| | |
| | | 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); |
| | |
| | | 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 |
| | |
| | | } |
| | | 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())); |