diff --git a/src/octoprint/filemanager/storage.py b/src/octoprint/filemanager/storage.py index 47ba0941..ab34a374 100644 --- a/src/octoprint/filemanager/storage.py +++ b/src/octoprint/filemanager/storage.py @@ -479,7 +479,7 @@ class LocalFileStorage(StorageInterface): import shutil shutil.rmtree(folder_path) - def _copyMove1(self, source, destination): + def _copyMove(self, source, destination): sourcepath, sourcename = self.sanitize(source) destinationpath, destinationname = self.sanitize(destination) @@ -503,8 +503,8 @@ class LocalFileStorage(StorageInterface): ) return sourceObj, destinationObj - def _copyMove2(self, source, destination): - sourceObj, destinationObj = self._copyMove1(source, destination) + def _copyMoveWithMetadata(self, source, destination): + sourceObj, destinationObj = self._copyMove(source, destination) if not os.path.isfile(sourceObj["fullpath"]): raise RuntimeError("%s in %s is not a file" % (sourceObj["name"], sourceObj["path"])) @@ -522,7 +522,7 @@ class LocalFileStorage(StorageInterface): return sourceObj, destinationObj def copy_folder(self, source, destination): - sourceObj, destinationObj = self._copyMove1(source, destination) + sourceObj, destinationObj = self._copyMove(source, destination) if not os.path.isdir(sourceObj["fullpath"]): raise RuntimeError("%s in %s is not a folder" % (sourceObj["name"], sourceObj["path"])) @@ -533,7 +533,7 @@ class LocalFileStorage(StorageInterface): raise RuntimeError("Could not copy %s in %s to %s in %s" % (sourceObj["name"], sourceObj["path"], destinationObj["name"], destinationObj["path"]), e) def move_folder(self, source, destination): - sourceObj, destinationObj = self._copyMove1(source, destination) + sourceObj, destinationObj = self._copyMove(source, destination) if not os.path.isdir(sourceObj["fullpath"]): raise RuntimeError("%s in %s is not a folder" % (sourceObj["name"], sourceObj["path"])) @@ -619,7 +619,7 @@ class LocalFileStorage(StorageInterface): self._save_metadata(path, metadata) def copy_file(self, source, destination): - sourceObj, destinationObj = self._copyMove2(source, destination) + sourceObj, destinationObj = self._copyMoveWithMetadata(source, destination) try: shutil.copy2(sourceObj["fullpath"], destinationObj["fullpath"]) @@ -632,7 +632,7 @@ class LocalFileStorage(StorageInterface): self._save_metadata(destinationObj["path"], destinationObj["metadata"]) def move_file(self, source, destination, allow_overwrite=False): - sourceObj, destinationObj = self._copyMove2(source, destination) + sourceObj, destinationObj = self._copyMoveWithMetadata(source, destination) try: shutil.move(sourceObj["fullpath"], destinationObj["fullpath"]) diff --git a/src/octoprint/static/js/app/main.js b/src/octoprint/static/js/app/main.js index 90d32ead..88f9ac18 100644 --- a/src/octoprint/static/js/app/main.js +++ b/src/octoprint/static/js/app/main.js @@ -271,10 +271,12 @@ $(function() { }, update: function(element, valueAccessor, allBindings, viewModel, bindingContext) { setTimeout(function() { - if (element.nodeName == "#comment") + if (element.nodeName == "#comment") { + // foreach is bound to a virtual element $(element.parentElement).slimScroll({scrollBy: 0}); - else + } else { $(element).slimScroll({scrollBy: 0}); + } }, 10); return ko.bindingHandlers.foreach.update(element, valueAccessor(), allBindings, viewModel, bindingContext); } diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js index d94f13d5..f13a13ed 100644 --- a/src/octoprint/static/js/app/viewmodels/files.js +++ b/src/octoprint/static/js/app/viewmodels/files.js @@ -118,6 +118,22 @@ $(function() { return _.filter(self.listHelper.paginatedItems(), filter); }); + self.filesAndFolders = ko.dependentObservable(function() { + var style = self.listStyle(); + if (style == "folders_files" || style == "files_folders") { + var files = self.filesOnlyList(); + var folders = self.foldersOnlyList(); + + if (style == "folders_files") { + return folders.concat(files); + } else { + return files.concat(folders); + } + } else { + return self.listHelper.paginatedItems(); + } + }); + self.isLoadActionPossible = ko.computed(function() { return self.loginState.isUser() && !self.isPrinting() && !self.isPaused() && !self.isLoading(); }); @@ -214,6 +230,12 @@ $(function() { self.listHelper.updateItems(data.children); }; + self.navigateUp = function() { + var path = self.currentPath().split("/"); + path.pop(); + self.changeFolderByPath(path.join("/")); + }; + self.changeFolderByPath = function(path) { var element = OctoPrint.files.elementByPath(path, { children: self.allItems() }); if (element) { diff --git a/src/octoprint/templates/sidebar/files.jinja2 b/src/octoprint/templates/sidebar/files.jinja2 index 180cea90..31be4107 100644 --- a/src/octoprint/templates/sidebar/files.jinja2 +++ b/src/octoprint/templates/sidebar/files.jinja2 @@ -2,32 +2,10 @@