filemanager: bring some drag'n'drop functionality via pankow

This commit is contained in:
Johannes Zellner
2023-07-28 19:31:53 +02:00
parent 56e1f53890
commit b3916622e8
3 changed files with 54 additions and 39 deletions
+43 -28
View File
@@ -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;