mirror of https://github.com/wekan/wekan
The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.5 KiB
165 lines
3.5 KiB
![]()
8 years ago
|
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);
|
||
|
}
|
||
|
});
|
||
|
}
|