Skip to content

Commit

Permalink
Leverage new file transaction API for mass actions
Browse files Browse the repository at this point in the history
  • Loading branch information
retrixe committed Dec 15, 2024
1 parent c419fb3 commit 48845cb
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 4 deletions.
34 changes: 32 additions & 2 deletions imports/dashboard/files/fileManager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,38 @@ const FileManager = (props: {
setFetching(false)
}
}
const handleFilesDelete = (): void => {
const handleFilesDelete = async (): Promise<void> => {
setMassActionMenuOpen(null)
setOverlay(`Deleting ${filesSelected.length} files.`)
try {
const operations = filesSelected.map(file => ({ operation: 'rm', path: path + file }))
const res = await ky.patch(`server/${server}/files?path=..`, { json: { operations } })
if (res.ok) {
setMessage('Deleted all files successfully!')
setOverlay('')
fetchFiles()
return
} else if (res.status !== 404) {
const errors = await res.json<{ errors?: Array<{ index: number, message: string }> }>()
if (errors.errors?.length === 1) {
setMessage(`Error deleting files: ${errors.errors[0].message}`)
setOverlay('')
} else {
setMessage('Critical error deleting files: Check browser console for info!')
setOverlay('')
fetchFiles()
console.error(errors.errors)
}
return
}
} catch (e) {
setMessage(`Error deleting files: ${e}`)
setOverlay('')
fetchFiles()
return
}

// Fallback to non-transactional API
let total = filesSelected.length
setOverlay({ text: `Deleting ${total} out of ${filesSelected.length} files.`, progress: 0 })
const ops = []
Expand Down Expand Up @@ -532,7 +562,7 @@ const FileManager = (props: {
<Menu open keepMounted anchorEl={massActionMenuOpen} onClose={() => setMassActionMenuOpen(null)}>
<MenuItem onClick={() => setMassActionDialogOpen('move')} disabled={!!overlay}>Move</MenuItem>
<MenuItem onClick={() => setMassActionDialogOpen('copy')} disabled={!!overlay}>Copy</MenuItem>
<MenuItem onClick={() => handleFilesDelete()} disabled={!!overlay}>Delete</MenuItem>
<MenuItem onClick={() => { handleFilesDelete().catch(() => {}) }} disabled={!!overlay}>Delete</MenuItem>
<MenuItem onClick={() => setMassActionDialogOpen('compress')} disabled={!!overlay}>Compress</MenuItem>
</Menu>
)}
Expand Down
38 changes: 36 additions & 2 deletions imports/dashboard/files/massActionDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,41 @@ const MassActionDialog = ({
}).catch(() => { setOverlay(''); setMessage('Failed to compress the files!') })
}

const handleMoveCopyOperation = (): void => {
const handleMoveCopyOperation = async (): Promise<void> => {
setOverlay(`${moving} ${files.length} files.`)
const operations = files.map(file => ({
operation: operation === 'move' ? 'mv' : 'cp',
src: path + file,
dest: newPath.endsWith('/') ? newPath + file : newPath + '/' + file
}))
try {
const res = await ky.patch(`server/${server}/files?path=..`, { json: { operations } })
if (res.ok) {
reload()
setMessage(moved + ' all files successfully!')
setOverlay('')
return
} else if (res.status !== 404) {
const errors = await res.json<{ errors?: Array<{ index: number, message: string }> }>()
if (errors.errors?.length === 1) {
setMessage(`Error ${movingl} files: ${errors.errors[0].message}`)
setOverlay('')
} else {
reload()
setMessage(`Critical error ${movingl} files: Check browser console for info!`)
setOverlay('')
console.error(errors.errors)
}
return
}
} catch (e) {
reload()
setMessage(`Error ${movingl} files: ${e}`)
setOverlay('')
return
}

// Fallback to non-transactional API
let left = files.length
setOverlay({ text: `${moving} ${left} out of ${files.length} files.`, progress: 0 })
const requests = []
Expand Down Expand Up @@ -111,7 +145,7 @@ const MassActionDialog = ({
if (operation === 'compress') {
handleCompressOperation()
} else {
handleMoveCopyOperation()
handleMoveCopyOperation().catch(console.error) // Should not be called, ideally.
}
}
const prompt = operation === 'compress'
Expand Down

0 comments on commit 48845cb

Please sign in to comment.