From 3255114450a98d829dbfbfb0fd94472cae7b2714 Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Tue, 20 Oct 2009 23:15:18 -0600 Subject: [PATCH] Add quick flag filtering to DIMP --- imp/ajax.php | 8 ++-- imp/docs/CHANGES | 3 +- imp/js/DimpBase.js | 66 ++++++++++++++++++++++----------- imp/lib/Search.php | 1 + imp/lib/Views/ListMessages.php | 68 +++++++++++++++++++--------------- imp/templates/index/index-dimp.inc | 3 ++ imp/templates/javascript_defs_dimp.php | 1 + 7 files changed, 92 insertions(+), 58 deletions(-) diff --git a/imp/ajax.php b/imp/ajax.php index 9e280ddba..ab57a6759 100644 --- a/imp/ajax.php +++ b/imp/ajax.php @@ -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'); diff --git a/imp/docs/CHANGES b/imp/docs/CHANGES index 53af983ed..7411b4b5a 100644 --- a/imp/docs/CHANGES +++ b/imp/docs/CHANGES @@ -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. diff --git a/imp/js/DimpBase.js b/imp/js/DimpBase.js index ffdf0c18b..d80566a2e 100644 --- a/imp/js/DimpBase.js +++ b/imp/js/DimpBase.js @@ -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. */ diff --git a/imp/lib/Search.php b/imp/lib/Search.php index 1381aeba4..6e325cf4c 100644 --- a/imp/lib/Search.php +++ b/imp/lib/Search.php @@ -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(). */ diff --git a/imp/lib/Views/ListMessages.php b/imp/lib/Views/ListMessages.php index 2df269929..f85d62192 100644 --- a/imp/lib/Views/ListMessages.php +++ b/imp/lib/Views/ListMessages.php @@ -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'))) { diff --git a/imp/templates/index/index-dimp.inc b/imp/templates/index/index-dimp.inc index f8400f48f..b92427a31 100644 --- a/imp/templates/index/index-dimp.inc +++ b/imp/templates/index/index-dimp.inc @@ -466,6 +466,9 @@ function _simpleButton($id, $text, $image) diff --git a/imp/templates/javascript_defs_dimp.php b/imp/templates/javascript_defs_dimp.php index c005c8662..769ca6842 100644 --- a/imp/templates/javascript_defs_dimp.php +++ b/imp/templates/javascript_defs_dimp.php @@ -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'), -- 2.11.0