summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/components/cards/cardDetails.js14
-rw-r--r--models/activities.js2
-rw-r--r--models/cards.js6
-rw-r--r--models/export.js2
-rw-r--r--models/subtasks.js167
-rw-r--r--server/migrations.js13
-rw-r--r--server/publications/boards.js2
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) {