Add checklist items model, migration and publication

This commit is contained in:
Andrés Manelli 2018-03-19 00:25:19 -03:00
parent 83848dbee2
commit bf7de463f1
4 changed files with 116 additions and 26 deletions

85
models/checklistItems.js Normal file
View file

@ -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);
});
}

View file

@ -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();

View file

@ -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
);
});
});

View file

@ -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) {