}
break;
-case 'MarkMessage':
+case 'FlagMessage':
$flags = Util::getPost('flags');
if (!$flags || empty($indices)) {
break;
break;
case 'DeleteMessage':
-case 'UndeleteMessage':
if (empty($indices)) {
break;
}
$imp_message = IMP_Message::singleton();
- if ($action == 'DeleteMessage') {
- $change = _changed($mbox, $cacheid, true);
- $result = $imp_message->delete($indices);
- if ($result) {
- $result = _generateDeleteResult($mbox, $indices, $change, !$prefs->getValue('hide_deleted') && !$prefs->getValue('use_trash'));
- }
- } else {
- $result = $imp_message->undelete($indices);
- if ($result) {
- $result = new stdClass;
- }
+ $change = _changed($mbox, $cacheid, true);
+ $result = $imp_message->delete($indices);
+ if ($result) {
+ $result = _generateDeleteResult($mbox, $indices, $change, !$prefs->getValue('hide_deleted') && !$prefs->getValue('use_trash'));
}
break;
break;
case 'ReportSpam':
-case 'ReportHam':
$change = _changed($mbox, $cacheid, false);
- $spam_result = IMP_Spam::reportSpam($indices, ($action == 'ReportSpam') ? 'spam' : 'notspam');
+ $spam_result = IMP_Spam::reportSpam($indices, Util::getPost('spam') ? 'spam' : 'notspam');
if ($spam_result) {
$result = _generateDeleteResult($mbox, $indices, $change);
// If $spam_result is non-zero, then we know the message has been
break;
case 'Blacklist':
-case 'Whitelist':
if (empty($indices)) {
break;
}
$imp_filter = new IMP_Filter();
- if ($action == 'Whitelist') {
- $imp_filter->whitelistMessage($indices, false);
- } else {
+ if (Util::getPost('blacklist')) {
$change = _changed($mbox, $cacheid, false);
if ($imp_filter->blacklistMessage($indices, false)) {
$result = _generateDeleteResult($mbox, $indices, $change);
}
+ } else {
+ $imp_filter->whitelistMessage($indices, false);
}
break;
case 'ctx_message_spam':
case 'ctx_message_ham':
+ this.reportSpam(id == 'ctx_message_spam');
+ break;
+
case 'ctx_message_blacklist':
case 'ctx_message_whitelist':
- this.flag(id.substring(12));
+ this.blacklist(id == 'ctx_message_blacklist');
break;
+ case 'ctx_draft_deleted':
case 'ctx_message_deleted':
- case 'ctx_message_undeleted':
- this.flag('imapflag', { imap: '\\deleted', set: id == 'ctx_message_deleted' });
+ this.deleteMsg();
break;
case 'ctx_message_forward':
this.composeMailbox('resume');
break;
- case 'ctx_draft_deleted':
- case 'ctx_draft_undeleted':
- this.flag('imapflag', { imap: '\\deleted', set: id == 'ctx_draft_deleted' });
- break;
-
case 'ctx_reply_reply':
case 'ctx_reply_reply_all':
case 'ctx_reply_reply_list':
case 'oa_blacklist':
case 'oa_whitelist':
- this.flag(id.substring(3));
+ this.blacklist(id == 'oa_blacklist');
break;
+ case 'ctx_draft_undeleted':
+ case 'ctx_message_undeleted':
case 'oa_undeleted':
- this.flag('imapflag', { imap: '\\deleted', set: false });
+ this.flag('\\deleted', false);
case 'oa_selectall':
this.selectAll();
menu == 'ctx_draft_setflag' ||
menu == 'oa_setflag') {
flag = elt.readAttribute('flag');
- this.flag('imapflag', { imap: flag, set: this.convertFlag(flag, true) });
+ this.flag(flag, this.convertFlag(flag, true));
} else if (menu == 'ctx_message_unsetflag' ||
menu == 'ctx_draft_unsetflag' ||
menu == 'oa_unsetflag') {
flag = elt.readAttribute('flag');
- this.flag('imapflag', { imap: flag, set: this.convertFlag(flag, false) });
+ this.flag(flag, this.convertFlag(flag, false));
} else {
parentfunc(elt, baseelt, menu);
}
// as unseen since first being viewed. If so, we need to
// explicitly flag as seen here.
if (this.hasFlag('\\seen', data)) {
- this.flag('imapflag', { imap: '\\seen', set: true });
+ this.flag('\\seen', true);
}
return this._loadPreviewCallback(this.ppcache[pp_uid]);
}
if (e.shiftKey) {
this.moveSelected((r.last().rownum == this.viewport.getMetaData('total_rows')) ? (r.first().rownum - 1) : (r.last().rownum + 1), true);
}
- this.flag('imapflag', { imap: '\\deleted', index: r, set: true });
+ this.deleteMsg();
e.stop();
break;
case 'button_ham':
case 'button_spam':
- this.flag(id.substring(7));
+ this.reportSpam(id == 'button_spam');
e.stop();
return;
case 'button_deleted':
- this.flag('imapflag', { imap: '\\deleted', set: true });
+ this.deleteMsg();
e.stop();
return;
},
/* Flag actions for message list. */
- // opts = 'imap' 'index', 'mailbox', 'noserver' (only for
- // answered/unanswered), 'set'
- flag: function(action, opts)
+ _getFlagSelection: function(opts)
{
- var actionCall, args, vs,
- flags = [];
- opts = opts || {};
-
- if (opts.index) {
+ if (opts.vs) {
+ vs = opts.vs;
+ } else if (opts.index) {
if (opts.mailbox) {
vs = this.viewport.getViewportSelection().search({ imapuid: { equal: [ opts.index ] }, view: { equal: [ opts.mailbox ] } });
if (!vs.size() && opts.mailbox != this.folder) {
vs = this.viewport.getSelected();
}
- switch (action) {
- case 'spam':
- case 'ham':
- case 'blacklist':
- case 'whitelist':
- if (!vs.size()) {
- break;
- }
-
- args = this.viewport.addRequestParams({});
+ return vs;
+ },
- actionCall = {
- spam: 'ReportSpam',
- ham: 'ReportHam',
- blacklist: 'Blacklist',
- whitelist: 'Whitelist'
- };
+ _doMsgAction: function(type, opts, args)
+ {
+ var vs = this._getFlagSelection(opts);
+ if (vs.size()) {
// This needs to be synchronous Ajax if we are calling from a
// popup window because Mozilla will not correctly call the
// callback function if the calling window has been closed.
- DimpCore.doAction(actionCall[action], this.viewport.addRequestParams({}), vs, this.bcache.get('deleteC') || this.bcache.set('deleteC', this._deleteCallback.bind(this)), { asynchronous: !(opts.index && opts.mailbox) });
+ DimpCore.doAction(type, this.viewport.addRequestParams(args), vs, this.bcache.get('deleteC') || this.bcache.set('deleteC', this._deleteCallback.bind(this)), { asynchronous: !(opts.index && opts.mailbox) });
+ return vs;
+ }
- // If reporting spam, to indicate to the user that something is
- // happening (since spam reporting may not be instantaneous).
- if (action == 'spam' || action == 'ham') {
- this.msgListLoading(true);
- }
- break;
+ return false;
+ },
- case 'imapflag':
- if (!vs.size()) {
- break;
- }
+ // spam = (boolean) True for spam, false for innocent
+ // opts = 'index', 'mailbox'
+ reportSpam: function(spam, opts)
+ {
+ opts = opts || {};
+ if (this._doMsgAction('ReportSpam', opts, { spam: spam })) {
+ // Indicate to the user that something is happening (since spam
+ // reporting may not be instantaneous).
+ this.msgListLoading(true);
+ }
+ },
+
+ // blacklist = (boolean) True for blacklist, false for whitelist
+ // opts = 'index', 'mailbox'
+ blacklist: function(blacklist, opts)
+ {
+ opts = opts || {};
+ this._doMsgAction('Blacklist', opts, { blacklist: blacklist });
+ },
- flags = [ (opts.set ? '' : '-') + opts.imap ];
+ // opts = 'index', 'mailbox'
+ deleteMsg: function(opts)
+ {
+ opts = opts || {};
+ var vs = this._getFlagSelection(opts);
- switch (opts.imap) {
- case '\\deleted':
- // Make sure that any given row is not deleted more than once.
- // Need to explicitly mark here because message may already be
- // flagged deleted when we load page (i.e. switching to using
- // trash folder).
- if (opts.set) {
- vs = vs.search({ isdel: { not: [ true ] } });
- if (!vs.size()) {
- return;
- }
- vs.set({ isdel: true });
- } else {
- vs.set({ isdel: false });
- }
+ // Make sure that any given row is not deleted more than once. Need to
+ // explicitly mark here because message may already be flagged deleted
+ // when we load page (i.e. switching to using trash folder).
+ vs = vs.search({ isdel: { not: [ true ] } });
+ if (!vs.size()) {
+ return;
+ }
+ vs.set({ isdel: true });
- this.updateFlag(vs, opts.imap, opts.set);
- DimpCore.doAction(opts.set ? 'DeleteMessage' : 'UndeleteMessage', this.viewport.addRequestParams({}), vs, this.bcache.get('deleteC') || this.bcache.set('deleteC', this._deleteCallback.bind(this)), { asynchronous: !(opts.index && opts.mailbox) });
- return;
+ opts.vs = vs;
- case '\\seen':
- vs.get('dataob').each(function(s) {
- this.updateSeenUID(s, opts.set);
- }, this);
- break;
+ this._doMsgAction('DeleteMessage', opts, {});
+ this.updateFlag(vs, '\\deleted', true);
+ },
- case '\\answered':
- if (opts.set) {
- this.updateFlag(vs, '\\flagged', false);
- flags.push('-\\flagged');
- }
- break;
- }
+ // flag = (string) IMAP flag name
+ // set = (boolean) True to set flag
+ // opts = (Object) 'index', 'mailbox', 'noserver'
+ flag: function(flag, set, opts)
+ {
+ opts = opts || {};
+ var flags = [ (opts.set ? '' : '-') + flag ];
+ vs = this._getFlagSelection(opts);
- this.updateFlag(vs, opts.imap, opts.set);
- if (!opts.noserver) {
- DimpCore.doAction('MarkMessage', { flags: flags.toJSON(), view: this.folder }, vs);
+ if (!vs.size()) {
+ return;
+ }
+
+ switch (flag) {
+ case '\\answered':
+ if (set) {
+ this.updateFlag(vs, '\\flagged', false);
+ flags.push('-\\flagged');
}
+ break;
+
+ case '\\deleted':
+ vs.set({ isdel: false });
+ break;
+
+ case '\\seen':
+ vs.get('dataob').each(function(s) {
+ this.updateSeenUID(s, set);
+ }, this);
+ break;
+ }
+
+ this.updateFlag(vs, flag, set);
+ if (!opts.noserver) {
+ DimpCore.doAction('FlagMessage', { flags: flags.toJSON(), view: this.folder }, vs);
}
},