From bf2c60f84d6d7214934f0560f71c87b41133699b Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Mon, 28 Apr 2014 17:47:47 +0100 Subject: [PATCH] added rename project to list page --- .../Features/Project/ProjectController.coffee | 11 ++++++ services/web/app/coffee/router.coffee | 3 ++ services/web/app/views/modals.jade | 11 ++++++ services/web/app/views/project/list.jade | 2 ++ services/web/public/coffee/list.coffee | 36 ++++++++++++++++++- .../Project/ProjectControllerTests.coffee | 27 +++++++++++++- 6 files changed, 88 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index fd96b1742f..12926c7c2b 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -3,6 +3,7 @@ logger = require("logger-sharelatex") projectDeleter = require("./ProjectDeleter") projectDuplicator = require("./ProjectDuplicator") projectCreationHandler = require("./ProjectCreationHandler") +editorController = require("../Editor/EditorController") metrics = require('../../infrastructure/Metrics') sanitize = require('sanitizer') Project = require('../../models/Project').Project @@ -58,6 +59,16 @@ module.exports = res.send {project_id:project._id} + renameProject: (req, res)-> + project_id = req.params.Project_id + newName = req.body.newProjectName + editorController.renameProject project_id, newName, (err)-> + if err? + logger.err err:err, project_id:project_id, newName:newName, "problem renaming project" + res.send 500 + else + res.send 200 + projectListPage: (req, res, next)-> timer = new metrics.Timer("project-list") user_id = req.session.user._id diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 0a158afd3c..25f3c2aeb5 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -96,6 +96,7 @@ module.exports = class Router app.get '/project', AuthenticationController.requireLogin(), ProjectController.projectListPage app.post '/project/new', AuthenticationController.requireLogin(), ProjectController.newProject + app.get '/project/new/template', TemplatesMiddlewear.saveTemplateDataInSession, AuthenticationController.requireLogin(), TemplatesController.createProjectFromZipTemplate app.get '/Project/:Project_id', SecurityManager.requestCanAccessProject, ProjectController.loadEditor @@ -118,6 +119,8 @@ module.exports = class Router app.del '/Project/:Project_id', SecurityManager.requestIsOwner, ProjectController.deleteProject app.post '/Project/:Project_id/clone', SecurityManager.requestCanAccessProject, ProjectController.cloneProject + app.post '/project/:Project_id/rename', SecurityManager.requestIsOwner, ProjectController.renameProject + app.post '/Project/:Project_id/snapshot', SecurityManager.requestCanModifyProject, versioningController.takeSnapshot app.get '/Project/:Project_id/version', SecurityManager.requestCanAccessProject, versioningController.listVersions app.get '/Project/:Project_id/version/:Version_id', SecurityManager.requestCanAccessProject, versioningController.getVersion diff --git a/services/web/app/views/modals.jade b/services/web/app/views/modals.jade index ef85ce7da9..d383a4e1d7 100644 --- a/services/web/app/views/modals.jade +++ b/services/web/app/views/modals.jade @@ -10,6 +10,17 @@ button.btn.btn-danger.confirm Delete Forever button.btn.cancel No +#renameProjectModal(style='display: none') + .modal + .modal-header + h3 Rename Project + .modal-body + form.form-horizontal(onkeydown="if (event.keyCode == 13){event.preventDefault(); document.getElementById('confirmRename').click()}") + input.inputmodal#projectNewName(placeholder='name') + .modal-footer + button.btn.btn-primary#confirmRename Rename + button.btn.cancel Cancel + #leaveProjectModal(style='display: none') .modal .modal-header diff --git a/services/web/app/views/project/list.jade b/services/web/app/views/project/list.jade index c651f5014f..ee08d17d5c 100644 --- a/services/web/app/views/project/list.jade +++ b/services/web/app/views/project/list.jade @@ -30,6 +30,8 @@ block content -if (project.accessLevel == "owner") li a(href='/project/'+project_id, data-name=project.name, data-id=project_id, data-csrf=csrfToken).deleteProject Delete Project + li + a(href='/project/'+project_id+'/rename', data-name=project.name, data-id=project_id, data-csrf=csrfToken).renameProject Rename Project -else li a(href='/project/'+project_id+'/leave', data-name=project.name, data-id=project_id, data-csrf=csrfToken).leaveProject Leave Project diff --git a/services/web/public/coffee/list.coffee b/services/web/public/coffee/list.coffee index b56e7c52bf..08aa6306db 100644 --- a/services/web/public/coffee/list.coffee +++ b/services/web/public/coffee/list.coffee @@ -58,7 +58,7 @@ require [ name = $(@).data("name") id = $(@).data("id") - nameEl = $modal.find(".name").text(name) + $modal.find(".name").text(name) href = this.href self = @ @@ -79,6 +79,40 @@ require [ $modal.find('.cancel').click (e)-> $modal.modal('hide') + $('.renameProject').click (event)-> + event.preventDefault() + $modal = $('#renameProjectModal') + $confirm = $modal.find('#confirmRename') + $modal.modal({backdrop:true, show:true, keyboard:true}) + name = $(@).data("name") + nameEl = $modal.find("#projectNewName").val(name) + nameEl.select() + href = this.href + self = @ + window.r = @ + $confirm.on 'click', (e) => + newProjectName = nameEl.val() + $.ajax + url: href + type:'POST' + data: + _csrf: $(@).data("csrf") + newProjectName:newProjectName + success: (data)-> + $modal.modal('hide') + if data.message + new Message data + else + $(self.parentNode.parentNode.parentNode.parentNode).find(".projectName").text(newProjectName) + $(self.parentNode.parentNode).find("li a").each ()-> + $(this).data('name', newProjectName) + + $modal.on 'hide', -> + $confirm.off 'click' + $modal.find('.cancel').click (e)-> + $modal.modal('hide') + + $(".leaveProject").click (event) -> event.preventDefault() $modal = $('#leaveProjectModal') diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index f7a04c6a59..b667212f0f 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -35,12 +35,17 @@ describe "ProjectController", -> findById: sinon.stub() @SecurityManager = userCanAccessProject:sinon.stub() + @EditorController = + renameProject:sinon.stub() @ProjectController = SandboxedModule.require modulePath, requires: "settings-sharelatex":@settings - "logger-sharelatex": log:-> + "logger-sharelatex": + log:-> + err:-> "./ProjectDeleter": @ProjectDeleter "./ProjectDuplicator": @ProjectDuplicator "./ProjectCreationHandler": @ProjectCreationHandler + "../Editor/EditorController": @EditorController "../Subscription/SubscriptionLocator": @SubscriptionLocator "../Tags/TagsHandler":@TagsHandler '../../models/Project': Project:@ProjectModel @@ -130,6 +135,26 @@ describe "ProjectController", -> done() @ProjectController.projectListPage @req, @res + describe "renameProject", -> + beforeEach -> + @newProjectName = "my supper great new project" + @req.body.newProjectName = @newProjectName + + it "should call the editor controller", (done)-> + @EditorController.renameProject.callsArgWith(2) + @res.send = (code)=> + code.should.equal 200 + @EditorController.renameProject.calledWith(@project_id, @newProjectName).should.equal true + done() + @ProjectController.renameProject @req, @res + + it "should send a 500 if there is a problem", (done)-> + @EditorController.renameProject.callsArgWith(2, "problem") + @res.send = (code)=> + code.should.equal 500 + @EditorController.renameProject.calledWith(@project_id, @newProjectName).should.equal true + done() + @ProjectController.renameProject @req, @res describe "loadEditor", -> beforeEach ->