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.
230 lines
5.5 KiB
230 lines
5.5 KiB
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 } };
|
|
},
|
|
check(){
|
|
return { $set: { isFinished: true } };
|
|
},
|
|
uncheck(){
|
|
return { $set: { isFinished: false } };
|
|
},
|
|
toggleItem() {
|
|
return { $set: { isFinished: !this.isFinished } };
|
|
},
|
|
move(checklistId, sortIndex) {
|
|
const cardId = Checklists.findOne(checklistId).cardId;
|
|
const mutatedFields = {
|
|
cardId,
|
|
checklistId,
|
|
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: 'addChecklistItem',
|
|
cardId: doc.cardId,
|
|
boardId,
|
|
checklistId: doc.checklistId,
|
|
checklistItemId: doc._id,
|
|
checklistItemName:doc.title,
|
|
});
|
|
}
|
|
|
|
function itemRemover(userId, doc) {
|
|
const card = Cards.findOne(doc.cardId);
|
|
const boardId = card.boardId;
|
|
Activities.insert({
|
|
userId,
|
|
activityType: 'removedChecklistItem',
|
|
cardId: doc.cardId,
|
|
boardId,
|
|
checklistId: doc.checklistId,
|
|
checklistItemId: doc._id,
|
|
checklistItemName:doc.title,
|
|
});
|
|
Activities.remove({
|
|
checklistItemId: doc._id,
|
|
});
|
|
}
|
|
|
|
function publishCheckActivity(userId, doc){
|
|
const card = Cards.findOne(doc.cardId);
|
|
const boardId = card.boardId;
|
|
let activityType;
|
|
if(doc.isFinished){
|
|
activityType = 'checkedItem';
|
|
}else{
|
|
activityType = 'uncheckedItem';
|
|
}
|
|
const act = {
|
|
userId,
|
|
activityType,
|
|
cardId: doc.cardId,
|
|
boardId,
|
|
checklistId: doc.checklistId,
|
|
checklistItemId: doc._id,
|
|
checklistItemName:doc.title,
|
|
};
|
|
Activities.insert(act);
|
|
}
|
|
|
|
function publishChekListCompleted(userId, doc, fieldNames, modifier){
|
|
const card = Cards.findOne(doc.cardId);
|
|
const boardId = card.boardId;
|
|
const checklistId = doc.checklistId;
|
|
const checkList = Checklists.findOne({_id:checklistId});
|
|
if(checkList.isFinished()){
|
|
const act = {
|
|
userId,
|
|
activityType: 'checklistCompleted',
|
|
cardId: doc.cardId,
|
|
boardId,
|
|
checklistId: doc.checklistId,
|
|
checklistName:doc.title,
|
|
};
|
|
Activities.insert(act);
|
|
}
|
|
}
|
|
|
|
function publishChekListUncompleted(userId, doc, fieldNames, modifier){
|
|
const card = Cards.findOne(doc.cardId);
|
|
const boardId = card.boardId;
|
|
const checklistId = doc.checklistId;
|
|
const checkList = Checklists.findOne({_id:checklistId});
|
|
if(checkList.isFinished()){
|
|
const act = {
|
|
userId,
|
|
activityType: 'checklistUncompleted',
|
|
cardId: doc.cardId,
|
|
boardId,
|
|
checklistId: doc.checklistId,
|
|
checklistName:doc.title,
|
|
};
|
|
Activities.insert(act);
|
|
}
|
|
}
|
|
|
|
// Activities
|
|
if (Meteor.isServer) {
|
|
Meteor.startup(() => {
|
|
ChecklistItems._collection._ensureIndex({ checklistId: 1 });
|
|
});
|
|
|
|
ChecklistItems.after.update((userId, doc, fieldNames, modifier) => {
|
|
publishCheckActivity(userId, doc);
|
|
publishChekListCompleted(userId, doc, fieldNames, modifier);
|
|
});
|
|
|
|
ChecklistItems.before.update((userId, doc, fieldNames, modifier) => {
|
|
publishChekListUncompleted(userId, doc, fieldNames, modifier);
|
|
});
|
|
|
|
|
|
ChecklistItems.after.insert((userId, doc) => {
|
|
itemCreation(userId, doc);
|
|
});
|
|
|
|
ChecklistItems.after.remove((userId, doc) => {
|
|
itemRemover(userId, doc);
|
|
});
|
|
}
|
|
|
|
if (Meteor.isServer) {
|
|
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
|
Authentication.checkUserId( req.userId);
|
|
const paramItemId = req.params.itemId;
|
|
const checklistItem = ChecklistItems.findOne({ _id: paramItemId });
|
|
if (checklistItem) {
|
|
JsonRoutes.sendResult(res, {
|
|
code: 200,
|
|
data: checklistItem,
|
|
});
|
|
} else {
|
|
JsonRoutes.sendResult(res, {
|
|
code: 500,
|
|
});
|
|
}
|
|
});
|
|
|
|
JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
|
Authentication.checkUserId( req.userId);
|
|
|
|
const paramItemId = req.params.itemId;
|
|
|
|
if (req.body.hasOwnProperty('isFinished')) {
|
|
ChecklistItems.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
|
|
}
|
|
if (req.body.hasOwnProperty('title')) {
|
|
ChecklistItems.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/checklists/:checklistId/items/:itemId', function (req, res) {
|
|
Authentication.checkUserId( req.userId);
|
|
const paramItemId = req.params.itemId;
|
|
ChecklistItems.direct.remove({ _id: paramItemId });
|
|
JsonRoutes.sendResult(res, {
|
|
code: 200,
|
|
data: {
|
|
_id: paramItemId,
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|