summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrés Manelli <andresmanelli@gmail.com>2018-03-19 00:25:19 -0300
committerAndrés Manelli <andresmanelli@gmail.com>2018-03-19 01:25:33 -0300
commitbf7de463f1f71f1758b62187667bf3a7e55585ff (patch)
tree61c06deb85d6bd401d2acb7cc9960777cb7f65f4
parent83848dbee2e6e283e33667cfa9649aafc7c07f4e (diff)
downloadwekan-bf7de463f1f71f1758b62187667bf3a7e55585ff.tar.gz
wekan-bf7de463f1f71f1758b62187667bf3a7e55585ff.tar.bz2
wekan-bf7de463f1f71f1758b62187667bf3a7e55585ff.zip
Add checklist items model, migration and publication
-rw-r--r--models/checklistItems.js85
-rw-r--r--models/checklists.js35
-rw-r--r--server/migrations.js21
-rw-r--r--server/publications/boards.js1
4 files changed, 116 insertions, 26 deletions
diff --git a/models/checklistItems.js b/models/checklistItems.js
new file mode 100644
index 00000000..47e37c87
--- /dev/null
+++ b/models/checklistItems.js
@@ -0,0 +1,85 @@
+ChecklistItems = new Mongo.Collection('checklistItems');
+
+ChecklistItems.attachSchema(new SimpleSchema({
+ title: {
+ type: String,
+ },
+ sort: {
+ type: Number,
+ decimal: true,
+ },
+ isFinished: {
+ type: Boolean,
+ defaultValue: false,
+ },
+ checklistId: {
+ type: String,
+ },
+ cardId: {
+ type: String,
+ },
+}));
+
+ChecklistItems.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'],
+});
+
+ChecklistItems.before.insert((userId, doc) => {
+ if (!doc.userId) {
+ doc.userId = userId;
+ }
+});
+
+// Mutations
+ChecklistItems.mutations({
+ setTitle(title) {
+ return { $set: { title } };
+ },
+ toggleItem() {
+ return { $set: { isFinished: !this.isFinished } };
+ },
+});
+
+// Activities helper
+function itemCreation(userId, doc) {
+ const card = Cards.findOne(doc.cardId);
+ const boardId = card.boardId;
+ Activities.insert({
+ userId,
+ activityType: 'addChecklistItem',
+ cardId: doc.cardId,
+ boardId,
+ checklistId: doc.checklistId,
+ checklistItemId: doc._id,
+ });
+}
+
+function itemRemover(userId, doc) {
+ Activities.remove({
+ checklistItemId: doc._id,
+ });
+}
+
+// Activities
+if (Meteor.isServer) {
+ Meteor.startup(() => {
+ ChecklistItems._collection._ensureIndex({ checklistId: 1 });
+ });
+
+ ChecklistItems.after.insert((userId, doc) => {
+ itemCreation(userId, doc);
+ });
+
+ ChecklistItems.after.remove((userId, doc) => {
+ itemRemover(userId, doc);
+ });
+}
diff --git a/models/checklists.js b/models/checklists.js
index 7eb0a24f..d9b15140 100644
--- a/models/checklists.js
+++ b/models/checklists.js
@@ -7,24 +7,6 @@ Checklists.attachSchema(new SimpleSchema({
title: {
type: String,
},
- items: {
- type: [Object],
- defaultValue: [],
- },
- 'items.$._id': {
- type: String,
- },
- 'items.$.title': {
- type: String,
- },
- 'items.$.sort': {
- type: Number,
- decimal: true,
- },
- 'items.$.isFinished': {
- type: Boolean,
- defaultValue: false,
- },
finishedAt: {
type: Date,
optional: true,
@@ -46,19 +28,20 @@ Checklists.attachSchema(new SimpleSchema({
},
}));
-const self = Checklists;
-
Checklists.helpers({
itemCount() {
- return this.items.length;
+ return ChecklistItems.find({ checklistId: this._id }).count();
},
- getItemsSorted() {
- return _.sortBy(this.items, 'sort');
+ items() {
+ return ChecklistItems.find(Filter.mongoSelector({
+ checklistId: this._id,
+ }), { sort: ['sort'] });
},
finishedCount() {
- return this.items.filter((item) => {
- return item.isFinished;
- }).length;
+ return ChecklistItems.find({
+ checklistId: this._id,
+ isFinished: true,
+ }).count();
},
isFinished() {
return 0 !== this.itemCount() && this.itemCount() === this.finishedCount();
diff --git a/server/migrations.js b/server/migrations.js
index f2cb124b..467dd4c2 100644
--- a/server/migrations.js
+++ b/server/migrations.js
@@ -187,3 +187,24 @@ Migrations.add('add-views', () => {
}
});
});
+
+Migrations.add('add-checklist-items', () => {
+ Checklists.find().forEach((checklist) => {
+ // Create new items
+ _.sortBy(checklist.items, 'sort').forEach((item) => {
+ ChecklistItems.direct.insert({
+ title: item.title,
+ sort: item.sort,
+ isFinished: item.isFinished,
+ checklistId: checklist._id,
+ cardId: checklist.cardId,
+ });
+ });
+
+ // Delete old ones
+ Checklists.direct.update({ _id: checklist._id },
+ { $unset: { items : 1 } },
+ noValidate
+ );
+ });
+});
diff --git a/server/publications/boards.js b/server/publications/boards.js
index 889bd177..17d87f3a 100644
--- a/server/publications/boards.js
+++ b/server/publications/boards.js
@@ -101,6 +101,7 @@ Meteor.publishRelations('board', function(boardId) {
this.cursor(CardComments.find({ cardId }));
this.cursor(Attachments.find({ cardId }));
this.cursor(Checklists.find({ cardId }));
+ this.cursor(ChecklistItems.find({ cardId }));
});
if (board.members) {