From: Michael M Slusarz Date: Mon, 6 Apr 2009 18:02:07 +0000 (-0600) Subject: More flagging improvements in dimp X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=677127f53baeb0dd6b72a2d984a6455d2285624a;p=horde.git More flagging improvements in dimp More cleanly seperate non IMAP flagging actions (blacklist, spam) from IMAP activities. Allows flagging a message as deleted without it being purged, for example. --- diff --git a/imp/ajax.php b/imp/ajax.php index e74886a31..6d6dce6d7 100644 --- a/imp/ajax.php +++ b/imp/ajax.php @@ -377,7 +377,7 @@ case 'CopyMessage': } break; -case 'MarkMessage': +case 'FlagMessage': $flags = Util::getPost('flags'); if (!$flags || empty($indices)) { break; @@ -407,23 +407,15 @@ case 'MarkMessage': 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; @@ -446,9 +438,8 @@ case 'AddContact': 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 @@ -458,19 +449,18 @@ case 'ReportHam': 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; diff --git a/imp/js/src/DimpBase.js b/imp/js/src/DimpBase.js index 891328a89..ab7505e13 100644 --- a/imp/js/src/DimpBase.js +++ b/imp/js/src/DimpBase.js @@ -688,14 +688,17 @@ var DimpBase = { 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': @@ -706,11 +709,6 @@ var DimpBase = { 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': @@ -723,11 +721,13 @@ var DimpBase = { 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(); @@ -742,12 +742,12 @@ var DimpBase = { 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); } @@ -931,7 +931,7 @@ var DimpBase = { // 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]); } @@ -1421,7 +1421,7 @@ var DimpBase = { 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; @@ -1608,12 +1608,12 @@ var DimpBase = { 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; @@ -2093,15 +2093,11 @@ var DimpBase = { }, /* 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) { @@ -2114,81 +2110,100 @@ var DimpBase = { 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); } }, diff --git a/imp/js/src/compose-dimp.js b/imp/js/src/compose-dimp.js index 45d200640..1d0ac4913 100644 --- a/imp/js/src/compose-dimp.js +++ b/imp/js/src/compose-dimp.js @@ -236,7 +236,7 @@ var DimpCompose = { case 'send_message': this.button_pressed = false; if (DIMP.baseWindow) { - DIMP.baseWindow.DimpBase.flag('imapflag', { imap: d.reply_type == 'reply' ? '\\answered' : '$forwarded', index: d.index, mailbox: d.reply_folder, noserver: true, set: true }); + DIMP.baseWindow.DimpBase.flag(d.reply_type == 'reply' ? '\\answered' : '$forwarded', true, { index: d.index, mailbox: d.reply_folder, noserver: true }); if (d.folder) { DIMP.baseWindow.DimpBase.createFolder(d.folder); diff --git a/imp/js/src/fullmessage-dimp.js b/imp/js/src/fullmessage-dimp.js index 026af6acf..8fe5a037f 100644 --- a/imp/js/src/fullmessage-dimp.js +++ b/imp/js/src/fullmessage-dimp.js @@ -92,9 +92,9 @@ var DimpFullmessage = { case 'button_ham': case 'button_spam': if (id == 'button_deleted') { - DIMP.baseWindow.DimpBase.flag('imapflag', { imap: '\\deleted', index: DIMP.conf.msg_index, mailbox: DIMP.conf.msg_folder, set: true }); + DIMP.baseWindow.DimpBase.deleteMsg({ index: DIMP.conf.msg_index, mailbox: DIMP.conf.msg_folder }); } else { - DIMP.baseWindow.DimpBase.flag(id.substring(7), { index: DIMP.conf.msg_index, mailbox: DIMP.conf.msg_folder }); + DIMP.baseWindow.DimpBase.reportSpam(id == 'button_spam', { index: DIMP.conf.msg_index, mailbox: DIMP.conf.msg_folder }); } window.close(); e.stop();