diff --git a/dev/App/User.js b/dev/App/User.js index 55efe8b3f..59fc7b98f 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -174,7 +174,15 @@ if (Utils.isUnd(bDropPagePosition) ? false : !!bDropPagePosition) { MessageStore.messageListPage(1); + MessageStore.messageListPageBeforeThread(1); iOffset = 0; + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + MessageStore.messageListPage(), + MessageStore.messageListSearch(), + MessageStore.messageListThreadUid() + ), true, true); } MessageStore.messageListLoading(true); @@ -844,10 +852,8 @@ AppUser.prototype.messageListAction = function (sFolderFullNameRaw, mUid, iSetAction, aMessages) { var - bRoot = false, - aAllUids = [], - aRootUids = [], oFolder = null, + aRootUids = [], iAlreadyUnread = 0 ; @@ -856,33 +862,16 @@ aMessages = MessageStore.messageListChecked(); } - if (true === mUid) - { - bRoot = true; - } - else if (aMessages && aMessages[0] && mUid && - sFolderFullNameRaw === aMessages[0].folderFullNameRaw && mUid === aMessages[0].uid) - { - bRoot = true; - } + aRootUids = _.uniq(_.compact(_.map(aMessages, function (oMessage) { + return (oMessage && oMessage.uid) ? oMessage.uid : null; + }))); - _.each(aMessages, function (oMessage) { - if (oMessage && oMessage.uid && oMessage.threads) - { - aRootUids.push(oMessage.uid); - aAllUids = _.union(aAllUids, oMessage.threads(), [oMessage.uid]); - } - }); - - aAllUids = _.uniq(aAllUids); - aRootUids = _.uniq(aRootUids); - - if ('' !== sFolderFullNameRaw && 0 < aAllUids.length) + if ('' !== sFolderFullNameRaw && 0 < aRootUids.length) { switch (iSetAction) { case Enums.MessageSetAction.SetSeen: - _.each(bRoot ? aAllUids : aRootUids, function (sSubUid) { + _.each(aRootUids, function (sSubUid) { iAlreadyUnread += Cache.storeMessageFlagsToCacheBySetAction( sFolderFullNameRaw, sSubUid, iSetAction); }); @@ -893,7 +882,7 @@ oFolder.messageCountUnread(oFolder.messageCountUnread() - iAlreadyUnread); } - Remote.messageSetSeen(Utils.emptyFunction, sFolderFullNameRaw, bRoot ? aAllUids : aRootUids, true); + Remote.messageSetSeen(Utils.emptyFunction, sFolderFullNameRaw, aRootUids, true); break; case Enums.MessageSetAction.UnsetSeen: @@ -925,13 +914,11 @@ case Enums.MessageSetAction.UnsetFlag: _.each(aRootUids, function (sSubUid) { -// _.each(bRoot ? aAllUids : aRootUids, function (sSubUid) { Cache.storeMessageFlagsToCacheBySetAction( sFolderFullNameRaw, sSubUid, iSetAction); }); Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, aRootUids, false); -// Remote.messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, bRoot ? aAllUids : aRootUids, false); break; } diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 399e51912..f05d1c3e5 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -978,7 +978,7 @@ } }; - MessageModel.prototype.storeDataToDom = function () + MessageModel.prototype.storeDataInDom = function () { if (this.body) { @@ -997,7 +997,7 @@ } }; - MessageModel.prototype.storePgpVerifyDataToDom = function () + MessageModel.prototype.storePgpVerifyDataInDom = function () { if (this.body && require('Stores/User/Pgp').capaOpenPGP()) { @@ -1006,7 +1006,7 @@ } }; - MessageModel.prototype.fetchDataToDom = function () + MessageModel.prototype.fetchDataFromDom = function () { if (this.body) { @@ -1090,7 +1090,7 @@ } catch (oExc) {} - this.storePgpVerifyDataToDom(); + this.storePgpVerifyDataInDom(); } }; @@ -1162,7 +1162,7 @@ } catch (oExc) {} - this.storePgpVerifyDataToDom(); + this.storePgpVerifyDataInDom(); } }; diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js index e37362cfa..96e72dbd4 100644 --- a/dev/Promises/User/Ajax.js +++ b/dev/Promises/User/Ajax.js @@ -16,8 +16,6 @@ // AppStore = require('Stores/User/App'), // SettingsStore = require('Stores/User/Settings'), - MessageSimpleModel = require('Model/MessageSimple'), - PromisesPopulator = require('Promises/User/Populator'), AbstractAjaxPromises = require('Promises/AbstractAjax') ; diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 2632a5f9a..b9e2331bb 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -327,6 +327,7 @@ var self = this, iUnseenCount = 0, + oMessage = null, aMessageList = this.messageList(), oFromFolder = Cache.getFolderFromCacheList(sFromFolderFullNameRaw), oToFolder = '' === sToFolderFullNameRaw ? null : Cache.getFolderFromCacheList(sToFolderFullNameRaw || ''), @@ -406,6 +407,56 @@ { Cache.setFolderHash(sToFolderFullNameRaw, ''); } + + if ('' !== this.messageListThreadUid()) + { + aMessageList = this.messageList(); + + if (aMessageList && 0 < aMessageList.length && !!_.find(aMessageList, function (oMessage) { + return !!(oMessage && oMessage.deleted() && oMessage.uid === self.messageListThreadUid()); + })) + { + oMessage = _.find(aMessageList, function (oMessage) { + return oMessage && !oMessage.deleted(); + }); + + if (oMessage && this.messageListThreadUid() !== Utils.pString(oMessage.uid)) + { + this.messageListThreadUid(Utils.pString(oMessage.uid)); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + this.messageListPage(), + this.messageListSearch(), + this.messageListThreadUid() + ), true, true); + } + else if (!oMessage) + { + if (1 < this.messageListPage()) + { + this.messageListPage(this.messageListPage() - 1); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + this.messageListPage(), + this.messageListSearch(), + this.messageListThreadUid() + ), true, true); + } + else + { + this.messageListThreadUid(''); + + kn.setHash(Links.mailBox( + FolderStore.currentFolderFullNameHash(), + this.messageListPageBeforeThread(), + this.messageListSearch() + ), true, true); + } + } + } + } }; MessageUserStore.prototype.addBlockquoteSwitcherCallback = function () @@ -574,7 +625,7 @@ oMessagesBodiesDom.append(oMessage.body); } - oMessage.storeDataToDom(); + oMessage.storeDataInDom(); if (bHasInternals) { @@ -594,7 +645,7 @@ if (oMessage.body) { oMessage.body.data('rl-cache-count', ++Globals.iMessageBodyCacheCount); - oMessage.fetchDataToDom(); + oMessage.fetchDataFromDom(); } } @@ -725,7 +776,6 @@ oData.Result['@Collection'] && Utils.isArray(oData.Result['@Collection'])) { var - self = this, iIndex = 0, iLen = 0, iCount = 0, diff --git a/dev/Styles/MessageList.less b/dev/Styles/MessageList.less index eba936ca0..78eba39e2 100644 --- a/dev/Styles/MessageList.less +++ b/dev/Styles/MessageList.less @@ -181,8 +181,8 @@ html.rl-no-preview-pane { .listThreadUidDesc { font-size: 16px; padding: 7px 20px 5px 20px; - border-bottom: 1px solid #eee; - background-color: #FCF8E3; + background-color: #999; + color: #fff; cursor: pointer; text-align: center; } diff --git a/package.json b/package.json index 4dba13d46..eca6fd444 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "304", + "release": "305", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 14faa9903..fa7c2261c 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -2079,11 +2079,8 @@ class MailClient if (0 < $iMessageRealCount) { - $mAllSortedUids = $this->GetUids($oCacher, '', $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); - - $bUseSortIfSupported = $bUseSortIfSupported ? $this->oImapClient->IsSupported('SORT') : false; - -// $bUseThreadSortIfSupported = $bUseThreadSortIfSupported ? + $mAllSortedUids = $this->GetUids($oCacher, '', + $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported); $mAllThreads = $bUseThreadSortIfSupported ? $this->MessageListThreadsMap( $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $mAllSortedUids, $oCacher) : null; @@ -2091,12 +2088,32 @@ class MailClient if ($bUseThreadSortIfSupported && 0 < $iThreadUid && \is_array($mAllThreads)) { $aUids = array(); - $aUids = \is_array($mAllThreads[$iThreadUid]) ? - $mAllThreads[$iThreadUid] : array(); - - if (\in_array($iThreadUid, $mAllSortedUids)) + $iResultRootUid = 0; + + if (isset($mAllThreads[$iThreadUid])) { - \array_unshift($aUids, $iThreadUid); + $iResultRootUid = $iThreadUid; + if (\is_array($mAllThreads[$iThreadUid])) + { + $aUids = $mAllThreads[$iThreadUid]; + } + } + else + { + foreach ($mAllThreads as $iRootUid => $mSubUids) + { + if (\is_array($mSubUids) && \in_array($iThreadUid, $mSubUids)) + { + $iResultRootUid = $iRootUid; + $aUids = $mSubUids; + continue; + } + } + } + + if (0 < $iResultRootUid && \in_array($iResultRootUid, $mAllSortedUids)) + { + \array_unshift($aUids, $iResultRootUid); } } else if ($bUseThreadSortIfSupported && \is_array($mAllThreads))