summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/components/cards/cardDetails.js7
-rw-r--r--client/components/lists/listBody.js7
-rw-r--r--client/components/lists/listHeader.js21
-rw-r--r--models/cards.js15
4 files changed, 42 insertions, 8 deletions
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index 7dcadfe3..048a7e1a 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -956,7 +956,12 @@ BlazeComponent.extendComponent({
},
'click .js-delete': Popup.afterConfirm('cardDelete', function() {
Popup.close();
- Cards.remove(this._id);
+ // verify that there are no linked cards
+ if (Cards.find({ linkedId: this._id }).count() === 0) {
+ Cards.remove(this._id);
+ } else {
+ // TODO popup...
+ }
Utils.goBoardId(this.boardId);
}),
'change .js-field-parent-board'(event) {
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js
index e0b3a66c..2d913aa9 100644
--- a/client/components/lists/listBody.js
+++ b/client/components/lists/listBody.js
@@ -658,10 +658,7 @@ BlazeComponent.extendComponent({
_id = element.copy(this.boardId, this.swimlaneId, this.listId);
// 1.B Linked card
} else {
- delete element._id;
- element.type = 'cardType-linkedCard';
- element.linkedId = element.linkedId || element._id;
- _id = Cards.insert(element);
+ _id = element.link(this.boardId, this.swimlaneId, this.listId);
}
Filter.addException(_id);
// List insertion
@@ -675,7 +672,7 @@ BlazeComponent.extendComponent({
element.sort = Boards.findOne(this.boardId)
.swimlanes()
.count();
- element.type = 'swimlalne';
+ element.type = 'swimlane';
_id = element.copy(this.boardId);
} else if (this.isBoardTemplateSearch) {
board = Boards.findOne(element.linkedId);
diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js
index 46dbd748..a839bb72 100644
--- a/client/components/lists/listHeader.js
+++ b/client/components/lists/listHeader.js
@@ -223,8 +223,25 @@ BlazeComponent.extendComponent({
Template.listMorePopup.events({
'click .js-delete': Popup.afterConfirm('listDelete', function() {
Popup.close();
- this.allCards().map(card => Cards.remove(card._id));
- Lists.remove(this._id);
+ // TODO how can we avoid the fetch call?
+ const allCards = this.allCards().fetch();
+ const allCardIds = _.pluck(allCards, '_id');
+ // it's okay if the linked cards are on the same list
+ if (
+ Cards.find({
+ $and: [
+ { listId: { $ne: this._id } },
+ { linkedId: { $in: allCardIds } },
+ ],
+ }).count() === 0
+ ) {
+ allCardIds.map(_id => Cards.remove(_id));
+ Lists.remove(this._id);
+ } else {
+ // TODO popup with a hint that the list cannot be deleted as there are
+ // linked cards. We can adapt the query above so we can list the linked
+ // cards.
+ }
Utils.goBoardId(this.boardId);
}),
});
diff --git a/models/cards.js b/models/cards.js
index 223677f1..aace2647 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -438,6 +438,21 @@ Cards.helpers({
return _id;
},
+ link(boardId, swimlaneId, listId) {
+ // TODO is there a better method to create a deepcopy?
+ linkCard = JSON.parse(JSON.stringify(this));
+ // TODO is this how it is meant to be?
+ linkCard.linkedId = linkCard.linkedId || linkCard._id;
+ linkCard.boardId = boardId;
+ linkCard.swimlaneId = swimlaneId;
+ linkCard.listId = listId;
+ linkCard.type = 'cardType-linkedCard';
+ delete linkCard._id;
+ // TODO shall we copy the labels for a linked card?!
+ delete linkCard.labelIds;
+ return Cards.insert(linkCard);
+ },
+
list() {
return Lists.findOne(this.listId);
},