diff --git a/dev/App/User.js b/dev/App/User.js index 8c613e169..4cb1499ca 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -105,10 +105,10 @@ export class AppUser extends AbstractApp { /** * @param {number} iFolderType * @param {string} sFromFolderFullName - * @param {Array} aUidForRemove + * @param {Set} oUids * @param {boolean=} bDelete = false */ - moveMessagesToFolderType(iFolderType, sFromFolderFullName, aUidForRemove, bDelete) { + moveMessagesToFolderType(iFolderType, sFromFolderFullName, oUids, bDelete) { let oMoveFolder = null, nSetSystemFoldersNotification = null; @@ -150,13 +150,13 @@ export class AppUser extends AbstractApp { showScreenPopup(AskPopupView, [ i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), () => { - messagesDeleteHelper(sFromFolderFullName, aUidForRemove); - MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove); + messagesDeleteHelper(sFromFolderFullName, oUids); + MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids); } ]); } else if (oMoveFolder) { - messagesMoveHelper(sFromFolderFullName, oMoveFolder.fullName, aUidForRemove); - MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove, oMoveFolder.fullName); + messagesMoveHelper(sFromFolderFullName, oMoveFolder.fullName, oUids); + MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids, oMoveFolder.fullName); } } diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index 86f77451b..075b41324 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -254,7 +254,7 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => { { FromFolder: fromFolderFullName, ToFolder: toFolderFullName, - Uids: uidsForMove.join(','), + Uids: [...uidsForMove].join(','), MarkAsRead: (isSpam || FolderUserStore.trashFolder() === toFolderFullName) ? 1 : 0, Learning: isSpam ? 'SPAM' : isHam ? 'HAM' : '' } @@ -266,19 +266,19 @@ messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => { moveOrDeleteResponseHelper, { Folder: sFromFolderFullName, - Uids: aUidForRemove.join(',') + Uids: [...aUidForRemove].join(',') } ); }, /** * @param {string} sFromFolderFullName - * @param {Array} aUidForMove + * @param {Set} oUids * @param {string} sToFolderFullName * @param {boolean=} bCopy = false */ -moveMessagesToFolder = (sFromFolderFullName, aUidForMove, sToFolderFullName, bCopy) => { - if (sFromFolderFullName !== sToFolderFullName && arrayLength(aUidForMove)) { +moveMessagesToFolder = (sFromFolderFullName, oUids, sToFolderFullName, bCopy) => { + if (sFromFolderFullName !== sToFolderFullName && oUids?.size) { const oFromFolder = getFolderFromCacheList(sFromFolderFullName), oToFolder = getFolderFromCacheList(sToFolderFullName); @@ -287,13 +287,13 @@ moveMessagesToFolder = (sFromFolderFullName, aUidForMove, sToFolderFullName, bCo Remote.request('MessageCopy', null, { FromFolder: oFromFolder.fullName, ToFolder: oToFolder.fullName, - Uids: aUidForMove.join(',') + Uids: [...oUids].join(',') }); } else { - messagesMoveHelper(oFromFolder.fullName, oToFolder.fullName, aUidForMove); + messagesMoveHelper(oFromFolder.fullName, oToFolder.fullName, oUids); } - MessagelistUserStore.removeMessagesFromList(oFromFolder.fullName, aUidForMove, oToFolder.fullName, bCopy); + MessagelistUserStore.removeMessagesFromList(oFromFolder.fullName, oUids, oToFolder.fullName, bCopy); return true; } } diff --git a/dev/External/User/ko.js b/dev/External/User/ko.js index 56d2d770f..3917b37a0 100644 --- a/dev/External/User/ko.js +++ b/dev/External/User/ko.js @@ -3,7 +3,6 @@ import ko from 'ko'; import { HtmlEditor } from 'Common/Html'; import { timeToNode } from 'Common/Translator'; import { elementById, addEventsListeners, dropdowns } from 'Common/Globals'; -import { isArray } from 'Common/Utils'; import { dropdownsDetectVisibility } from 'Common/UtilsUser'; import { EmailAddressesComponent } from 'Component/EmailAddresses'; import { ThemeStore } from 'Stores/Theme'; @@ -97,7 +96,7 @@ Object.assign(ko.bindingHandlers, { let data = fValueAccessor()(e); dragImage || (dragImage = elementById('messagesDragImage')); if (data && dragImage && !ThemeStore.isMobile()) { - dragImage.querySelector('.text').textContent = data.uids.length; + dragImage.querySelector('.text').textContent = data.size; let img = dragImage.querySelector('i'); img.classList.toggle('icon-copy', e.ctrlKey); img.classList.toggle('icon-mail', !e.ctrlKey); @@ -107,7 +106,7 @@ Object.assign(ko.bindingHandlers, { dragImage.style.top = e.clientY + 'px'; dragImage.style.right = 'auto'; - setDragAction(e, 'messages', e.ctrlKey ? 'copy' : 'move', data, dragImage); + setDragAction(e, 'messages', data.copy ? 'copy' : 'move', data, dragImage); // Remove the Chrome visibility dragImage.style.cssText = ''; @@ -150,8 +149,8 @@ Object.assign(ko.bindingHandlers, { fnStop(e); if (dragMessages() && ['move','copy'].includes(e.dataTransfer.effectAllowed)) { let data = dragData.data; - if (folder && data?.folder && isArray(data.uids)) { - moveMessagesToFolder(data.folder, data.uids, folder.fullName, data.copy && e.ctrlKey); + if (folder && data?.folder && data.size) { + moveMessagesToFolder(data.folder, data, folder.fullName, data.copy && e.ctrlKey); } } } diff --git a/dev/Stores/User/Messagelist.js b/dev/Stores/User/Messagelist.js index 0a7d30c41..06ce24cdf 100644 --- a/dev/Stores/User/Messagelist.js +++ b/dev/Stores/User/Messagelist.js @@ -107,11 +107,11 @@ addComputablesTo(MessagelistUserStore, { }, listCheckedOrSelectedUidsWithSubMails: () => { - let result = []; + let result = new Set; MessagelistUserStore.listCheckedOrSelected().forEach(message => { - result.push(message.uid); + result.add(message.uid); if (1 < message.threadsLen()) { - result = result.concat(message.threads()).unique(); + message.threads().forEach(result.add, result); } }); return result; @@ -340,15 +340,13 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => { /** * @param {string} fromFolderFullName - * @param {Array} uidForRemove + * @param {Set} oUids * @param {string=} toFolderFullName = '' * @param {boolean=} copy = false */ MessagelistUserStore.removeMessagesFromList = ( - fromFolderFullName, uidForRemove, toFolderFullName = '', copy = false + fromFolderFullName, oUids, toFolderFullName = '', copy = false ) => { - uidForRemove = uidForRemove.map(mValue => pInt(mValue)); - let unseenCount = 0, messageList = MessagelistUserStore, currentMessage = MessageUserStore.message(); @@ -359,7 +357,7 @@ MessagelistUserStore.removeMessagesFromList = ( toFolder = toFolderFullName ? getFolderFromCacheList(toFolderFullName) : null, messages = FolderUserStore.currentFolderFullName() === fromFolderFullName - ? messageList.filter(item => item && uidForRemove.includes(pInt(item.uid))) + ? messageList.filter(item => item && oUids.has(item.uid)) : []; messages.forEach(item => item?.isUnseen() && ++unseenCount); @@ -368,7 +366,7 @@ MessagelistUserStore.removeMessagesFromList = ( fromFolder.hash = ''; if (!copy) { fromFolder.totalEmails( - 0 <= fromFolder.totalEmails() - uidForRemove.length ? fromFolder.totalEmails() - uidForRemove.length : 0 + 0 <= fromFolder.totalEmails() - oUids.size ? fromFolder.totalEmails() - oUids.size : 0 ); if (0 < unseenCount) { @@ -386,7 +384,7 @@ MessagelistUserStore.removeMessagesFromList = ( unseenCount = 0; } - toFolder.totalEmails(toFolder.totalEmails() + uidForRemove.length); + toFolder.totalEmails(toFolder.totalEmails() + oUids.size); if (0 < unseenCount) { toFolder.unreadEmails(toFolder.unreadEmails() + unseenCount); } diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index e44dd349a..3e214fd8a 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -564,9 +564,9 @@ export class ComposePopupView extends AbstractViewPopup { () => { const sFromFolderFullName = this.draftsFolder(), - aUidForRemove = [this.draftUid()]; - messagesDeleteHelper(sFromFolderFullName, aUidForRemove); - MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove); + oUids = new Set([this.draftUid()]); + messagesDeleteHelper(sFromFolderFullName, oUids); + MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, oUids); this.close(); } ]); diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 633e3b5e8..8a37fd88b 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -384,12 +384,9 @@ export class MailMessageList extends AbstractViewRight { const item = ko.dataFor(doc.elementFromPoint(event.clientX, event.clientY)); item?.checked?.(true); const uids = MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails(); - item && !uids.includes(item.uid) && uids.push(item.uid); - return uids.length ? { - copy: event.ctrlKey, - folder: FolderUserStore.currentFolderFullName(), - uids: uids - } : null; + uids.copy = event.ctrlKey; // dropEffect + uids.folder = FolderUserStore.currentFolderFullName(); + return uids; } listSetSeen() { diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 69aa95de5..e165ca065 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -499,7 +499,7 @@ export class MailMessageView extends AbstractViewRight { * @returns {string} */ printableCheckedMessageCount() { - const cnt = MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails().length; + const cnt = MessagelistUserStore.listCheckedOrSelectedUidsWithSubMails().size; return 0 < cnt ? (100 > cnt ? cnt : '99+') : ''; }