1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-08-10 22:11:50 +02:00

Desktop: Resolves #12039: "Collapse all" button in sidebar doesn't collapse trash folder (#12051)

This commit is contained in:
Bernd de Kruik
2025-04-29 14:53:25 +02:00
committed by GitHub
parent b93a125f95
commit e9fe944744
4 changed files with 51 additions and 0 deletions

View File

@@ -1161,6 +1161,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

1
.gitignore vendored
View File

@@ -1135,6 +1135,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

View File

@@ -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);
});
});

View File

@@ -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;
};