diff options
-rw-r--r-- | client/components/cards/cardDetails.js | 14 | ||||
-rw-r--r-- | models/activities.js | 2 | ||||
-rw-r--r-- | models/cards.js | 6 | ||||
-rw-r--r-- | models/export.js | 2 | ||||
-rw-r--r-- | models/subtasks.js | 167 | ||||
-rw-r--r-- | server/migrations.js | 13 | ||||
-rw-r--r-- | server/publications/boards.js | 2 |
7 files changed, 29 insertions, 177 deletions
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 8d917830..4731e448 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -136,7 +136,7 @@ BlazeComponent.extendComponent({ Subtasks.update(subtask._id, { $set: { - sort: sortIndex.base, + subtaskSort: sortIndex.base, }, }); }, @@ -449,13 +449,13 @@ Template.copyCardPopup.events({ }); // copy subtasks - cursor = Subtasks.find({cardId: oldId}); + cursor = Cards.find({parentId: oldId}); cursor.forEach(function() { 'use strict'; const subtask = arguments[0]; - subtask.cardId = _id; + subtask.parentId = _id; subtask._id = null; - /* const newSubtaskId = */ Subtasks.insert(subtask); + /* const newSubtaskId = */ Cards.insert(subtask); }); // copy card comments @@ -509,13 +509,13 @@ Template.copyChecklistToManyCardsPopup.events({ }); // copy subtasks - cursor = Subtasks.find({cardId: oldId}); + cursor = Cards.find({parentId: oldId}); cursor.forEach(function() { 'use strict'; const subtask = arguments[0]; - subtask.cardId = _id; + subtask.parentId = _id; subtask._id = null; - /* const newSubtaskId = */ Subtasks.insert(subtask); + /* const newSubtaskId = */ Cards.insert(subtask); }); // copy card comments diff --git a/models/activities.js b/models/activities.js index 1ff0a299..5b54759c 100644 --- a/models/activities.js +++ b/models/activities.js @@ -45,7 +45,7 @@ Activities.helpers({ return ChecklistItems.findOne(this.checklistItemId); }, subtasks() { - return Subtasks.findOne(this.subtaskId); + return Cards.findOne(this.subtaskId); }, customField() { return CustomFields.findOne(this.customFieldId); diff --git a/models/cards.js b/models/cards.js index ca0e16be..4ec3ea7c 100644 --- a/models/cards.js +++ b/models/cards.js @@ -127,6 +127,12 @@ Cards.attachSchema(new SimpleSchema({ type: Number, decimal: true, }, + subtaskSort: { + type: Number, + decimal: true, + defaultValue: -1, + optional: true, + }, })); Cards.allow({ diff --git a/models/export.js b/models/export.js index 778633f9..8c4c29d4 100644 --- a/models/export.js +++ b/models/export.js @@ -62,7 +62,7 @@ class Exporter { result.cards.forEach((card) => { result.checklists.push(...Checklists.find({ cardId: card._id }).fetch()); result.checklistItems.push(...ChecklistItems.find({ cardId: card._id }).fetch()); - result.subtaskItems.push(...Subtasks.find({ cardId: card._id }).fetch()); + result.subtaskItems.push(...Cards.find({ parentid: card._id }).fetch()); }); // [Old] for attachments we only export IDs and absolute url to original doc diff --git a/models/subtasks.js b/models/subtasks.js deleted file mode 100644 index 3f8b932c..00000000 --- a/models/subtasks.js +++ /dev/null @@ -1,167 +0,0 @@ -Subtasks = new Mongo.Collection('subtasks'); - -Subtasks.attachSchema(new SimpleSchema({ - title: { - type: String, - }, - startAt: { // this is a predicted time - type: Date, - optional: true, - }, - endAt: { // this is a predicted time - type: Date, - optional: true, - }, - finishedAt: { // The date & time when it is marked as being done - type: Date, - optional: true, - }, - createdAt: { - type: Date, - denyUpdate: false, - autoValue() { // eslint-disable-line consistent-return - if (this.isInsert) { - return new Date(); - } else { - this.unset(); - } - }, - }, - sort: { - type: Number, - decimal: true, - }, - isFinished: { - type: Boolean, - defaultValue: false, - }, - cardId: { - type: String, - }, -})); - -Subtasks.helpers({ - // ... -}); - -Subtasks.allow({ - insert(userId, doc) { - return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); - }, - update(userId, doc) { - return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); - }, - remove(userId, doc) { - return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); - }, - fetch: ['userId', 'cardId'], -}); - -Subtasks.before.insert((userId, doc) => { - doc.createdAt = new Date(); - if (!doc.userId) { - doc.userId = userId; - } -}); - -// Mutations -Subtasks.mutations({ - setTitle(title) { - return { $set: { title } }; - }, - toggleItem() { - return { $set: { isFinished: !this.isFinished } }; - }, - move(sortIndex) { - const mutatedFields = { - sort: sortIndex, - }; - - return {$set: mutatedFields}; - }, -}); - -// Activities helper -function itemCreation(userId, doc) { - const card = Cards.findOne(doc.cardId); - const boardId = card.boardId; - Activities.insert({ - userId, - activityType: 'addSubtaskItem', - cardId: doc.cardId, - boardId, - subtaskItemId: doc._id, - }); -} - -function itemRemover(userId, doc) { - Activities.remove({ - subtaskItemId: doc._id, - }); -} - -// Activities -if (Meteor.isServer) { - Meteor.startup(() => { - Subtasks._collection._ensureIndex({ cardId: 1 }); - }); - - Subtasks.after.insert((userId, doc) => { - itemCreation(userId, doc); - }); - - Subtasks.after.remove((userId, doc) => { - itemRemover(userId, doc); - }); -} - -// APIs -if (Meteor.isServer) { - JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) { - Authentication.checkUserId( req.userId); - const paramItemId = req.params.itemId; - const subtaskItem = Subtasks.findOne({ _id: paramItemId }); - if (subtaskItem) { - JsonRoutes.sendResult(res, { - code: 200, - data: subtaskItem, - }); - } else { - JsonRoutes.sendResult(res, { - code: 500, - }); - } - }); - - JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) { - Authentication.checkUserId( req.userId); - - const paramItemId = req.params.itemId; - - if (req.body.hasOwnProperty('isFinished')) { - Subtasks.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}}); - } - if (req.body.hasOwnProperty('title')) { - Subtasks.direct.update({_id: paramItemId}, {$set: {title: req.body.title}}); - } - - JsonRoutes.sendResult(res, { - code: 200, - data: { - _id: paramItemId, - }, - }); - }); - - JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/subtasks/:itemId', function (req, res) { - Authentication.checkUserId( req.userId); - const paramItemId = req.params.itemId; - Subtasks.direct.remove({ _id: paramItemId }); - JsonRoutes.sendResult(res, { - code: 200, - data: { - _id: paramItemId, - }, - }); - }); -} diff --git a/server/migrations.js b/server/migrations.js index 3ab3070d..c49581f5 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -282,3 +282,16 @@ Migrations.add('add-subtasks-boards', () => { }, }, noValidateMulti); }); + +Migrations.add('add-subtasks-sort', () => { + Boards.update({ + subtaskSort: { + $exists: false, + }, + }, { + $set: { + subtaskSort: -1, + }, + }, noValidateMulti); +}); + diff --git a/server/publications/boards.js b/server/publications/boards.js index 5b6bf139..5d095c17 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -103,7 +103,7 @@ Meteor.publishRelations('board', function(boardId) { this.cursor(Attachments.find({ cardId })); this.cursor(Checklists.find({ cardId })); this.cursor(ChecklistItems.find({ cardId })); - this.cursor(Subtasks.find({ cardId })); + this.cursor(Cards.find({ parentId: cardId })); }); if (board.members) { |