Add quick flag filtering to DIMP
authorMichael M Slusarz <slusarz@curecanti.org>
Wed, 21 Oct 2009 05:15:18 +0000 (23:15 -0600)
committerMichael M Slusarz <slusarz@curecanti.org>
Wed, 21 Oct 2009 05:15:35 +0000 (23:15 -0600)
imp/ajax.php
imp/docs/CHANGES
imp/js/DimpBase.js
imp/lib/Search.php
imp/lib/Views/ListMessages.php
imp/templates/index/index-dimp.inc
imp/templates/javascript_defs_dimp.php

index 9e280dd..ab57a67 100644 (file)
@@ -58,11 +58,7 @@ function _changed($mbox, $compare, $rw = null)
     }
 
     $imp_mailbox = IMP_Mailbox::singleton($mbox);
-    if ($imp_mailbox->getCacheID($mbox) != $compare) {
-        return true;
-    }
-
-    return false;
+    return ($imp_mailbox->getCacheID($mbox) != $compare);
 }
 
 function _getListMessages($mbox, $change)
@@ -75,7 +71,9 @@ function _getListMessages($mbox, $change)
         'mbox' => $mbox,
         'rangeslice' => Horde_Util::getPost('rangeslice'),
         'qsearch' => Horde_Util::getPost('qsearch'),
+        'qsearchflag' => Horde_Util::getPost('qsearchflag'),
         'qsearchmbox' => Horde_Util::getPost('qsearchmbox'),
+        'qsearchflagnot' => Horde_Util::getPost('qsearchflagnot')
     );
 
     $search = Horde_Util::getPost('search');
index 53af983..7411b4b 100644 (file)
@@ -2,6 +2,7 @@
 v5.0-git
 --------
 
+[mms] Add ability to quickly filter by flags in DIMP.
 [mms] Add ability to select sent-mail mailbox when composing in DIMP.
 [mms] Add ability to save drafts in MIMP.
 [mms] Add spam reporting in MIMP.
@@ -13,7 +14,7 @@ v5.0-git
 [mms] Add ability to search by a custom defined header (Request #6875).
 [mms] Improved advanced search query interface (Request #6875).
 [mms] More intelligent ordering of autocomplete search results.
-[mms] Add a mini search query interface (Request #6875).
+[mms] Add a mini search query interface to IMP (Request #6875).
 [mms] Make DIMP quicksearch field selection persist across sessions.
 [mms] Move JS/CSS caching to Horde framework.
 [mms] Add simple search function to MIMP.
index ffdf0c1..d80566a 100644 (file)
@@ -9,7 +9,7 @@
 
 var DimpBase = {
     // Vars used and defaulting to null/false:
-    //   cfolderaction, folder, folderswitch, offset, pollPE, pp, sfolder,
+    //   cfolderaction, folder, folderswitch, offset, pollPE, pp, search,
     //   uid, viewport
     // message_list_template set via js/mailbox-dimp.js
     bcache: $H(),
@@ -229,14 +229,12 @@ var DimpBase = {
                 }
 
                 // This catches the refresh case - no need to re-add to history
-                if (!Object.isUndefined(this.folder) && !this.sfolder) {
+                if (!Object.isUndefined(this.folder) && !this.search) {
                     this._addHistory(loc);
                 }
 
-                if (this.isSearch(f) && !this.sfolder) {
-                    this._quicksearchDeactivate();
-                }
             }
+
             this.loadMailbox(f);
             return;
         }
@@ -384,6 +382,11 @@ var DimpBase = {
                 $('msgHeader').update();
                 this.folderswitch = true;
                 this.folder = f;
+
+                if (this.isSearch(f) &&
+                    (!this.search || this.search.flag)) {
+                    this._quicksearchDeactivate(!this.search);
+                }
             }
         }
 
@@ -412,12 +415,15 @@ var DimpBase = {
 
             // Callbacks
             onAjaxRequest: function(id) {
-                var p = this.isSearch(id, true) && $('qsearch_input').visible()
-                    ? $H({
-                        qsearch: $F('qsearch_input'),
-                        qsearchmbox: this.sfolder
-                    })
-                    : $H();
+                var p = $H();
+                if (this.isSearch(id, true) && $('qsearch_input').visible()) {
+                    p.set('qsearchmbox', this.search.mbox);
+                    if (this.search.flag) {
+                        p.update({ qsearchflag: this.search.flag, qsearchflagnot: Number(this.search.not) });
+                    } else {
+                        p.set('qsearch', $F('qsearch_input'));
+                    }
+                }
                 return DimpCore.addRequestParams(p);
             }.bind(this),
             onAjaxResponse: DimpCore.doActionComplete.bind(DimpCore),
@@ -548,7 +554,7 @@ var DimpBase = {
                 l = this.viewport.getMetaData('label');
                 if (l) {
                     if (this.isSearch(null, true)) {
-                        l += ' (' + this.sfolder + ')';
+                        l += ' (' + this.search.mbox + ')';
                     }
                     $('folderName').update(l);
                 }
@@ -816,6 +822,13 @@ var DimpBase = {
             if (menu.endsWith('_setflag') || menu.endsWith('_unsetflag')) {
                 flag = elt.readAttribute('flag');
                 this.flag(flag, this.convertFlag(flag, menu.endsWith('_setflag')));
+            } else if (menu.endsWith('_filter') || menu.endsWith('_filternot')) {
+                this.search = {
+                    flag: elt.readAttribute('flag'),
+                    mbox: this.folder,
+                    not: menu.endsWith('_filternot')
+                };
+                this.loadMailbox(DIMP.conf.fsearchid);
             } else {
                 parentfunc(elt, baseelt, menu);
             }
@@ -903,7 +916,7 @@ var DimpBase = {
             label = this.viewport.getMetaData('label');
 
         if (this.isSearch(null, true)) {
-            label += ' (' + this.sfolder + ')';
+            label += ' (' + this.search.mbox + ')';
         } else {
             elt = $(this.getFolderId(this.folder));
             if (elt) {
@@ -1343,7 +1356,7 @@ var DimpBase = {
     isSearch: function(id, qsearch)
     {
         id = id ? id : this.folder;
-        return id && id.startsWith(DIMP.conf.searchprefix) && (!qsearch || this.sfolder);
+        return id && id.startsWith(DIMP.conf.searchprefix) && (!qsearch || this.search);
     },
 
     _quicksearchOnBlur: function()
@@ -1359,7 +1372,7 @@ var DimpBase = {
         if (this.isSearch()) {
             this.viewport.reload();
         } else {
-            this.sfolder = this.folder;
+            this.search = { mbox: this.folder };
             this.loadMailbox(DIMP.conf.qsearchid);
         }
     },
@@ -1376,12 +1389,12 @@ var DimpBase = {
         if (this.isSearch()) {
             DimpCore.DMenu.disable('qsearch_icon', true, false);
             this.resetSelected();
-            $('qsearch_input').show();
+            $('qsearch', 'qsearch_input').invoke('show');
             if (!noload) {
-                this.loadMailbox(this.sfolder || 'INBOX');
+                this.loadMailbox(this.search ? this.search.mbox : 'INBOX');
             }
             this.viewport.deleteView(f);
-            this.sfolder = null;
+            this.search = null;
         }
     },
 
@@ -1390,13 +1403,20 @@ var DimpBase = {
     {
         $('qsearch_input').setValue(d ? DIMP.text.search + ' (' + $('ctx_qsearchby_' + DIMP.conf.qsearchfield).getText() + ')' : '');
         [ $('qsearch') ].invoke(d ? 'removeClassName' : 'addClassName', 'qsearchActive');
-        $('qsearch_close').hide();
+        if ($('qsearch_input').visible()) {
+            $('qsearch_close').hide();
+        }
     },
 
-    _quicksearchDeactivate: function()
+    // hideall = (boolean) Hide entire searchbox?
+    _quicksearchDeactivate: function(hideall)
     {
-        $('qsearch_close').show();
-        $('qsearch_input').hide();
+        if (hideall) {
+            $('qsearch').hide();
+        } else {
+            $('qsearch_close').show();
+            $('qsearch_input').hide();
+        }
         DimpCore.DMenu.disable('qsearch_icon', true, true);
     },
 
@@ -2557,6 +2577,8 @@ var DimpBase = {
             $('qsearch_input').observe('blur', this._quicksearchOnBlur.bind(this));
             this._addMouseEvents({ id: 'qsearch_icon', left: true, offset: 'qsearch', type: 'qsearchopts' });
             DM.addSubMenu('ctx_qsearchopts_by', 'ctx_qsearchby');
+            DM.addSubMenu('ctx_qsearchopts_filter', 'ctx_flag');
+            DM.addSubMenu('ctx_qsearchopts_filternot', 'ctx_flag');
         }
 
         /* Start message list loading as soon as possible. */
index 1381aeb..6e325cf 100644 (file)
@@ -66,6 +66,7 @@ class IMP_Search
 
     /* The special search mailbox names. */
     const BASIC_SEARCH = 'impbsearch';
+    const DIMP_FILTERSEARCH = 'dimpfsearch';
     const DIMP_QUICKSEARCH = 'dimpqsearch';
 
     /* Bitmask constants for listQueries(). */
index 2df2699..f85d621 100644 (file)
@@ -27,42 +27,49 @@ class IMP_Views_ListMessages
         $sortpref = IMP::getSort($mbox);
 
         /* Check for quicksearch request. */
-        if (strlen($args['qsearch']) &&
-            strlen($args['qsearchmbox'])) {
+        if (strlen($args['qsearchmbox'])) {
             /* Create the search query. */
             $query = new Horde_Imap_Client_Search_Query();
 
-            $field = $GLOBALS['prefs']->getValue('dimp_qsearch_field');
-            switch ($field) {
-            case 'body':
-                $query->text($args['qsearch'], true);
-                break;
-
-            case 'from':
-            case 'subject':
-                $query->headerText($field, $args['qsearch']);
-                break;
-
-            case 'to':
-                $query2 = new Horde_Imap_Client_Search_Query();
-                $query2->headerText('cc', $args['qsearch']);
-
-                $query3 = new Horde_Imap_Client_Search_Query();
-                $query3->headerText('bcc', $args['qsearch']);
-
-                $query->headerText('to', $args['qsearch']);
-                $query->orSearch(array($query2, $query3));
-                break;
+            if (strlen($args['qsearchflag'])) {
+                $query->flag($args['qsearchflag'], empty($args['qsearchflagnot']));
+                $is_search = true;
+            } elseif (strlen($args['qsearch'])) {
+                $field = $GLOBALS['prefs']->getValue('dimp_qsearch_field');
+                switch ($field) {
+                case 'body':
+                    $query->text($args['qsearch'], true);
+                    break;
+
+                case 'from':
+                case 'subject':
+                    $query->headerText($field, $args['qsearch']);
+                    break;
+
+                case 'to':
+                    $query2 = new Horde_Imap_Client_Search_Query();
+                    $query2->headerText('cc', $args['qsearch']);
+
+                    $query3 = new Horde_Imap_Client_Search_Query();
+                    $query3->headerText('bcc', $args['qsearch']);
+
+                    $query->headerText('to', $args['qsearch']);
+                    $query->orSearch(array($query2, $query3));
+                    break;
+
+                case 'all':
+                default:
+                    $query->text($args['qsearch'], false);
+                    break;
+                }
 
-            case 'all':
-            default:
-                $query->text($args['qsearch'], false);
-                break;
+                $is_search = true;
             }
 
             /* Set the search in the IMP session. */
-            $GLOBALS['imp_search']->createSearchQuery($query, array($args['qsearchmbox']), array(), _("Search Results"), $mbox);
-            $is_search = true;
+            if ($is_search) {
+                $GLOBALS['imp_search']->createSearchQuery($query, array($args['qsearchmbox']), array(), _("Search Results"), $mbox);
+            }
         }
 
         $label = IMP::getLabel($mbox);
@@ -71,7 +78,8 @@ class IMP_Views_ListMessages
         Horde_Nls::setTimeZone();
 
         /* Run filters now. */
-        if (!empty($_SESSION['imp']['filteravail']) &&
+        if (!$is_search &&
+            !empty($_SESSION['imp']['filteravail']) &&
             !empty($args['applyfilter']) ||
             (($mbox == 'INBOX') &&
              $GLOBALS['prefs']->getValue('filter_on_display'))) {
index f8400f4..b92427a 100644 (file)
@@ -466,6 +466,9 @@ function _simpleButton($id, $text, $image)
 <div class="context" id="ctx_qsearchopts" style="display:none">
  <a id="ctx_qsearchopts_by"><?php echo _("Search By") ?></a>
  <div class="sep"></div>
+ <a id="ctx_qsearchopts_filter"><?php echo _("Filter By") ?></a>
+ <a id="ctx_qsearchopts_filternot"><?php echo _("Filter By (NOT)") ?></a>
+ <div class="sep"></div>
  <a id="ctx_qsearchopts_advanced"><?php echo _("Advanced Search...") ?></a>
 </div>
 
index c005c86..769ca68 100644 (file)
@@ -66,6 +66,7 @@ $code['conf'] = array_filter(array(
         ? array()
         : array_map(array('IMP_Dimp', 'appendedFolderPref'), $GLOBALS['conf']['server']['fixed_folders']),
     'flags' => $flags,
+    'fsearchid' => IMP_Search::MBOX_PREFIX . IMP_Search::DIMP_FILTERSEARCH,
     'ham_spammbox' => intval(!empty($GLOBALS['conf']['notspam']['spamfolder'])),
     'limit_factor' => intval($GLOBALS['conf']['dimp']['viewport']['limit_factor']),
     'login_view' => $GLOBALS['prefs']->getValue('dimp_login_view'),