From 2cf2b1ee75510b2ea97ab36a54b0d98f0541bc77 Mon Sep 17 00:00:00 2001 From: djmaze Date: Wed, 3 Nov 2021 19:25:52 +0100 Subject: [PATCH] Bugfix: some folders were invisible while they should be visible It all came down to a very complex subscribe system. I changed that in a "is visible for whatever reason" system. --- dev/Model/FolderCollection.js | 58 +++++++++++++++-------------- dev/Stores/User/Settings.js | 4 +- dev/View/User/MailBox/FolderList.js | 11 +++--- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index 6f37b7634..ac4dff613 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -225,7 +225,7 @@ export class FolderModel extends AbstractModel { kolabType: null, - collapsedPrivate: true + collapsed: true }); this.addSubscribables({ @@ -281,29 +281,45 @@ export class FolderModel extends AbstractModel { isInbox: () => FolderType.Inbox === folder.type(), isFlagged: () => FolderUserStore.currentFolder() === folder - && MessageUserStore.listSearch().trim().includes('is:flagged'), + && MessageUserStore.listSearch().includes('flagged'), - hasSubscribedSubfolders: - () => !!folder.subFolders().find( + hasVisibleSubfolders: () => !!folder.subFolders().find(folder => folder.visible()), + + hasSubscriptions: () => folder.subscribed() | !!folder.subFolders().find( oFolder => { const subscribed = oFolder.hasSubscriptions(); return !oFolder.isSystemFolder() && subscribed; } ), - hasSubscriptions: () => folder.subscribed() | folder.hasSubscribedSubfolders(), - canBeEdited: () => FolderType.User === folder.type() && folder.exists/* && folder.selectable()*/, - visible: () => folder.hasSubscriptions() | !SettingsUserStore.hideUnsubscribed(), - isSystemFolder: () => FolderType.User !== folder.type() | !!folder.kolabType(), - hidden: () => { - let hasSubFolders = folder.hasSubscribedSubfolders(); - return (folder.isSystemFolder() | !folder.selectable()) && !hasSubFolders; + canBeSelected: () => folder.selectable() && !folder.isSystemFolder(), + + canBeDeleted: () => folder.canBeSelected() && folder.exists, + + canBeSubscribed: () => folder.selectable() + && !(folder.isSystemFolder() | !SettingsUserStore.hideUnsubscribed()), + + /** + * Folder is visible when: + * - hasVisibleSubfolders() + * Or when all below conditions are true: + * - selectable() + * - subscribed() OR hideUnsubscribed = false + * - FolderType.User + * - not kolabType() + */ + visible: () => { + const selectable = folder.canBeSelected(), + visible = (folder.subscribed() | !SettingsUserStore.hideUnsubscribed()) && selectable; + return folder.hasVisibleSubfolders() | visible; }, + hidden: () => !folder.selectable() && (folder.isSystemFolder() | !folder.hasVisibleSubfolders()), + printableUnreadCount: () => { const count = folder.messageCountAll(), unread = folder.messageCountUnread(), @@ -326,13 +342,6 @@ export class FolderModel extends AbstractModel { return null; }, - canBeDeleted: () => !(folder.isSystemFolder() | !folder.selectable()), - - canBeSubscribed: () => Settings.app('useImapSubscribe') - && !(folder.isSystemFolder() | !SettingsUserStore.hideUnsubscribed() | !folder.selectable()), - - canBeSelected: () => !(folder.isSystemFolder() | !folder.selectable() | folder.kolabType()), - localName: () => { let name = folder.name(); if (folder.isSystemFolder()) { @@ -353,17 +362,12 @@ export class FolderModel extends AbstractModel { return ''; }, - collapsed: { - read: () => !folder.hidden() && folder.collapsedPrivate(), - write: value => folder.collapsedPrivate(value) - }, - hasUnreadMessages: () => 0 < folder.messageCountUnread() && folder.printableUnreadCount(), hasSubscribedUnreadMessagesSubfolders: () => - !!folder.subFolders().find( - folder => folder.hasUnreadMessages() || folder.hasSubscribedUnreadMessagesSubfolders() - ) + !!folder.subFolders().find( + folder => folder.hasUnreadMessages() | folder.hasSubscribedUnreadMessagesSubfolders() + ) }); folder.addSubscribables({ @@ -385,7 +389,7 @@ export class FolderModel extends AbstractModel { * @returns {string} */ collapsedCss() { - return 'e-collapsed-sign ' + (this.hasSubscribedSubfolders() + return 'e-collapsed-sign ' + (this.hasVisibleSubfolders() ? (this.collapsed() ? 'icon-right-mini' : 'icon-down-mini') : 'icon-none' ); diff --git a/dev/Stores/User/Settings.js b/dev/Stores/User/Settings.js index 509ac69d6..0783b6825 100644 --- a/dev/Stores/User/Settings.js +++ b/dev/Stores/User/Settings.js @@ -2,7 +2,7 @@ import ko from 'ko'; import { Layout, EditorDefaultType } from 'Common/EnumsUser'; import { pInt, addObservablesTo } from 'Common/Utils'; -import { $htmlCL, SettingsGet } from 'Common/Globals'; +import { $htmlCL, Settings, SettingsGet } from 'Common/Globals'; import { ThemeStore } from 'Stores/Theme'; export const SettingsUserStore = new class { @@ -31,7 +31,7 @@ export const SettingsUserStore = new class { allowDraftAutosave: !!SettingsGet('AllowDraftAutosave'), useThreads: !!SettingsGet('UseThreads'), replySameFolder: !!SettingsGet('ReplySameFolder'), - hideUnsubscribed: !!SettingsGet('HideUnsubscribed'), + hideUnsubscribed: Settings.app('useImapSubscribe') && SettingsGet('HideUnsubscribed'), autoLogout: pInt(SettingsGet('AutoLogout')) }); diff --git a/dev/View/User/MailBox/FolderList.js b/dev/View/User/MailBox/FolderList.js index 8b6e2e2d8..58ae47f86 100644 --- a/dev/View/User/MailBox/FolderList.js +++ b/dev/View/User/MailBox/FolderList.js @@ -44,15 +44,14 @@ export class MailFolderList extends AbstractViewLeft { folderListVisible: () => { let multiple = false, - inbox, subscribed, hasSub, + inbox, visible, result = FolderUserStore.folderList().filter(folder => { if (folder.isInbox()) { inbox = folder; } - subscribed = folder.subscribed(); - hasSub = folder.hasSubscribedSubfolders(); - multiple |= (!folder.isSystemFolder() || (hasSub && !folder.isInbox())) && (subscribed || hasSub) - return !(folder.hidden() | folder.kolabType()); + visible = folder.visible(); + multiple |= visible && !folder.isInbox(); + return visible; }); if (inbox && !multiple) { inbox.collapsedPrivate(false); @@ -109,7 +108,7 @@ export class MailFolderList extends AbstractViewLeft { rl.route.setHash( mailBox(folder.fullNameHash, 1, - (event.target.matches('.flag-icon') && !folder.isFlagged()) ? 'is:flagged' : '' + (event.target.matches('.flag-icon') && !folder.isFlagged()) ? 'flagged' : '' ) ); }