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)