Skip to content

Desktop: Resolves issue #12039: Checks whether there exists a deleted folder in order to determine if Trash is collapsible #12051

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Apr 29, 2025
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions packages/lib/models/utils/getCanBeCollapsedFolderIds.test.ts
Original file line number Diff line number Diff line change
@@ -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);
});

});
21 changes: 21 additions & 0 deletions packages/lib/models/utils/getCanBeCollapsedFolderIds.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { FolderEntity } from '../../services/database/types';
import { getTrashFolderId } from '../../services/trash';
import Folder, { FolderEntityWithChildren } from '../Folder';

export default (folders: FolderEntity[]) => {
Expand All @@ -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;
};