diff --git a/src/components/filetree.html b/src/components/filetree.html
index a1c07bdd4..c5f3946c1 100644
--- a/src/components/filetree.html
+++ b/src/components/filetree.html
@@ -57,31 +57,6 @@
-
-
@@ -178,6 +228,8 @@
on-upload-folder="onUploadFolder(cwd)"
on-upload-file="onUploadFile(cwd)"
on-delete-entries="deleteEntries.show(cwd, entries)"
+ on-rename-entry="renameEntry.show(cwd, entry)"
+ on-extract-entry="extractEntry(cwd, entry)"
backend-type="backendType" backend-id="backendId" view="VIEW.LEFT"
ng-click="setActiveView(VIEW.LEFT)">
@@ -185,6 +237,8 @@
on-upload-folder="onUploadFolder(cwd)"
on-upload-file="onUploadFile(cwd)"
on-delete-entries="deleteEntries.show(cwd, entries)"
+ on-rename-entry="renameEntry.show(cwd, entry)"
+ on-extract-entry="extractEntry(cwd, entry)"
backend-type="backendType" backend-id="backendId" view="VIEW.RIGHT"
ng-click="setActiveView(VIEW.RIGHT)" ng-show="splitView">
diff --git a/src/js/filemanager.js b/src/js/filemanager.js
index 4474692ee..f3ecc481f 100644
--- a/src/js/filemanager.js
+++ b/src/js/filemanager.js
@@ -253,6 +253,81 @@ app.controller('FileManagerController', ['$scope', '$translate', '$timeout', 'Cl
}
};
+ // rename entry
+
+ $scope.renameEntry = {
+ busy: false,
+ error: null,
+ entry: null,
+ cwd: '',
+ newName: '',
+
+ show: function (cwd, entry) {
+ $scope.renameEntry.error = null;
+ $scope.renameEntry.cwd = cwd;
+ $scope.renameEntry.entry = entry;
+ $scope.renameEntry.newName = entry.fileName;
+ $scope.renameEntry.busy = false;
+
+ $('#renameEntryModal').modal('show');
+ },
+
+ submit: function () {
+ $scope.renameEntry.busy = true;
+
+ var oldFilePath = sanitize($scope.renameEntry.cwd + '/' + $scope.renameEntry.entry.fileName);
+ var newFilePath = sanitize(($scope.renameEntry.newName[0] === '/' ? '' : ($scope.renameEntry.cwd + '/')) + $scope.renameEntry.newName);
+
+ Client.filesRename($scope.backendId, $scope.backendType, oldFilePath, newFilePath, function (error) {
+ $scope.renameEntry.busy = false;
+ if (error) return Client.error(error);
+
+ $scope.refresh();
+
+ $('#renameEntryModal').modal('hide');
+ });
+ }
+ };
+
+
+ // extract archives
+
+ $scope.extractStatus = {
+ error: null,
+ busy: false,
+ fileName: ''
+ };
+
+ $scope.extractEntry = function (cwd, entry) {
+ var filePath = sanitize(cwd + '/' + entry.fileName);
+
+ if (entry.isDirectory) return;
+
+ // prevent it from getting closed
+ $('#extractModal').modal({
+ backdrop: 'static',
+ keyboard: false
+ });
+
+ $scope.extractStatus.fileName = entry.fileName;
+ $scope.extractStatus.error = null;
+ $scope.extractStatus.busy = true;
+
+ Client.filesExtract($scope.backendId, $scope.backendType, filePath, function (error) {
+ $scope.extractStatus.busy = false;
+
+ if (error) {
+ console.error(error);
+ $scope.extractStatus.error = $translate.instant('filemanager.extract.error', error.message);
+ return;
+ }
+
+ $('#extractModal').modal('hide');
+
+ $scope.refresh();
+ });
+ };
+
// split view handling
@@ -509,4 +584,20 @@ app.controller('FileManagerController', ['$scope', '$translate', '$timeout', 'Cl
}
});
+
+ // setup all the dialog focus handling
+ ['newFileModal', 'newDirectoryModal', 'renameEntryModal'].forEach(function (id) {
+ $('#' + id).on('shown.bs.modal', function () {
+ $(this).find('[autofocus]:first').focus();
+ });
+ });
+
+ // selects filename (without extension)
+ ['renameEntryModal'].forEach(function (id) {
+ $('#' + id).on('shown.bs.modal', function () {
+ var elem = $(this).find('[autofocus]:first');
+ var text = elem.val();
+ elem[0].setSelectionRange(0, text.indexOf('.'));
+ });
+ });
}]);