Forráskód Böngészése

Allow swimlane creation from template
Mix lists with same name to avoid duplicates

Andrés Manelli 6 éve
szülő
commit
60be4df76e

+ 0 - 3
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

+ 0 - 3
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 () {

+ 4 - 1
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)

+ 10 - 9
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');

+ 5 - 0
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

+ 1 - 0
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');

+ 4 - 4
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');

+ 24 - 0
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));
 

+ 21 - 15
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 } };
   },
 

+ 31 - 0
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 } };
   },