From 84ac77795f9e03abbc5fa6ca59cbb21a2d428eb6 Mon Sep 17 00:00:00 2001 From: James Allen Date: Sun, 22 Jun 2014 20:49:58 +0100 Subject: [PATCH] Delete files --- services/web/app/coffee/router.coffee | 2 +- .../app/views/project/editor/file-tree.jade | 25 +++++++++++++- .../app/ide/file-tree/FileTreeManager.coffee | 34 +++++++++++++++++-- .../controllers/FileTreeController.coffee | 3 ++ .../FileTreeEntityController.coffee | 31 +++++++++++++++-- 5 files changed, 89 insertions(+), 6 deletions(-) diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 47c07ad7fe..0a0b931227 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -92,7 +92,7 @@ module.exports = class Router app.post '/project/:Project_id/:entity_type/:entity_id/rename', SecurityManager.requestCanModifyProject, EditorHttpController.renameEntity app.post '/project/:Project_id/:entity_type/:entity_id/move', SecurityManager.requestCanModifyProject, EditorHttpController.moveEntity - app.post '/project/:Project_id/:entity_type/:entity_id/delete', SecurityManager.requestCanModifyProject, EditorHttpController.deleteEntity + app.delete '/project/:Project_id/:entity_type/:entity_id', SecurityManager.requestCanModifyProject, EditorHttpController.deleteEntity app.post '/project/:Project_id/compile', SecurityManager.requestCanAccessProject, CompileController.compile app.get '/Project/:Project_id/output/output.pdf', SecurityManager.requestCanAccessProject, CompileController.downloadPdf diff --git a/services/web/app/views/project/editor/file-tree.jade b/services/web/app/views/project/editor/file-tree.jade index cee28837b0..220096f077 100644 --- a/services/web/app/views/project/editor/file-tree.jade +++ b/services/web/app/views/project/editor/file-tree.jade @@ -30,7 +30,13 @@ aside#file-tree.ui-layout-west(ng-controller="FileTreeController") tooltip-placement="bottom" ) i.fa.fa-pencil - a(href, tooltip="Delete", tooltip-placement="bottom", tooltip-append-to-body="true") + a( + href, + ng-click="openDeleteModalForSelected()", + tooltip="Delete", + tooltip-placement="bottom", + tooltip-append-to-body="true" + ) i.fa.fa-trash-o ul.list-unstyled.file-tree-list @@ -155,3 +161,20 @@ script(type="text/ng-template", id="uploadFileModalTemplate") span Upload file(s) .modal-footer button.btn.btn-default(ng-click="cancel()") Cancel + +script(type='text/ng-template', id='deleteEntityModalTemplate') + .modal-header + h3 Delete {{ entity.name }} + .modal-body + p Are you sure you want to permanently delete {{ entity.name }}? + .modal-footer + button.btn.btn-default( + ng-disabled="state.inflight" + ng-click="cancel()" + ) Cancel + button.btn.btn-danger( + ng-disabled="state.inflight" + ng-click="delete()" + ) + span(ng-hide="state.inflight") Delete + span(ng-show="state.inflight") Deleting... diff --git a/services/web/public/coffee/app/ide/file-tree/FileTreeManager.coffee b/services/web/public/coffee/app/ide/file-tree/FileTreeManager.coffee index fb1aa0d155..ea7a29ba39 100644 --- a/services/web/public/coffee/app/ide/file-tree/FileTreeManager.coffee +++ b/services/web/public/coffee/app/ide/file-tree/FileTreeManager.coffee @@ -45,6 +45,12 @@ define [ @$scope.$apply () -> entity.name = name + @ide.socket.on "removeEntity", (entity_id) => + entity = @findEntityById(entity_id) + return if !entity? + @$scope.$apply () => + @_deleteEntityFromScope entity + findEntityById: (id) -> @_findEntityByIdInFolder @$scope.rootFolder, id @@ -58,12 +64,12 @@ define [ return null - forEachEntity: (callback) -> + forEachEntity: (callback = (entity, parent_folder) ->) -> @_forEachEntityInFolder(@$scope.rootFolder, callback) _forEachEntityInFolder: (folder, callback) -> for entity in folder.children or [] - callback(entity) + callback(entity, folder) if entity.children? @_forEachEntityInFolder(entity, callback) @@ -176,3 +182,27 @@ define [ failure: (error) -> callback(error) } + deleteEntity: (entity, callback = (error) ->) -> + # We'll wait for the socket.io notification to + # delete from scope. + $.ajax { + url: "/project/#{@ide.project_id}/#{entity.type}/#{entity.id}" + type: "DELETE" + contentType: "application/json; charset=utf-8" + headers: + "X-Csrf-Token": window.csrfToken + dataType: "json" + success: () -> callback() + failure: (error) -> callback(error) + } + + _deleteEntityFromScope: (entity) -> + parent_folder = null + @forEachEntity (possible_entity, folder) -> + if possible_entity == entity + parent_folder = folder + + if parent_folder? + index = parent_folder.children.indexOf(entity) + if index > -1 + parent_folder.children.splice(index, 1) diff --git a/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeController.coffee b/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeController.coffee index 0ae8be1bd6..515c686b6d 100644 --- a/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeController.coffee +++ b/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeController.coffee @@ -27,6 +27,9 @@ define [ $scope.startRenamingSelected = () -> $scope.$broadcast "rename:selected" + + $scope.openDeleteModalForSelected = () -> + $scope.$broadcast "delete:selected" ] App.controller "NewDocModalController", [ diff --git a/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeEntityController.coffee b/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeEntityController.coffee index e96721b212..f70da259b0 100644 --- a/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeEntityController.coffee +++ b/services/web/public/coffee/app/ide/file-tree/controllers/FileTreeEntityController.coffee @@ -1,7 +1,7 @@ define [ "base" ], (App) -> - App.controller "FileTreeEntityController", ["$scope", "ide", ($scope, ide) -> + App.controller "FileTreeEntityController", ["$scope", "ide", "$modal", ($scope, ide, $modal) -> $scope.select = () -> ide.fileTreeManager.forEachEntity (entity) -> entity.selected = false @@ -20,9 +20,36 @@ define [ $scope.$on "rename:selected", () -> $scope.startRenaming() if $scope.entity.selected + $scope.openDeleteModal = () -> + $modal.open( + templateUrl: "deleteEntityModalTemplate" + controller: "DeleteEntityModalController" + scope: $scope + ) + + $scope.$on "delete:selected", () -> + $scope.openDeleteModal() if $scope.entity.selected + if $scope.entity.type == "folder" $scope.expanded = false $scope.toggleExpanded = () -> $scope.expanded = !$scope.expanded - ] \ No newline at end of file + ] + + App.controller "DeleteEntityModalController", [ + "$scope", "ide", "$modalInstance", + ($scope, ide, $modalInstance) -> + $scope.state = + inflight: false + + $scope.delete = () -> + $scope.state.inflight = true + ide.fileTreeManager.deleteEntity $scope.entity, (error) -> + $scope.$apply () -> + $scope.state.inflight = false + $modalInstance.close() + + $scope.cancel = () -> + $modalInstance.dismiss('cancel') + ]