From f1c8dcdf1e99ca369380aa3cc5bf4b549a1444cb Mon Sep 17 00:00:00 2001 From: Chrystal Maria Griffiths Date: Tue, 13 Nov 2018 10:34:27 +0000 Subject: [PATCH] Merge pull request #1127 from sharelatex/as-keep-tags-archive Keep tags when archiving project GitOrigin-RevId: 40b23895ef27a69500194cfc149a236ae615f271 --- services/web/.eslintrc | 7 ++- .../Features/Project/ProjectDeleter.coffee | 23 +++++---- .../src/main/project-list/project-list.js | 48 +++++++------------ .../coffee/Project/ProjectDeleterTests.coffee | 46 ++++++++---------- 4 files changed, 56 insertions(+), 68 deletions(-) diff --git a/services/web/.eslintrc b/services/web/.eslintrc index a27784723e..d55c4160bb 100644 --- a/services/web/.eslintrc +++ b/services/web/.eslintrc @@ -18,7 +18,12 @@ "mocha": true }, "globals": { - "expect": true + "expect": true, + "define": true, + "$": true, + "angular": true, + // Injected in layout.pug + "user_id": true }, "settings": { // Tell eslint-plugin-react which version of React we are using diff --git a/services/web/app/coffee/Features/Project/ProjectDeleter.coffee b/services/web/app/coffee/Features/Project/ProjectDeleter.coffee index 3f671692f3..3daca09632 100644 --- a/services/web/app/coffee/Features/Project/ProjectDeleter.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDeleter.coffee @@ -30,13 +30,7 @@ module.exports = ProjectDeleter = CollaboratorsHandler.removeUserFromAllProjets user_id, callback deleteProject: (project_id, callback = (error) ->) -> - # archiveProject takes care of the clean-up - ProjectDeleter.archiveProject project_id, (error) -> - logger.log project_id: project_id, "deleting project" - Project.remove _id: project_id, callback - - archiveProject: (project_id, callback = (error) ->)-> - logger.log project_id:project_id, "archived project from user request" + logger.log project_id: project_id, "deleting project" async.series [ (cb)-> documentUpdaterHandler.flushProjectToMongoAndDelete project_id, cb @@ -45,9 +39,18 @@ module.exports = ProjectDeleter = for member_id in member_ids tagsHandler.removeProjectFromAllTags member_id, project_id, (err)-> cb() #doesn't matter if this fails or the order it happens in - (cb)-> - Project.update {_id:project_id}, { $set: { archived: true }}, cb - ], (err)-> + (cb) -> + Project.remove _id: project_id, cb + ], (err) -> + if err? + logger.err err:err, "problem deleting project" + return callback(err) + logger.log project_id:project_id, "successfully deleting project from user request" + callback() + + archiveProject: (project_id, callback = (error) ->)-> + logger.log project_id:project_id, "archived project from user request" + Project.update {_id:project_id}, { $set: { archived: true }}, (err)-> if err? logger.err err:err, "problem archived project" return callback(err) diff --git a/services/web/public/src/main/project-list/project-list.js b/services/web/public/src/main/project-list/project-list.js index 68ed7aca34..58f1395627 100644 --- a/services/web/public/src/main/project-list/project-list.js +++ b/services/web/public/src/main/project-list/project-list.js @@ -1,9 +1,5 @@ /* eslint-disable camelcase, - max-len, - no-return-assign, - no-undef, - no-unused-vars, */ // TODO: This file was created by bulk-decaffeinate. // Fix any style issues and re-enable lint. @@ -27,7 +23,6 @@ define(['base'], function(App) { $timeout, localStorage ) { - let project_id $scope.projects = window.data.projects $scope.tags = window.data.tags $scope.notifications = window.data.notifications @@ -80,7 +75,7 @@ define(['base'], function(App) { } for (var tag of Array.from($scope.tags)) { - for (project_id of Array.from(tag.project_ids || [])) { + for (let project_id of Array.from(tag.project_ids || [])) { project = projectsById[project_id] if (project != null) { if (!project.tags) { @@ -146,9 +141,9 @@ define(['base'], function(App) { $scope.selectedProjects = $scope.projects.filter( project => project.selected ) - return ($scope.isArchiveableProjectSelected = $scope.selectedProjects.some( + $scope.isArchiveableProjectSelected = $scope.selectedProjects.some( project => window.user_id === project.owner._id - )) + ) } $scope.getSelectedProjects = () => $scope.selectedProjects @@ -252,7 +247,7 @@ define(['base'], function(App) { // Remove project_id from tag.project_ids const remaining_project_ids = [] const removed_project_ids = [] - for (project_id of Array.from(tag.project_ids)) { + for (let project_id of Array.from(tag.project_ids)) { if (!Array.from(remove_project_ids).includes(project_id)) { remaining_project_ids.push(project_id) } else { @@ -282,7 +277,6 @@ define(['base'], function(App) { ) // Remove tag from project.tags - const remaining_tags = [] for (project of Array.from(selected_projects)) { if (!project.tags) { project.tags = [] @@ -293,7 +287,7 @@ define(['base'], function(App) { } } - for (project_id of Array.from(removed_project_ids)) { + for (let project_id of Array.from(removed_project_ids)) { queuedHttp({ method: 'DELETE', url: `/tag/${tag._id}/project/${project_id}`, @@ -340,7 +334,7 @@ define(['base'], function(App) { // Add project_ids into tag.project_ids const added_project_ids = [] - for (project_id of Array.from($scope.getSelectedProjectIds())) { + for (let project_id of Array.from($scope.getSelectedProjectIds())) { if (!Array.from(tag.project_ids).includes(project_id)) { tag.project_ids.push(project_id) added_project_ids.push(project_id) @@ -359,7 +353,7 @@ define(['base'], function(App) { return (() => { const result = [] - for (project_id of Array.from(added_project_ids)) { + for (let project_id of Array.from(added_project_ids)) { result.push( queuedHttp.post(`/tag/${tag._id}/project/${project_id}`, { _csrf: window.csrfToken @@ -441,7 +435,6 @@ define(['base'], function(App) { .then(() => (project.name = newName)) $scope.openRenameProjectModal = function() { - let modalInstance project = $scope.getFirstSelectedProject() if (project == null || project.accessLevel !== 'owner') { return @@ -451,7 +444,7 @@ define(['base'], function(App) { 'project action', 'Rename' ) - return (modalInstance = $modal.open({ + $modal.open({ templateUrl: 'renameProjectModalTemplate', controller: 'RenameProjectModalController', resolve: { @@ -460,7 +453,7 @@ define(['base'], function(App) { } }, scope: $scope - })) + }) } $scope.cloneProject = function(project, cloneName) { @@ -491,13 +484,12 @@ define(['base'], function(App) { } $scope.openCloneProjectModal = function() { - let modalInstance project = $scope.getFirstSelectedProject() if (project == null) { return } - return (modalInstance = $modal.open({ + $modal.open({ templateUrl: 'cloneProjectModalTemplate', controller: 'CloneProjectModalController', resolve: { @@ -506,7 +498,7 @@ define(['base'], function(App) { } }, scope: $scope - })) + }) } $scope.openArchiveProjectsModal = function() { @@ -533,14 +525,7 @@ define(['base'], function(App) { $scope.archiveOrLeaveProjects($scope.getSelectedProjects()) $scope.archiveOrLeaveProjects = function(projects) { - const projectIds = projects.map(p => p.id) - // Remove project from any tags - for (tag of Array.from($scope.tags)) { - $scope._removeProjectIdsFromTagArray(tag, projectIds) - } - - for (project of Array.from(projects)) { - project.tags = [] + for (let project of projects) { if (project.accessLevel === 'owner') { project.archived = true queuedHttp({ @@ -594,7 +579,7 @@ define(['base'], function(App) { $scope._removeProjectIdsFromTagArray(tag, selected_project_ids) } - for (project_id of Array.from(selected_project_ids)) { + for (let project_id of Array.from(selected_project_ids)) { queuedHttp({ method: 'DELETE', url: `/project/${project_id}?forever=true`, @@ -630,11 +615,10 @@ define(['base'], function(App) { } $scope.openUploadProjectModal = function() { - let modalInstance - return (modalInstance = $modal.open({ + $modal.open({ templateUrl: 'uploadProjectModalTemplate', controller: 'UploadProjectModalController' - })) + }) } $scope.downloadSelectedProjects = () => @@ -733,7 +717,7 @@ define(['base'], function(App) { .catch(function(response) { const { data, status } = response const error = status === 400 ? { message: data } : true - const modalInstance = $modal.open({ + $modal.open({ templateUrl: 'showErrorModalTemplate', controller: 'ShowErrorModalController', resolve: { diff --git a/services/web/test/unit/coffee/Project/ProjectDeleterTests.coffee b/services/web/test/unit/coffee/Project/ProjectDeleterTests.coffee index 60a9f71ba2..5d7fe189bd 100644 --- a/services/web/test/unit/coffee/Project/ProjectDeleterTests.coffee +++ b/services/web/test/unit/coffee/Project/ProjectDeleterTests.coffee @@ -82,32 +82,34 @@ describe 'ProjectDeleter', -> describe "deleteProject", -> beforeEach (done) -> @project_id = "mock-project-id-123" - @deleter.archiveProject = sinon.stub().callsArg(1) - - @deleter.deleteProject @project_id, done - - it "should archive the project to clean it up", -> - @deleter.archiveProject - .calledWith(@project_id) - .should.equal true - - it "should remove the project from Mongo", -> - @Project.remove - .calledWith(_id: @project_id) - .should.equal true - - describe "archiveProject", -> - beforeEach -> @CollaboratorsHandler.getMemberIds = sinon.stub() @CollaboratorsHandler.getMemberIds.withArgs(@project_id).yields(null, ["member-id-1", "member-id-2"]) - @Project.update.callsArgWith(2) + @Project.remove.callsArgWith(1) + done() it "should flushProjectToMongoAndDelete in doc updater", (done)-> - @deleter.archiveProject @project_id, => + @deleter.deleteProject @project_id, => @documentUpdaterHandler.flushProjectToMongoAndDelete.calledWith(@project_id).should.equal true done() - it "should remove the project", (done)-> + it "should removeProjectFromAllTags", (done)-> + @deleter.deleteProject @project_id, => + @TagsHandler.removeProjectFromAllTags.calledWith("member-id-1", @project_id).should.equal true + @TagsHandler.removeProjectFromAllTags.calledWith("member-id-2", @project_id).should.equal true + done() + + it "should remove the project from Mongo", (done) -> + @deleter.deleteProject @project_id, => + @Project.remove.calledWith({ + _id: @project_id + }).should.equal true + done() + + describe "archiveProject", -> + beforeEach -> + @Project.update.callsArgWith(2) + + it "should update the project", (done)-> @deleter.archiveProject @project_id, => @Project.update.calledWith({ _id:@project_id @@ -116,12 +118,6 @@ describe 'ProjectDeleter', -> }).should.equal true done() - it "should removeProjectFromAllTags", (done)-> - @deleter.archiveProject @project_id, => - @TagsHandler.removeProjectFromAllTags.calledWith("member-id-1", @project_id).should.equal true - @TagsHandler.removeProjectFromAllTags.calledWith("member-id-2", @project_id).should.equal true - done() - describe "restoreProject", -> beforeEach -> @Project.update.callsArgWith(2)