diff --git a/dev/Common/UtilsUser.js b/dev/Common/UtilsUser.js index 151e73939..364fe534b 100644 --- a/dev/Common/UtilsUser.js +++ b/dev/Common/UtilsUser.js @@ -1,8 +1,10 @@ -import { ComposeType, FolderType } from 'Common/EnumsUser'; +import { ComposeType/*, FolderType*/ } from 'Common/EnumsUser'; import { EmailModel } from 'Model/Email'; import { encodeHtml } from 'Common/Html'; import { isArray } from 'Common/Utils'; import { createElement } from 'Common/Globals'; +import { FolderUserStore } from 'Stores/User/Folder'; +import { SettingsUserStore } from 'Stores/User/Settings'; /** * @param {(string|number)} value @@ -213,24 +215,20 @@ rl.Utils = { /** * @param {Array} aSystem - * @param {Array} aList * @param {Array=} aDisabled * @param {Array=} aHeaderLines * @param {Function=} fDisableCallback * @param {Function=} fRenameCallback - * @param {boolean=} bSystem - * @param {boolean=} bBuildUnvisible + * @param {boolean=} bNoSelectSelectable Used in FolderCreatePopupView * @returns {Array} */ export function folderListOptionsBuilder( aSystem, - aList, aDisabled, aHeaderLines, - fDisableCallback, fRenameCallback, - bSystem, - bBuildUnvisible + fDisableCallback, + bNoSelectSelectable ) { let /** * @type {?FolderModel} @@ -238,71 +236,67 @@ export function folderListOptionsBuilder( bSep = false, aResult = []; - const sDeepPrefix = '\u00A0\u00A0\u00A0'; + const sDeepPrefix = '\u00A0\u00A0\u00A0', + // FolderSystemPopupView should always be true + showUnsubscribed = (aSystem.length || bNoSelectSelectable) ? !SettingsUserStore.hideUnsubscribed() : true; - bBuildUnvisible = undefined === bBuildUnvisible ? false : !!bBuildUnvisible; - bSystem = null == bSystem ? 0 < aSystem.length : bSystem; - fDisableCallback = null != fDisableCallback ? fDisableCallback : null; - fRenameCallback = null != fRenameCallback ? fRenameCallback : null; + fDisableCallback = fDisableCallback || (() => false); + fRenameCallback = fRenameCallback || (oItem => oItem.name()); if (!isArray(aDisabled)) { aDisabled = []; } - if (!isArray(aHeaderLines)) { - aHeaderLines = []; - } - - aHeaderLines.forEach(line => { + isArray(aHeaderLines) && aHeaderLines.forEach(line => aResult.push({ id: line[0], name: line[1], system: false, dividerbar: false, disabled: false - }); - }); + }) + ); bSep = true; aSystem.forEach(oItem => { aResult.push({ id: oItem.fullNameRaw, - name: fRenameCallback ? fRenameCallback(oItem) : oItem.name(), + name: fRenameCallback(oItem), system: true, dividerbar: bSep, disabled: !oItem.selectable || aDisabled.includes(oItem.fullNameRaw) || - (fDisableCallback ? fDisableCallback(oItem) : false) + fDisableCallback(oItem) }); bSep = false; }); bSep = true; - aList.forEach(oItem => { - // if (oItem.subscribed() || !oItem.exists || bBuildUnvisible) - if ( - (oItem.subscribed() || !oItem.exists || bBuildUnvisible) && - (oItem.selectable || oItem.hasSubscribedSubfolders()) + FolderUserStore.folderList().forEach(oItem => { +/* + if ((oItem.subscribed() || !oItem.exists || bBuildUnvisible) + && (oItem.selectable || oItem.hasSubscribedSubfolders()) + && (FolderType.User === oItem.type() || !bSystem || oItem.hasSubscribedSubfolders()) { ) { - if (FolderType.User === oItem.type() || !bSystem || oItem.hasSubscribedSubfolders()) { - aResult.push({ - id: oItem.fullNameRaw, - name: - sDeepPrefix.repeat(oItem.deep + 1) + - (fRenameCallback ? fRenameCallback(oItem) : oItem.name()), - system: false, - dividerbar: bSep, - disabled: - !oItem.selectable || - aDisabled.includes(oItem.fullNameRaw) || - (fDisableCallback ? fDisableCallback(oItem) : false) - }); - bSep = false; - } +*/ + if (showUnsubscribed || oItem.subscribed() || !oItem.exists || oItem.hasSubscribedSubfolders()) { + aResult.push({ + id: oItem.fullNameRaw, + name: + sDeepPrefix.repeat(oItem.deep) + + fRenameCallback(oItem), + system: false, + dividerbar: bSep, + disabled: !bNoSelectSelectable && ( + !oItem.selectable || + aDisabled.includes(oItem.fullNameRaw) || + fDisableCallback(oItem)) + }); + bSep = false; } - if (oItem.subscribed() && oItem.subFolders.length) { + if (oItem.subFolders.length) { aResult = aResult.concat( folderListOptionsBuilder( [], @@ -311,8 +305,7 @@ export function folderListOptionsBuilder( [], fDisableCallback, fRenameCallback, - bSystem, - bBuildUnvisible + bNoSelectSelectable ) ); } diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index 12eeb7f79..90cbda50e 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -257,13 +257,13 @@ export class FolderModel extends AbstractModel { oFolder => (oFolder.subscribed() || oFolder.hasSubscribedSubfolders()) && !oFolder.isSystemFolder() ), - canBeEdited: () => FolderType.User === folder.type() && folder.exists && folder.selectable, + canBeEdited: () => FolderType.User === folder.type() && folder.exists/* && folder.selectable*/, visible: () => { const isSubscribed = folder.subscribed(), isSubFolders = folder.hasSubscribedSubfolders(); - return isSubscribed || (isSubFolders && (!folder.exists || !folder.selectable)); + return isSubscribed || (isSubFolders && (!folder.exists/* || !folder.selectable*/)); }, isSystemFolder: () => FolderType.User !== folder.type(), diff --git a/dev/Settings/User/Folders.js b/dev/Settings/User/Folders.js index b17d32323..57dceb5c9 100644 --- a/dev/Settings/User/Folders.js +++ b/dev/Settings/User/Folders.js @@ -118,25 +118,16 @@ export class FoldersUserSettings { } } - subscribeFolder(folder) { + toggleFolderSubscription(folder) { + let subscribe = !folder.subscribed(); Local.set(ClientSideKeyName.FoldersLashHash, ''); - Remote.folderSetSubscribe(()=>0, folder.fullNameRaw, true); - folder.subscribed(true); + Remote.folderSetSubscribe(()=>0, folder.fullNameRaw, subscribe); + folder.subscribed(subscribe); } - unSubscribeFolder(folder) { - Local.set(ClientSideKeyName.FoldersLashHash, ''); - Remote.folderSetSubscribe(()=>0, folder.fullNameRaw, false); - folder.subscribed(false); - } - - checkableTrueFolder(folder) { - Remote.folderSetCheckable(()=>0, folder.fullNameRaw, true); - folder.checkable(true); - } - - checkableFalseFolder(folder) { - Remote.folderSetCheckable(()=>0, folder.fullNameRaw, false); - folder.checkable(false); + toggleFolderCheckable(folder) { + let checkable = !folder.checkable(); + Remote.folderSetCheckable(()=>0, folder.fullNameRaw, checkable); + folder.checkable(checkable); } } diff --git a/dev/Stores/User/Folder.js b/dev/Stores/User/Folder.js index 34ed105bf..64c9519c9 100644 --- a/dev/Stores/User/Folder.js +++ b/dev/Stores/User/Folder.js @@ -3,7 +3,6 @@ import ko from 'ko'; import { FolderType, FolderSortMode } from 'Common/EnumsUser'; import { UNUSED_OPTION_VALUE } from 'Common/Consts'; import { addObservablesTo, addSubscribablesTo } from 'Common/Utils'; -import { folderListOptionsBuilder } from 'Common/UtilsUser'; import { getFolderInboxName, getFolderFromCacheList } from 'Common/Cache'; import { SettingsGet } from 'Common/Globals'; @@ -107,28 +106,6 @@ export const FolderUserStore = new class { this.folderListSystemNames().map(name => getFolderFromCacheList(name)).filter(v => v) ); - this.folderMenuForMove = ko.computed(() => - folderListOptionsBuilder( - this.folderListSystem(), - this.folderList(), - [this.currentFolderFullNameRaw()], - [], - null, - (item) => (item ? item.localName() : '') - ) - ); - - this.folderMenuForFilters = ko.computed(() => - folderListOptionsBuilder( - this.folderListSystem(), - this.folderList(), - [this.sieveAllowFileintoInbox ? '' : 'INBOX'], - [['', '']], - null, - (item) => (item ? item.localName() : '') - ) - ); - const fRemoveSystemFolderType = (observable) => () => { const folder = getFolderFromCacheList(observable()); diff --git a/dev/Styles/User/FolderList.less b/dev/Styles/User/FolderList.less index f5f5b3af7..28b68b4de 100644 --- a/dev/Styles/User/FolderList.less +++ b/dev/Styles/User/FolderList.less @@ -111,6 +111,9 @@ color: var(--folders-selected-color, #eee); } } + &:not(.selectable) { + font-style: italic; + } &.focused { background-color: #888; diff --git a/dev/Styles/User/SettingsFolders.less b/dev/Styles/User/SettingsFolders.less index 41b6b87c3..002e89c64 100644 --- a/dev/Styles/User/SettingsFolders.less +++ b/dev/Styles/User/SettingsFolders.less @@ -34,6 +34,10 @@ .folder-item { + &:not(.selectable) { + font-style: italic; + } + &.system .folder-name { font-weight: bold; } diff --git a/dev/View/Popup/Filter.js b/dev/View/Popup/Filter.js index 64b387f93..b41b472fe 100644 --- a/dev/View/Popup/Filter.js +++ b/dev/View/Popup/Filter.js @@ -11,6 +11,8 @@ import { SieveUserStore } from 'Stores/User/Sieve'; import { decorateKoCommands } from 'Knoin/Knoin'; import { AbstractViewPopup } from 'Knoin/AbstractViews'; +import { folderListOptionsBuilder } from 'Common/UtilsUser'; + class FilterPopupView extends AbstractViewPopup { constructor() { super('Filter'); @@ -25,7 +27,15 @@ class FilterPopupView extends AbstractViewPopup { this.fTrueCallback = null; this.defaultOptionsAfterRender = defaultOptionsAfterRender; - this.folderSelectList = FolderUserStore.folderMenuForFilters; + this.folderSelectList = ko.computed(() => + folderListOptionsBuilder( + FolderUserStore.folderListSystem(), + [FolderUserStore.sieveAllowFileintoInbox ? '' : 'INBOX'], + [['', '']], + item => item ? item.localName() : '' + ) + ); + this.selectedFolderValue.subscribe(() => this.filter() && this.filter().actionValueError(false)); diff --git a/dev/View/Popup/FolderCreate.js b/dev/View/Popup/FolderCreate.js index ee8f627a7..4521c2f7a 100644 --- a/dev/View/Popup/FolderCreate.js +++ b/dev/View/Popup/FolderCreate.js @@ -25,14 +25,14 @@ class FolderCreatePopupView extends AbstractViewPopup { this.parentFolderSelectList = ko.computed(() => folderListOptionsBuilder( [], - FolderUserStore.folderList(), [], [['', '']], + oItem => + oItem ? (oItem.isSystemFolder() ? oItem.name() + ' ' + oItem.manageFolderSystemName() : oItem.name()) : '', FolderUserStore.namespace ? item => FolderUserStore.namespace !== item.fullNameRaw.substr(0, FolderUserStore.namespace.length) : null, - oItem => - oItem ? (oItem.isSystemFolder() ? oItem.name() + ' ' + oItem.manageFolderSystemName() : oItem.name()) : '' + true ) ); diff --git a/dev/View/Popup/FolderSystem.js b/dev/View/Popup/FolderSystem.js index 145402d10..961b6e36b 100644 --- a/dev/View/Popup/FolderSystem.js +++ b/dev/View/Popup/FolderSystem.js @@ -30,16 +30,11 @@ class FolderSystemPopupView extends AbstractViewPopup { this.folderSelectList = ko.computed(() => folderListOptionsBuilder( [], - FolderUserStore.folderList(), FolderUserStore.folderListSystemNames(), [ ['', this.sChooseOnText], [UNUSED_OPTION_VALUE, this.sUnuseText] - ], - null, - null, - null, - true + ] ) ); diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 796a80ed7..1fb3ad8cc 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -15,7 +15,7 @@ import { UNUSED_OPTION_VALUE } from 'Common/Consts'; import { doc, leftPanelDisabled, moveAction, Settings, SettingsGet } from 'Common/Globals'; -import { computedPaginatorHelper, showMessageComposer } from 'Common/UtilsUser'; +import { computedPaginatorHelper, showMessageComposer, folderListOptionsBuilder } from 'Common/UtilsUser'; import { FileInfo } from 'Common/File'; import { mailBox, serverRequest } from 'Common/Links'; @@ -78,7 +78,14 @@ export class MessageListMailBoxUserView extends AbstractViewRight { this.isMessageSelected = MessageUserStore.isMessageSelected; this.messageListSearch = MessageUserStore.listSearch; this.messageListError = MessageUserStore.listError; - this.folderMenuForMove = FolderUserStore.folderMenuForMove; + this.folderMenuForMove = ko.computed(() => + folderListOptionsBuilder( + FolderUserStore.folderListSystem(), + [FolderUserStore.currentFolderFullNameRaw()], + [], + item => item ? item.localName() : '' + ) + ); this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList; diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Folder.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Folder.php index a86752760..3b9e2fbeb 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Folder.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/Folder.php @@ -233,7 +233,7 @@ class Folder implements \JsonSerializable 'FullName' => $this->FullName(), 'FullNameRaw' => $this->FullNameRaw(), 'Delimiter' => (string) $this->Delimiter(), - 'HasVisibleSubFolders' => $this->HasVisibleSubFolders(), +// 'HasVisibleSubFolders' => $this->HasVisibleSubFolders(), 'Subscribed' => $this->bSubscribed, 'Exists' => $this->bExists, 'Selectable' => $this->IsSelectable(), diff --git a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html index 2e35966b3..c55d18254 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/SettingsFolderItem.html @@ -14,14 +14,10 @@ 🗑