diff --git a/dev/Boots/RainLoopApp.js b/dev/Boots/RainLoopApp.js index 58dd84a5b..fc9f9bced 100644 --- a/dev/Boots/RainLoopApp.js +++ b/dev/Boots/RainLoopApp.js @@ -13,6 +13,7 @@ function RainLoopApp() this.oCache = null; this.quotaDebounce = _.debounce(this.quota, 1000 * 30); + this.moveOrDeleteResponseHelper = _.bind(this.moveOrDeleteResponseHelper, this); window.setInterval(function () { RL.pub('interval.30s'); @@ -163,6 +164,137 @@ RainLoopApp.prototype.recacheInboxMessageList = function () RL.remote().messageList(Utils.emptyFunction, 'INBOX', 0, RL.data().messagesPerPage(), '', true); }; +RainLoopApp.prototype.moveOrDeleteResponseHelper = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && RL.data().currentFolder()) + { + if (oData && Utils.isArray(oData.Result) && 2 === oData.Result.length) + { + RL.cache().setFolderHash(oData.Result[0], oData.Result[1]); + } + else + { + RL.cache().setFolderHash(RL.data().currentFolderFullNameRaw(), ''); + + if (oData && -1 < Utils.inArray(oData.ErrorCode, + [Enums.Notification.CantMoveMessage, Enums.Notification.CantCopyMessage])) + { + window.alert(Utils.getNotification(oData.ErrorCode)); + } + } + + RL.reloadMessageList(0 === RL.data().messageList().length); + RL.quotaDebounce(); + } +}; + +/** + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + */ +RainLoopApp.prototype.deleteMessagesFromFolderWithoutCheck = function (sFromFolderFullNameRaw, aUidForRemove) +{ + RL.remote().messagesDelete( + this.moveOrDeleteResponseHelper, + sFromFolderFullNameRaw, + aUidForRemove + ); + + RL.data().removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove); +}; + +/** + * @param {number} iDeleteType + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + * @param {boolean=} bUseFolder = true + */ +RainLoopApp.prototype.deleteMessagesFromFolder = function (iDeleteType, sFromFolderFullNameRaw, aUidForRemove, bUseFolder) +{ + var + self = this, + oData = RL.data(), + oCache = RL.cache(), + oTrashOrSpamFolder = oCache.getFolderFromCacheList( + Enums.FolderType.Spam === iDeleteType ? oData.spamFolder() : oData.trashFolder()) + ; + + bUseFolder = Utils.isUnd(bUseFolder) ? true : !!bUseFolder; + if (bUseFolder) + { + if ((Enums.FolderType.Spam === iDeleteType && Consts.Values.UnuseOptionValue === oData.spamFolder()) || + (Enums.FolderType.Trash === iDeleteType && Consts.Values.UnuseOptionValue === oData.trashFolder())) + { + bUseFolder = false; + } + } + + if (!oTrashOrSpamFolder && bUseFolder) + { + kn.showScreenPopup(PopupsFolderSystemViewModel, [ + Enums.FolderType.Spam === iDeleteType ? Enums.SetSystemFoldersNotification.Spam : Enums.SetSystemFoldersNotification.Trash]); + } + else if (!bUseFolder || (sFromFolderFullNameRaw === oData.spamFolder() || sFromFolderFullNameRaw === oData.trashFolder())) + { + kn.showScreenPopup(PopupsAskViewModel, [Utils.i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), function () { + + RL.remote().messagesDelete( + self.moveOrDeleteResponseHelper, + sFromFolderFullNameRaw, + aUidForRemove + ); + + oData.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove); + + }]); + } + else if (oTrashOrSpamFolder) + { + RL.remote().messagesMove( + this.moveOrDeleteResponseHelper, + sFromFolderFullNameRaw, + oTrashOrSpamFolder.fullNameRaw, + aUidForRemove + ); + + oData.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, oTrashOrSpamFolder.fullNameRaw); + } +}; + +/** + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForMove + * @param {string} sToFolderFullNameRaw + * @param {boolean=} bCopy = false + */ +RainLoopApp.prototype.moveMessagesToFolder = function (sFromFolderFullNameRaw, aUidForMove, sToFolderFullNameRaw, bCopy) +{ + if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && Utils.isArray(aUidForMove) && 0 < aUidForMove.length) + { + var + oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), + oToFolder = RL.cache().getFolderFromCacheList(sToFolderFullNameRaw) + ; + + if (oFromFolder && oToFolder) + { + bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; + + RL.remote()[bCopy ? 'messagesCopy' : 'messagesMove']( + this.moveOrDeleteResponseHelper, + oFromFolder.fullNameRaw, + oToFolder.fullNameRaw, + aUidForMove + ); + + RL.data().removeMessagesFromList(oFromFolder.fullNameRaw, aUidForMove, oToFolder.fullNameRaw, bCopy); + return true; + } + } + + return false; +}; + /** * @param {Function=} fCallback */ diff --git a/dev/Storages/WebMailData.js b/dev/Storages/WebMailData.js index 438657073..a0f2a1620 100644 --- a/dev/Storages/WebMailData.js +++ b/dev/Storages/WebMailData.js @@ -714,6 +714,107 @@ WebMailDataStorage.prototype.getNextFolderNames = function (bBoot) return _.uniq(aResult); }; +/** + * @param {Function} fCallback + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + * @param {string=} sToFolderFullNameRaw = '' + * @param {bCopy=} bCopy = false + */ +WebMailDataStorage.prototype.removeMessagesFromList = function ( + sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy) +{ + sToFolderFullNameRaw = Utils.isNormal(sToFolderFullNameRaw) ? sToFolderFullNameRaw : ''; + bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; + + aUidForRemove = _.map(aUidForRemove, function (mValue) { + return Utils.pInt(mValue); + }); + + var + iUnseenCount = 0, + oData = RL.data(), + oCache = RL.cache(), + oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), + oToFolder = '' === sToFolderFullNameRaw ? null : oCache.getFolderFromCacheList(sToFolderFullNameRaw || ''), + sCurrentFolderFullNameRaw = oData.currentFolderFullNameRaw(), + oCurrentMessage = oData.message(), + aMessages = sCurrentFolderFullNameRaw === sFromFolderFullNameRaw ? _.filter(oData.messageList(), function (oMessage) { + return oMessage && -1 < Utils.inArray(Utils.pInt(oMessage.uid), aUidForRemove); + }) : [] + ; + + _.each(aMessages, function (oMessage) { + if (oMessage && oMessage.unseen()) + { + iUnseenCount++; + } + }); + + if (oFromFolder && !bCopy) + { + oFromFolder.messageCountAll(0 <= oFromFolder.messageCountAll() - aUidForRemove.length ? + oFromFolder.messageCountAll() - aUidForRemove.length : 0); + + if (0 < iUnseenCount) + { + oFromFolder.messageCountUnread(0 <= oFromFolder.messageCountUnread() - iUnseenCount ? + oFromFolder.messageCountUnread() - iUnseenCount : 0); + } + } + + if (oToFolder) + { + oToFolder.messageCountAll(oToFolder.messageCountAll() + aUidForRemove.length); + if (0 < iUnseenCount) + { + oToFolder.messageCountUnread(oToFolder.messageCountUnread() + iUnseenCount); + } + + oToFolder.actionBlink(true); + } + + if (0 < aMessages.length) + { + if (bCopy) + { + _.each(aMessages, function (oMessage) { + oMessage.checked(false); + }); + } + else + { + oData.messageListIsNotCompleted(true); + + _.each(aMessages, function (oMessage) { + if (oCurrentMessage && oCurrentMessage.requestHash === oMessage.requestHash) + { + oCurrentMessage = null; + oData.message(null); + } + + oMessage.deleted(true); + }); + + _.delay(function () { + _.each(aMessages, function (oMessage) { + oData.messageList.remove(oMessage); + }); + }, 400); + } + } + + if ('' !== sFromFolderFullNameRaw) + { + oCache.setFolderHash(sFromFolderFullNameRaw, ''); + } + + if ('' !== sToFolderFullNameRaw) + { + oCache.setFolderHash(sToFolderFullNameRaw, ''); + } +}; + WebMailDataStorage.prototype.setMessage = function (oData, bCached) { var diff --git a/dev/ViewModels/MailBoxFolderListViewModel.js b/dev/ViewModels/MailBoxFolderListViewModel.js index 491afd177..3bb746504 100644 --- a/dev/ViewModels/MailBoxFolderListViewModel.js +++ b/dev/ViewModels/MailBoxFolderListViewModel.js @@ -99,10 +99,9 @@ MailBoxFolderListViewModel.prototype.messagesDrop = function (oToFolder, oUi) aUids = oUi.helper.data('rl-uids') ; - if (MailBoxMessageListViewModel && MailBoxMessageListViewModel.__vm && Utils.isNormal(sFromFolderFullNameRaw) && Utils.isArray(aUids)) + if (Utils.isNormal(sFromFolderFullNameRaw) && '' !== sFromFolderFullNameRaw && Utils.isArray(aUids)) { - MailBoxMessageListViewModel.__vm.moveMessagesToFolder( - sFromFolderFullNameRaw, aUids, oToFolder.fullNameRaw, bCopy); + RL.moveMessagesToFolder(sFromFolderFullNameRaw, aUids, oToFolder.fullNameRaw, bCopy); } } }; diff --git a/dev/ViewModels/MailBoxMessageListViewModel.js b/dev/ViewModels/MailBoxMessageListViewModel.js index 7e7eadbc0..d16108741 100644 --- a/dev/ViewModels/MailBoxMessageListViewModel.js +++ b/dev/ViewModels/MailBoxMessageListViewModel.js @@ -131,15 +131,21 @@ function MailBoxMessageListViewModel() }, this.canBeMoved); this.deleteWithoutMoveCommand = Utils.createCommand(this, function () { - this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Trash, false); + RL.deleteMessagesFromFolder(Enums.FolderType.Trash, + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), false); }, this.canBeMoved); this.deleteCommand = Utils.createCommand(this, function () { - this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Trash, true); + RL.deleteMessagesFromFolder(Enums.FolderType.Trash, + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), true); }, this.canBeMoved); this.spamCommand = Utils.createCommand(this, function () { - this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Spam, true); + RL.deleteMessagesFromFolder(Enums.FolderType.Spam, + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), true); }, this.canBeMoved); this.moveCommand = Utils.createCommand(this, Utils.emptyFunction, this.canBeMoved); @@ -197,8 +203,6 @@ function MailBoxMessageListViewModel() }, this) ; - this.moveOrDeleteResponse = _.bind(this.moveOrDeleteResponse, this); - Knoin.constructorEnd(this); } @@ -221,165 +225,6 @@ MailBoxMessageListViewModel.prototype.cancelSearch = function () this.inputMessageListSearchFocus(false); }; -/** - * @param {string} sFromFolderFullNameRaw - * @param {Array} aUidForRemove - * @param {string=} sToFolderFullNameRaw - * @param {boolean=} bCopy = false - */ -MailBoxMessageListViewModel.prototype.removeMessagesFromList = function (sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy) -{ - sToFolderFullNameRaw = Utils.isNormal(sToFolderFullNameRaw) ? sToFolderFullNameRaw : ''; - bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; - - var - iUnseenCount = 0 , - oData = RL.data(), - oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), - oToFolder = '' === sToFolderFullNameRaw ? null : RL.cache().getFolderFromCacheList(sToFolderFullNameRaw || ''), - sCurrentFolderFullNameRaw = oData.currentFolderFullNameRaw(), - oCurrentMessage = oData.message(), - aMessages = sCurrentFolderFullNameRaw === sFromFolderFullNameRaw ? _.filter(oData.messageList(), function (oMessage) { - return oMessage && -1 < Utils.inArray(oMessage.uid, aUidForRemove); - }) : [] - ; - - _.each(aMessages, function (oMessage) { - if (oMessage && oMessage.unseen()) - { - iUnseenCount++; - } - }); - - if (oFromFolder && !bCopy) - { - oFromFolder.messageCountAll(0 <= oFromFolder.messageCountAll() - aUidForRemove.length ? - oFromFolder.messageCountAll() - aUidForRemove.length : 0); - - if (0 < iUnseenCount) - { - oFromFolder.messageCountUnread(0 <= oFromFolder.messageCountUnread() - iUnseenCount ? - oFromFolder.messageCountUnread() - iUnseenCount : 0); - } - } - - if (oToFolder) - { - oToFolder.messageCountAll(oToFolder.messageCountAll() + aUidForRemove.length); - if (0 < iUnseenCount) - { - oToFolder.messageCountUnread(oToFolder.messageCountUnread() + iUnseenCount); - } - } - - if (0 < aMessages.length) - { - if (bCopy) - { - _.each(aMessages, function (oMessage) { - oMessage.checked(false); - }); - } - else - { - _.each(aMessages, function (oMessage) { - if (oCurrentMessage && oCurrentMessage.requestHash === oMessage.requestHash) - { - oCurrentMessage = null; - oData.message(null); - } - - oMessage.deleted(true); - }); - - _.delay(function () { - _.each(aMessages, function (oMessage) { - oData.messageList.remove(oMessage); - }); - }, 400); - - RL.data().messageListIsNotCompleted(true); - RL.cache().setFolderHash(sFromFolderFullNameRaw, ''); - } - - if (Utils.isNormal(sToFolderFullNameRaw)) - { - RL.cache().setFolderHash(sToFolderFullNameRaw || '', ''); - } - } -}; - -/** - * @param {string=} sToFolderFullNameRaw - */ -MailBoxMessageListViewModel.prototype.removeCheckedOrSelectedMessagesFromList = function (sToFolderFullNameRaw) -{ - this.removeMessagesFromList(RL.data().currentFolderFullNameRaw(), _.map(RL.data().messageListCheckedOrSelected(), function (oMessage) { - return oMessage.uid; - }), sToFolderFullNameRaw); -}; - -MailBoxMessageListViewModel.prototype.moveOrDeleteResponse = function (sResult, oData) -{ - if (Enums.StorageResultType.Success === sResult && RL.data().currentFolder()) - { - if (oData && Utils.isArray(oData.Result) && 2 === oData.Result.length) - { - RL.cache().setFolderHash(oData.Result[0], oData.Result[1]); - } - else - { - if (oData && -1 < Utils.inArray(oData.ErrorCode, - [Enums.Notification.CantMoveMessage, Enums.Notification.CantCopyMessage])) - { - window.alert(Utils.getNotification(oData.ErrorCode)); - } - - RL.cache().setFolderHash(RL.data().currentFolderFullNameRaw(), ''); - } - - RL.reloadMessageList(); - - RL.quotaDebounce(); - } -}; - -/** - * @param {string} sFromFolderFullNameRaw - * @param {Array} aUidForRemove - * @param {string} sToFolderFullNameRaw - * @param {boolean=} bCopy = false - */ -MailBoxMessageListViewModel.prototype.moveMessagesToFolder = function (sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy) -{ - if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && Utils.isArray(aUidForRemove) && 0 < aUidForRemove.length) - { - var - oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), - oToFolder = RL.cache().getFolderFromCacheList(sToFolderFullNameRaw) - ; - - if (oFromFolder && oToFolder) - { - bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; - - RL.remote()[bCopy ? 'messagesCopy' : 'messagesMove']( - this.moveOrDeleteResponse, - oFromFolder.fullNameRaw, - oToFolder.fullNameRaw, - aUidForRemove - ); - - oToFolder.actionBlink(true); - - this.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy); - return true; - } - } - - return false; -}; - /** * @param {string} sToFolderFullNameRaw * @return {boolean} @@ -388,74 +233,14 @@ MailBoxMessageListViewModel.prototype.moveSelectedMessagesToFolder = function (s { if (this.canBeMoved()) { - return this.moveMessagesToFolder(RL.data().currentFolderFullNameRaw(), + RL.moveMessagesToFolder( + RL.data().currentFolderFullNameRaw(), RL.data().messageListCheckedOrSelectedUidsWithSubMails(), sToFolderFullNameRaw); } return false; }; -/** - * @param {number} iType - * @param {boolean=} bUseFolder = true - */ -MailBoxMessageListViewModel.prototype.deleteSelectedMessageFromCurrentFolder = function (iType, bUseFolder) -{ - if (this.canBeMoved()) - { - bUseFolder = Utils.isUnd(bUseFolder) ? true : !!bUseFolder; - if (bUseFolder) - { - if ((Enums.FolderType.Spam === iType && Consts.Values.UnuseOptionValue === RL.data().spamFolder()) || - (Enums.FolderType.Trash === iType && Consts.Values.UnuseOptionValue === RL.data().trashFolder())) - { - bUseFolder = false; - } - } - - var - self = this, - aUIds = null, - sCurrentFolderFullNameRaw = RL.data().currentFolderFullNameRaw(), - oTrashOrSpamFolder = RL.cache().getFolderFromCacheList( - Enums.FolderType.Spam === iType ? RL.data().spamFolder() : RL.data().trashFolder()) - ; - - if (!oTrashOrSpamFolder && bUseFolder) - { - kn.showScreenPopup(PopupsFolderSystemViewModel, [ - Enums.FolderType.Spam === iType ? Enums.SetSystemFoldersNotification.Spam : Enums.SetSystemFoldersNotification.Trash]); - } - else if (!bUseFolder || (oTrashOrSpamFolder && RL.data().currentFolderFullNameRaw() === oTrashOrSpamFolder.fullNameRaw)) - { - aUIds = RL.data().messageListCheckedOrSelectedUidsWithSubMails(); - - kn.showScreenPopup(PopupsAskViewModel, [Utils.i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), function () { - - RL.remote().messagesDelete( - self.moveOrDeleteResponse, - sCurrentFolderFullNameRaw, - aUIds - ); - - self.removeCheckedOrSelectedMessagesFromList(); - }]); - } - else if (oTrashOrSpamFolder) - { - RL.remote().messagesMove( - this.moveOrDeleteResponse, - sCurrentFolderFullNameRaw, - oTrashOrSpamFolder.fullNameRaw, - RL.data().messageListCheckedOrSelectedUidsWithSubMails() - ); - - oTrashOrSpamFolder.actionBlink(true); - this.removeCheckedOrSelectedMessagesFromList(oTrashOrSpamFolder.fullNameRaw); - } - } -}; - MailBoxMessageListViewModel.prototype.dragAndDronHelper = function (oMessageListItem, bCopy) { if (oMessageListItem) diff --git a/dev/ViewModels/MailBoxMessageViewViewModel.js b/dev/ViewModels/MailBoxMessageViewViewModel.js index 90183c7ee..ddd65780f 100644 --- a/dev/ViewModels/MailBoxMessageViewViewModel.js +++ b/dev/ViewModels/MailBoxMessageViewViewModel.js @@ -68,13 +68,25 @@ function MailBoxMessageViewViewModel() }, this.messageVisibility); this.deleteCommand = Utils.createCommand(this, function () { - // TODO - window.console.log(arguments); + + if (this.message()) + { + RL.deleteMessagesFromFolder(Enums.FolderType.Trash, + this.message().folderFullNameRaw, + [this.message().uid], true); + } + }, this.messageVisibility); this.spamCommand = Utils.createCommand(this, function () { - // TODO - window.console.log(arguments); + + if (this.message()) + { + RL.deleteMessagesFromFolder(Enums.FolderType.Spam, + this.message().folderFullNameRaw, + [this.message().uid], true); + } + }, this.messageVisibility); // viewer diff --git a/dev/ViewModels/PopupsComposeViewModel.js b/dev/ViewModels/PopupsComposeViewModel.js index f0910296b..8977e504a 100644 --- a/dev/ViewModels/PopupsComposeViewModel.js +++ b/dev/ViewModels/PopupsComposeViewModel.js @@ -14,7 +14,6 @@ function PopupsComposeViewModel() this.bFromDraft = false; this.sReferences = ''; - this.bReloadFolder = false; this.bAllowIdentities = RL.settingsGet('AllowIdentities'); this.bAllowCtrlS = !!RL.settingsGet('AllowCtrlSOnCompose'); @@ -177,38 +176,7 @@ function PopupsComposeViewModel() this.deleteCommand = Utils.createCommand(this, function () { - var - oMessage = null, - sDraftFolder = this.draftFolder(), - sDraftUid = this.draftUid() - ; - - if (this.bFromDraft) - { - oMessage = RL.data().message(); - if (oMessage && sDraftFolder === oMessage.folderFullNameRaw && sDraftUid === oMessage.uid) - { - RL.data().message(null); - } - } - - if (RL.data().currentFolderFullNameRaw() === this.draftFolder()) - { - _.each(RL.data().messageList(), function (oMessage) { - if (oMessage && sDraftFolder === oMessage.folderFullNameRaw && sDraftUid === oMessage.uid) - { - oMessage.deleted(true); - } - }); - } - - RL.data().messageListIsNotCompleted(true); - RL.remote().messagesDelete(function () { - RL.cache().setFolderHash(sDraftFolder, ''); - RL.reloadMessageList(); - }, this.draftFolder(), [this.draftUid()]); - - this.bReloadFolder = false; + RL.deleteMessagesFromFolderWithoutCheck(this.draftFolder(), [this.draftUid()]); kn.hideScreenPopup(PopupsComposeViewModel); }, function () { @@ -247,7 +215,6 @@ function PopupsComposeViewModel() { this.sendError(false); this.sending(true); - this.bReloadFolder = true; if (Utils.isArray(this.aDraftInfo) && 3 === this.aDraftInfo.length) { @@ -265,6 +232,7 @@ function PopupsComposeViewModel() RL.cache().setMessageFlagsToCache(this.aDraftInfo[2], this.aDraftInfo[1], aFlagsCache); RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + RL.cache().setFolderHash(this.aDraftInfo[2], ''); } } @@ -305,7 +273,6 @@ function PopupsComposeViewModel() { this.savedError(false); this.saving(true); - this.bReloadFolder = true; RL.cache().setFolderHash(RL.data().draftFolder(), ''); @@ -368,14 +335,6 @@ function PopupsComposeViewModel() return this.dropboxEnabled(); }); - this.modalVisibility.subscribe(function (bValue) { - if (!bValue && this.bReloadFolder) - { - this.bReloadFolder = false; - RL.reloadMessageList(); - } - }, this); - this.driveEnabled = ko.observable(false); this.driveCommand = Utils.createCommand(this, function () { @@ -396,6 +355,23 @@ function PopupsComposeViewModel() Utils.extendAsViewModel('PopupsComposeViewModel', PopupsComposeViewModel); +PopupsComposeViewModel.prototype.reloadDraftFolder = function () +{ + var sDraftFolder = RL.data().draftFolder(); + if ('' !== sDraftFolder) + { + RL.cache().setFolderHash(sDraftFolder, ''); + if (RL.data().currentFolderFullNameRaw() === sDraftFolder) + { + RL.reloadMessageList(true); + } + else + { + RL.folderInformation(sDraftFolder); + } + } +}; + PopupsComposeViewModel.prototype.findIdentityIdByMessage = function (sComposeType, oMessage) { var @@ -508,6 +484,8 @@ PopupsComposeViewModel.prototype.sendMessageResponse = function (sResult, oData) window.alert(sMessage || Utils.getNotification(Enums.Notification.CantSendMessage)); } } + + this.reloadDraftFolder(); }; PopupsComposeViewModel.prototype.saveMessageResponse = function (sResult, oData) @@ -560,6 +538,8 @@ PopupsComposeViewModel.prototype.saveMessageResponse = function (sResult, oData) this.savedError(true); this.savedOrSendingText(Utils.getNotification(Enums.Notification.CantSaveMessage)); } + + this.reloadDraftFolder(); }; PopupsComposeViewModel.prototype.onHide = function () @@ -1439,7 +1419,6 @@ PopupsComposeViewModel.prototype.reset = function () this.sInReplyTo = ''; this.bFromDraft = false; this.sReferences = ''; - this.bReloadFolder = false; this.sendError(false); this.sendSuccessButSaveError(false); diff --git a/rainloop/v/0.0.0/app/templates/Views/MailMessageList.html b/rainloop/v/0.0.0/app/templates/Views/MailMessageList.html index fe1b47371..3b6d8b2ab 100644 --- a/rainloop/v/0.0.0/app/templates/Views/MailMessageList.html +++ b/rainloop/v/0.0.0/app/templates/Views/MailMessageList.html @@ -26,7 +26,7 @@ -   + diff --git a/rainloop/v/0.0.0/app/templates/Views/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/MailMessageView.html index e4ce8f666..6d9863861 100644 --- a/rainloop/v/0.0.0/app/templates/Views/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/MailMessageView.html @@ -24,16 +24,16 @@ - - --> +
 
diff --git a/rainloop/v/0.0.0/static/js/app.js b/rainloop/v/0.0.0/static/js/app.js index 49f1dfdfb..a73f1f65e 100644 --- a/rainloop/v/0.0.0/static/js/app.js +++ b/rainloop/v/0.0.0/static/js/app.js @@ -7685,7 +7685,6 @@ function PopupsComposeViewModel() this.bFromDraft = false; this.sReferences = ''; - this.bReloadFolder = false; this.bAllowIdentities = RL.settingsGet('AllowIdentities'); this.bAllowCtrlS = !!RL.settingsGet('AllowCtrlSOnCompose'); @@ -7848,38 +7847,7 @@ function PopupsComposeViewModel() this.deleteCommand = Utils.createCommand(this, function () { - var - oMessage = null, - sDraftFolder = this.draftFolder(), - sDraftUid = this.draftUid() - ; - - if (this.bFromDraft) - { - oMessage = RL.data().message(); - if (oMessage && sDraftFolder === oMessage.folderFullNameRaw && sDraftUid === oMessage.uid) - { - RL.data().message(null); - } - } - - if (RL.data().currentFolderFullNameRaw() === this.draftFolder()) - { - _.each(RL.data().messageList(), function (oMessage) { - if (oMessage && sDraftFolder === oMessage.folderFullNameRaw && sDraftUid === oMessage.uid) - { - oMessage.deleted(true); - } - }); - } - - RL.data().messageListIsNotCompleted(true); - RL.remote().messagesDelete(function () { - RL.cache().setFolderHash(sDraftFolder, ''); - RL.reloadMessageList(); - }, this.draftFolder(), [this.draftUid()]); - - this.bReloadFolder = false; + RL.deleteMessagesFromFolderWithoutCheck(this.draftFolder(), [this.draftUid()]); kn.hideScreenPopup(PopupsComposeViewModel); }, function () { @@ -7918,7 +7886,6 @@ function PopupsComposeViewModel() { this.sendError(false); this.sending(true); - this.bReloadFolder = true; if (Utils.isArray(this.aDraftInfo) && 3 === this.aDraftInfo.length) { @@ -7936,6 +7903,7 @@ function PopupsComposeViewModel() RL.cache().setMessageFlagsToCache(this.aDraftInfo[2], this.aDraftInfo[1], aFlagsCache); RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + RL.cache().setFolderHash(this.aDraftInfo[2], ''); } } @@ -7976,7 +7944,6 @@ function PopupsComposeViewModel() { this.savedError(false); this.saving(true); - this.bReloadFolder = true; RL.cache().setFolderHash(RL.data().draftFolder(), ''); @@ -8039,14 +8006,6 @@ function PopupsComposeViewModel() return this.dropboxEnabled(); }); - this.modalVisibility.subscribe(function (bValue) { - if (!bValue && this.bReloadFolder) - { - this.bReloadFolder = false; - RL.reloadMessageList(); - } - }, this); - this.driveEnabled = ko.observable(false); this.driveCommand = Utils.createCommand(this, function () { @@ -8067,6 +8026,23 @@ function PopupsComposeViewModel() Utils.extendAsViewModel('PopupsComposeViewModel', PopupsComposeViewModel); +PopupsComposeViewModel.prototype.reloadDraftFolder = function () +{ + var sDraftFolder = RL.data().draftFolder(); + if ('' !== sDraftFolder) + { + RL.cache().setFolderHash(sDraftFolder, ''); + if (RL.data().currentFolderFullNameRaw() === sDraftFolder) + { + RL.reloadMessageList(true); + } + else + { + RL.folderInformation(sDraftFolder); + } + } +}; + PopupsComposeViewModel.prototype.findIdentityIdByMessage = function (sComposeType, oMessage) { var @@ -8179,6 +8155,8 @@ PopupsComposeViewModel.prototype.sendMessageResponse = function (sResult, oData) window.alert(sMessage || Utils.getNotification(Enums.Notification.CantSendMessage)); } } + + this.reloadDraftFolder(); }; PopupsComposeViewModel.prototype.saveMessageResponse = function (sResult, oData) @@ -8231,6 +8209,8 @@ PopupsComposeViewModel.prototype.saveMessageResponse = function (sResult, oData) this.savedError(true); this.savedOrSendingText(Utils.getNotification(Enums.Notification.CantSaveMessage)); } + + this.reloadDraftFolder(); }; PopupsComposeViewModel.prototype.onHide = function () @@ -9110,7 +9090,6 @@ PopupsComposeViewModel.prototype.reset = function () this.sInReplyTo = ''; this.bFromDraft = false; this.sReferences = ''; - this.bReloadFolder = false; this.sendError(false); this.sendSuccessButSaveError(false); @@ -11002,10 +10981,9 @@ MailBoxFolderListViewModel.prototype.messagesDrop = function (oToFolder, oUi) aUids = oUi.helper.data('rl-uids') ; - if (MailBoxMessageListViewModel && MailBoxMessageListViewModel.__vm && Utils.isNormal(sFromFolderFullNameRaw) && Utils.isArray(aUids)) + if (Utils.isNormal(sFromFolderFullNameRaw) && '' !== sFromFolderFullNameRaw && Utils.isArray(aUids)) { - MailBoxMessageListViewModel.__vm.moveMessagesToFolder( - sFromFolderFullNameRaw, aUids, oToFolder.fullNameRaw, bCopy); + RL.moveMessagesToFolder(sFromFolderFullNameRaw, aUids, oToFolder.fullNameRaw, bCopy); } } }; @@ -11164,15 +11142,21 @@ function MailBoxMessageListViewModel() }, this.canBeMoved); this.deleteWithoutMoveCommand = Utils.createCommand(this, function () { - this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Trash, false); + RL.deleteMessagesFromFolder(Enums.FolderType.Trash, + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), false); }, this.canBeMoved); this.deleteCommand = Utils.createCommand(this, function () { - this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Trash, true); + RL.deleteMessagesFromFolder(Enums.FolderType.Trash, + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), true); }, this.canBeMoved); this.spamCommand = Utils.createCommand(this, function () { - this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Spam, true); + RL.deleteMessagesFromFolder(Enums.FolderType.Spam, + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), true); }, this.canBeMoved); this.moveCommand = Utils.createCommand(this, Utils.emptyFunction, this.canBeMoved); @@ -11230,8 +11214,6 @@ function MailBoxMessageListViewModel() }, this) ; - this.moveOrDeleteResponse = _.bind(this.moveOrDeleteResponse, this); - Knoin.constructorEnd(this); } @@ -11254,165 +11236,6 @@ MailBoxMessageListViewModel.prototype.cancelSearch = function () this.inputMessageListSearchFocus(false); }; -/** - * @param {string} sFromFolderFullNameRaw - * @param {Array} aUidForRemove - * @param {string=} sToFolderFullNameRaw - * @param {boolean=} bCopy = false - */ -MailBoxMessageListViewModel.prototype.removeMessagesFromList = function (sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy) -{ - sToFolderFullNameRaw = Utils.isNormal(sToFolderFullNameRaw) ? sToFolderFullNameRaw : ''; - bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; - - var - iUnseenCount = 0 , - oData = RL.data(), - oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), - oToFolder = '' === sToFolderFullNameRaw ? null : RL.cache().getFolderFromCacheList(sToFolderFullNameRaw || ''), - sCurrentFolderFullNameRaw = oData.currentFolderFullNameRaw(), - oCurrentMessage = oData.message(), - aMessages = sCurrentFolderFullNameRaw === sFromFolderFullNameRaw ? _.filter(oData.messageList(), function (oMessage) { - return oMessage && -1 < Utils.inArray(oMessage.uid, aUidForRemove); - }) : [] - ; - - _.each(aMessages, function (oMessage) { - if (oMessage && oMessage.unseen()) - { - iUnseenCount++; - } - }); - - if (oFromFolder && !bCopy) - { - oFromFolder.messageCountAll(0 <= oFromFolder.messageCountAll() - aUidForRemove.length ? - oFromFolder.messageCountAll() - aUidForRemove.length : 0); - - if (0 < iUnseenCount) - { - oFromFolder.messageCountUnread(0 <= oFromFolder.messageCountUnread() - iUnseenCount ? - oFromFolder.messageCountUnread() - iUnseenCount : 0); - } - } - - if (oToFolder) - { - oToFolder.messageCountAll(oToFolder.messageCountAll() + aUidForRemove.length); - if (0 < iUnseenCount) - { - oToFolder.messageCountUnread(oToFolder.messageCountUnread() + iUnseenCount); - } - } - - if (0 < aMessages.length) - { - if (bCopy) - { - _.each(aMessages, function (oMessage) { - oMessage.checked(false); - }); - } - else - { - _.each(aMessages, function (oMessage) { - if (oCurrentMessage && oCurrentMessage.requestHash === oMessage.requestHash) - { - oCurrentMessage = null; - oData.message(null); - } - - oMessage.deleted(true); - }); - - _.delay(function () { - _.each(aMessages, function (oMessage) { - oData.messageList.remove(oMessage); - }); - }, 400); - - RL.data().messageListIsNotCompleted(true); - RL.cache().setFolderHash(sFromFolderFullNameRaw, ''); - } - - if (Utils.isNormal(sToFolderFullNameRaw)) - { - RL.cache().setFolderHash(sToFolderFullNameRaw || '', ''); - } - } -}; - -/** - * @param {string=} sToFolderFullNameRaw - */ -MailBoxMessageListViewModel.prototype.removeCheckedOrSelectedMessagesFromList = function (sToFolderFullNameRaw) -{ - this.removeMessagesFromList(RL.data().currentFolderFullNameRaw(), _.map(RL.data().messageListCheckedOrSelected(), function (oMessage) { - return oMessage.uid; - }), sToFolderFullNameRaw); -}; - -MailBoxMessageListViewModel.prototype.moveOrDeleteResponse = function (sResult, oData) -{ - if (Enums.StorageResultType.Success === sResult && RL.data().currentFolder()) - { - if (oData && Utils.isArray(oData.Result) && 2 === oData.Result.length) - { - RL.cache().setFolderHash(oData.Result[0], oData.Result[1]); - } - else - { - if (oData && -1 < Utils.inArray(oData.ErrorCode, - [Enums.Notification.CantMoveMessage, Enums.Notification.CantCopyMessage])) - { - window.alert(Utils.getNotification(oData.ErrorCode)); - } - - RL.cache().setFolderHash(RL.data().currentFolderFullNameRaw(), ''); - } - - RL.reloadMessageList(); - - RL.quotaDebounce(); - } -}; - -/** - * @param {string} sFromFolderFullNameRaw - * @param {Array} aUidForRemove - * @param {string} sToFolderFullNameRaw - * @param {boolean=} bCopy = false - */ -MailBoxMessageListViewModel.prototype.moveMessagesToFolder = function (sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy) -{ - if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && Utils.isArray(aUidForRemove) && 0 < aUidForRemove.length) - { - var - oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), - oToFolder = RL.cache().getFolderFromCacheList(sToFolderFullNameRaw) - ; - - if (oFromFolder && oToFolder) - { - bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; - - RL.remote()[bCopy ? 'messagesCopy' : 'messagesMove']( - this.moveOrDeleteResponse, - oFromFolder.fullNameRaw, - oToFolder.fullNameRaw, - aUidForRemove - ); - - oToFolder.actionBlink(true); - - this.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy); - return true; - } - } - - return false; -}; - /** * @param {string} sToFolderFullNameRaw * @return {boolean} @@ -11421,74 +11244,14 @@ MailBoxMessageListViewModel.prototype.moveSelectedMessagesToFolder = function (s { if (this.canBeMoved()) { - return this.moveMessagesToFolder(RL.data().currentFolderFullNameRaw(), + RL.moveMessagesToFolder( + RL.data().currentFolderFullNameRaw(), RL.data().messageListCheckedOrSelectedUidsWithSubMails(), sToFolderFullNameRaw); } return false; }; -/** - * @param {number} iType - * @param {boolean=} bUseFolder = true - */ -MailBoxMessageListViewModel.prototype.deleteSelectedMessageFromCurrentFolder = function (iType, bUseFolder) -{ - if (this.canBeMoved()) - { - bUseFolder = Utils.isUnd(bUseFolder) ? true : !!bUseFolder; - if (bUseFolder) - { - if ((Enums.FolderType.Spam === iType && Consts.Values.UnuseOptionValue === RL.data().spamFolder()) || - (Enums.FolderType.Trash === iType && Consts.Values.UnuseOptionValue === RL.data().trashFolder())) - { - bUseFolder = false; - } - } - - var - self = this, - aUIds = null, - sCurrentFolderFullNameRaw = RL.data().currentFolderFullNameRaw(), - oTrashOrSpamFolder = RL.cache().getFolderFromCacheList( - Enums.FolderType.Spam === iType ? RL.data().spamFolder() : RL.data().trashFolder()) - ; - - if (!oTrashOrSpamFolder && bUseFolder) - { - kn.showScreenPopup(PopupsFolderSystemViewModel, [ - Enums.FolderType.Spam === iType ? Enums.SetSystemFoldersNotification.Spam : Enums.SetSystemFoldersNotification.Trash]); - } - else if (!bUseFolder || (oTrashOrSpamFolder && RL.data().currentFolderFullNameRaw() === oTrashOrSpamFolder.fullNameRaw)) - { - aUIds = RL.data().messageListCheckedOrSelectedUidsWithSubMails(); - - kn.showScreenPopup(PopupsAskViewModel, [Utils.i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), function () { - - RL.remote().messagesDelete( - self.moveOrDeleteResponse, - sCurrentFolderFullNameRaw, - aUIds - ); - - self.removeCheckedOrSelectedMessagesFromList(); - }]); - } - else if (oTrashOrSpamFolder) - { - RL.remote().messagesMove( - this.moveOrDeleteResponse, - sCurrentFolderFullNameRaw, - oTrashOrSpamFolder.fullNameRaw, - RL.data().messageListCheckedOrSelectedUidsWithSubMails() - ); - - oTrashOrSpamFolder.actionBlink(true); - this.removeCheckedOrSelectedMessagesFromList(oTrashOrSpamFolder.fullNameRaw); - } - } -}; - MailBoxMessageListViewModel.prototype.dragAndDronHelper = function (oMessageListItem, bCopy) { if (oMessageListItem) @@ -12022,13 +11785,25 @@ function MailBoxMessageViewViewModel() }, this.messageVisibility); this.deleteCommand = Utils.createCommand(this, function () { - // TODO - window.console.log(arguments); + + if (this.message()) + { + RL.deleteMessagesFromFolder(Enums.FolderType.Trash, + this.message().folderFullNameRaw, + [this.message().uid], true); + } + }, this.messageVisibility); this.spamCommand = Utils.createCommand(this, function () { - // TODO - window.console.log(arguments); + + if (this.message()) + { + RL.deleteMessagesFromFolder(Enums.FolderType.Spam, + this.message().folderFullNameRaw, + [this.message().uid], true); + } + }, this.messageVisibility); // viewer @@ -14311,6 +14086,107 @@ WebMailDataStorage.prototype.getNextFolderNames = function (bBoot) return _.uniq(aResult); }; +/** + * @param {Function} fCallback + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + * @param {string=} sToFolderFullNameRaw = '' + * @param {bCopy=} bCopy = false + */ +WebMailDataStorage.prototype.removeMessagesFromList = function ( + sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bCopy) +{ + sToFolderFullNameRaw = Utils.isNormal(sToFolderFullNameRaw) ? sToFolderFullNameRaw : ''; + bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; + + aUidForRemove = _.map(aUidForRemove, function (mValue) { + return Utils.pInt(mValue); + }); + + var + iUnseenCount = 0, + oData = RL.data(), + oCache = RL.cache(), + oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), + oToFolder = '' === sToFolderFullNameRaw ? null : oCache.getFolderFromCacheList(sToFolderFullNameRaw || ''), + sCurrentFolderFullNameRaw = oData.currentFolderFullNameRaw(), + oCurrentMessage = oData.message(), + aMessages = sCurrentFolderFullNameRaw === sFromFolderFullNameRaw ? _.filter(oData.messageList(), function (oMessage) { + return oMessage && -1 < Utils.inArray(Utils.pInt(oMessage.uid), aUidForRemove); + }) : [] + ; + + _.each(aMessages, function (oMessage) { + if (oMessage && oMessage.unseen()) + { + iUnseenCount++; + } + }); + + if (oFromFolder && !bCopy) + { + oFromFolder.messageCountAll(0 <= oFromFolder.messageCountAll() - aUidForRemove.length ? + oFromFolder.messageCountAll() - aUidForRemove.length : 0); + + if (0 < iUnseenCount) + { + oFromFolder.messageCountUnread(0 <= oFromFolder.messageCountUnread() - iUnseenCount ? + oFromFolder.messageCountUnread() - iUnseenCount : 0); + } + } + + if (oToFolder) + { + oToFolder.messageCountAll(oToFolder.messageCountAll() + aUidForRemove.length); + if (0 < iUnseenCount) + { + oToFolder.messageCountUnread(oToFolder.messageCountUnread() + iUnseenCount); + } + + oToFolder.actionBlink(true); + } + + if (0 < aMessages.length) + { + if (bCopy) + { + _.each(aMessages, function (oMessage) { + oMessage.checked(false); + }); + } + else + { + oData.messageListIsNotCompleted(true); + + _.each(aMessages, function (oMessage) { + if (oCurrentMessage && oCurrentMessage.requestHash === oMessage.requestHash) + { + oCurrentMessage = null; + oData.message(null); + } + + oMessage.deleted(true); + }); + + _.delay(function () { + _.each(aMessages, function (oMessage) { + oData.messageList.remove(oMessage); + }); + }, 400); + } + } + + if ('' !== sFromFolderFullNameRaw) + { + oCache.setFolderHash(sFromFolderFullNameRaw, ''); + } + + if ('' !== sToFolderFullNameRaw) + { + oCache.setFolderHash(sToFolderFullNameRaw, ''); + } +}; + WebMailDataStorage.prototype.setMessage = function (oData, bCached) { var @@ -16722,6 +16598,7 @@ function RainLoopApp() this.oCache = null; this.quotaDebounce = _.debounce(this.quota, 1000 * 30); + this.moveOrDeleteResponseHelper = _.bind(this.moveOrDeleteResponseHelper, this); window.setInterval(function () { RL.pub('interval.30s'); @@ -16872,6 +16749,137 @@ RainLoopApp.prototype.recacheInboxMessageList = function () RL.remote().messageList(Utils.emptyFunction, 'INBOX', 0, RL.data().messagesPerPage(), '', true); }; +RainLoopApp.prototype.moveOrDeleteResponseHelper = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && RL.data().currentFolder()) + { + if (oData && Utils.isArray(oData.Result) && 2 === oData.Result.length) + { + RL.cache().setFolderHash(oData.Result[0], oData.Result[1]); + } + else + { + RL.cache().setFolderHash(RL.data().currentFolderFullNameRaw(), ''); + + if (oData && -1 < Utils.inArray(oData.ErrorCode, + [Enums.Notification.CantMoveMessage, Enums.Notification.CantCopyMessage])) + { + window.alert(Utils.getNotification(oData.ErrorCode)); + } + } + + RL.reloadMessageList(0 === RL.data().messageList().length); + RL.quotaDebounce(); + } +}; + +/** + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + */ +RainLoopApp.prototype.deleteMessagesFromFolderWithoutCheck = function (sFromFolderFullNameRaw, aUidForRemove) +{ + RL.remote().messagesDelete( + this.moveOrDeleteResponseHelper, + sFromFolderFullNameRaw, + aUidForRemove + ); + + RL.data().removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove); +}; + +/** + * @param {number} iDeleteType + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + * @param {boolean=} bUseFolder = true + */ +RainLoopApp.prototype.deleteMessagesFromFolder = function (iDeleteType, sFromFolderFullNameRaw, aUidForRemove, bUseFolder) +{ + var + self = this, + oData = RL.data(), + oCache = RL.cache(), + oTrashOrSpamFolder = oCache.getFolderFromCacheList( + Enums.FolderType.Spam === iDeleteType ? oData.spamFolder() : oData.trashFolder()) + ; + + bUseFolder = Utils.isUnd(bUseFolder) ? true : !!bUseFolder; + if (bUseFolder) + { + if ((Enums.FolderType.Spam === iDeleteType && Consts.Values.UnuseOptionValue === oData.spamFolder()) || + (Enums.FolderType.Trash === iDeleteType && Consts.Values.UnuseOptionValue === oData.trashFolder())) + { + bUseFolder = false; + } + } + + if (!oTrashOrSpamFolder && bUseFolder) + { + kn.showScreenPopup(PopupsFolderSystemViewModel, [ + Enums.FolderType.Spam === iDeleteType ? Enums.SetSystemFoldersNotification.Spam : Enums.SetSystemFoldersNotification.Trash]); + } + else if (!bUseFolder || (sFromFolderFullNameRaw === oData.spamFolder() || sFromFolderFullNameRaw === oData.trashFolder())) + { + kn.showScreenPopup(PopupsAskViewModel, [Utils.i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), function () { + + RL.remote().messagesDelete( + self.moveOrDeleteResponseHelper, + sFromFolderFullNameRaw, + aUidForRemove + ); + + oData.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove); + + }]); + } + else if (oTrashOrSpamFolder) + { + RL.remote().messagesMove( + this.moveOrDeleteResponseHelper, + sFromFolderFullNameRaw, + oTrashOrSpamFolder.fullNameRaw, + aUidForRemove + ); + + oData.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, oTrashOrSpamFolder.fullNameRaw); + } +}; + +/** + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForMove + * @param {string} sToFolderFullNameRaw + * @param {boolean=} bCopy = false + */ +RainLoopApp.prototype.moveMessagesToFolder = function (sFromFolderFullNameRaw, aUidForMove, sToFolderFullNameRaw, bCopy) +{ + if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && Utils.isArray(aUidForMove) && 0 < aUidForMove.length) + { + var + oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), + oToFolder = RL.cache().getFolderFromCacheList(sToFolderFullNameRaw) + ; + + if (oFromFolder && oToFolder) + { + bCopy = Utils.isUnd(bCopy) ? false : !!bCopy; + + RL.remote()[bCopy ? 'messagesCopy' : 'messagesMove']( + this.moveOrDeleteResponseHelper, + oFromFolder.fullNameRaw, + oToFolder.fullNameRaw, + aUidForMove + ); + + RL.data().removeMessagesFromList(oFromFolder.fullNameRaw, aUidForMove, oToFolder.fullNameRaw, bCopy); + return true; + } + } + + return false; +}; + /** * @param {Function=} fCallback */ diff --git a/rainloop/v/0.0.0/static/js/app.min.js b/rainloop/v/0.0.0/static/js/app.min.js index 4eacabefd..7fdd77d7d 100644 --- a/rainloop/v/0.0.0/static/js/app.min.js +++ b/rainloop/v/0.0.0/static/js/app.min.js @@ -1,9 +1,9 @@ /*! RainLoop Webmail Main Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ -!function(a,b,c,d,e,f,g,h,i){"use strict";function j(){this.sBase="#/",this.sCdnStaticDomain=Jb.settingsGet("CdnStaticDomain"),this.sVersion=Jb.settingsGet("Version"),this.sSpecSuffix=Jb.settingsGet("AuthAccountHash")||"0",this.sServer=(Jb.settingsGet("IndexFile")||"./")+"?",this.sCdnStaticDomain=""===this.sCdnStaticDomain?this.sCdnStaticDomain:"/"===this.sCdnStaticDomain.substr(-1)?this.sCdnStaticDomain:this.sCdnStaticDomain+"/"}function k(a,c,d){var e=this;e.editor=null,e.iBlurTimer=0,e.fOnBlur=c||null,e.fOnReady=d||null,e.$element=b(a),e.init()}function l(a,b,c,d,e){this.list=a,this.selectedItem=b,this.selectedItem.extend({toggleSubscribe:[null,function(a){a&&a.selected(!1)},function(a){a&&a.selected(!0)}]}),this.oContentVisible=null,this.oContentScrollable=null,this.sItemSelector=c,this.sItemSelectedSelector=d,this.sItemCheckedSelector=e,this.sLastUid="",this.oCallbacks={},this.iSelectTimer=0,this.bUseKeyboard=!0,this.emptyFunction=function(){},this.useItemSelectCallback=!0,this.throttleSelection=!1,this.selectedItem.subscribe(function(a){this.useItemSelectCallback&&(this.throttleSelection?(this.throttleSelection=!1,this.selectItemCallbacksThrottle(a)):this.selectItemCallbacks(a))},this);var f=this,g=[],i=null;this.list.subscribe(function(){var a=this,b=this.list();xb.isArray(b)&&h.each(b,function(b){b.checked()&&g.push(a.getItemUid(b)),null===i&&b.selected()&&(i=a.getItemUid(b))})},this,"beforeChange"),this.list.subscribe(function(a){if(this.useItemSelectCallback=!1,this.selectedItem(null),xb.isArray(a)){var b=this,c=g.length;h.each(a,function(a){c>0&&-1b?b:a))},this),this.body=null,this.plainRaw="",this.isRtl=c.observable(!1),this.isHtml=c.observable(!1),this.hasImages=c.observable(!1),this.attachments=c.observableArray([]),this.isPgpSigned=c.observable(!1),this.isPgpEncrypted=c.observable(!1),this.pgpSignature=c.observable(""),this.priority=c.observable(vb.MessagePriority.Normal),this.readReceipt=c.observable(""),this.aDraftInfo=[],this.sMessageId="",this.sInReplyTo="",this.sReferences="",this.parentUid=c.observable(0),this.threads=c.observableArray([]),this.threadsLen=c.observable(0),this.hasUnseenSubMessage=c.observable(!1),this.hasFlaggedSubMessage=c.observable(!1),this.lastInCollapsedThread=c.observable(!1),this.lastInCollapsedThreadLoading=c.observable(!1),this.threadsLenResult=c.computed(function(){var a=this.threadsLen();return 0===this.parentUid()&&a>0?a+1:""},this)}function A(){this.name=c.observable(""),this.fullName="",this.fullNameRaw="",this.fullNameHash="",this.delimiter="",this.namespace="",this.deep=0,this.selectable=!1,this.existen=!0,this.isNamespaceFolder=!1,this.isGmailFolder=!1,this.isUnpaddigFolder=!1,this.interval=0,this.type=c.observable(vb.FolderType.User),this.selected=c.observable(!1),this.edited=c.observable(!1),this.collapsed=c.observable(!0),this.subScribed=c.observable(!0),this.subFolders=c.observableArray([]),this.deleteAccess=c.observable(!1),this.actionBlink=c.observable(!1).extend({falseTimeout:1e3}),this.nameForEdit=c.observable(""),this.name.subscribe(function(a){this.nameForEdit(a)},this),this.edited.subscribe(function(a){a&&this.nameForEdit(this.name())},this),this.privateMessageCountAll=c.observable(0),this.privateMessageCountUnread=c.observable(0),this.collapsedPrivate=c.observable(!0)}function B(a,b){this.email=a,this.deleteAccess=c.observable(!1),this.canBeDalete=c.observable(b)}function C(a,b,d){this.id=a,this.email=c.observable(b),this.name=c.observable(""),this.replyTo=c.observable(""),this.bcc=c.observable(""),this.deleteAccess=c.observable(!1),this.canBeDalete=c.observable(d)}function D(a,b,d,e,f){this.index=a,this.id=b,this.user=d,this.armor=f,this.isPrivate=!!e,this.deleteAccess=c.observable(!1)}function E(){r.call(this,"Popups","PopupsFolderClear"),this.selectedFolder=c.observable(null),this.clearingProcess=c.observable(!1),this.clearingError=c.observable(""),this.folderFullNameForClear=c.computed(function(){var a=this.selectedFolder();return a?a.printableFullName():""},this),this.folderNameForClear=c.computed(function(){var a=this.selectedFolder();return a?a.localName():""},this),this.dangerDescHtml=c.computed(function(){return xb.i18n("POPUPS_CLEAR_FOLDER/DANGER_DESC_HTML_1",{FOLDER:this.folderNameForClear()})},this),this.clearCommand=xb.createCommand(this,function(){var a=this,b=this.selectedFolder();b&&(Jb.data().message(null),Jb.data().messageList([]),this.clearingProcess(!0),Jb.cache().setFolderHash(b.fullNameRaw,""),Jb.remote().folderClear(function(b,c){a.clearingProcess(!1),vb.StorageResultType.Success===b&&c&&c.Result?(Jb.reloadMessageList(!0),a.cancelCommand()):c&&c.ErrorCode?a.clearingError(xb.getNotification(c.ErrorCode)):a.clearingError(xb.getNotification(vb.Notification.MailServerError))},b.fullNameRaw))},function(){var a=this.selectedFolder(),b=this.clearingProcess();return!b&&null!==a}),t.constructorEnd(this)}function F(){r.call(this,"Popups","PopupsFolderCreate"),xb.initOnStartOrLangChange(function(){this.sNoParentText=xb.i18n("POPUPS_CREATE_FOLDER/SELECT_NO_PARENT")},this),this.folderName=c.observable(""),this.folderName.focused=c.observable(!1),this.selectedParentValue=c.observable(ub.Values.UnuseOptionValue),this.parentFolderSelectList=c.computed(function(){var a=Jb.data(),b=[],c=null,d=null,e=a.folderList(),f=function(a){return a?a.isSystemFolder()?a.name()+" "+a.manageFolderSystemName():a.name():""};return b.push(["",this.sNoParentText]),""!==a.namespace&&(c=function(b){return a.namespace!==b.fullNameRaw.substr(0,a.namespace.length)}),Jb.folderListOptionsBuilder([],e,[],b,null,c,d,f)},this),this.createFolder=xb.createCommand(this,function(){var a=Jb.data(),b=this.selectedParentValue();""===b&&1=a?1:a},this),this.contactsPagenator=c.computed(xb.computedPagenatorHelper(this.contactsPage,this.contactsPageCount)),this.emptySelection=c.observable(!0),this.viewClearSearch=c.observable(!1),this.viewID=c.observable(""),this.viewIDStr=c.observable(""),this.viewReadOnly=c.observable(!1),this.viewScopeType=c.observable(vb.ContactScopeType.Default),this.viewProperties=c.observableArray([]),this.viewSaveTrigger=c.observable(vb.SaveSettingsStep.Idle),this.viewPropertiesNames=this.viewProperties.filter(function(a){return-1"),this.submitRequest(!0),h.delay(function(){d=a.openpgp.generateKeyPair(1,xb.pInt(b.keyBitLength()),c,xb.trim(b.password())),d&&d.privateKeyArmored&&(e.importKey(d.privateKeyArmored),e.importKey(d.publicKeyArmored),e.store(),Jb.reloadOpenPgpKeys(),xb.delegateRun(b,"cancelCommand")),b.submitRequest(!1)},100),!0)}),t.constructorEnd(this)}function O(){r.call(this,"Popups","PopupsIdentity"),this.id="",this.edit=c.observable(!1),this.owner=c.observable(!1),this.email=c.observable("").validateEmail(),this.email.focused=c.observable(!1),this.name=c.observable(""),this.name.focused=c.observable(!1),this.replyTo=c.observable("").validateSimpleEmail(),this.replyTo.focused=c.observable(!1),this.bcc=c.observable("").validateSimpleEmail(),this.bcc.focused=c.observable(!1),this.submitRequest=c.observable(!1),this.submitError=c.observable(""),this.addOrEditIdentityCommand=xb.createCommand(this,function(){return this.email.hasError()||this.email.hasError(""===xb.trim(this.email())),this.email.hasError()?(this.owner()||this.email.focused(!0),!1):this.replyTo.hasError()?(this.replyTo.focused(!0),!1):this.bcc.hasError()?(this.bcc.focused(!0),!1):(this.submitRequest(!0),Jb.remote().identityUpdate(h.bind(function(a,b){this.submitRequest(!1),vb.StorageResultType.Success===a&&b?b.Result?(Jb.accountsAndIdentities(),this.cancelCommand()):b.ErrorCode&&this.submitError(xb.getNotification(b.ErrorCode)):this.submitError(xb.getNotification(vb.Notification.UnknownError))},this),this.id,this.email(),this.name(),this.replyTo(),this.bcc()),!0)},function(){return!this.submitRequest()}),this.label=c.computed(function(){return xb.i18n("POPUPS_IDENTITIES/"+(this.edit()?"TITLE_UPDATE_IDENTITY":"TITLE_ADD_IDENTITY"))},this),this.button=c.computed(function(){return xb.i18n("POPUPS_IDENTITIES/"+(this.edit()?"BUTTON_UPDATE_IDENTITY":"BUTTON_ADD_IDENTITY"))},this),t.constructorEnd(this)}function P(){r.call(this,"Popups","PopupsLanguages"),this.exp=c.observable(!1),this.languages=c.computed(function(){return h.map(Jb.data().languages(),function(a){return{key:a,selected:c.observable(!1),fullName:xb.convertLangName(a)}})}),Jb.data().mainLanguage.subscribe(function(){this.resetMainLanguage()},this),t.constructorEnd(this)}function Q(){r.call(this,"Popups","PopupsAsk"),this.askDesc=c.observable(""),this.yesButton=c.observable(""),this.noButton=c.observable(""),this.yesFocus=c.observable(!1),this.noFocus=c.observable(!1),this.fYesAction=null,this.fNoAction=null,this.bDisabeCloseOnEsc=!0,t.constructorEnd(this)}function R(){r.call(this,"Center","Login");var b=Jb.data();this.email=c.observable(""),this.login=c.observable(""),this.password=c.observable(""),this.signMe=c.observable(!1),this.logoImg=xb.trim(Jb.settingsGet("LoginLogo")),this.loginDescription=xb.trim(Jb.settingsGet("LoginDescription")),this.logoCss=xb.trim(Jb.settingsGet("LoginCss")),this.emailError=c.observable(!1),this.loginError=c.observable(!1),this.passwordError=c.observable(!1),this.emailFocus=c.observable(!1),this.loginFocus=c.observable(!1),this.submitFocus=c.observable(!1),this.email.subscribe(function(){this.emailError(!1)},this),this.login.subscribe(function(){this.loginError(!1)},this),this.password.subscribe(function(){this.passwordError(!1)},this),this.submitRequest=c.observable(!1),this.submitError=c.observable(""),this.allowCustomLogin=b.allowCustomLogin,this.allowLanguagesOnLogin=b.allowLanguagesOnLogin,this.langRequest=c.observable(!1),this.mainLanguage=b.mainLanguage,this.bSendLanguage=!1,this.mainLanguageFullName=c.computed(function(){return xb.convertLangName(this.mainLanguage())},this),this.signMeType=c.observable(vb.LoginSignMeType.Unused),this.signMeType.subscribe(function(a){this.signMe(vb.LoginSignMeType.DefaultOn===a)},this),this.signMeVisibility=c.computed(function(){return vb.LoginSignMeType.Unused!==this.signMeType()},this),this.submitCommand=xb.createCommand(this,function(){return this.emailError(""===xb.trim(this.email())),this.passwordError(""===xb.trim(this.password())),this.emailError()||this.passwordError()?!1:(this.submitRequest(!0),Jb.remote().login(h.bind(function(a,b){vb.StorageResultType.Success===a&&b&&"Login"===b.Action?b.Result?Jb.loginAndLogoutReload():b.ErrorCode?(this.submitRequest(!1),this.submitError(xb.getNotification(b.ErrorCode))):this.submitRequest(!1):(this.submitRequest(!1),this.submitError(xb.getNotification(vb.Notification.UnknownError)))},this),this.email(),this.login(),this.password(),!!this.signMe(),this.bSendLanguage?this.mainLanguage():""),!0)},function(){return!this.submitRequest()}),this.facebookLoginEnabled=c.observable(!1),this.facebookCommand=xb.createCommand(this,function(){return a.open(Jb.link().socialFacebook(),"Facebook","left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes"),!0 -},function(){return!this.submitRequest()&&this.facebookLoginEnabled()}),this.googleLoginEnabled=c.observable(!1),this.googleCommand=xb.createCommand(this,function(){return a.open(Jb.link().socialGoogle(),"Google","left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes"),!0},function(){return!this.submitRequest()&&this.googleLoginEnabled()}),this.twitterLoginEnabled=c.observable(!1),this.twitterCommand=xb.createCommand(this,function(){return a.open(Jb.link().socialTwitter(),"Twitter","left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes"),!0},function(){return!this.submitRequest()&&this.twitterLoginEnabled()}),this.loginFocus.subscribe(function(a){a&&""===this.login()&&""!==this.email()&&this.login(this.email())},this),this.socialLoginEnabled=c.computed(function(){var a=this.facebookLoginEnabled(),b=this.googleLoginEnabled(),c=this.twitterLoginEnabled();return a||b||c},this),t.constructorEnd(this)}function S(){r.call(this,"Right","SystemDropDown");var a=Jb.data();this.accounts=a.accounts,this.accountEmail=a.accountEmail,this.accountsLoading=a.accountsLoading,this.allowAddAccount=Jb.settingsGet("AllowAdditionalAccounts"),this.loading=c.computed(function(){return this.accountsLoading()},this),this.accountClick=h.bind(this.accountClick,this)}function T(){S.call(this),t.constructorEnd(this)}function U(){S.call(this),t.constructorEnd(this)}function V(){r.call(this,"Left","MailFolderList"),this.folderList=Jb.data().folderList,this.folderListSystem=Jb.data().folderListSystem,this.foldersChanging=Jb.data().foldersChanging,this.iDropOverTimer=0,this.allowContacts=!!Jb.settingsGet("ContactsIsAllowed"),t.constructorEnd(this)}function W(){r.call(this,"Right","MailMessageList"),this.sLastUid=null,this.bPrefetch=!1,this.emptySubjectValue="";var a=Jb.data();this.popupVisibility=Jb.popupVisibility,this.messageList=a.messageList,this.currentMessage=a.currentMessage,this.isMessageSelected=a.isMessageSelected,this.messageListSearch=a.messageListSearch,this.messageListError=a.messageListError,this.folderMenuForMove=a.folderMenuForMove,this.useCheckboxesInList=a.useCheckboxesInList,this.mainMessageListSearch=a.mainMessageListSearch,this.messageListEndFolder=a.messageListEndFolder,this.messageListChecked=a.messageListChecked,this.messageListCheckedOrSelected=a.messageListCheckedOrSelected,this.messageListCheckedOrSelectedUidsWithSubMails=a.messageListCheckedOrSelectedUidsWithSubMails,this.messageListCompleteLoadingThrottle=a.messageListCompleteLoadingThrottle,xb.initOnStartOrLangChange(function(){this.emptySubjectValue=xb.i18n("MESSAGE_LIST/EMPTY_SUBJECT_TEXT")},this),this.userQuota=a.userQuota,this.userUsageSize=a.userUsageSize,this.userUsageProc=a.userUsageProc,this.dragOver=c.observable(!1).extend({throttle:1}),this.dragOverEnter=c.observable(!1).extend({throttle:1}),this.dragOverArea=c.observable(null),this.dragOverBodyArea=c.observable(null),this.messageListItemTemplate=c.computed(function(){return vb.Layout.NoPreview!==a.layout()?"MailMessageListItem":"MailMessageListItemNoPreviewPane"}),this.messageListSearchDesc=c.computed(function(){var b=a.messageListEndSearch();return""===b?"":xb.i18n("MESSAGE_LIST/SEARCH_RESULT_FOR",{SEARCH:b})}),this.messageListPagenator=c.computed(xb.computedPagenatorHelper(a.messageListPage,a.messageListPageCount)),this.checkAll=c.computed({read:function(){return 00&&b>0&&a>b},this),this.hasMessages=c.computed(function(){return 0'),e.after(f),e.remove()),f&&f[0]&&(f.attr("data-href",g).attr("data-theme",a[0]),f&&f[0]&&f[0].styleSheet&&!xb.isUnd(f[0].styleSheet.cssText)?f[0].styleSheet.cssText=a[1]:f.text(a[1])),d.themeTrigger(vb.SaveSettingsStep.TrueResult))}).always(function(){d.iTimer=a.setTimeout(function(){d.themeTrigger(vb.SaveSettingsStep.Idle)},1e3),d.oLastAjax=null})),Jb.remote().saveSettings(null,{Theme:c})},this)}function ib(){xb.initDataConstructorBySettings(this)}function jb(){ib.call(this);var a=function(a){return function(){var b=Jb.cache().getFolderFromCacheList(a());b&&b.type(vb.FolderType.User)}},d=function(a){return function(b){var c=Jb.cache().getFolderFromCacheList(b);c&&c.type(a)}};this.devEmail="",this.devLogin="",this.devPassword="",this.accountEmail=c.observable(""),this.accountIncLogin=c.observable(""),this.accountOutLogin=c.observable(""),this.projectHash=c.observable(""),this.threading=c.observable(!1),this.lastFoldersHash="",this.remoteSuggestions=!1,this.sentFolder=c.observable(""),this.draftFolder=c.observable(""),this.spamFolder=c.observable(""),this.trashFolder=c.observable(""),this.sentFolder.subscribe(a(this.sentFolder),this,"beforeChange"),this.draftFolder.subscribe(a(this.draftFolder),this,"beforeChange"),this.spamFolder.subscribe(a(this.spamFolder),this,"beforeChange"),this.trashFolder.subscribe(a(this.trashFolder),this,"beforeChange"),this.sentFolder.subscribe(d(vb.FolderType.SentItems),this),this.draftFolder.subscribe(d(vb.FolderType.Draft),this),this.spamFolder.subscribe(d(vb.FolderType.Spam),this),this.trashFolder.subscribe(d(vb.FolderType.Trash),this),this.draftFolderNotEnabled=c.computed(function(){return""===this.draftFolder()||ub.Values.UnuseOptionValue===this.draftFolder()},this),this.displayName=c.observable(""),this.signature=c.observable(""),this.signatureToAll=c.observable(!1),this.replyTo=c.observable(""),this.accounts=c.observableArray([]),this.accountsLoading=c.observable(!1).extend({throttle:100}),this.identities=c.observableArray([]),this.identitiesLoading=c.observable(!1).extend({throttle:100}),this.namespace="",this.folderList=c.observableArray([]),this.foldersListError=c.observable(""),this.foldersLoading=c.observable(!1),this.foldersCreating=c.observable(!1),this.foldersDeleting=c.observable(!1),this.foldersRenaming=c.observable(!1),this.foldersChanging=c.computed(function(){var a=this.foldersLoading(),b=this.foldersCreating(),c=this.foldersDeleting(),d=this.foldersRenaming();return a||b||c||d},this),this.foldersInboxUnreadCount=c.observable(0),this.currentFolder=c.observable(null).extend({toggleSubscribe:[null,function(a){a&&a.selected(!1)},function(a){a&&a.selected(!0)}]}),this.currentFolderFullNameRaw=c.computed(function(){return this.currentFolder()?this.currentFolder().fullNameRaw:""},this),this.currentFolderFullName=c.computed(function(){return this.currentFolder()?this.currentFolder().fullName:""},this),this.currentFolderFullNameHash=c.computed(function(){return this.currentFolder()?this.currentFolder().fullNameHash:""},this),this.currentFolderName=c.computed(function(){return this.currentFolder()?this.currentFolder().name():""},this),this.folderListSystemNames=c.computed(function(){var a=["INBOX"],b=this.folderList(),c=this.sentFolder(),d=this.draftFolder(),e=this.spamFolder(),f=this.trashFolder();return xb.isArray(b)&&0=a?1:a},this),this.mainMessageListSearch=c.computed({read:this.messageListSearch,write:function(a){Cb.setHash(Jb.link().mailBox(this.currentFolderFullNameHash(),1,xb.trim(a.toString())))},owner:this}),this.messageListError=c.observable(""),this.messageListLoading=c.observable(!1),this.messageListIsNotCompleted=c.observable(!1),this.messageListCompleteLoadingThrottle=c.observable(!1).extend({throttle:200}),this.messageListCompleteLoading=c.computed(function(){var a=this.messageListLoading(),b=this.messageListIsNotCompleted();return a||b},this),this.messageListCompleteLoading.subscribe(function(a){this.messageListCompleteLoadingThrottle(a)},this),this.messageList.subscribe(h.debounce(function(a){h.each(a,function(a){a.newForAnimation()&&a.newForAnimation(!1)})},500)),this.staticMessageList=new z,this.message=c.observable(null),this.messageLoading=c.observable(!1),this.messageLoadingThrottle=c.observable(!1).extend({throttle:50}),this.messageLoading.subscribe(function(a){this.messageLoadingThrottle(a)},this),this.messageFullScreenMode=c.observable(!1),this.messageError=c.observable(""),this.messagesBodiesDom=c.observable(null),this.messagesBodiesDom.subscribe(function(a){!a||a instanceof jQuery||this.messagesBodiesDom(b(a))},this),this.messageActiveDom=c.observable(null),this.isMessageSelected=c.computed(function(){return null!==this.message()},this),this.currentMessage=c.observable(null),this.message.subscribe(function(a){null===a&&(this.currentMessage(null),this.hideMessageBodies())},this),this.messageListChecked=c.computed(function(){return h.filter(this.messageList(),function(a){return a.checked()})},this),this.messageListCheckedOrSelected=c.computed(function(){var a=this.messageListChecked(),b=this.currentMessage();return h.union(a,b?[b]:[])},this),this.messageListCheckedUids=c.computed(function(){var a=[];return h.each(this.messageListChecked(),function(b){b&&(a.push(b.uid),00?Math.ceil(b/a*100):0},this),this.useKeyboardShortcuts=c.observable(!0),this.openpgpkeys=c.observableArray([]),this.openpgpKeyring=null,this.googleActions=c.observable(!1),this.googleLoggined=c.observable(!1),this.googleUserName=c.observable(""),this.facebookActions=c.observable(!1),this.facebookLoggined=c.observable(!1),this.facebookUserName=c.observable(""),this.twitterActions=c.observable(!1),this.twitterLoggined=c.observable(!1),this.twitterUserName=c.observable(""),this.customThemeType=c.observable(vb.CustomThemeType.Light),this.purgeMessageBodyCacheThrottle=h.throttle(this.purgeMessageBodyCache,3e4)}function kb(){this.oRequests={}}function lb(){kb.call(this),this.oRequests={}}function mb(){this.oEmailsPicsHashes={},this.oServices={}}function nb(){mb.call(this),this.oFoldersCache={},this.oFoldersNamesCache={},this.oFolderHashCache={},this.oFolderUidNextCache={},this.oMessageListHashCache={},this.oMessageFlagsCache={},this.oNewMessage={},this.oRequestedMessage={}}function ob(a){s.call(this,"settings",a),this.menu=c.observableArray([]),this.oCurrentSubScreen=null,this.oViewModelPlace=null}function pb(){s.call(this,"login",[R])}function qb(){s.call(this,"mailbox",[T,V,W,X]),this.oLastRoute={}}function rb(){ob.call(this,[U,Y,Z]),xb.initOnStartOrLangChange(function(){this.sSettingsTitle=xb.i18n("TITLES/SETTINGS")},this,function(){Jb.setTitle(this.sSettingsTitle)})}function sb(){q.call(this),this.oSettings=null,this.oPlugins=null,this.oLocal=null,this.oLink=null,this.oSubs={},this.isLocalAutocomplete=!0,this.popupVisibility=c.observable(!1),this.iframe=b('