瀏覽代碼

Refuse to delete a card as long as there is link to it

This fixes https://github.com/wekan/wekan/issues/2785.
Marc Hartmayer 5 年之前
父節點
當前提交
b740381a72
共有 2 個文件被更改,包括 25 次插入3 次删除
  1. 6 1
      client/components/cards/cardDetails.js
  2. 19 2
      client/components/lists/listHeader.js

+ 6 - 1
client/components/cards/cardDetails.js

@@ -967,7 +967,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) {

+ 19 - 2
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);
   }),
 });