diff --git a/dev/External/ko.js b/dev/External/ko.js index a67337b81..4b8188d3a 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -28,12 +28,12 @@ export const dispose = disposable => isFunction(disposable?.dispose) && disposable.dispose(), - onKey = (key, element, fValueAccessor, fAllBindings, viewModel) => { + onKey = (key, element, fValueAccessor, fAllBindings, model) => { let fn = event => { if (key == event.key) { // stopEvent(event); // element.dispatchEvent(new Event('change')); - fValueAccessor().call(viewModel); + fValueAccessor().call(model); } }; element.addEventListener('keydown', fn); @@ -68,18 +68,18 @@ Object.assign(ko.bindingHandlers, { }, onEnter: { - init: (element, fValueAccessor, fAllBindings, viewModel) => - onKey('Enter', element, fValueAccessor, fAllBindings, viewModel) + init: (element, fValueAccessor, fAllBindings, model) => + onKey('Enter', element, fValueAccessor, fAllBindings, model) }, onEsc: { - init: (element, fValueAccessor, fAllBindings, viewModel) => - onKey('Escape', element, fValueAccessor, fAllBindings, viewModel) + init: (element, fValueAccessor, fAllBindings, model) => + onKey('Escape', element, fValueAccessor, fAllBindings, model) }, onSpace: { - init: (element, fValueAccessor, fAllBindings, viewModel) => - onKey(' ', element, fValueAccessor, fAllBindings, viewModel) + init: (element, fValueAccessor, fAllBindings, model) => + onKey(' ', element, fValueAccessor, fAllBindings, model) }, i18nUpdate: { diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index 7a8f06849..e9c86ed47 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -3,8 +3,9 @@ import { AbstractCollectionModel } from 'Model/AbstractCollection'; import { UNUSED_OPTION_VALUE } from 'Common/Consts'; import { isArray, getKeyByValue, forEachObjectEntry, b64EncodeJSONSafe } from 'Common/Utils'; import { ClientSideKeyNameExpandedFolders, FolderType, FolderMetadataKeys } from 'Common/EnumsUser'; -import { getFolderFromCacheList, setFolder, setFolderInboxName } from 'Common/Cache'; +import { getFolderFromCacheList, setFolder, setFolderInboxName, removeFolderFromCacheList } from 'Common/Cache'; import { Settings, SettingsGet, fireEvent } from 'Common/Globals'; +import { Notifications } from 'Common/Enums'; import * as Local from 'Storage/Client'; @@ -14,7 +15,7 @@ import { MessagelistUserStore } from 'Stores/User/Messagelist'; import { SettingsUserStore } from 'Stores/User/Settings'; import { sortFolders } from 'Common/Folders'; -import { i18n, translateTrigger } from 'Common/Translator'; +import { i18n, translateTrigger, getNotification } from 'Common/Translator'; import { AbstractModel } from 'Knoin/AbstractModel'; @@ -473,6 +474,41 @@ export class FolderModel extends AbstractModel { this.editing(false); } + rename() { + const folder = this, + nameToEdit = folder.nameForEdit().trim(); + if (nameToEdit && folder.name() !== nameToEdit) { + Remote.abort('Folders').post('FolderRename', FolderUserStore.foldersRenaming, { + folder: folder.fullName, + newFolderName: nameToEdit, + subscribe: folder.isSubscribed() ? 1 : 0 + }) + .then(data => { + folder.name(nameToEdit/*data.name*/); + if (folder.subFolders.length) { + Remote.setTrigger(FolderUserStore.foldersLoading, true); +// clearTimeout(Remote.foldersTimeout); +// Remote.foldersTimeout = setTimeout(loadFolders, 500); + setTimeout(loadFolders, 500); + // TODO: rename all subfolders with folder.delimiter to prevent reload? + } else { + removeFolderFromCacheList(folder.fullName); + folder.fullName = data.Result.fullName; + setFolder(folder); + const parent = getFolderFromCacheList(folder.parentName); + sortFolders(parent ? parent.subFolders : FolderUserStore.folderList); + } + }) + .catch(error => { + FolderUserStore.folderListError( + getNotification(error.code, '', Notifications.CantRenameFolder) + + '.\n' + error.message); + }); + } + + folder.editing(false); + } + /** * For url safe '/#/mailbox/...' path */ diff --git a/dev/Settings/User/Folders.js b/dev/Settings/User/Folders.js index 73e68b6dd..89fc7fc9e 100644 --- a/dev/Settings/User/Folders.js +++ b/dev/Settings/User/Folders.js @@ -4,9 +4,8 @@ import { Notifications } from 'Common/Enums'; import { FolderMetadataKeys } from 'Common/EnumsUser'; import { getNotification } from 'Common/Translator'; -import { setFolder, getFolderFromCacheList, removeFolderFromCacheList } from 'Common/Cache'; +import { getFolderFromCacheList, removeFolderFromCacheList } from 'Common/Cache'; import { defaultOptionsAfterRender } from 'Common/Utils'; -import { sortFolders } from 'Common/Folders'; import { initOnStartOrLangChange, i18n } from 'Common/Translator'; import { FolderUserStore } from 'Stores/User/Folder'; @@ -18,7 +17,6 @@ import { showScreenPopup } from 'Knoin/Knoin'; import { FolderCreatePopupView } from 'View/Popup/FolderCreate'; import { FolderSystemPopupView } from 'View/Popup/FolderSystem'; -import { loadFolders } from 'Model/FolderCollection'; const folderForDeletion = ko.observable(null).askDeleteHelper(); @@ -56,40 +54,6 @@ export class UserSettingsFolders /*extends AbstractViewSettings*/ { SettingsUserStore.unhideKolabFolders.subscribe(value => Remote.saveSetting('UnhideKolabFolders', value)); } - folderEditOnEnter(folder) { - const nameToEdit = folder?.nameForEdit().trim(); - if (nameToEdit && folder.name() !== nameToEdit) { - Remote.abort('Folders').post('FolderRename', FolderUserStore.foldersRenaming, { - folder: folder.fullName, - newFolderName: nameToEdit, - subscribe: folder.isSubscribed() ? 1 : 0 - }) - .then(data => { - folder.name(nameToEdit/*data.name*/); - if (folder.subFolders.length) { - Remote.setTrigger(FolderUserStore.foldersLoading, true); -// clearTimeout(Remote.foldersTimeout); -// Remote.foldersTimeout = setTimeout(loadFolders, 500); - setTimeout(loadFolders, 500); - // TODO: rename all subfolders with folder.delimiter to prevent reload? - } else { - removeFolderFromCacheList(folder.fullName); - folder.fullName = data.Result.fullName; - setFolder(folder); - const parent = getFolderFromCacheList(folder.parentName); - sortFolders(parent ? parent.subFolders : FolderUserStore.folderList); - } - }) - .catch(error => { - FolderUserStore.folderListError( - getNotification(error.code, '', Notifications.CantRenameFolder) - + '.\n' + error.message); - }); - } - - folder.editing(false); - } - onShow() { FolderUserStore.folderListError(''); } 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 c598e694a..0432e202b 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 @@ -5,7 +5,7 @@ tooltipErrorTip: errorMsg"> + data-bind="textInput: nameForEdit, visible: editing, hasfocus: editing, onEnter: rename, onEsc: unedit">