diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index 8be92501c..cba42f263 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -216,12 +216,8 @@ export class Selector { }); } - isListChecked() { - return this.list.find(item => item.checked()); - } - itemSelected(item) { - if (this.isListChecked()) { + if (this.list.hasChecked()) { item || this.oCallbacks.ItemSelect?.(null); } else if (item) { this.oCallbacks.ItemSelect?.(item); @@ -373,7 +369,7 @@ export class Selector { if (result) { this.focusedItem(result); - if ((this.autoSelect() || bForceSelect) && !this.isListChecked()) { + if ((this.autoSelect() || bForceSelect) && !this.list.hasChecked()) { this.selectedItem(result); } this.scrollToFocused(); diff --git a/dev/Model/Contact.js b/dev/Model/Contact.js index 33739ab5f..1b4984009 100644 --- a/dev/Model/Contact.js +++ b/dev/Model/Contact.js @@ -81,9 +81,11 @@ export class ContactModel extends AbstractModel { this.jCard = ['vcard',[]]; this.addObservables({ + // Also used by Selector focused: false, selected: false, checked: false, + deleted: false, readOnly: false, diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 38ef408bb..2c0e22701 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -127,6 +127,7 @@ export class MessageModel extends AbstractModel { deleted: false, + // Also used by Selector focused: false, selected: false, checked: false, diff --git a/dev/Stores/User/Contact.js b/dev/Stores/User/Contact.js index 28ec7c5ed..ec1f1b4e6 100644 --- a/dev/Stores/User/Contact.js +++ b/dev/Stores/User/Contact.js @@ -1,7 +1,7 @@ import ko from 'ko'; import { SettingsGet } from 'Common/Globals'; import { pInt } from 'Common/Utils'; -import { addObservablesTo, koArrayWithDestroy } from 'External/ko'; +import { koComputable, addObservablesTo, koArrayWithDestroy } from 'External/ko'; import Remote from 'Remote/User/Fetch'; export const ContactUserStore = koArrayWithDestroy(); @@ -18,6 +18,12 @@ addObservablesTo(ContactUserStore, { syncPass: '' }); +// Also used by Selector +ContactUserStore.hasChecked = koComputable( + // Issue: not all are observed? + () => !!ContactUserStore.find(item => item.checked()) +); + /** * @param {Function} fResultFunc * @returns {void} diff --git a/dev/Stores/User/Messagelist.js b/dev/Stores/User/Messagelist.js index 7d65a61b7..d0fba3ab2 100644 --- a/dev/Stores/User/Messagelist.js +++ b/dev/Stores/User/Messagelist.js @@ -120,18 +120,21 @@ addComputablesTo(MessagelistUserStore, { }); MessagelistUserStore.listChecked = koComputable( - () => MessagelistUserStore.filter(isChecked)).extend({ rateLimit: 0 } -); + () => MessagelistUserStore.filter(isChecked) +).extend({ rateLimit: 0 }); -MessagelistUserStore.hasCheckedMessages = koComputable( +// Also used by Selector +MessagelistUserStore.hasChecked = koComputable( + // Issue: not all are observed? () => !!MessagelistUserStore.find(isChecked) ).extend({ rateLimit: 0 }); MessagelistUserStore.hasCheckedOrSelected = koComputable(() => - !!(MessagelistUserStore.selectedMessage() - || MessagelistUserStore.focusedMessage() - || MessagelistUserStore.find(item => item.checked())) - ).extend({ rateLimit: 50 }); + !!(MessagelistUserStore.selectedMessage() + | MessagelistUserStore.focusedMessage() + // Issue: not all are observed? + | MessagelistUserStore.find(isChecked)) +).extend({ rateLimit: 50 }); MessagelistUserStore.notifyNewMessages = (folder, newMessages) => { if (getFolderInboxName() === folder && arrayLength(newMessages)) { diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 955a1a289..08dab6e41 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -71,7 +71,7 @@ export class ContactsPopupView extends AbstractViewPopup { ), contactsCheckedOrSelected: () => { - const checked = ContactUserStore.filter(item => item.checked?.()), + const checked = ContactUserStore.filter(item => item.checked()), selected = this.selectorContact(); return checked.length ? checked : (selected ? [selected] : []); }, diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index ad02772d2..1d36fb7b0 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -118,7 +118,7 @@ export class MailMessageList extends AbstractViewRight { MessagelistUserStore.pageCount), checkAll: { - read: () => 0 < MessagelistUserStore.listChecked().length, + read: () => MessagelistUserStore.hasChecked(), write: (value) => { value = !!value; MessagelistUserStore.forEach(message => message.checked(value)); @@ -135,9 +135,9 @@ export class MailMessageList extends AbstractViewRight { return c && MessagelistUserStore().length > c; }, - mobileCheckedStateShow: () => ThemeStore.isMobile() ? MessagelistUserStore.listChecked().length : 1, + mobileCheckedStateShow: () => ThemeStore.isMobile() ? MessagelistUserStore.hasChecked() : 1, - mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessagelistUserStore.listChecked().length : 1, + mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessagelistUserStore.hasChecked() : 1, sortText: () => { let mode = FolderUserStore.sortMode(), @@ -323,7 +323,7 @@ export class MailMessageList extends AbstractViewRight { } goToUpOrDown(up) { - if (MessagelistUserStore.listChecked().length) { + if (MessagelistUserStore.hasChecked()) { return false; } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index decf5e527..d42a5faa2 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -111,7 +111,7 @@ export class MailMessageView extends AbstractViewRight { const attachmentsActions = Settings.app('attachmentsActions'); this.attachmentsActions = ko.observableArray(arrayLength(attachmentsActions) ? attachmentsActions : []); - this.hasCheckedMessages = MessagelistUserStore.hasCheckedMessages; + this.hasCheckedMessages = MessagelistUserStore.hasChecked; this.archiveAllowed = MessagelistUserStore.archiveAllowed; this.canMarkAsSpam = MessagelistUserStore.canMarkAsSpam; this.isDraftFolder = MessagelistUserStore.isDraftFolder;