diff --git a/services/web/frontend/js/features/file-tree/util/count-in-tree.js b/services/web/frontend/js/features/file-tree/util/count-in-tree.js index 90ddd2fb74..e9af4657af 100644 --- a/services/web/frontend/js/features/file-tree/util/count-in-tree.js +++ b/services/web/frontend/js/features/file-tree/util/count-in-tree.js @@ -3,10 +3,7 @@ export function countFiles(fileTreeData) { return 0 } - const files = filesInFolder(fileTreeData) - - // count all the non-deleted entities - const value = files.filter(item => !item.deleted).length + const value = _countElements(fileTreeData) const limit = window.ExposedSettings.maxEntitiesPerProject const status = fileCountStatus(value, limit, Math.ceil(limit / 20)) @@ -14,16 +11,6 @@ export function countFiles(fileTreeData) { return { value, status, limit } } -function filesInFolder({ docs, folders, fileRefs }) { - const files = [...docs, ...fileRefs] - - for (const folder of folders) { - files.push(...filesInFolder(folder)) - } - - return files -} - function fileCountStatus(value, limit, range) { if (value >= limit) { return 'error' @@ -35,3 +22,29 @@ function fileCountStatus(value, limit, range) { return 'success' } + +// Copied and adapted from ProjectEntityMongoUpdateHandler +function _countElements(rootFolder) { + function countFolder(folder) { + if (folder == null) { + return 0 + } + + let total = 0 + if (folder.folders) { + total += folder.folders.length + for (const subfolder of folder.folders) { + total += countFolder(subfolder) + } + } + if (folder.docs) { + total += folder.docs.length + } + if (folder.fileRefs) { + total += folder.fileRefs.length + } + return total + } + + return countFolder(rootFolder) +} diff --git a/services/web/test/frontend/features/file-tree/components/file-tree-create/file-tree-modal-create-file.test.js b/services/web/test/frontend/features/file-tree/components/file-tree-create/file-tree-modal-create-file.test.js index 32dfc8d782..76ee024c18 100644 --- a/services/web/test/frontend/features/file-tree/components/file-tree-create/file-tree-modal-create-file.test.js +++ b/services/web/test/frontend/features/file-tree/components/file-tree-create/file-tree-modal-create-file.test.js @@ -100,22 +100,20 @@ describe('', function () { { _id: 'root-folder-id', name: 'rootFolder', - docs: [{ _id: 'entity-1' }], + docs: [{ _id: 'doc-1' }], fileRefs: [], folders: [ { - docs: [{ _id: 'entity-1-2' }], + docs: [{ _id: 'doc-2' }], fileRefs: [], folders: [ { docs: [ - { _id: 'entity-3' }, - { _id: 'entity-4' }, - { _id: 'entity-5' }, - { _id: 'entity-6' }, - { _id: 'entity-7' }, - { _id: 'entity-8' }, - { _id: 'entity-9' }, + { _id: 'doc-3' }, + { _id: 'doc-4' }, + { _id: 'doc-5' }, + { _id: 'doc-6' }, + { _id: 'doc-7' }, ], fileRefs: [], folders: [], @@ -133,6 +131,33 @@ describe('', function () { screen.getByText(/This project is approaching the file limit \(\d+\/\d+\)/) }) + it('counts folders toward the limit', async function () { + const rootFolder = [ + { + _id: 'root-folder-id', + name: 'rootFolder', + docs: [{ _id: 'doc-1' }], + fileRefs: [], + folders: [ + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + { docs: [], fileRefs: [], folders: [] }, + ], + }, + ] + + renderWithContext(, { + contextProps: { rootFolder }, + }) + + screen.getByText(/This project is approaching the file limit \(\d+\/\d+\)/) + }) + it('creates a new file when the form is submitted', async function () { fetchMock.post('express:/project/:projectId/doc', () => 204)