diff --git a/dev/App/User.js b/dev/App/User.js index 2ad5c7b5c..bde7b3b5d 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -61,9 +61,7 @@ import { AskPopupView } from 'View/Popup/Ask'; import { folderInformation, folderInformationMultiply, - setRefreshFoldersInterval, - messagesMoveHelper, - messagesDeleteHelper + setRefreshFoldersInterval } from 'Common/Folders'; import { loadFolders } from 'Model/FolderCollection'; @@ -133,13 +131,11 @@ export class AppUser extends AbstractApp { showScreenPopup(AskPopupView, [ i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), () => { - messagesDeleteHelper(sFromFolderFullName, oUids); - MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids); + MessagelistUserStore.moveMessages(sFromFolderFullName, oUids); } ]); } else if (oMoveFolder) { - messagesMoveHelper(sFromFolderFullName, oMoveFolder.fullName, oUids); - MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids, oMoveFolder.fullName); + MessagelistUserStore.moveMessages(sFromFolderFullName, oUids, oMoveFolder.fullName); } } diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index b1ad903fb..6d53c6332 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -1,13 +1,11 @@ import { isArray, arrayLength } from 'Common/Utils'; import { - setFolderETag, getFolderInboxName, getFolderFromCacheList } from 'Common/Cache'; import { SettingsUserStore } from 'Stores/User/Settings'; import { FolderUserStore } from 'Stores/User/Folder'; import { MessagelistUserStore } from 'Stores/User/Messagelist'; -import { getNotification } from 'Common/Translator'; import Remote from 'Remote/User/Fetch'; @@ -197,76 +195,6 @@ folderInformationMultiply = (boot = false) => { } }, -moveOrDeleteResponseHelper = (iError, oData) => { - if (iError) { - setFolderETag(FolderUserStore.currentFolderFullName(), ''); - alert(getNotification(iError)); - } else if (FolderUserStore.currentFolder()) { - if (2 === arrayLength(oData.Result)) { - setFolderETag(oData.Result[0], oData.Result[1]); - } else { - setFolderETag(FolderUserStore.currentFolderFullName(), ''); - } - MessagelistUserStore.reload(!MessagelistUserStore.length); - } -}, - -messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => { - const - sSpamFolder = FolderUserStore.spamFolder(), - isSpam = sSpamFolder === toFolderFullName, - isHam = !isSpam && sSpamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName; - - Remote.abort('MessageList', 'reload').request('MessageMove', - moveOrDeleteResponseHelper, - { - fromFolder: fromFolderFullName, - toFolder: toFolderFullName, - uids: [...uidsForMove].join(','), - markAsRead: (isSpam || FolderUserStore.trashFolder() === toFolderFullName) ? 1 : 0, - learning: isSpam ? 'SPAM' : isHam ? 'HAM' : '' - } - ); -}, - -messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => { - Remote.abort('MessageList', 'reload').request('MessageDelete', - moveOrDeleteResponseHelper, - { - folder: sFromFolderFullName, - uids: [...aUidForRemove].join(',') - } - ); -}, - -/** - * @param {string} sFromFolderFullName - * @param {Set} oUids - * @param {string} sToFolderFullName - * @param {boolean=} bCopy = false - */ -moveMessagesToFolder = (sFromFolderFullName, oUids, sToFolderFullName, bCopy) => { - if (sFromFolderFullName !== sToFolderFullName && oUids?.size) { - const oFromFolder = getFolderFromCacheList(sFromFolderFullName), - oToFolder = getFolderFromCacheList(sToFolderFullName); - - if (oFromFolder && oToFolder) { - bCopy - ? Remote.request('MessageCopy', null, { - fromFolder: oFromFolder.fullName, - toFolder: oToFolder.fullName, - uids: [...oUids].join(',') - }) - : messagesMoveHelper(oFromFolder.fullName, oToFolder.fullName, oUids); - - MessagelistUserStore.removeMessagesFromList(oFromFolder.fullName, oUids, oToFolder.fullName, bCopy); - return true; - } - } - - return false; -}, - dropFilesInFolder = (sFolderFullName, files) => { let count = files.length; for (const file of files) { diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index e4df8d466..88c044daf 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -65,8 +65,8 @@ export class Selector { this.listChecked.subscribe(items => { if (items.length) { koSelectedItem() ? koSelectedItem(null) : koSelectedItem.valueHasMutated?.(); - } else if (this.autoSelect()) { - koSelectedItem(koFocusedItem()); + } else { + this.autoSelect(); } }); @@ -174,9 +174,7 @@ export class Selector { this.iFocusedNextHelper = 0; } - if (this.autoSelect() && !isChecked && !koSelectedItem()) { - koSelectedItem(koFocusedItem()); - } + !isChecked && !koSelectedItem() && this.autoSelect(); } aCheckedCache = []; @@ -250,8 +248,10 @@ export class Selector { /** * @returns {boolean} */ - autoSelect() { - return (this.oCallbacks.AutoSelect || (()=>1))() && this.focusedItem(); + autoSelect(bForce) { + (bForce || (this.oCallbacks.AutoSelect || (()=>1))()) + && this.focusedItem() + && this.selectedItem(this.focusedItem()); } /** @@ -327,9 +327,7 @@ export class Selector { if (result) { this.focusedItem(result); - if ((this.autoSelect() || bForceSelect) && !this.list.hasChecked()) { - this.selectedItem(result); - } + !this.list.hasChecked() && this.autoSelect(bForceSelect); this.scrollToFocused(); } } diff --git a/dev/External/User/ko.js b/dev/External/User/ko.js index 2fd60a2a7..fc423232f 100644 --- a/dev/External/User/ko.js +++ b/dev/External/User/ko.js @@ -6,7 +6,7 @@ import { doc, elementById, addEventsListeners, dropdowns, leftPanelDisabled } fr import { dropdownsDetectVisibility } from 'Common/UtilsUser'; import { EmailAddressesComponent } from 'Component/EmailAddresses'; import { ThemeStore } from 'Stores/Theme'; -import { moveMessagesToFolder, dropFilesInFolder } from 'Common/Folders'; +import { dropFilesInFolder } from 'Common/Folders'; import { setExpandedFolder } from 'Model/FolderCollection'; import { FolderUserStore } from 'Stores/User/Folder'; import { MessagelistUserStore } from 'Stores/User/Messagelist'; @@ -63,7 +63,9 @@ const rlContentType = 'snappymail/action', dragDrop = (e, element, folder, dragData) => { dragStop(e, element); if (dragMessages() && 'copyMove' == e.dataTransfer.effectAllowed) { - moveMessagesToFolder(FolderUserStore.currentFolderFullName(), dragData.data, folder.fullName, e.ctrlKey); + MessagelistUserStore.moveMessages( + FolderUserStore.currentFolderFullName(), dragData.data, folder.fullName, e.ctrlKey + ); } else if (e.dataTransfer.types.includes('Files')) { dropFilesInFolder(folder.fullName, e.dataTransfer.files); } diff --git a/dev/Stores/User/Messagelist.js b/dev/Stores/User/Messagelist.js index 7c1be0697..c9ada4545 100644 --- a/dev/Stores/User/Messagelist.js +++ b/dev/Stores/User/Messagelist.js @@ -166,9 +166,9 @@ MessagelistUserStore.notifyNewMessages = (folder, newMessages) => { } MessagelistUserStore.canAutoSelect = () => - !/is:unseen/.test(MessagelistUserStore.mainSearch()) - && !disableAutoSelect() + !disableAutoSelect() && SettingsUserStore.usePreviewPane(); +// && !SettingsUserStore.showNextMessage(); let prevFolderName; @@ -399,53 +399,92 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => { * @param {string=} toFolderFullName = '' * @param {boolean=} copy = false */ -MessagelistUserStore.removeMessagesFromList = ( +MessagelistUserStore.moveMessages = ( fromFolderFullName, oUids, toFolderFullName = '', copy = false ) => { + const fromFolder = getFolderFromCacheList(fromFolderFullName); + + if (!fromFolder || !oUids?.size) return; + let unseenCount = 0, setPage = 0, currentMessage = MessageUserStore.message(); - const trashFolder = FolderUserStore.trashFolder(), + const toFolder = toFolderFullName ? getFolderFromCacheList(toFolderFullName) : null, + trashFolder = FolderUserStore.trashFolder(), spamFolder = FolderUserStore.spamFolder(), - fromFolder = getFolderFromCacheList(fromFolderFullName), - toFolder = toFolderFullName ? getFolderFromCacheList(toFolderFullName) : null, + page = MessagelistUserStore.page(), messages = FolderUserStore.currentFolderFullName() === fromFolderFullName ? MessagelistUserStore.filter(item => item && oUids.has(item.uid)) - : []; + : [], + moveOrDeleteResponseHelper = (iError, oData) => { + if (iError) { + setFolderETag(FolderUserStore.currentFolderFullName(), ''); + alert(getNotification(iError)); + } else if (FolderUserStore.currentFolder()) { + if (2 === arrayLength(oData.Result)) { + setFolderETag(oData.Result[0], oData.Result[1]); + } else { + setFolderETag(FolderUserStore.currentFolderFullName(), ''); + } + + MessagelistUserStore.count(MessagelistUserStore.count() - oUids.size); + if (page > MessagelistUserStore.pageCount()) { + setPage = MessagelistUserStore.pageCount(); + } + if (MessagelistUserStore.threadUid() + && MessagelistUserStore.length + && MessagelistUserStore.find(item => item?.deleted() && item.uid == MessagelistUserStore.threadUid()) + ) { + const message = MessagelistUserStore.find(item => item && !item.deleted()); + if (!message) { + if (1 < page) { + setPage = page - 1; + } else { + MessagelistUserStore.threadUid(0); + setPage = MessagelistUserStore.pageBeforeThread(); + } + } else if (MessagelistUserStore.threadUid() != message.uid) { + MessagelistUserStore.threadUid(message.uid); + setPage = page; + } + } + if (setPage) { + MessagelistUserStore.page(setPage); + replaceHash( + mailBox( + FolderUserStore.currentFolderFullNameHash(), + setPage, + MessagelistUserStore.listSearch(), + MessagelistUserStore.threadUid() + ) + ); + } + + MessagelistUserStore.reload(!MessagelistUserStore.count()); + } + }; messages.forEach(item => item?.isUnseen() && ++unseenCount); - if (fromFolder) { + if (!copy) { fromFolder.etag = ''; - if (!copy) { - fromFolder.totalEmails( - 0 <= fromFolder.totalEmails() - oUids.size ? fromFolder.totalEmails() - oUids.size : 0 - ); - - if (0 < unseenCount) { - fromFolder.unreadEmails(Math.max(0, fromFolder.unreadEmails() - unseenCount)); - } - } + fromFolder.totalEmails(Math.max(0, fromFolder.totalEmails() - oUids.size)); + fromFolder.unreadEmails(Math.max(0, fromFolder.unreadEmails() - unseenCount)); } if (toFolder) { toFolder.etag = ''; - - if (trashFolder === toFolder.fullName || spamFolder === toFolder.fullName) { - unseenCount = 0; - } - toFolder.totalEmails(toFolder.totalEmails() + oUids.size); - if (0 < unseenCount) { + if (trashFolder !== toFolder.fullName && spamFolder !== toFolder.fullName) { toFolder.unreadEmails(toFolder.unreadEmails() + unseenCount); } - toFolder.actionBlink(true); } if (messages.length) { + disableAutoSelect(true); if (copy) { messages.forEach(item => item.checked(false)); } else { @@ -468,49 +507,37 @@ MessagelistUserStore.removeMessagesFromList = ( currentMessage = null; MessageUserStore.message(null); } - item.deleted(true); + MessagelistUserStore.remove(item); }); - - setTimeout(() => messages.forEach(item => MessagelistUserStore.remove(item)), 350); - - const - count = MessagelistUserStore.count() - messages.length, - page = MessagelistUserStore.page(); - MessagelistUserStore.count(count); - if (page > MessagelistUserStore.pageCount()) { - setPage = MessagelistUserStore.pageCount(); - } } } - if (MessagelistUserStore.threadUid() - && MessagelistUserStore.length - && MessagelistUserStore.find(item => item?.deleted() && item.uid == MessagelistUserStore.threadUid()) - ) { - const message = MessagelistUserStore.find(item => item && !item.deleted()); - if (!message) { - if (1 < MessagelistUserStore.page()) { - setPage = MessagelistUserStore.page() - 1; + if (toFolderFullName) { + if (toFolder && fromFolderFullName != toFolderFullName) { + const params = { + fromFolder: fromFolderFullName, + toFolder: toFolderFullName, + uids: [...oUids].join(',') + }; + if (copy) { + Remote.request('MessageCopy', null, params); } else { - MessagelistUserStore.threadUid(0); - setPage = MessagelistUserStore.pageBeforeThread(); + const + isSpam = spamFolder === toFolderFullName, + isHam = !isSpam && spamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName; + params.markAsRead = (isSpam || FolderUserStore.trashFolder() === toFolderFullName) ? 1 : 0; + params.learning = isSpam ? 'SPAM' : isHam ? 'HAM' : ''; + Remote.abort('MessageList', 'reload').request('MessageMove', moveOrDeleteResponseHelper, params); } - } else if (MessagelistUserStore.threadUid() != message.uid) { - MessagelistUserStore.threadUid(message.uid); - setPage = MessagelistUserStore.page(); } - } - - if (setPage) { - MessagelistUserStore.page(setPage); - replaceHash( - mailBox( - FolderUserStore.currentFolderFullNameHash(), - setPage, - MessagelistUserStore.listSearch(), - MessagelistUserStore.threadUid() - ) + } else { + Remote.abort('MessageList', 'reload').request('MessageDelete', + moveOrDeleteResponseHelper, + { + folder: fromFolderFullName, + uids: [...oUids].join(',') + } ); } }; diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 3af776059..183e5b831 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -15,7 +15,7 @@ import { encodeHtml, HtmlEditor, htmlToPlain } from 'Common/Html'; import { koArrayWithDestroy, addObservablesTo, addComputablesTo, addSubscribablesTo } from 'External/ko'; import { UNUSED_OPTION_VALUE } from 'Common/Consts'; -import { folderInformation, messagesDeleteHelper } from 'Common/Folders'; +import { folderInformation } from 'Common/Folders'; import { serverRequest } from 'Common/Links'; import { i18n, getNotification, getUploadErrorDescByCode, timestampToString } from 'Common/Translator'; import { setFolderETag } from 'Common/Cache'; @@ -586,8 +586,7 @@ export class ComposePopupView extends AbstractViewPopup { const sFromFolderFullName = this.draftsFolder(), oUids = new Set([this.draftUid()]); - messagesDeleteHelper(sFromFolderFullName, oUids); - MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids); + MessagelistUserStore.moveMessages(sFromFolderFullName, oUids); this.close(); } ]); diff --git a/dev/View/User/MailBox/FolderList.js b/dev/View/User/MailBox/FolderList.js index 9c4860886..393f23a27 100644 --- a/dev/View/User/MailBox/FolderList.js +++ b/dev/View/User/MailBox/FolderList.js @@ -20,8 +20,6 @@ import { FolderCreatePopupView } from 'View/Popup/FolderCreate'; import { ContactsPopupView } from 'View/Popup/Contacts'; import { ComposePopupView } from 'View/Popup/Compose'; -import { moveMessagesToFolder } from 'Common/Folders'; - import { setExpandedFolder, foldersFilter } from 'Model/FolderCollection'; export class MailFolderList extends AbstractViewLeft { @@ -92,7 +90,7 @@ export class MailFolderList extends AbstractViewLeft { if (folder) { if (moveAction()) { moveAction(false); - moveMessagesToFolder( + MessagelistUserStore.moveMessages( FolderUserStore.currentFolderFullName(), MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(), folder.fullName,