diff --git a/src/components/filetree.html b/src/components/filetree.html index d17f074be..a9503fd4b 100644 --- a/src/components/filetree.html +++ b/src/components/filetree.html @@ -53,7 +53,7 @@ -
+
diff --git a/src/components/filetree.js b/src/components/filetree.js index cb2924b4d..98c6b1252 100644 --- a/src/components/filetree.js +++ b/src/components/filetree.js @@ -61,8 +61,9 @@ function FileTreeController($scope, $translate, $timeout, Client) { if (a.fileName.toLowerCase() < b.fileName.toLowerCase()) return -1; return 1; }).sort(function (a, b) { - if (a.isDirectory !== b.isDirectory) return 1; - return -1; + if ((a.isDirectory && b.isDirectory) || (!a.isDirectory && !b.isDirectory)) return 0; + if (a.isDirectory && !b.isDirectory) return -1; + return 1; }); } @@ -115,29 +116,13 @@ function FileTreeController($scope, $translate, $timeout, Client) { Client.filesGet($scope.backendId, $scope.backendType, parentPath, 'data', function (error, result) { if (error) return setTimeout(function () { openPath(path); }, 2000); // try again in some time - // amend icons - result.entries.forEach(function (e) { - e.icon = 'fa-file'; - - if (e.isDirectory) e.icon = 'fa-folder'; - if (e.isSymbolicLink) e.icon = 'fa-link'; - if (e.isFile) { - var mimeType = Mimer().get(e.fileName); - var mimeGroup = mimeType.split('/')[0]; - if (mimeGroup === 'text') e.icon = 'fa-file-alt'; - if (mimeGroup === 'image') e.icon = 'fa-file-image'; - if (mimeGroup === 'video') e.icon = 'fa-file-video'; - if (mimeGroup === 'audio') e.icon = 'fa-file-audio'; - if (mimeType === 'text/csv') e.icon = 'fa-file-csv'; - if (mimeType === 'application/pdf') e.icon = 'fa-file-pdf'; - } - }); - - $scope.entries = result.entries; - sort(); - // call itself now that we know $scope.cwd = parentPath; + + $scope.entries = result.entries; + amendIcons(); + sort(); + openPath(path); }); } @@ -155,8 +140,8 @@ function FileTreeController($scope, $translate, $timeout, Client) { } $scope.dragStart = function ($event, entry) { - $event.originalEvent.dataTransfer.setData('text/plain', entry.fileName); - $event.originalEvent.dataTransfer.setData('application/cloudron-filemanager', entry.fileName); + var filePath = sanitize($scope.cwd + '/' + entry.fileName); + $event.originalEvent.dataTransfer.setData('application/cloudron-filemanager', filePath); }; $scope.dragEnter = function ($event, entry) { @@ -192,21 +177,24 @@ function FileTreeController($scope, $translate, $timeout, Client) { if (!event.originalEvent.dataTransfer.items[0]) return; var targetFolder; - if (typeof entry === 'string') targetFolder = sanitize(entry); + if (entry === null) targetFolder = $scope.cwd + '/'; + else if (typeof entry === 'string') targetFolder = sanitize(entry); else targetFolder = sanitize($scope.cwd + '/' + (entry && entry.isDirectory ? entry.fileName : '')); var dataTransfer = event.originalEvent.dataTransfer; + var dragContent = dataTransfer.getData('application/cloudron-filemanager'); // check if we have internal drag'n'drop - if (dataTransfer.getData('application/cloudron-filemanager')) { - if ($scope.selected.length === 0) return; - + if (dragContent) { var moved = 0; + // FIXME only one currently supported + var arr = [ dragContent ]; + // move files - async.eachLimit($scope.selected, 5, function (entry, callback) { - var oldFilePath = sanitize($scope.cwd + '/' + entry.fileName); - var newFilePath = sanitize(targetFolder + '/' + entry.fileName); + async.eachLimit(arr, 5, function (oldFilePath, callback) { + var fileName = oldFilePath.split('/').slice(-1); + var newFilePath = sanitize(targetFolder + '/' + fileName); // if we drop the item on itself if (oldFilePath === targetFolder) return callback(); @@ -221,8 +209,6 @@ function FileTreeController($scope, $translate, $timeout, Client) { }, function (error) { if (error) return Client.error(error); - $scope.selected = []; - // only refresh if anything has changed if (moved) $scope.refresh(); }); @@ -234,23 +220,19 @@ function FileTreeController($scope, $translate, $timeout, Client) { var folderItem; try { folderItem = dataTransfer.items[0].webkitGetAsEntry(); - if (folderItem.isFile) return uploadFiles(event.originalEvent.dataTransfer.files, targetFolder, false); + if (folderItem.isFile) return $scope.$parent.uploadFiles(event.originalEvent.dataTransfer.files, targetFolder, false); } catch (e) { - return uploadFiles(event.originalEvent.dataTransfer.files, targetFolder, false); + return $scope.$parent.uploadFiles(event.originalEvent.dataTransfer.files, targetFolder, false); } // if we got here we have a folder drop and a modern browser // now traverse the folder tree and create a file list - $scope.uploadStatus.busy = true; - $scope.uploadStatus.count = 0; - var fileList = []; function traverseFileTree(item, path, callback) { if (item.isFile) { // Get file item.file(function (file) { fileList.push(file); - ++$scope.uploadStatus.count; callback(); }); } else if (item.isDirectory) { @@ -265,12 +247,9 @@ function FileTreeController($scope, $translate, $timeout, Client) { } traverseFileTree(folderItem, '', function (error) { - $scope.uploadStatus.busy = false; - $scope.uploadStatus.count = 0; - if (error) return console.error(error); - uploadFiles(fileList, targetFolder, false); + $scope.$parent.uploadFiles(fileList, targetFolder, false); }); }; @@ -278,6 +257,30 @@ function FileTreeController($scope, $translate, $timeout, Client) { $scope.$parent.refresh(); }; + function amendIcons() { + $scope.entries.forEach(function (e) { + e.icon = 'fa-file'; + e.previewUrl = null; + + if (e.isDirectory) e.icon = 'fa-folder'; + if (e.isSymbolicLink) e.icon = 'fa-link'; + if (e.isFile) { + var mimeType = Mimer().get(e.fileName); + var mimeGroup = mimeType.split('/')[0]; + if (mimeGroup === 'text') e.icon = 'fa-file-alt'; + // if (mimeGroup === 'image') e.icon = 'fa-file-image'; + if (mimeGroup === 'image') { + e.icon = 'fa-file-image'; + e.previewUrl = Client.filesGetLink($scope.backendId, $scope.backendType, sanitize($scope.cwd + '/' + e.fileName)); + } + if (mimeGroup === 'video') e.icon = 'fa-file-video'; + if (mimeGroup === 'audio') e.icon = 'fa-file-audio'; + if (mimeType === 'text/csv') e.icon = 'fa-file-csv'; + if (mimeType === 'application/pdf') e.icon = 'fa-file-pdf'; + } + }); + } + // called from the parent $scope.onRefresh = function () { $scope.selected = []; @@ -285,30 +288,8 @@ function FileTreeController($scope, $translate, $timeout, Client) { Client.filesGet($scope.backendId, $scope.backendType, $scope.cwd, 'data', function (error, result) { if (error) return Client.error(error); - // amend icons - result.entries.forEach(function (e) { - e.icon = 'fa-file'; - e.previewUrl = null; - - if (e.isDirectory) e.icon = 'fa-folder'; - if (e.isSymbolicLink) e.icon = 'fa-link'; - if (e.isFile) { - var mimeType = Mimer().get(e.fileName); - var mimeGroup = mimeType.split('/')[0]; - if (mimeGroup === 'text') e.icon = 'fa-file-alt'; - // if (mimeGroup === 'image') e.icon = 'fa-file-image'; - if (mimeGroup === 'image') { - e.icon = 'fa-file-image'; - e.previewUrl = Client.filesGetLink($scope.backendId, $scope.backendType, sanitize($scope.cwd + '/' + e.fileName)); - } - if (mimeGroup === 'video') e.icon = 'fa-file-video'; - if (mimeGroup === 'audio') e.icon = 'fa-file-audio'; - if (mimeType === 'text/csv') e.icon = 'fa-file-csv'; - if (mimeType === 'application/pdf') e.icon = 'fa-file-pdf'; - } - }); - $scope.entries = result.entries; + amendIcons(); sort(); $scope.busy = false; diff --git a/src/js/filemanager.js b/src/js/filemanager.js index 3282c143b..cc809445d 100644 --- a/src/js/filemanager.js +++ b/src/js/filemanager.js @@ -130,7 +130,7 @@ app.controller('FileManagerController', ['$scope', '$translate', '$timeout', 'Cl targetFolder: '' }; - function uploadFiles(files, targetFolder, overwrite) { + $scope.uploadFiles = function(files, targetFolder, overwrite) { if (!files || !files.length) return; targetFolder = targetFolder || $scope.cwd; @@ -199,10 +199,10 @@ app.controller('FileManagerController', ['$scope', '$translate', '$timeout', 'Cl $scope.refresh(); }); - } + }; $scope.retryUpload = function (overwrite) { - uploadFiles($scope.uploadStatus.files, $scope.uploadStatus.targetFolder, !!overwrite); + $scope.uploadFiles($scope.uploadStatus.files, $scope.uploadStatus.targetFolder, !!overwrite); }; @@ -210,7 +210,7 @@ app.controller('FileManagerController', ['$scope', '$translate', '$timeout', 'Cl $scope.uploadCwd = ''; $('#uploadFileInput').on('change', function (e ) { - uploadFiles(e.target.files || [], $scope.uploadCwd, false); + $scope.uploadFiles(e.target.files || [], $scope.uploadCwd, false); }); $scope.onUploadFile = function (cwd) { $scope.uploadCwd = cwd; @@ -218,7 +218,7 @@ app.controller('FileManagerController', ['$scope', '$translate', '$timeout', 'Cl }; $('#uploadFolderInput').on('change', function (e ) { - uploadFiles(e.target.files || [], $scope.uploadCwd, false); + $scope.uploadFiles(e.target.files || [], $scope.uploadCwd, false); }); $scope.onUploadFolder = function (cwd) { $scope.uploadCwd = cwd;