Pārlūkot izejas kodu

Can add cards as subtasks

Nicu Tofan 7 gadi atpakaļ
vecāks
revīzija
5a023e4315
4 mainītis faili ar 92 papildinājumiem un 5 dzēšanām
  1. 22 4
      client/components/cards/subtasks.js
  2. 3 1
      i18n/en.i18n.json
  3. 54 0
      models/boards.js
  4. 13 0
      server/migrations.js

+ 22 - 4
client/components/cards/subtasks.js

@@ -12,13 +12,31 @@ BlazeComponent.extendComponent({
     const title = textarea.value.trim();
     const cardId = this.currentData().cardId;
     const card = Cards.findOne(cardId);
+    const sortIndex = -1;
+    const crtBoard = Boards.findOne(card.boardId);
+    const targetBoard = crtBoard.getDefaultSubtasksBoard();
+    const listId = targetBoard.getDefaultSubtasksListId();
+    const swimlaneId = Swimlanes.findOne({boardId: targetBoard._id})._id;
 
     if (title) {
-      Subtasks.insert({
-        cardId,
+      const _id = Cards.insert({
         title,
-        sort: card.subtasks().count(),
+        parentId: cardId,
+        members: [],
+        labelIds: [],
+        customFields: [],
+        listId,
+        boardId: targetBoard._id,
+        sort: sortIndex,
+        swimlaneId,
       });
+      // 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);
+
+
       setTimeout(() => {
         this.$('.add-subtask-item').last().click();
       }, 100);
@@ -34,7 +52,7 @@ BlazeComponent.extendComponent({
   deleteSubtask() {
     const subtask = this.currentData().subtask;
     if (subtask && subtask._id) {
-      Subtasks.remove(subtask._id);
+      Cards.remove(subtask._id);
       this.toggleDeleteDialog.set(false);
     }
   },

+ 3 - 1
i18n/en.i18n.json

@@ -479,5 +479,7 @@
     "board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
     "delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
     "boardDeletePopup-title": "Delete Board?",
-    "delete-board": "Delete Board"
+    "delete-board": "Delete Board",
+    "default-subtasks-board": "Subtasks for __board__ board",
+    "default": "Default"
 }

+ 54 - 0
models/boards.js

@@ -151,6 +151,16 @@ Boards.attachSchema(new SimpleSchema({
     type: String,
     optional: true,
   },
+  subtasksDefaultBoardId: {
+    type: String,
+    optional: true,
+    defaultValue: null,
+  },
+  subtasksDefaultListId: {
+    type: String,
+    optional: true,
+    defaultValue: null,
+  },
 }));
 
 
@@ -284,8 +294,52 @@ Boards.helpers({
 
     return Cards.find(query, projection);
   },
+  // A board alwasy has another board where it deposits subtasks of thasks
+  // that belong to itself.
+  getDefaultSubtasksBoardId() {
+    if (this.subtasksDefaultBoardId === null) {
+      this.subtasksDefaultBoardId = Boards.insert({
+        title: `^${this.title}^`,
+        permission: this.permission,
+        members: this.members,
+        color: this.color,
+        description: TAPi18n.__('default-subtasks-board', {board: this.title}),
+      });
+
+      Swimlanes.insert({
+        title: TAPi18n.__('default'),
+        boardId: this.subtasksDefaultBoardId,
+      });
+      Boards.update(this._id, {$set: {
+        subtasksDefaultBoardId: this.subtasksDefaultBoardId,
+      }});
+    }
+    return this.subtasksDefaultBoardId;
+  },
+
+  getDefaultSubtasksBoard() {
+    return Boards.findOne(this.getDefaultSubtasksBoardId());
+  },
+
+  getDefaultSubtasksListId() {
+    if (this.subtasksDefaultListId === null) {
+      this.subtasksDefaultListId = Lists.insert({
+        title: TAPi18n.__('new'),
+        boardId: this._id,
+      });
+      Boards.update(this._id, {$set: {
+        subtasksDefaultListId: this.subtasksDefaultListId,
+      }});
+    }
+    return this.subtasksDefaultListId;
+  },
+
+  getDefaultSubtasksList() {
+    return Lists.findOne(this.getDefaultSubtasksListId());
+  },
 });
 
+
 Boards.mutations({
   archive() {
     return { $set: { archived: true } };

+ 13 - 0
server/migrations.js

@@ -269,3 +269,16 @@ Migrations.add('add-parent-field-to-cards', () => {
     },
   }, noValidateMulti);
 });
+
+Migrations.add('add-subtasks-boards', () => {
+  Boards.update({
+    subtasksDefaultBoardId: {
+      $exists: false,
+    },
+  }, {
+    $set: {
+      subtasksDefaultBoardId: null,
+      subtasksDefaultListId: null,
+    },
+  }, noValidateMulti);
+});