Allow multiple pasting of files and folders with non-clashing names.

pull/1222/head
ioedeveloper 4 years ago
parent 9db9476d85
commit 71d9d6e9b2
  1. 8
      apps/remix-ide/src/app/files/fileManager.js
  2. 14
      apps/remix-ide/src/lib/helper.js
  3. 4
      libs/remix-ui/file-explorer/src/lib/file-explorer.tsx

@ -222,9 +222,10 @@ class FileManager extends Plugin {
await this._handleExists(dest, `Cannot paste content into ${dest}. Path does not exist.`) await this._handleExists(dest, `Cannot paste content into ${dest}. Path does not exist.`)
await this._handleIsDir(dest, `Cannot paste content into ${dest}. Path is not directory.`) await this._handleIsDir(dest, `Cannot paste content into ${dest}. Path is not directory.`)
const content = await this.readFile(src) const content = await this.readFile(src)
const copiedFileName = customName ? '/' + customName : '/' + `Copy_${helper.extractNameFromKey(src)}` let copiedFilePath = dest + (customName ? '/' + customName : '/' + `Copy_${helper.extractNameFromKey(src)}`)
copiedFilePath = await helper.createNonClashingNameAsync(copiedFilePath, this)
await this.writeFile(dest + copiedFileName, content) await this.writeFile(copiedFilePath, content)
} catch (e) { } catch (e) {
throw new Error(e) throw new Error(e)
} }
@ -252,7 +253,8 @@ class FileManager extends Plugin {
async inDepthCopy (src, dest, count = 0) { async inDepthCopy (src, dest, count = 0) {
const content = await this.readdir(src) const content = await this.readdir(src)
const copiedFolderPath = count === 0 ? dest + '/' + `Copy_${helper.extractNameFromKey(src)}` : dest + '/' + helper.extractNameFromKey(src) let copiedFolderPath = count === 0 ? dest + '/' + `Copy_${helper.extractNameFromKey(src)}` : dest + '/' + helper.extractNameFromKey(src)
copiedFolderPath = await helper.createNonClashingDirNameAsync(copiedFolderPath, this)
await this.mkdir(copiedFolderPath) await this.mkdir(copiedFolderPath)

@ -71,6 +71,20 @@ module.exports = {
return name + counter + prefix + '.' + ext return name + counter + prefix + '.' + ext
}, },
async createNonClashingDirNameAsync (name, fileManager) {
if (!name) name = 'Undefined'
let counter = ''
let exist = true
do {
const isDuplicate = await fileManager.exists(name + counter)
if (isDuplicate) counter = (counter | 0) + 1
else exist = false
} while (exist)
return name + counter
},
checkSpecialChars (name) { checkSpecialChars (name) {
return name.match(/[:*?"<>\\'|]/) != null return name.match(/[:*?"<>\\'|]/) != null
}, },

@ -763,10 +763,6 @@ export const FileExplorer = (props: FileExplorerProps) => {
state.copyElement.map(({ key, type }) => { state.copyElement.map(({ key, type }) => {
type === 'file' ? copyFile(key, dest) : copyFolder(key, dest) type === 'file' ? copyFile(key, dest) : copyFolder(key, dest)
}) })
setState(prevState => {
return { ...prevState, copyElement: [] }
})
setCanPaste(false)
} }
const label = (file: File) => { const label = (file: File) => {

Loading…
Cancel
Save