From 8137f2692fe3e1d9f1c0a9b635ef15cdf36728f7 Mon Sep 17 00:00:00 2001 From: guillaume Date: Tue, 23 Apr 2019 18:00:09 +0200 Subject: remove feature --- client/components/sidebar/sidebarArchives.jade | 28 +++++++++++---- client/components/sidebar/sidebarArchives.js | 48 +++++++++++++++++++++++++ client/components/swimlanes/swimlaneHeader.jade | 4 +++ i18n/en.i18n.json | 6 +++- i18n/fr.i18n.json | 8 +++-- models/boards.js | 19 ++++++++++ models/cards.js | 4 +-- models/checklists.js | 2 -- models/lists.js | 10 ++++++ models/swimlanes.js | 20 ++++++++++- 10 files changed, 135 insertions(+), 14 deletions(-) diff --git a/client/components/sidebar/sidebarArchives.jade b/client/components/sidebar/sidebarArchives.jade index ee6cac01..e2f3e395 100644 --- a/client/components/sidebar/sidebarArchives.jade +++ b/client/components/sidebar/sidebarArchives.jade @@ -2,6 +2,10 @@ template(name="archivesSidebar") +basicTabs(tabs=tabs) +tabContent(slug="cards") + p.quiet + a.js-restore-all-cards {{_ 'restore-all'}} + | - + a.js-delete-all-cards {{_ 'delete-all'}} each archivedCards .minicard-wrapper.js-minicard +minicard(this) @@ -16,23 +20,35 @@ template(name="archivesSidebar") p.no-items-message {{_ 'no-archived-cards'}} +tabContent(slug="lists") + p.quiet + a.js-restore-all-lists {{_ 'restore-all'}} + | - + a.js-delete-all-lists {{_ 'delete-all'}} ul.archived-lists each archivedLists li.archived-lists-item - if currentUser.isBoardMember - button.js-restore-list - i.fa.fa-undo = title + if currentUser.isBoardMember + p.quiet + a.js-restore-list {{_ 'restore'}} + | - + a.js-delete-list {{_ 'delete'}} else li.no-items-message {{_ 'no-archived-lists'}} +tabContent(slug="swimlanes") + p.quiet + a.js-restore-all-swimlanes {{_ 'restore-all'}} + | - + a.js-delete-all-swimlanes {{_ 'delete-all'}} ul.archived-lists each archivedSwimlanes li.archived-lists-item - if currentUser.isBoardMember - button.js-restore-swimlane - i.fa.fa-undo = title + if currentUser.isBoardMember + p.quiet + a.js-restore-swimlane {{_ 'restore'}} + | - + a.js-delete-swimlane {{_ 'delete'}} else li.no-items-message {{_ 'no-archived-swimlanes'}} diff --git a/client/components/sidebar/sidebarArchives.js b/client/components/sidebar/sidebarArchives.js index 6102bf11..b50043fd 100644 --- a/client/components/sidebar/sidebarArchives.js +++ b/client/components/sidebar/sidebarArchives.js @@ -44,19 +44,67 @@ BlazeComponent.extendComponent({ card.restore(); } }, + 'click .js-restore-all-cards'() { + this.archivedCards().forEach((card) => { + if(card.canBeRestored()){ + card.restore(); + } + }); + }, + 'click .js-delete-card': Popup.afterConfirm('cardDelete', function() { const cardId = this._id; Cards.remove(cardId); Popup.close(); }), + 'click .js-delete-all-cards': Popup.afterConfirm('cardDelete', () => { + this.archivedCards().forEach((card) => { + Cards.remove(card._id); + }); + Popup.close(); + }), + 'click .js-restore-list'() { const list = this.currentData(); list.restore(); }, + 'click .js-restore-all-lists'() { + this.archivedLists().forEach((list) => { + list.restore(); + }); + }, + + 'click .js-delete-list': Popup.afterConfirm('listDelete', function() { + this.remove(); + Popup.close(); + }), + 'click .js-delete-all-lists': Popup.afterConfirm('listDelete', () => { + this.archivedLists().forEach((list) => { + list.remove(); + }); + Popup.close(); + }), + 'click .js-restore-swimlane'() { const swimlane = this.currentData(); swimlane.restore(); }, + 'click .js-restore-all-swimlanes'() { + this.archivedSwimlanes().forEach((swimlane) => { + swimlane.restore(); + }); + }, + + 'click .js-delete-swimlane': Popup.afterConfirm('swimlaneDelete', function() { + this.remove(); + Popup.close(); + }), + 'click .js-delete-all-swimlanes': Popup.afterConfirm('swimlaneDelete', () => { + this.archivedSwimlanes().forEach((swimlane) => { + swimlane.remove(); + }); + Popup.close(); + }), }]; }, }).register('archivesSidebar'); diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade index de9621d5..8c6aa5a3 100644 --- a/client/components/swimlanes/swimlaneHeader.jade +++ b/client/components/swimlanes/swimlaneHeader.jade @@ -54,3 +54,7 @@ template(name="setSwimlaneColorPopup") i.fa.fa-check button.primary.confirm.js-submit {{_ 'save'}} button.js-remove-color.negate.wide.right {{_ 'unset-color'}} + +template(name="swimlaneDeletePopup") + p {{_ "swimlane-delete-pop"}} + button.js-confirm.negate.full(type="submit") {{_ 'delete'}} diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 22e15934..bb84dc66 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -687,5 +687,9 @@ "display-authentication-method": "Display Authentication Method", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", - "people-number": "The number of people is: " + "people-number": "The number of people is: ", + "swimlaneDeletePopup-title": "Delete Swimlane ?", + "swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.", + "restore-all": "Restore all", + "delete-all": "Delete all" } diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index 922ebc27..224be75c 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -684,5 +684,9 @@ "display-authentication-method": "Afficher la méthode d'authentification", "default-authentication-method": "Méthode d'authentification par défaut", "duplicate-board": "Dupliquer le tableau", - "people-number": "Le nombre d'utilisateurs est de :" -} \ No newline at end of file + "people-number": "Le nombre d'utilisateurs est de :", + "swimlaneDeletePopup-title": "Supprimer le couloir ?", + "swimlane-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser ce couloir. Cette action est irréversible.", + "restore-all": "Tout supprimer", + "delete-all": "Tout restaurer" +} diff --git a/models/boards.js b/models/boards.js index 36651d54..b07d9e27 100644 --- a/models/boards.js +++ b/models/boards.js @@ -803,6 +803,13 @@ Boards.mutations({ }, }); +function boardRemover(userId, doc) { + [Cards, Lists, Swimlanes, Integrations, Rules, Activities].forEach((element) => { + element.remove({ boardId: doc._id }); + }); +} + + if (Meteor.isServer) { Boards.allow({ insert: Meteor.userId, @@ -966,6 +973,18 @@ if (Meteor.isServer) { } }); + Boards.before.remove((userId, doc) => { + boardRemover(userId, doc); + // Add removeBoard activity to keep it + Activities.insert({ + userId, + type: 'board', + activityTypeId: doc._id, + activityType: 'removeBoard', + boardId: doc._id, + }); + }); + // Add a new activity if we add or remove a member to the board Boards.after.update((userId, doc, fieldNames, modifier) => { if (!_.contains(fieldNames, 'members')) { diff --git a/models/cards.js b/models/cards.js index 7430ae52..d5a59377 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1518,7 +1518,7 @@ function cardCreation(userId, doc) { } function cardRemover(userId, doc) { - Activities.remove({ + ChecklistItems.remove({ cardId: doc._id, }); Checklists.remove({ @@ -1583,7 +1583,7 @@ if (Meteor.isServer) { // Remove all activities associated with a card if we remove the card // Remove also card_comments / checklists / attachments - Cards.after.remove((userId, doc) => { + Cards.before.remove((userId, doc) => { cardRemover(userId, doc); }); } diff --git a/models/checklists.js b/models/checklists.js index d5063faf..33cb0f40 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -157,8 +157,6 @@ if (Meteor.isServer) { listId: doc.listId, swimlaneId: doc.swimlaneId, }); - - }); } diff --git a/models/lists.js b/models/lists.js index a8e597ee..1a0910c2 100644 --- a/models/lists.js +++ b/models/lists.js @@ -217,6 +217,10 @@ Lists.helpers({ isTemplateList() { return this.type === 'template-list'; }, + + remove() { + Lists.remove({ _id: this._id}); + }, }); Lists.mutations({ @@ -310,6 +314,12 @@ if (Meteor.isServer) { }); Lists.before.remove((userId, doc) => { + const cards = Cards.find({ listId: doc._id }); + if (cards) { + cards.forEach((card) => { + Cards.remove(card._id); + }); + } Activities.insert({ userId, type: 'list', diff --git a/models/swimlanes.js b/models/swimlanes.js index 9da4afb5..bd2565af 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -180,6 +180,10 @@ Swimlanes.helpers({ const user = Users.findOne(Meteor.userId()); return user.profile.boardTemplatesSwimlaneId === this._id; }, + + remove() { + Swimlanes.remove({ _id: this._id}); + }, }); Swimlanes.mutations({ @@ -234,7 +238,21 @@ if (Meteor.isServer) { }); }); - Swimlanes.before.remove((userId, doc) => { + Swimlanes.before.remove(function(userId, doc) { + const lists = Lists.find({ + boardId: doc.boardId, + swimlaneId: {$in: [doc._id, '']}, + archived: false, + }, { sort: ['sort'] }); + + if (lists.count() < 2) { + lists.forEach((list) => { + list.remove(); + }); + } else { + Cards.remove({swimlaneId: doc._id}); + } + Activities.insert({ userId, type: 'swimlane', -- cgit v1.2.3-1-g7c22