diff options
author | Lauri Ojansivu <x@xet7.org> | 2017-02-10 09:54:23 +0200 |
---|---|---|
committer | Lauri Ojansivu <x@xet7.org> | 2017-02-10 09:54:23 +0200 |
commit | 0065ca3ad6a3a627cde557b6c80f87c8c6267492 (patch) | |
tree | f832fde75ee9fba0310a51196c2e7ce90dedcfec /models/checklists.js | |
parent | 89959753cd10321fc21cf290bdd06f26b19874b9 (diff) | |
parent | 1f7d1f023ff4a6ec2e8923e54fe26c68fa7d9380 (diff) | |
download | wekan-0065ca3ad6a3a627cde557b6c80f87c8c6267492.tar.gz wekan-0065ca3ad6a3a627cde557b6c80f87c8c6267492.tar.bz2 wekan-0065ca3ad6a3a627cde557b6c80f87c8c6267492.zip |
Merge branch 'devel' into greenkeeper-xss-0.3.3
Diffstat (limited to 'models/checklists.js')
-rw-r--r-- | models/checklists.js | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/models/checklists.js b/models/checklists.js new file mode 100644 index 00000000..35be4dcc --- /dev/null +++ b/models/checklists.js @@ -0,0 +1,164 @@ +Checklists = new Mongo.Collection('checklists'); + +Checklists.attachSchema(new SimpleSchema({ + cardId: { + type: String, + }, + title: { + type: String, + }, + items: { + type: [Object], + defaultValue: [], + }, + 'items.$._id': { + type: String, + }, + 'items.$.title': { + type: String, + }, + 'items.$.isFinished': { + type: Boolean, + defaultValue: false, + }, + finishedAt: { + type: Date, + optional: true, + }, + createdAt: { + type: Date, + denyUpdate: false, + }, +})); + +Checklists.helpers({ + itemCount () { + return this.items.length; + }, + finishedCount () { + return this.items.filter((item) => { + return item.isFinished; + }).length; + }, + isFinished () { + return 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); + }, + getItem (_id) { + return _.findWhere(this.items, { _id }); + }, + itemIndex(itemId) { + return _.pluck(this.items, '_id').indexOf(itemId); + }, +}); + +Checklists.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'], +}); + +Checklists.before.insert((userId, doc) => { + doc.createdAt = new Date(); + if (!doc.userId) { + doc.userId = userId; + } +}); + +Checklists.mutations({ + //for checklist itself + setTitle(title){ + return { $set: { title }}; + }, + //for items in checklist + addItem(title) { + const itemCount = this.itemCount(); + const _id = `${this._id}${itemCount}`; + return { $addToSet: {items: {_id, title, isFinished: false}} }; + }, + removeItem(itemId) { + return {$pull: {items: {_id : itemId}}}; + }, + editItem(itemId, title) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.title`]: title, + }, + }; + } + return {}; + }, + finishItem(itemId) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: true, + }, + }; + } + return {}; + }, + resumeItem(itemId) { + if (this.getItem(itemId)) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: false, + }, + }; + } + return {}; + }, + toggleItem(itemId) { + const item = this.getItem(itemId); + if (item) { + const itemIndex = this.itemIndex(itemId); + return { + $set: { + [`items.${itemIndex}.isFinished`]: !item.isFinished, + }, + }; + } + return {}; + }, +}); + +if (Meteor.isServer) { + Checklists.after.insert((userId, doc) => { + Activities.insert({ + userId, + activityType: 'addChecklist', + cardId: doc.cardId, + boardId: Cards.findOne(doc.cardId).boardId, + checklistId: doc._id, + }); + }); + + //TODO: so there will be no activity for adding item into checklist, maybe will be implemented in the future. + // Checklists.after.update((userId, doc) => { + // console.log('update:', doc) + // Activities.insert({ + // userId, + // activityType: 'addChecklist', + // boardId: doc.boardId, + // cardId: doc.cardId, + // checklistId: doc._id, + // }); + // }); + + Checklists.before.remove((userId, doc) => { + const activity = Activities.findOne({ checklistId: doc._id }); + if (activity) { + Activities.remove(activity._id); + } + }); +} |