From 2cdc8d0055e29dd92023c938b49ea5a50d43c108 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Sun, 17 Mar 2024 19:42:20 +0100 Subject: [PATCH] On folder/mailbox rename, also rename all children instead of reloading all --- dev/Model/FolderCollection.js | 42 ++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index 8ab218c4f..3548aa085 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -488,9 +488,13 @@ export class FolderModel extends AbstractModel { rename(nameToEdit, parentName) { nameToEdit = nameToEdit.trim(); const folder = this, - parentFolder = getFolderFromCacheList(parentName), + oldParent = getFolderFromCacheList(folder.parentName), + newParent = getFolderFromCacheList(parentName), + folderList = FolderUserStore.folderList, + newFolderList = newParent ? newParent.subFolders : folderList, + delimiter = (newParent || folder).delimiter, oldFullname = folder.fullName, - newFullname = (parentFolder ? (parentName + parentFolder.delimiter) : '') + nameToEdit; + newFullname = (newParent ? parentName + delimiter : '') + nameToEdit; if (nameToEdit && newFullname != oldFullname) { Remote.abort('Folders').post('FolderRename', FolderUserStore.foldersRenaming, { oldName: oldFullname, @@ -498,21 +502,33 @@ export class FolderModel extends AbstractModel { subscribe: folder.isSubscribed() ? 1 : 0 }) .then(() => { - folder.fullName = newFullname; + const + renameFolder = (folder, parent) => { + removeFolderFromCacheList(folder.fullName); + folder.parentName = (parent ? parent.fullName : ''); + folder.fullName = (parent ? parent.fullName + delimiter : '') + folder.name(); + folder.delimiter = delimiter; + folder.deep = (parent ? parent.deep : -1) + 1; + setFolder(folder); + }, + renameChildren = folder => { + folder.subFolders.forEach(child => { + renameFolder(child, folder); + renameChildren(child); + }) + }; folder.name(nameToEdit); - if (folder.subFolders.length || folder.parentName != parentName) { - 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(oldFullname); - setFolder(folder); - sortFolders(parentFolder ? parentFolder.subFolders : FolderUserStore.folderList); + renameFolder(folder, newParent); + if (folder.subFolders.length || newParent != oldParent) { + // Rename all subfolders to prevent reload + renameChildren(folder); } + (oldParent ? oldParent.subFolders : folderList).remove(folder); + newFolderList.push(folder); + sortFolders(newFolderList); }) .catch(error => { + console.error(error); FolderUserStore.error( getNotification(error.code, '', Notifications.CantRenameFolder) + '.\n' + error.message);