Merge pull request #8258 from overleaf/jk-clean-up-too-many-files-errors

[web] Count folders toward entity limit on frontend

GitOrigin-RevId: ef07a61639f0dc516c83e4ed0f2fdc35e8b6d3fa
This commit is contained in:
June Kelly 2022-06-08 09:28:46 +01:00 committed by Copybot
parent 716f186fed
commit c07aa9638b
2 changed files with 61 additions and 23 deletions

View file

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

View file

@ -100,22 +100,20 @@ describe('<FileTreeModalCreateFile/>', 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('<FileTreeModalCreateFile/>', 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(<OpenWithMode mode="doc" />, {
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)