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.
 
 
 
 
 
 
wekan/models/checklistItems.js

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