From 26b5200322dbb1b52333f7e2db1c303ef0ace1f4 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Fri, 18 Apr 2014 10:39:41 -0400
Subject: [PATCH] Consider search scope (and changes) for filter searches + disable folder operation commands in multi-folder search mode (#1485234)

---
 program/steps/mail/list.inc          |    3 ++-
 program/steps/mail/search.inc        |   20 ++++++++++++--------
 program/lib/Roundcube/rcube_imap.php |    4 +++-
 program/js/app.js                    |   25 +++++++++++++++++++------
 4 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 4a52000..48ec996 100644
--- a/program/js/app.js
+++ b/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);
diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php
index baca052..b3ae960 100644
--- a/program/lib/Roundcube/rcube_imap.php
+++ b/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;
     }
 
 
diff --git a/program/steps/mail/list.inc b/program/steps/mail/list.inc
index 36c79fb..c4a6df5 100644
--- a/program/steps/mail/list.inc
+++ b/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
diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc
index c97e3ac..813e8c4 100644
--- a/program/steps/mail/search.inc
+++ b/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()));

--
Gitblit v1.9.1