}
// This catches the refresh case - no need to re-add to history
- if (!Object.isUndefined(this.folder) && !this.search) {
+ if (!Object.isUndefined(this.folder)) {
this.setHash(loc);
}
} else if (this.folder == f) {
this.folder = f;
- if (this.isSearch(f)) {
- if (!this.search || this.search.flag) {
- this._quicksearchDeactivate(!this.search);
- }
- $('refreshlink').show();
- } else {
- $('refreshlink').hide();
+ if (!this.isSearch(f)) {
+ $('searchbar').hide();
+ } else if (!this.search || this.search.flag) {
+ $('qsearch').hide();
}
}
}
l = this.viewport.getMetaData('label');
this.setMessageListTitle();
- if (!this.isSearch()) {
+
+ if (this.isSearch()) {
+ tmp = this.viewport.getMetaData('slabel');
+ if (tmp) {
+ $('search_label').update(tmp.stripTags().escapeHTML());
+ }
+ [ $('search_edit') ].invoke(this.search ? 'hide' : 'show');
+ $('searchbar').show();
+ } else {
this.setFolderLabel(this.folder, this.viewport.getMetaData('unseen') || 0);
}
+
this.updateTitle(this.viewport.getMetaData('noexist'));
if (this.rownum) {
mbox: this.folder,
not: menu.endsWith('_filternot')
};
- this.loadMailbox(DIMP.conf.fsearchid);
+ this.go('folder:' + DIMP.conf.fsearchid);
} else {
parentfunc(e);
}
// Label is HTML encoded - but this is not HTML code so unescape.
label = this.viewport.getMetaData('label').unescapeHTML();
- if (this.isSearch(null, true)) {
- label += ' (' + this.search.label + ')';
+ if (this.isSearch()) {
+ if (this.isSearch(null, true)) {
+ label += ' (' + this.search.label + ')';
+ }
} else {
elt = $(this.getFolderId(this.folder));
if (elt) {
},
/* Folder list updates. */
- poll: function(force)
+
+ // search = (boolean) If true, update search results as well.
+ poll: function(search)
{
- var args = {},
- check = 'checkmaillink';
+ var args = {};
// Reset poll folder counter.
this.setPoll();
args = this.viewport.addRequestParams({});
}
- if (force) {
+ if (search) {
args.set('forceUpdate', 1);
- check = 'refreshlink';
}
- $(check).down('A').update('[' + DIMP.text.check + ']');
+ $('checkmaillink').down('A').update('[' + DIMP.text.check + ']');
DimpCore.doAction('poll', args);
},
}
$('checkmaillink').down('A').update(DIMP.text.getmail);
- if ($('refreshlink').visible()) {
- $('refreshlink').down('A').update(DIMP.text.refresh);
- }
},
_displayQuota: function(r)
mbox: this.folder,
query: q
};
- this.loadMailbox(DIMP.conf.qsearchid);
+ this.go('folder:' + DIMP.conf.qsearchid);
}
},
this.resetSelected();
$(qs, 'qsearch_icon', 'qsearch_input').invoke('show');
if (!noload) {
- this.loadMailbox(this.search ? this.search.mbox : 'INBOX');
+ this.go('folder:' + (this.search ? this.search.mbox : 'INBOX'));
}
this.viewport.deleteView(f);
this.search = null;
{
$('qsearch_input').setValue(d ? DIMP.text.search + ' (' + $('ctx_qsearchby_' + DIMP.conf.qsearchfield).getText() + ')' : '');
[ $('qsearch') ].invoke(d ? 'removeClassName' : 'addClassName', 'qsearchActive');
- if ($('qsearch_input').visible()) {
- $('qsearch_close').hide().next().hide();
- }
- },
-
- // hideall = (boolean) Hide entire searchbox?
- _quicksearchDeactivate: function(hideall)
- {
- if (hideall) {
- $('qsearch').hide();
- } else {
- $('qsearch_close').show().next().show();
- $('qsearch_icon', 'qsearch_input').invoke('hide');
- }
},
/* Enable/Disable DIMP action buttons as needed. */
e.stop();
}
break;
-
- default:
- if (elt.readAttribute('id') == 'qsearch_input') {
- $('qsearch_close').show();
- }
- break;
}
return;
return;
case 'checkmaillink':
- case 'refreshlink':
- this.poll(id == 'refreshlink');
+ case 'search_refresh':
+ this.poll(id == 'search_refresh');
+ e.stop();
+ return;
+
+ case 'search_edit':
+ this.go('search', { edit_query: this.folder });
e.stop();
return;
}
break;
- case 'qsearch':
- if (e.element().readAttribute('id') != 'qsearch_icon') {
- elt.addClassName('qsearchFocus');
- if (!elt.hasClassName('qsearchActive')) {
- this._setQsearchText(false);
- }
- $('qsearch_input').focus();
- }
- break;
-
- case 'qsearch_close':
- case 'qsearch_close_filter':
+ case 'search_close':
this.quicksearchClear();
e.stop();
return;
parentfunc(e);
},
+ mousedownHandler: function(e)
+ {
+ var elt;
+
+ if (e.findElement('#qsearch') &&
+ (e.element().readAttribute('id') != 'qsearch_icon')) {
+ elt = $('qsearch');
+ elt.addClassName('qsearchFocus');
+ if (!elt.hasClassName('qsearchActive')) {
+ this._setQsearchText(false);
+ }
+ $('qsearch_input').focus();
+ }
+ },
+
mouseoverHandler: function(e)
{
if (DragDrop.Drags.drag) {
/* Store these text strings for updating purposes. */
DIMP.text.getmail = $('checkmaillink').down('A').innerHTML;
- DIMP.text.refresh = $('refreshlink').down('A').innerHTML;
DIMP.text.showalog = $('alertsloglink').down('A').innerHTML;
/* Initialize the starting page. */
/* Click handler. */
DimpCore.clickHandler = DimpCore.clickHandler.wrap(DimpBase.clickHandler.bind(DimpBase));
+document.observe('mousedown', DimpBase.mousedownHandler.bindAsEventListener(DimpBase));
/* ContextSensitive handlers. */
DimpCore.contextOnClick = DimpCore.contextOnClick.wrap(DimpBase.contextOnClick.bind(DimpBase));
if (strlen($args['qsearchflag'])) {
$query->flag($args['qsearchflag'], empty($args['qsearchflagnot']));
+ $tmp = new stdClass;
+ $tmp->t = 'flag';
+ $tmp->v = $args['qsearchflag'];
+ $criteria = array($tmp);
+
$is_search = true;
} elseif (strlen($args['qsearch'])) {
$field = $GLOBALS['prefs']->getValue('dimp_qsearch_field');
+ $is_search = true;
+
switch ($field) {
case 'body':
$query->text($args['qsearch'], true);
+
+ $tmp = new stdClass;
+ $tmp->t = 'body';
+ $tmp->v = $args['qsearch'];
+ $criteria = array($tmp);
break;
case 'from':
case 'subject':
$query->headerText($field, $args['qsearch']);
+
+ $tmp = new stdClass;
+ $tmp->t = $field;
+ $tmp->v = $args['qsearch'];
+ $criteria = array($tmp);
break;
case 'to':
$query->headerText('to', $args['qsearch']);
$query->orSearch(array($query2, $query3));
+
+ $tmp = new stdClass;
+ $tmp->t = 'to';
+ $tmp->v = $args['qsearch'];
+ $criteria = array($tmp);
+
+ $tmp = new stdClass;
+ $tmp->t = 'or';
+ $criteria[] = $tmp;
+
+ $tmp = new stdClass;
+ $tmp->t = 'cc';
+ $tmp->v = $args['qsearch'];
+ $criteria[] = $tmp;
+
+ $tmp = new stdClass;
+ $tmp->t = 'or';
+ $criteria[] = $tmp;
+
+ $tmp = new stdClass;
+ $tmp->t = 'bcc';
+ $tmp->v = $args['qsearch'];
+ $criteria[] = $tmp;
break;
case 'all':
- default:
$query->text($args['qsearch'], false);
+
+ $tmp = new stdClass;
+ $tmp->t = 'text';
+ $tmp->v = $args['qsearch'];
+ $criteria = array($tmp);
break;
- }
- $is_search = true;
+ default:
+ $is_search = false;
+ break;
+ }
}
/* Set the search in the IMP session. */
if ($is_search) {
- $GLOBALS['injector']->getInstance('IMP_Search')->createSearchQuery($query, array($args['qsearchmbox']), array(), _("Search Results"), $mbox);
+ $imp_search = $GLOBALS['injector']->getInstance('IMP_Search');
+ $imp_search->createSearchQuery($query, array($args['qsearchmbox']), $criteria, _("Search Results"), $mbox);
}
} else {
- $is_search = $GLOBALS['injector']->getInstance('IMP_Search')->isSearchMbox($mbox);
+ $imp_search = $GLOBALS['injector']->getInstance('IMP_Search');
+ $is_search = $imp_search->isSearchMbox($mbox);
}
/* Set the current time zone. */
$md->flags = array_keys($GLOBALS['injector']->getInstance('IMP_Imap_Flags')->getList(array('imap' => true, 'mailbox' => $is_search ? null : $mbox)));
}
+ /* The search query may have changed. */
+ if ($is_search &&
+ ($args['initial'] || strlen($args['qsearchmbox']))) {
+ $md->slabel = $imp_search->searchQueryText($mbox);
+ }
+
$imp_imap = $GLOBALS['injector']->getInstance('IMP_Imap')->getOb();
/* These entries may change during a session, so always need to
<ul id="dimpbarActions">
<?php echo _simpleButton('composelink', _("_New Message"), 'dimpactionCompose') ?>
<?php echo _simpleButton('checkmaillink', _("_Get Mail"), 'dimpactionCheckmail') ?>
- <?php echo _simpleButton('refreshlink', _("_Refresh Search"), 'dimpactionRefresh', true) ?>
<?php echo _simpleButton('alertsloglink', _("Alerts _Log"), 'infoIcon') ?>
<?php if (!empty($_SESSION['imp']['filteravail'])): ?>
<?php echo _simpleButton('applyfilterlink', _("Apply Filters"), 'filtersIcon') ?>
<form action="#" method="post">
<input autocomplete="off" id="qsearch_input" type="text" />
</form>
- <span class="closeImg" id="qsearch_close" style="display:none" title="<?php echo _("Clear Search") ?>"></span>
- <span id="qsearch_close_filter" style="display:none">Clear Filter</span>
</div>
<?php endif; ?>
<div><?php echo IMP_Dimp::actionButton(array('class' => 'noselectDisable', 'icon' => 'Reply', 'id' => 'button_reply', 'title' => _("Reply"))) ?></div>
<div><?php echo IMP_Dimp::actionButton(array('icon' => 'Other', 'id' => 'button_other', 'title' => _("Other Actions"))) ?></div>
</div>
+ <div id="searchbar" style="display:none">
+ <span id="search_label"></span>
+ <span class="iconImg closeImg" id="search_close" title="<?php echo _("Clear Search") ?>"></span>
+ <span class="iconImg dimpactionRefresh" id="search_refresh" title="<?php echo _("Refresh Search Results") ?>"></span>
+ <span class="iconImg dimpactionEditsearch" id="search_edit" style="display:none" title="<?php echo _("Edit Search Query") ?>"></span>
+ </div>
+
<div id="msglistHeader" class="item">
<div class="msgStatus"></div>
<div class="msgFrom sep"></div>
}
/* Fixes broken inline-block. */
-div.msgStatus div, #msgHeadersContent .subject span, span.iconImg, span.contextImg, span.spellcheckPopdownImg, span.popdownImg, #qsearch_icon, #qsearch_close, #upload_wait, #noticerow .notices li {
+div.msgStatus div, #msgHeadersContent .subject span, span.iconImg, span.contextImg, span.spellcheckPopdownImg, span.popdownImg, #qsearch_icon, #upload_wait, #noticerow .notices li {
zoom: 1;
*display: inline;
}
#qsearch form {
display: inline;
}
-#qsearch_icon, #qsearch_close {
- cursor: pointer;
- padding: 2px 0 0;
-}
#qsearch_icon {
background: #f3f3f3 url("../graphics/search.png") center no-repeat;
+ cursor: pointer;
padding-top: 2px;
}
#qsearch_input {
padding: 0 2px 0 0;
width: 150px;
}
-#qsearch_close_filter {
- cursor: pointer;
- padding-right: 3px;
- vertical-align: middle;
-}
.qsearchFocus, .qsearchFocus #qsearch_icon, .qsearchFocus #qsearch_input {
background-color: #fff !important;
}
text-decoration: underline;
}
+#searchbar {
+ background-color: #ffa;
+ border: 1px solid gray;
+ padding: 3px 2px;
+}
+#search_close, #search_edit, #search_refresh {
+ cursor: pointer;
+ float: right;
+ margin-top: -1px;
+}
+#searchbar #search_label {
+ font-size: 90%;
+ font-weight: bold;
+}
+
/* Redbox styles. */
.RBForm {
width: 20em;
}
/* Images */
-div.msgStatus div, #msgHeadersContent .subject span, span.iconImg, span.contextImg, span.spellcheckPopdownImg, span.popdownImg, #qsearch_icon, #qsearch_close {
+div.msgStatus div, #msgHeadersContent .subject span, span.iconImg, span.contextImg, span.spellcheckPopdownImg, span.popdownImg, #qsearch_icon {
display: -moz-inline-stack;
display: inline-block;
height: 16px;
span.dimpactionDrafts {
background-image: url("../graphics/drafts.png");
}
+span.dimpactionEditsearch {
+ background-image: url("../graphics/edit.png");
+}
/* Context menu images */
#ctx_message_reply span.contextImg {
* CSS corrections for WebKit.
*/
-div.msgStatus div, #msgHeadersContent .subject span, span.iconImg, span.contextImg, span.spellcheckPopdownImg, span.popdownImg, #qsearch_icon, #qsearch_close {
+div.msgStatus div, #msgHeadersContent .subject span, span.iconImg, span.contextImg, span.spellcheckPopdownImg, span.popdownImg, #qsearch_icon {
vertical-align: middle;
}
span.dimpactionDrafts {
background-image: url("../graphics/drafts.png");
}
+span.dimpactionEditsearch {
+ background-image: url("../graphics/edit.png");
+}
/* Context menu images */
#ctx_message_reply span.contextImg {