From a4904f4c00134c4ab114dd26a9493fe4a4fbc0d2 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 15 Apr 2015 02:27:10 +0400 Subject: [PATCH] Message thread optimization --- dev/App/User.js | 29 +++++-- dev/Common/Cache.js | 14 +-- dev/Model/MessageSimple.js | 26 ++++++ dev/Stores/User/Message.js | 2 + dev/Styles/MessageView.less | 34 ++++---- dev/View/User/MailBox/MessageView.js | 85 +++++++++++++------ .../templates/Views/User/MailMessageView.html | 3 + 7 files changed, 140 insertions(+), 53 deletions(-) diff --git a/dev/App/User.js b/dev/App/User.js index d9bb971b4..616451270 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -153,7 +153,20 @@ Cache.initMessageFlagsFromCache(oMessage); }); + _.each(MessageStore.messageThreadList(), function (oMessage) { + Cache.initMessageFlagsFromCache(oMessage); + }); + Cache.initMessageFlagsFromCache(MessageStore.message()); + + this.reloadFlagsCurrentMessageThreadListFromCache(); + }; + + AppUser.prototype.reloadFlagsCurrentMessageThreadListFromCache = function () + { + _.each(MessageStore.messageThreadList(), function (oMessage) { + Cache.initMessageFlagsFromCache(oMessage); + }); }; /** @@ -860,19 +873,21 @@ bRoot = true; } else if (aMessages && aMessages[0] && mUid && - sFolderFullNameRaw === aMessages[0].uid && mUid === aMessages[0].uid) + sFolderFullNameRaw === aMessages[0].folderFullNameRaw && mUid === aMessages[0].uid) { bRoot = true; } _.each(aMessages, function (oMessage) { - aRootUids.push(oMessage.uid); - aAllUids = _.union(aAllUids, oMessage.threads(), [oMessage.uid]); + if (oMessage && oMessage.uid && oMessage.threads) + { + aRootUids.push(oMessage.uid); + aAllUids = _.union(aAllUids, oMessage.threads(), [oMessage.uid]); + } }); aAllUids = _.uniq(aAllUids); aRootUids = _.uniq(aRootUids); - aRootUids = aAllUids; // always all if ('' !== sFolderFullNameRaw && 0 < aAllUids.length) { @@ -921,12 +936,14 @@ case Enums.MessageSetAction.UnsetFlag: - _.each(bRoot ? aAllUids : aRootUids, function (sSubUid) { + _.each(aRootUids, function (sSubUid) { +// _.each(bRoot ? aAllUids : aRootUids, function (sSubUid) { Cache.storeMessageFlagsToCacheBySetAction( sFolderFullNameRaw, sSubUid, iSetAction); }); - Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, bRoot ? aAllUids : aRootUids, false); + Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, aRootUids, false); +// Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, bRoot ? aAllUids : aRootUids, false); break; } diff --git a/dev/Common/Cache.js b/dev/Common/Cache.js index 23805973b..bacc24b80 100644 --- a/dev/Common/Cache.js +++ b/dev/Common/Cache.js @@ -302,12 +302,16 @@ if (aFlags && 0 < aFlags.length) { - oMessage.unseen(!!aFlags[0]); oMessage.flagged(!!aFlags[1]); - oMessage.answered(!!aFlags[2]); - oMessage.forwarded(!!aFlags[3]); - oMessage.isReadReceipt(!!aFlags[4]); - oMessage.deletedMark(!!aFlags[5]); + + if (!oMessage.__simple_message__) + { + oMessage.unseen(!!aFlags[0]); + oMessage.answered(!!aFlags[2]); + oMessage.forwarded(!!aFlags[3]); + oMessage.isReadReceipt(!!aFlags[4]); + oMessage.deletedMark(!!aFlags[5]); + } } if (0 < oMessage.threads().length) diff --git a/dev/Model/MessageSimple.js b/dev/Model/MessageSimple.js index ed994eebd..d4eb52d23 100644 --- a/dev/Model/MessageSimple.js +++ b/dev/Model/MessageSimple.js @@ -5,6 +5,7 @@ var _ = require('_'), + ko = require('ko'), Utils = require('Common/Utils'), @@ -20,11 +21,18 @@ function MessageSimpleModel(sSuperName) { AbstractModel.call(this, sSuperName || 'MessageSimpleModel'); + + this.flagged = ko.observable(false); + this.selected = ko.observable(false); } _.extend(MessageSimpleModel.prototype, AbstractModel.prototype); + MessageSimpleModel.prototype.__simple_message__ = true; + MessageSimpleModel.prototype.folder = ''; + MessageSimpleModel.prototype.folderFullNameRaw = ''; + MessageSimpleModel.prototype.uid = ''; MessageSimpleModel.prototype.subject = ''; @@ -48,6 +56,8 @@ MessageSimpleModel.prototype.clear = function () { this.folder = ''; + this.folderFullNameRaw = ''; + this.uid = ''; this.subject = ''; @@ -68,6 +78,9 @@ this.size = 0; this.timestamp = 0; + + this.flagged(false); + this.selected(false); }; /** @@ -81,6 +94,8 @@ if (oJson && 'Object/Message' === oJson['@Object']) { this.folder = Utils.pString(oJson.Folder); + this.folderFullNameRaw = this.folder; + this.uid = Utils.pString(oJson.Uid); this.subject = Utils.pString(oJson.Subject); @@ -112,6 +127,9 @@ this.toAsString = MessageHelper.emailArrayToString(this.to, true); this.toAsStringClear = MessageHelper.emailArrayToStringClear(this.to); + this.flagged(false); + this.selected(false); + this.populateSenderEmail(); bResult = true; @@ -132,6 +150,14 @@ } }; + /** + * @return {Array} + */ + MessageSimpleModel.prototype.threads = function () + { + return []; + }; + /** * @static * @param {Object} oJson diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index b8d5691c4..55c503324 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -63,6 +63,8 @@ this.message.viewTrigger = ko.observable(false); + this.messageThreadList = ko.observableArray([]); + this.messageLastThreadUidsData = ko.observable(null); this.messageError = ko.observable(''); diff --git a/dev/Styles/MessageView.less b/dev/Styles/MessageView.less index 82b7ec020..2b272a3aa 100644 --- a/dev/Styles/MessageView.less +++ b/dev/Styles/MessageView.less @@ -76,6 +76,23 @@ html.rl-no-preview-pane { right: 10px; } + .flagParent { + + cursor: pointer; + margin-right: 5px; + + .flagOn { + color: orange; + } + + .flagOff { + opacity: 0.5; + &:hover { + opacity: 1; + } + } + } + .messageItemHeader { position: absolute; @@ -120,23 +137,6 @@ html.rl-no-preview-pane { margin-top: 5px; } - .flagParent { - - cursor: pointer; - margin-right: 5px; - - .flagOn { - color: orange; - } - - .flagOff { - opacity: 0.5; - &:hover { - opacity: 1; - } - } - } - .informationShort { margin-left: 22px; a { diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 92315b3c1..fdba28c18 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -56,6 +56,7 @@ } ; + this.oDom = null; this.oHeaderDom = null; this.oMessageScrollerDom = null; @@ -232,14 +233,38 @@ this.viewThreads = ko.observableArray([]); this.viewThreads.trigger = ko.observable(false); - this.viewThreadMessages = ko.observableArray([]); + this.viewThreadMessages = MessageStore.messageThreadList; + this.viewThreadMessages.error = ko.observable(''); this.viewThreadMessages.showMore = ko.observable(false); this.viewThreadMessages.limit = 6; this.viewThreadMessages.subscribe(function (aList) { + + var iSelectedIndex = -1; + this.viewThreadMessages.error(''); - this.viewThreadMessages.showMore(this.viewThreadMessages.limit >= aList.length); + if (aList && 0 < aList.length) + { + _.each(aList, function (oM, iIndex) { + if (oM && oM.selected()) + { + iSelectedIndex = iIndex; + } + }); + + this.viewThreadMessages.showMore(this.viewThreadMessages.limit >= aList.length); + + if (-1 < iSelectedIndex && !this.viewThreadMessages.showMore() && + this.viewThreadMessages.limit < iSelectedIndex) + { + this.viewThreadMessages.showMore(true); + } + + this.selectSelectedThreadMessage(); + require('App/User').reloadFlagsCurrentMessageListAndMessageFromCache(); + } + }, this); MessageStore.messageLastThreadUidsData.subscribe(function (oData) { @@ -344,7 +369,7 @@ _.each(aList, function (oItem) { if (oItem && oItem.uid) { - oItem.selected = sUid === oItem.uid; + oItem.selected(sUid === oItem.uid); } }); @@ -530,15 +555,6 @@ kn.extendAsViewModel(['View/User/MailBox/MessageView', 'View/App/MailBox/MessageView', 'MailBoxMessageViewViewModel'], MessageViewMailBoxUserView); _.extend(MessageViewMailBoxUserView.prototype, AbstractView.prototype); - MessageViewMailBoxUserView.prototype.updateViewFlagsFromCache = function () - { - var aFlags = this.getMessageFlagsFromCache(this.viewFolder, this.viewUid); - if (aFlags) - { - this.viewIsFlagged(!!aFlags[1]); - } - }; - MessageViewMailBoxUserView.prototype.openThreadMessage = function (sUid) { var oMessage = this.message(); @@ -635,6 +651,8 @@ fCheckHeaderHeight = _.bind(this.checkHeaderHeight, this) ; + this.oDom = oDom; + this.fullScreenMode.subscribe(function (bValue) { if (bValue && self.message()) { @@ -785,7 +803,7 @@ self.viewThreadMessages.showMore(true); self.threadsDropdownTrigger(true); - if (oLast) + if (oLast && oLast[0]) { oLast.focus(); } @@ -810,8 +828,26 @@ require('App/User').download(oAttachment.linkDownload()); } }) - .on('click', '.messageItemHeader .flagParent', function () { - self.flagViewMessage(); + .on('click', '.messageItemHeader .subjectParent .flagParent', function () { + var oMessage = self.message(); + if (oMessage) + { + require('App/User').messageListAction(oMessage.folderFullNameRaw, oMessage.uid, + oMessage.flagged() ? Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, [oMessage]); + } + }) + .on('click', '.thread-list .flagParent', function () { + var oMessage = ko.dataFor(this); + if (oMessage && oMessage.folder && oMessage.uid) + { + require('App/User').messageListAction( + oMessage.folder, oMessage.uid, + oMessage.flagged() ? Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, [oMessage]); + } + + self.threadsDropdownTrigger(true); + + return false; }) ; @@ -833,17 +869,16 @@ this.initShortcuts(); }; - /** - * @return {boolean} - */ - MessageViewMailBoxUserView.prototype.flagViewMessage = function () + MessageViewMailBoxUserView.prototype.selectSelectedThreadMessage = function () { - var oMessage = this.message(); - if (oMessage) - { - require('App/User').messageListAction(oMessage.folderFullNameRaw, oMessage.uid, - oMessage.flagged() ? Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, [oMessage]); - } + var self = this; + _.delay(function () { + var oLast = self.oDom ? $('.thread-list .e-item.thread-list-message.real-msg.selected a.e-link', self.oDom) : null; + if (oLast && oLast[0]) + { + oLast.focus(); + } + }, 30); }; /** diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index 4b8f01aff..ee19b8d48 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -219,6 +219,9 @@