summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/boards.js32
-rw-r--r--models/cards.js30
-rw-r--r--models/settings.js4
-rw-r--r--models/trelloCreator.js8
-rw-r--r--models/users.js66
5 files changed, 110 insertions, 30 deletions
diff --git a/models/boards.js b/models/boards.js
index 35ee1a36..26dc6127 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -493,6 +493,14 @@ Boards.attachSchema(
type: String,
defaultValue: 'board',
},
+ sort: {
+ /**
+ * Sort value
+ */
+ type: Number,
+ decimal: true,
+ defaultValue: -1,
+ },
}),
);
@@ -1186,6 +1194,10 @@ Boards.mutations({
setPresentParentTask(presentParentTask) {
return { $set: { presentParentTask } };
},
+
+ move(sortIndex) {
+ return { $set: { sort: sortIndex } };
+ },
});
function boardRemover(userId, doc) {
@@ -1283,6 +1295,17 @@ if (Meteor.isServer) {
});
}
+// Insert new board at last position in sort order.
+Boards.before.insert((userId, doc) => {
+ const lastBoard = Boards.findOne(
+ { sort: { $exists: true } },
+ { sort: { sort: -1 } },
+ );
+ if (lastBoard && typeof lastBoard.sort !== 'undefined') {
+ doc.sort = lastBoard.sort + 1;
+ }
+});
+
if (Meteor.isServer) {
// Let MongoDB ensure that a member is not included twice in the same board
Meteor.startup(() => {
@@ -1466,7 +1489,7 @@ if (Meteor.isServer) {
'members.userId': paramUserId,
},
{
- sort: ['title'],
+ sort: { sort: 1 /* boards default sorting */ },
},
).map(function(board) {
return {
@@ -1496,7 +1519,12 @@ if (Meteor.isServer) {
Authentication.checkUserId(req.userId);
JsonRoutes.sendResult(res, {
code: 200,
- data: Boards.find({ permission: 'public' }).map(function(doc) {
+ data: Boards.find(
+ { permission: 'public' },
+ {
+ sort: { sort: 1 /* boards default sorting */ },
+ },
+ ).map(function(doc) {
return {
_id: doc._id,
title: doc.title,
diff --git a/models/cards.js b/models/cards.js
index 5a812679..72153132 100644
--- a/models/cards.js
+++ b/models/cards.js
@@ -732,7 +732,7 @@ Cards.helpers({
parentString(sep) {
return this.parentList()
- .map(function (elem) {
+ .map(function(elem) {
return elem.title;
})
.join(sep);
@@ -1050,13 +1050,13 @@ Cards.helpers({
voteMemberPositive() {
if (this.vote && this.vote.positive)
- return Users.find({ _id: { $in: this.vote.positive } })
- return []
+ return Users.find({ _id: { $in: this.vote.positive } });
+ return [];
},
voteMemberNegative() {
if (this.vote && this.vote.negative)
- return Users.find({ _id: { $in: this.vote.negative } })
- return []
+ return Users.find({ _id: { $in: this.vote.negative } });
+ return [];
},
getId() {
@@ -1929,7 +1929,7 @@ if (Meteor.isServer) {
});
//New activity for card moves
- Cards.after.update(function (userId, doc, fieldNames) {
+ Cards.after.update(function(userId, doc, fieldNames) {
const oldListId = this.previous.listId;
const oldSwimlaneId = this.previous.swimlaneId;
const oldBoardId = this.previous.boardId;
@@ -1975,7 +1975,7 @@ if (Meteor.isServer) {
// change list modifiedAt, when user modified the key values in timingaction array, if it's endAt, put the modifiedAt of list back to one year ago for sorting purpose
const modifiedAt = new Date(
new Date(value).getTime() -
- (action === 'endAt' ? 365 * 24 * 3600 * 1e3 : 0),
+ (action === 'endAt' ? 365 * 24 * 3600 * 1e3 : 0),
); // set it as 1 year before
const boardId = list.boardId;
Lists.direct.update(
@@ -2029,7 +2029,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'GET',
'/api/boards/:boardId/swimlanes/:swimlaneId/cards',
- function (req, res) {
+ function(req, res) {
const paramBoardId = req.params.boardId;
const paramSwimlaneId = req.params.swimlaneId;
Authentication.checkBoardAccess(req.userId, paramBoardId);
@@ -2039,7 +2039,7 @@ if (Meteor.isServer) {
boardId: paramBoardId,
swimlaneId: paramSwimlaneId,
archived: false,
- }).map(function (doc) {
+ }).map(function(doc) {
return {
_id: doc._id,
title: doc.title,
@@ -2063,7 +2063,7 @@ if (Meteor.isServer) {
* title: string,
* description: string}]
*/
- JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function (
+ JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId/cards', function(
req,
res,
) {
@@ -2076,7 +2076,7 @@ if (Meteor.isServer) {
boardId: paramBoardId,
listId: paramListId,
archived: false,
- }).map(function (doc) {
+ }).map(function(doc) {
return {
_id: doc._id,
title: doc.title,
@@ -2098,7 +2098,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'GET',
'/api/boards/:boardId/lists/:listId/cards/:cardId',
- function (req, res) {
+ function(req, res) {
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
const paramCardId = req.params.cardId;
@@ -2130,7 +2130,7 @@ if (Meteor.isServer) {
* @param {string} [assignees] the array of maximum one ID of assignee of the new card
* @return_type {_id: string}
*/
- JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function (
+ JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function(
req,
res,
) {
@@ -2237,7 +2237,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'PUT',
'/api/boards/:boardId/lists/:listId/cards/:cardId',
- function (req, res) {
+ function(req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramCardId = req.params.cardId;
@@ -2536,7 +2536,7 @@ if (Meteor.isServer) {
JsonRoutes.add(
'DELETE',
'/api/boards/:boardId/lists/:listId/cards/:cardId',
- function (req, res) {
+ function(req, res) {
Authentication.checkUserId(req.userId);
const paramBoardId = req.params.boardId;
const paramListId = req.params.listId;
diff --git a/models/settings.js b/models/settings.js
index 0d671aa4..fb823205 100644
--- a/models/settings.js
+++ b/models/settings.js
@@ -334,6 +334,10 @@ if (Meteor.isServer) {
getDefaultAuthenticationMethod() {
return process.env.DEFAULT_AUTHENTICATION_METHOD;
},
+
+ isPasswordLoginDisabled() {
+ return process.env.PASSWORD_LOGIN_ENABLED === 'false';
+ },
});
}
diff --git a/models/trelloCreator.js b/models/trelloCreator.js
index 28982f43..1c5bcd93 100644
--- a/models/trelloCreator.js
+++ b/models/trelloCreator.js
@@ -1,4 +1,4 @@
-const DateString = Match.Where(function (dateAsString) {
+const DateString = Match.Where(function(dateAsString) {
check(dateAsString, String);
return moment(dateAsString, moment.ISO_8601).isValid();
});
@@ -299,13 +299,13 @@ export class TrelloCreator {
}
}
return true;
- })
+ });
if (positiveVotes.length > 0) {
cardToCreate.vote = {
question: cardToCreate.title,
public: true,
positive: positiveVotes,
- }
+ };
}
}
@@ -369,7 +369,7 @@ export class TrelloCreator {
// so we make it server only, and let UI catch up once it is done, forget about latency comp.
const self = this;
if (Meteor.isServer) {
- file.attachData(att.url, function (error) {
+ file.attachData(att.url, function(error) {
file.boardId = boardId;
file.cardId = cardId;
file.userId = self._user(att.idMemberCreator);
diff --git a/models/users.js b/models/users.js
index 8a05a0d2..ebb14f5f 100644
--- a/models/users.js
+++ b/models/users.js
@@ -190,6 +190,13 @@ Users.attachSchema(
type: Number,
optional: true,
},
+ 'profile.startDayOfWeek': {
+ /**
+ * startDayOfWeek field of the user
+ */
+ type: Number,
+ optional: true,
+ },
'profile.starredBoards': {
/**
* list of starred board IDs
@@ -377,8 +384,8 @@ if (Meteor.isClient) {
return board && board.hasWorker(this._id);
},
- isBoardAdmin() {
- const board = Boards.findOne(Session.get('currentBoard'));
+ isBoardAdmin(boardId = Session.get('currentBoard')) {
+ const board = Boards.findOne(boardId);
return board && board.hasAdmin(this._id);
},
});
@@ -386,12 +393,20 @@ if (Meteor.isClient) {
Users.helpers({
boards() {
- return Boards.find({ 'members.userId': this._id });
+ return Boards.find(
+ { 'members.userId': this._id },
+ { sort: { sort: 1 /* boards default sorting */ } },
+ );
},
starredBoards() {
const { starredBoards = [] } = this.profile || {};
- return Boards.find({ archived: false, _id: { $in: starredBoards } });
+ return Boards.find(
+ { archived: false, _id: { $in: starredBoards } },
+ {
+ sort: { sort: 1 /* boards default sorting */ },
+ },
+ );
},
hasStarred(boardId) {
@@ -401,7 +416,12 @@ Users.helpers({
invitedBoards() {
const { invitedBoards = [] } = this.profile || {};
- return Boards.find({ archived: false, _id: { $in: invitedBoards } });
+ return Boards.find(
+ { archived: false, _id: { $in: invitedBoards } },
+ {
+ sort: { sort: 1 /* boards default sorting */ },
+ },
+ );
},
isInvitedTo(boardId) {
@@ -508,6 +528,12 @@ Users.helpers({
return profile.language || 'en';
},
+ getStartDayOfWeek() {
+ const profile = this.profile || {};
+ // default is 'Monday' (1)
+ return profile.startDayOfWeek ?? 1;
+ },
+
getTemplatesBoardId() {
return (this.profile || {}).templatesBoardId;
},
@@ -639,6 +665,10 @@ Users.mutations({
return { $set: { 'profile.showCardsCountAt': limit } };
},
+ setStartDayOfWeek(startDay) {
+ return { $set: { 'profile.startDayOfWeek': startDay } };
+ },
+
setBoardView(view) {
return {
$set: {
@@ -669,6 +699,10 @@ Meteor.methods({
check(limit, Number);
Meteor.user().setShowCardsCountAt(limit);
},
+ changeStartDayOfWeek(startDay) {
+ check(startDay, Number);
+ Meteor.user().setStartDayOfWeek(startDay);
+ },
});
if (Meteor.isServer) {
@@ -814,6 +848,16 @@ if (Meteor.isServer) {
board.addMember(user._id);
user.addInvite(boardId);
+ //Check if there is a subtasks board
+ if (board.subtasksDefaultBoardId) {
+ const subBoard = Boards.findOne(board.subtasksDefaultBoardId);
+ //If there is, also add user to that board
+ if (subBoard) {
+ subBoard.addMember(user._id);
+ user.addInvite(subBoard._id);
+ }
+ }
+
try {
const params = {
user: user.username,
@@ -942,6 +986,7 @@ const addCronJob = _.debounce(
schedule: parser => parser.text('every 1 days'),
job: () => {
for (const user of Users.find()) {
+ if (!user.profile || !user.profile.notifications) continue;
for (const notification of user.profile.notifications) {
if (notification.read) {
const removeDate = new Date(notification.read);
@@ -1281,10 +1326,13 @@ if (Meteor.isServer) {
let data = Meteor.users.findOne({ _id: id });
if (data !== undefined) {
if (action === 'takeOwnership') {
- data = Boards.find({
- 'members.userId': id,
- 'members.isAdmin': true,
- }).map(function(board) {
+ data = Boards.find(
+ {
+ 'members.userId': id,
+ 'members.isAdmin': true,
+ },
+ { sort: { sort: 1 /* boards default sorting */ } },
+ ).map(function(board) {
if (board.hasMember(req.userId)) {
board.removeMember(req.userId);
}