Jelajahi Sumber

Prepare to create card from template

Andrés Manelli 6 tahun lalu
induk
melakukan
0fec711545

+ 5 - 53
client/components/cards/cardDetails.js

@@ -459,26 +459,9 @@ BlazeComponent.extendComponent({
   },
 }).register('boardsAndLists');
 
-
-function cloneCheckList(_id, checklist) {
-  'use strict';
-  const checklistId = checklist._id;
-  checklist.cardId = _id;
-  checklist._id = null;
-  const newChecklistId = Checklists.insert(checklist);
-  ChecklistItems.find({checklistId}).forEach(function(item) {
-    item._id = null;
-    item.checklistId = newChecklistId;
-    item.cardId = _id;
-    ChecklistItems.insert(item);
-  });
-}
-
 Template.copyCardPopup.events({
   'click .js-done'() {
     const card = Cards.findOne(Session.get('currentCard'));
-    const oldId = card._id;
-    card._id = null;
     const lSelect = $('.js-select-lists')[0];
     card.listId = lSelect.options[lSelect.selectedIndex].value;
     const slSelect = $('.js-select-swimlanes')[0];
@@ -493,38 +476,13 @@ Template.copyCardPopup.events({
     if (title) {
       card.title = title;
       card.coverId = '';
-      const _id = Cards.insert(card);
+      const _id = card.copy();
       // In case the filter is active we need to add the newly inserted card in
       // the list of exceptions -- cards that are not filtered. Otherwise the
       // card will disappear instantly.
       // See https://github.com/wekan/wekan/issues/80
       Filter.addException(_id);
 
-      // copy checklists
-      let cursor = Checklists.find({cardId: oldId});
-      cursor.forEach(function() {
-        cloneCheckList(_id, arguments[0]);
-      });
-
-      // copy subtasks
-      cursor = Cards.find({parentId: oldId});
-      cursor.forEach(function() {
-        'use strict';
-        const subtask = arguments[0];
-        subtask.parentId = _id;
-        subtask._id = null;
-        /* const newSubtaskId = */ Cards.insert(subtask);
-      });
-
-      // copy card comments
-      cursor = CardComments.find({cardId: oldId});
-      cursor.forEach(function () {
-        'use strict';
-        const comment = arguments[0];
-        comment.cardId = _id;
-        comment._id = null;
-        CardComments.insert(comment);
-      });
       Popup.close();
     }
   },
@@ -561,9 +519,8 @@ Template.copyChecklistToManyCardsPopup.events({
         Filter.addException(_id);
 
         // copy checklists
-        let cursor = Checklists.find({cardId: oldId});
-        cursor.forEach(function() {
-          cloneCheckList(_id, arguments[0]);
+        Checklists.find({cardId: oldId}).forEach((ch) => {
+          ch.copy(_id);
         });
 
         // copy subtasks
@@ -577,13 +534,8 @@ Template.copyChecklistToManyCardsPopup.events({
         });
 
         // copy card comments
-        cursor = CardComments.find({cardId: oldId});
-        cursor.forEach(function () {
-          'use strict';
-          const comment = arguments[0];
-          comment.cardId = _id;
-          comment._id = null;
-          CardComments.insert(comment);
+        CardComments.find({cardId: oldId}).forEach((cmt) => {
+          cmt.copy(_id);
         });
       }
       Popup.close();

+ 2 - 4
client/components/lists/listBody.jade

@@ -96,11 +96,9 @@ template(name="searchCardPopup")
     label {{_ 'boards'}}:
     .link-board-wrapper
       select.js-select-boards
+        option(value="")
         each boards
-          if $eq _id currentBoard._id
-            option(value="{{_id}}" selected) {{_ 'current'}}
-          else
-            option(value="{{_id}}") {{title}}
+          option(value="{{_id}}") {{title}}
   form.js-search-term-form
     input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus)
   .list-body.js-perfect-scrollbar.search-card-results

+ 4 - 3
client/components/lists/listBody.js

@@ -456,6 +456,7 @@ BlazeComponent.extendComponent({
       archived: false,
       linkedId: {$nin: ownCardsIds},
       _id: {$nin: ownCardsIds},
+      type: {$nin: ['template-card']},
     });
   },
 
@@ -523,16 +524,16 @@ BlazeComponent.extendComponent({
   },
 
   onCreated() {
-    const isTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-search-template');
+    this.isTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-search-template');
     let board = {};
-    if (isTemplateSearch) {
+    if (this.isTemplateSearch) {
         board = Boards.findOne(Meteor.user().profile.templatesBoardId);
     } else {
       // Prefetch first non-current board id
       board = Boards.findOne({
         archived: false,
         'members.userId': Meteor.userId(),
-        _id: {$ne: Session.get('currentBoard')},
+        _id: {$nin: [Session.get('currentBoard'), Meteor.user().profile.templatesBoardId]},
       });
     }
     if (!board) {

+ 2 - 0
models/boards.js

@@ -473,6 +473,8 @@ Boards.helpers({
     if (this.isTemplatesBoard()) {
       query.type = 'template-card';
       query.archived = false;
+    } else {
+        query.type = {$nin: ['template-card']};
     }
     const projection = { limit: 10, sort: { createdAt: -1 } };
 

+ 6 - 0
models/cardComments.js

@@ -67,6 +67,12 @@ CardComments.allow({
 });
 
 CardComments.helpers({
+  copy(newCardId) {
+    this.cardId = newCardId;
+    this._id = null;
+    CardComments.insert(this);
+  },
+
   user() {
     return Users.findOne(this.userId);
   },

+ 25 - 0
models/cards.js

@@ -272,6 +272,31 @@ Cards.allow({
 });
 
 Cards.helpers({
+  copy() {
+      const oldId = this._id;
+      this._id = null;
+      const _id = Cards.insert(this);
+
+      // copy checklists
+      Checklists.find({cardId: oldId}).forEach((ch) => {
+          ch.copy(_id);
+      });
+
+      // copy subtasks
+      Cards.find({parentId: oldId}).forEach((subtask) => {
+        subtask.parentId = _id;
+        subtask._id = null;
+        Cards.insert(subtask);
+      });
+
+      // copy card comments
+      CardComments.find({cardId: oldId}).forEach((cmt) => {
+          cmt.copy(_id);
+      });
+
+      return _id;
+  },
+
   list() {
     return Lists.findOne(this.listId);
   },

+ 13 - 0
models/checklists.js

@@ -48,6 +48,19 @@ Checklists.attachSchema(new SimpleSchema({
 }));
 
 Checklists.helpers({
+  copy(newCardId) {
+      const oldChecklistId = this._id;
+      this._id = null;
+      this.cardId = newCardId;
+      const newChecklistId = Checklists.insert(this);
+      ChecklistItems.find({checklistId: oldChecklistId}).forEach((item) => {
+        item._id = null;
+        item.checklistId = newChecklistId;
+        item.cardId = newCardId;
+        ChecklistItems.insert(item);
+      });
+  },
+
   itemCount() {
     return ChecklistItems.find({ checklistId: this._id }).count();
   },