diff --git a/.eslintignore b/.eslintignore index 686414f27ce..d667e8141e8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1158,6 +1158,7 @@ packages/lib/models/settings/settingValidations.js packages/lib/models/settings/types.js packages/lib/models/utils/areAllFoldersCollapsed.test.js packages/lib/models/utils/areAllFoldersCollapsed.js +packages/lib/models/utils/getCanBeCollapsedFolderIds.test.js packages/lib/models/utils/getCanBeCollapsedFolderIds.js packages/lib/models/utils/getCollator.js packages/lib/models/utils/getConflictFolderId.js diff --git a/.gitignore b/.gitignore index 84efad54ad2..016e662afaa 100644 --- a/.gitignore +++ b/.gitignore @@ -1132,6 +1132,7 @@ packages/lib/models/settings/settingValidations.js packages/lib/models/settings/types.js packages/lib/models/utils/areAllFoldersCollapsed.test.js packages/lib/models/utils/areAllFoldersCollapsed.js +packages/lib/models/utils/getCanBeCollapsedFolderIds.test.js packages/lib/models/utils/getCanBeCollapsedFolderIds.js packages/lib/models/utils/getCollator.js packages/lib/models/utils/getConflictFolderId.js diff --git a/packages/lib/models/utils/getCanBeCollapsedFolderIds.test.ts b/packages/lib/models/utils/getCanBeCollapsedFolderIds.test.ts new file mode 100644 index 00000000000..8b17110a484 --- /dev/null +++ b/packages/lib/models/utils/getCanBeCollapsedFolderIds.test.ts @@ -0,0 +1,28 @@ +import { setupDatabaseAndSynchronizer, switchClient } from '../../testing/test-utils'; +import Folder from '../Folder'; +import getCanBeCollapsedFolderIds from './getCanBeCollapsedFolderIds'; + +describe('getCanBeCollapsedFolderIds', () => { + + beforeEach(async () => { + await setupDatabaseAndSynchronizer(1); + await switchClient(1); + }); + + it('should tell if trash can be collapsed too', async () => { + const folder1 = await Folder.save({}); + await Folder.save({ parent_id: folder1.id }); + await Folder.save({ parent_id: folder1.id }); + + const folder2 = await Folder.save({ }); + const folder2a = await Folder.save({ parent_id: folder2.id }); + await Folder.save({ parent_id: folder2a.id }); + + expect(getCanBeCollapsedFolderIds(await Folder.all({ includeTrash: true }))).toHaveLength(3); + + await Folder.delete(folder1.id, { toTrash: true, deleteChildren: true }); + + expect(getCanBeCollapsedFolderIds(await Folder.all({ includeTrash: true }))).toHaveLength(4); + }); + +}); diff --git a/packages/lib/models/utils/getCanBeCollapsedFolderIds.ts b/packages/lib/models/utils/getCanBeCollapsedFolderIds.ts index cfa4ea9688a..d958e034305 100644 --- a/packages/lib/models/utils/getCanBeCollapsedFolderIds.ts +++ b/packages/lib/models/utils/getCanBeCollapsedFolderIds.ts @@ -1,4 +1,5 @@ import { FolderEntity } from '../../services/database/types'; +import { getTrashFolderId } from '../../services/trash'; import Folder, { FolderEntityWithChildren } from '../Folder'; export default (folders: FolderEntity[]) => { @@ -17,5 +18,25 @@ export default (folders: FolderEntity[]) => { processTree(tree); + // Logic to determine whether trash should be included in canBeCollapsedIds + // Loops over all folders recursively in case in the future a deleted folder remains child of a not deleted folder (and hence there is no deleted folder in 'tree'). + const isTrashCollapsable = (folders: FolderEntityWithChildren[]) => { + for (const folder of folders) { + if (folder.deleted_time) { + canBeCollapsedIds.push(getTrashFolderId()); + return; + } + + if (folder.children.length) { + isTrashCollapsable(folder.children); + } + } + }; + + // Future proofing: if TrashFolder is already in canBeCollapsedIds do not add it again. + if (!(getTrashFolderId() in canBeCollapsedIds)) { + isTrashCollapsable(tree); + } + return canBeCollapsedIds; };