diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a7ee0544a..cc6d6b4eb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,10 +11,10 @@ "@fontsource/noto-sans": "^5.0.5", "anser": "^2.1.1", "combokeys": "^3.0.1", - "filesize": "^10.0.7", + "filesize": "^10.0.8", "marked": "^5.1.2", "moment": "^2.29.4", - "pankow": "^0.5.1", + "pankow": "^0.5.2", "primeicons": "^6.0.1", "primevue": "^3.31.0", "superagent": "^8.0.9", @@ -727,9 +727,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/filesize": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.7.tgz", - "integrity": "sha512-iMRG7Qo9nayLoU3PNCiLizYtsy4W1ClrapeCwEgtiQelOAOuRJiw4QaLI+sSr8xr901dgHv+EYP2bCusGZgoiA==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.8.tgz", + "integrity": "sha512-/ylBrxZ1GAjgh2CEemKKLwTtmXfWqTtN1jRl6iqLwnMEucUX5cmaCCUPGstQOHVCcK9uYL6o1cPNakLQU2sasQ==", "engines": { "node": ">= 10.4.0" } @@ -946,11 +946,11 @@ } }, "node_modules/pankow": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-0.5.1.tgz", - "integrity": "sha512-Ijn1m5k7qM7vWLzeYxBtdBn+4ADy26fCFMGQw+2pq2AIHETW22NF5o2kSYESViKVH/ovmR086gjBOjluKKz/wg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-0.5.2.tgz", + "integrity": "sha512-4oBYtPXSHJ2gjgdfzNC8JIH0FeUoJQPgjHtt6rMc3C9syQr1jeVDvmumDz4ZGfmsFWiR/2QZUuWJqneG0RHM7A==", "dependencies": { - "filesize": "^10.0.7", + "filesize": "^10.0.8", "monaco-editor": "^0.40.0", "primevue": "^3.31.0", "superagent": "^8.0.9" diff --git a/frontend/package.json b/frontend/package.json index 573686c41..1e1f3559a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,10 +12,10 @@ "@fontsource/noto-sans": "^5.0.5", "anser": "^2.1.1", "combokeys": "^3.0.1", - "filesize": "^10.0.7", + "filesize": "^10.0.8", "marked": "^5.1.2", "moment": "^2.29.4", - "pankow": "^0.5.1", + "pankow": "^0.5.2", "primeicons": "^6.0.1", "primevue": "^3.31.0", "superagent": "^8.0.9", diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index ca3e77af3..92b8e6dab 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -291,38 +291,53 @@ export default { await this.loadCwd(); setTimeout(() => { this.busyRefresh = false; }, 500); }, - async onDrop(targetFolder, dataTransfer) { + // either dataTransfer (external drop) or files (internal drag) + async onDrop(targetFolder, dataTransfer, files) { const fullTargetFolder = sanitize(this.cwd + '/' + targetFolder); - // figure if a folder was dropped on a modern browser, in this case the first would have to be a directory - let folderItem; - try { - folderItem = dataTransfer.items[0].webkitGetAsEntry(); - if (folderItem.isFile) return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); - } catch (e) { - return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); - } - - // if we got here we have a folder drop and a modern browser - // now traverse the folder tree and create a file list - var that = this; - function traverseFileTree(item, path) { - if (item.isFile) { - item.file(function (file) { - that.$refs.fileUploader.addFiles([file], sanitize(`${that.cwd}/${targetFolder}`), false); - }); - } else if (item.isDirectory) { - // Get folder contents - var dirReader = item.createReader(); - dirReader.readEntries(function (entries) { - for (let i in entries) { - traverseFileTree(entries[i], item.name); - } - }); + if (dataTransfer) { + // figure if a folder was dropped on a modern browser, in this case the first would have to be a directory + let folderItem; + try { + folderItem = dataTransfer.items[0].webkitGetAsEntry(); + if (folderItem.isFile) return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); + } catch (e) { + return this.$refs.fileUploader.addFiles(dataTransfer.files, fullTargetFolder, false); } - } - traverseFileTree(folderItem, ''); + // if we got here we have a folder drop and a modern browser + // now traverse the folder tree and create a file list + var that = this; + function traverseFileTree(item, path) { + if (item.isFile) { + item.file(function (file) { + that.$refs.fileUploader.addFiles([file], sanitize(`${that.cwd}/${targetFolder}`), false); + }); + } else if (item.isDirectory) { + // Get folder contents + var dirReader = item.createReader(); + dirReader.readEntries(function (entries) { + for (let i in entries) { + traverseFileTree(entries[i], item.name); + } + }); + } + } + + traverseFileTree(folderItem, ''); + } else { + if (!files.length) return; + + window.addEventListener('beforeunload', beforeUnloadListener, { capture: true }); + this.pasteInProgress = true; + + // check ctrl for cut/copy + await this.directoryModel.paste(fullTargetFolder, 'cut', files); + await this.loadCwd(); + + window.removeEventListener('beforeunload', beforeUnloadListener, { capture: true }); + this.pasteInProgress = false; + } }, onItemActivated(item) { if (!item) return;