You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-11-23 22:36:32 +02:00
Desktop: Add a button to collapse or expand all folders (#11905)
This commit is contained in:
35
packages/lib/models/utils/areAllFoldersCollapsed.test.ts
Normal file
35
packages/lib/models/utils/areAllFoldersCollapsed.test.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { setupDatabaseAndSynchronizer, switchClient } from '../../testing/test-utils';
|
||||
import Folder from '../Folder';
|
||||
import areAllFoldersCollapsed from './areAllFoldersCollapsed';
|
||||
|
||||
describe('areAllFoldersCollapsed', () => {
|
||||
|
||||
beforeEach(async () => {
|
||||
await setupDatabaseAndSynchronizer(1);
|
||||
await switchClient(1);
|
||||
});
|
||||
|
||||
it('should tell if all folders are collapsed', 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(areAllFoldersCollapsed(await Folder.all(), [])).toBe(false);
|
||||
|
||||
expect(areAllFoldersCollapsed(await Folder.all(), [
|
||||
folder1.id,
|
||||
folder2.id,
|
||||
])).toBe(false);
|
||||
|
||||
expect(areAllFoldersCollapsed(await Folder.all(), [
|
||||
folder1.id,
|
||||
folder2.id,
|
||||
folder2a.id,
|
||||
])).toBe(true);
|
||||
});
|
||||
|
||||
});
|
||||
10
packages/lib/models/utils/areAllFoldersCollapsed.ts
Normal file
10
packages/lib/models/utils/areAllFoldersCollapsed.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { FolderEntity } from '../../services/database/types';
|
||||
import getCanBeCollapsedFolderIds from './getCanBeCollapsedFolderIds';
|
||||
|
||||
export default (folders: FolderEntity[], collapsedFolderIds: string[]) => {
|
||||
const canBeCollapsedIds = getCanBeCollapsedFolderIds(folders);
|
||||
if (collapsedFolderIds.length !== canBeCollapsedIds.length) return false;
|
||||
collapsedFolderIds = collapsedFolderIds.slice().sort();
|
||||
canBeCollapsedIds.sort();
|
||||
return JSON.stringify(collapsedFolderIds) === JSON.stringify(canBeCollapsedIds);
|
||||
};
|
||||
21
packages/lib/models/utils/getCanBeCollapsedFolderIds.ts
Normal file
21
packages/lib/models/utils/getCanBeCollapsedFolderIds.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import { FolderEntity } from '../../services/database/types';
|
||||
import Folder, { FolderEntityWithChildren } from '../Folder';
|
||||
|
||||
export default (folders: FolderEntity[]) => {
|
||||
const tree = Folder.buildTree(folders);
|
||||
|
||||
const canBeCollapsedIds: string[] = [];
|
||||
|
||||
const processTree = (folders: FolderEntityWithChildren[]) => {
|
||||
for (const folder of folders) {
|
||||
if (folder.children.length) {
|
||||
canBeCollapsedIds.push(folder.id);
|
||||
processTree(folder.children);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
processTree(tree);
|
||||
|
||||
return canBeCollapsedIds;
|
||||
};
|
||||
Reference in New Issue
Block a user