From 60be4df76e02afdf4dd62f8e03505d55c0ed119e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Manelli?= Date: Sat, 23 Feb 2019 23:07:54 +0100 Subject: Allow swimlane creation from template Mix lists with same name to avoid duplicates --- client/components/cards/cardDetails.jade | 3 --- client/components/cards/cardDetails.js | 3 --- client/components/lists/listBody.jade | 5 +++- client/components/lists/listBody.js | 19 ++++++------- client/components/swimlanes/swimlaneHeader.jade | 5 ++++ client/components/swimlanes/swimlaneHeader.js | 1 + client/components/swimlanes/swimlanes.js | 8 +++--- models/boards.js | 24 +++++++++++++++++ models/lists.js | 36 ++++++++++++++----------- models/swimlanes.js | 31 +++++++++++++++++++++ 10 files changed, 100 insertions(+), 35 deletions(-) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 4d9b2e08..25316d04 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -247,9 +247,6 @@ template(name="cardDetailsActionsPopup") unless archived li: a.js-archive {{_ 'archive-card'}} li: a.js-more {{_ 'cardMorePopup-title'}} - hr - ul.pop-over-list - li: a.js-template-card {{_ 'cardTemplatePopup-title'}} template(name="moveCardPopup") +boardsAndLists diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 1281356d..73a7a67d 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -365,9 +365,6 @@ Template.cardDetailsActionsPopup.events({ if (!err && ret) Popup.close(); }); }, - 'click .js-template-card' () { - console.log('REMOVE Creating template card'); - }, }); Template.editCardTitleForm.onRendered(function () { diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade index 46f90f99..fcc28777 100644 --- a/client/components/lists/listBody.jade +++ b/client/components/lists/listBody.jade @@ -91,7 +91,7 @@ template(name="linkCardPopup") unless isSandstorm input.primary.confirm.js-done(type="button" value="{{_ 'link'}}") -template(name="searchCardPopup") +template(name="searchElementPopup") unless isTemplateSearch label {{_ 'boards'}}: .link-board-wrapper @@ -110,6 +110,9 @@ template(name="searchCardPopup") if isSwimlaneTemplateSearch a.minicard-wrapper.js-minicard +miniswimlane(this) + if isCardTemplateSearch + a.minicard-wrapper.js-minicard + +minicard(this) unless isTemplateSearch a.minicard-wrapper.js-minicard +minicard(this) diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index ad34efef..f8634c0b 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -315,8 +315,8 @@ BlazeComponent.extendComponent({ return [{ keydown: this.pressKey, 'click .js-link': Popup.open('linkCard'), - 'click .js-search': Popup.open('searchCard'), - 'click .js-search-template': Popup.open('searchCard'), + 'click .js-search': Popup.open('searchElement'), + 'click .js-card-template': Popup.open('searchElement'), }]; }, @@ -526,7 +526,7 @@ BlazeComponent.extendComponent({ onCreated() { this.isCardTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-card-template'); this.isListTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-list-template'); - this.isSwimlaneTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-swimlane-template'); + this.isSwimlaneTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-open-add-swimlane-menu'); this.isTemplateSearch = this.isCardTemplateSearch || this.isListTemplateSearch || this.isSwimlaneTemplateSearch; let board = {}; if (this.isTemplateSearch) { @@ -551,14 +551,13 @@ BlazeComponent.extendComponent({ this.boardId = Session.get('currentBoard'); // In order to get current board info subManager.subscribe('board', this.boardId); - board = Boards.findOne(this.boardId); // List where to insert card const list = $(Popup._getTopStack().openerElement).closest('.js-list'); this.listId = Blaze.getData(list[0])._id; // Swimlane where to insert card - const swimlane = $(Popup._getTopStack().openerElement).closest('.js-swimlane'); + const swimlane = $(Popup._getTopStack().openerElement).parents('.js-swimlane'); this.swimlaneId = ''; - if (board.view === 'board-view-swimlanes') + if (Meteor.user().profile.boardView === 'board-view-swimlanes') this.swimlaneId = Blaze.getData(swimlane[0])._id; else this.swimlaneId = Swimlanes.findOne({boardId: this.boardId})._id; @@ -606,7 +605,6 @@ BlazeComponent.extendComponent({ 'click .js-minicard'(evt) { // 0. Common let element = Blaze.getData(evt.currentTarget); - console.log(element); element.boardId = this.boardId; let _id = ''; if (!this.isTemplateSearch || this.isCardTemplateSearch) { @@ -630,14 +628,17 @@ BlazeComponent.extendComponent({ Filter.addException(_id); // List insertion } else if (this.isListTemplateSearch) { - element.swimlaneId = ''; element.sort = Swimlanes.findOne(this.swimlaneId).lists().count(); element.type = 'list'; element.swimlaneId = this.swimlaneId; _id = element.copy(); + } else if (this.isSwimlaneTemplateSearch) { + element.sort = Boards.findOne(this.boardId).swimlanes().count(); + element.type = 'swimlalne'; + _id = element.copy(); } Popup.close(); }, }]; }, -}).register('searchCardPopup'); +}).register('searchElementPopup'); diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade index 810dd57f..de9621d5 100644 --- a/client/components/swimlanes/swimlaneHeader.jade +++ b/client/components/swimlanes/swimlaneHeader.jade @@ -40,6 +40,11 @@ template(name="swimlaneAddPopup") autocomplete="off" autofocus) .edit-controls.clearfix button.primary.confirm(type="submit") {{_ 'add'}} + unless currentBoard.isTemplatesBoard + unless currentBoard.isTemplateBoard + span.quiet + | {{_ 'or'}} + a.js-swimlane-template {{_ 'template'}} template(name="setSwimlaneColorPopup") form.edit-label diff --git a/client/components/swimlanes/swimlaneHeader.js b/client/components/swimlanes/swimlaneHeader.js index b78bdc96..e7f3cc76 100644 --- a/client/components/swimlanes/swimlaneHeader.js +++ b/client/components/swimlanes/swimlaneHeader.js @@ -65,6 +65,7 @@ BlazeComponent.extendComponent({ // with a minimum of interactions Popup.close(); }, + 'click .js-swimlane-template': Popup.open('searchElement'), }]; }, }).register('swimlaneAddPopup'); diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index bdaed81d..b4277d4f 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -154,8 +154,8 @@ BlazeComponent.extendComponent({ BlazeComponent.extendComponent({ onCreated() { - currentBoard = Boards.findOne(Session.get('currentBoard')); - this.isListTemplatesSwimlane = currentBoard.isTemplatesBoard() && this.currentData().isListTemplatesSwimlane(); + this.currentBoard = Boards.findOne(Session.get('currentBoard')); + this.isListTemplatesSwimlane = this.currentBoard.isTemplatesBoard() && this.currentData().isListTemplatesSwimlane(); this.currentSwimlane = this.currentData(); }, @@ -176,14 +176,14 @@ BlazeComponent.extendComponent({ boardId: Session.get('currentBoard'), sort: $('.list').length, type: (this.isListTemplatesSwimlane)?'template-list':'list', - swimlaneId: (this.isListTemplatesSwimlane)?this.currentSwimlane._id:'', + swimlaneId: (this.currentBoard.isTemplatesBoard())?this.currentSwimlane._id:'', }); titleInput.value = ''; titleInput.focus(); } }, - 'click .js-list-template': Popup.open('searchCard'), + 'click .js-list-template': Popup.open('searchElement'), }]; }, }).register('addListForm'); diff --git a/models/boards.js b/models/boards.js index 530a6f71..d81ded15 100644 --- a/models/boards.js +++ b/models/boards.js @@ -463,6 +463,30 @@ Boards.helpers({ return _id; }, + searchSwimlanes(term) { + check(term, Match.OneOf(String, null, undefined)); + + const query = { boardId: this._id }; + if (this.isTemplatesBoard()) { + query.type = 'template-swimlane'; + query.archived = false; + } else { + query.type = {$nin: ['template-swimlane']}; + } + const projection = { limit: 10, sort: { createdAt: -1 } }; + + if (term) { + const regex = new RegExp(term, 'i'); + + query.$or = [ + { title: regex }, + { description: regex }, + ]; + } + + return Swimlanes.find(query, projection); + }, + searchLists(term) { check(term, Match.OneOf(String, null, undefined)); diff --git a/models/lists.js b/models/lists.js index e2ded36e..76708ffd 100644 --- a/models/lists.js +++ b/models/lists.js @@ -139,8 +139,17 @@ Lists.allow({ Lists.helpers({ copy() { const oldId = this._id; - this._id = null; - const _id = Lists.insert(this); + let _id = null; + existingListWithSameName = Lists.findOne({ + boardId: this.boardId, + title: this.title, + }); + if (existingListWithSameName) { + _id = existingListWithSameName._id; + } else { + this._id = null; + _id = Lists.insert(this); + } // Copy all cards in list Cards.find({ @@ -213,23 +222,20 @@ Lists.mutations({ }, archive() { - Cards.find({ - listId: this._id, - archived: false, - }).forEach((card) => { - return card.archive(); - }); + if (this.isTemplateList()) { + this.cards().forEach((card) => { + return card.archive(); + }); + } return { $set: { archived: true } }; }, restore() { - cardsToRestore = Cards.find({ - listId: this._id, - archived: true, - }); - cardsToRestore.forEach((card) => { - card.restore(); - }); + if (this.isTemplateList()) { + this.allCards().forEach((card) => { + return card.restore(); + }); + } return { $set: { archived: false } }; }, diff --git a/models/swimlanes.js b/models/swimlanes.js index be3f617c..205f1498 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -101,6 +101,23 @@ Swimlanes.allow({ }); Swimlanes.helpers({ + copy() { + const oldId = this._id; + this._id = null; + const _id = Swimlanes.insert(this); + + // Copy all lists in swimlane + Lists.find({ + swimlaneId: oldId, + archived: false, + }).forEach((list) => { + list.type = 'list'; + list.swimlaneId = _id; + list.boardId = this.boardId; + list.copy(); + }); + }, + cards() { return Cards.find(Filter.mongoSelector({ swimlaneId: this._id, @@ -115,6 +132,10 @@ Swimlanes.helpers({ }), { sort: ['sort'] }); }, + allLists() { + return Lists.find({ swimlaneId: this._id }); + }, + allCards() { return Cards.find({ swimlaneId: this._id }); }, @@ -159,10 +180,20 @@ Swimlanes.mutations({ }, archive() { + if (this.isTemplateSwimlane()) { + this.lists().forEach((list) => { + return list.archive(); + }); + } return { $set: { archived: true } }; }, restore() { + if (this.isTemplateSwimlane()) { + this.allLists().forEach((list) => { + return list.restore(); + }); + } return { $set: { archived: false } }; }, -- cgit v1.2.3-1-g7c22