summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Priour <xavier.priour@bubblyware.com>2015-10-23 03:38:38 +0200
committerXavier Priour <xavier.priour@bubblyware.com>2015-10-23 03:38:38 +0200
commit658ef5ebe112edd55eb8cf160e02a46eb2e13afd (patch)
tree91991e142582b1ae71f5369a8ef9c202908ba8c2
parent027aacb50e2baf715c89d914e34132458cf11691 (diff)
parentb3696e1e3b366770af8c41861b5cf996cdd2378a (diff)
downloadwekan-658ef5ebe112edd55eb8cf160e02a46eb2e13afd.tar.gz
wekan-658ef5ebe112edd55eb8cf160e02a46eb2e13afd.tar.bz2
wekan-658ef5ebe112edd55eb8cf160e02a46eb2e13afd.zip
Merge branch 'devel' into feature/import-board-members
-rw-r--r--.eslintrc1
-rw-r--r--.meteor/packages1
-rw-r--r--.meteor/versions2
-rw-r--r--client/components/cards/cardDetails.js5
-rw-r--r--client/components/cards/labels.js2
-rw-r--r--client/components/main/editor.js2
-rw-r--r--client/components/sidebar/sidebar.js4
-rw-r--r--client/components/users/userHeader.js2
-rw-r--r--client/config/accounts.js2
-rw-r--r--client/config/router.js23
-rw-r--r--client/lib/filter.js4
-rw-r--r--client/lib/modal.js4
-rw-r--r--client/lib/multiSelection.js9
-rw-r--r--client/lib/popup.js4
-rw-r--r--i18n/en.i18n.json2
-rw-r--r--models/boards.js2
-rw-r--r--models/users.js16
-rw-r--r--server/migrations.js6
-rw-r--r--server/publications/boards.js2
19 files changed, 61 insertions, 32 deletions
diff --git a/.eslintrc b/.eslintrc
index 081b2a56..c952e5e0 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -78,6 +78,7 @@ globals:
Avatars: true
BlazeComponent: false
BlazeLayout: false
+ DocHead: false
ESSearchResults: false
FlowRouter: false
FS: false
diff --git a/.meteor/packages b/.meteor/packages
index 765932d4..39242f48 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -50,6 +50,7 @@ alethes:pages
arillo:flow-router-helpers
audit-argument-checks
kadira:blaze-layout
+kadira:dochead
kadira:flow-router
meteorhacks:picker
meteorhacks:subs-manager
diff --git a/.meteor/versions b/.meteor/versions
index 9a2087f1..840f09f9 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -60,7 +60,9 @@ http@1.1.1
id-map@1.0.4
idmontie:migrations@1.0.0
jquery@1.11.4
+jsx@0.1.6
kadira:blaze-layout@2.2.0
+kadira:dochead@1.1.0
kadira:flow-router@2.7.0
kenton:accounts-sandstorm@0.1.6
launch-screen@1.0.4
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index 5e07abab..2d2679ec 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -62,7 +62,8 @@ BlazeComponent.extendComponent({
},
};
- return [_.extend(events, {
+ return [{
+ ...events,
'click .js-close-card-details'() {
Utils.goBoardId(this.data().boardId);
},
@@ -86,7 +87,7 @@ BlazeComponent.extendComponent({
this.parentComponent().showOverlay.set(true);
this.parentComponent().mouseHasEnterCardDetails = true;
},
- })];
+ }];
},
}).register('cardDetails');
diff --git a/client/components/cards/labels.js b/client/components/cards/labels.js
index 6a411561..4e61a0c6 100644
--- a/client/components/cards/labels.js
+++ b/client/components/cards/labels.js
@@ -13,7 +13,7 @@ BlazeComponent.extendComponent({
},
labels() {
- return _.map(labelColors, (color) => {
+ return labelColors.map((color) => {
return { color, name: '' };
});
},
diff --git a/client/components/main/editor.js b/client/components/main/editor.js
index 67b65bec..168c85d0 100644
--- a/client/components/main/editor.js
+++ b/client/components/main/editor.js
@@ -54,7 +54,7 @@ const at = HTML.CharRef({html: '&commat;', str: '@'});
Blaze.Template.registerHelper('mentions', new Template('mentions', function() {
const view = this;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
- const knowedUsers = _.map(currentBoard.members, (member) => {
+ const knowedUsers = currentBoard.members.map((member) => {
member.username = Users.findOne(member.userId).username;
return member;
});
diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js
index 72866055..ccb9f2f5 100644
--- a/client/components/sidebar/sidebar.js
+++ b/client/components/sidebar/sidebar.js
@@ -95,10 +95,10 @@ BlazeComponent.extendComponent({
events() {
// XXX Hacky, we need some kind of `super`
const mixinEvents = this.getMixin(Mixins.InfiniteScrolling).events();
- return mixinEvents.concat([{
+ return [...mixinEvents, {
'click .js-toggle-sidebar': this.toggle,
'click .js-back-home': this.setView,
- }]);
+ }];
},
}).register('sidebar');
diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js
index 0f91fd15..a7382769 100644
--- a/client/components/users/userHeader.js
+++ b/client/components/users/userHeader.js
@@ -41,7 +41,7 @@ Template.changePasswordPopup.onRendered(function() {
Template.changeLanguagePopup.helpers({
languages() {
- return _.map(TAPi18n.getLanguages(), (lang, tag) => {
+ return TAPi18n.getLanguages().map((lang, tag) => {
const name = lang.name;
return { tag, name };
});
diff --git a/client/config/accounts.js b/client/config/accounts.js
index df0935f7..d475e6b2 100644
--- a/client/config/accounts.js
+++ b/client/config/accounts.js
@@ -25,7 +25,7 @@ AccountsTemplates.configure({
},
});
-_.each(['signIn', 'signUp', 'resetPwd', 'forgotPwd', 'enrollAccount'],
+['signIn', 'signUp', 'resetPwd', 'forgotPwd', 'enrollAccount'].forEach(
(routeName) => AccountsTemplates.configureRoute(routeName));
// We display the form to change the password in a popup window that already
diff --git a/client/config/router.js b/client/config/router.js
index 1cac43a0..0a6958d0 100644
--- a/client/config/router.js
+++ b/client/config/router.js
@@ -88,3 +88,26 @@ _.each(redirections, (newPath, oldPath) => {
}],
});
});
+
+// As it is not possible to use template helpers in the page <head> we create a
+// reactive function whose role is to set any page-specific tag in the <head>
+// using the `kadira:dochead` package. Currently we only use it to display the
+// board title if we are in a board page (see #364) but we may want to support
+// some <meta> tags in the future.
+const appTitle = 'Wekan';
+
+// XXX The `Meteor.startup` should not be necessary -- we don't need to wait for
+// the complete DOM to be ready to call `DocHead.setTitle`. But the problem is
+// that the global variable `Boards` is undefined when this file loads so we
+// wait a bit until hopefully all files are loaded. This will be fixed in a
+// clean way once Meteor will support ES6 modules -- hopefully in Meteor 1.3.
+Meteor.startup(() => {
+ Tracker.autorun(() => {
+ const currentBoard = Boards.findOne(Session.get('currentBoard'));
+ const titleStack = [appTitle];
+ if (currentBoard) {
+ titleStack.push(currentBoard.title);
+ }
+ DocHead.setTitle(titleStack.reverse().join(' - '));
+ });
+});
diff --git a/client/lib/filter.js b/client/lib/filter.js
index f7baf480..74305284 100644
--- a/client/lib/filter.js
+++ b/client/lib/filter.js
@@ -95,7 +95,7 @@ Filter = {
return {};
const filterSelector = {};
- _.forEach(this._fields, (fieldName) => {
+ this._fields.forEach((fieldName) => {
const filter = this[fieldName];
if (filter._isActive())
filterSelector[fieldName] = filter._getMongoSelector();
@@ -116,7 +116,7 @@ Filter = {
},
reset() {
- _.forEach(this._fields, (fieldName) => {
+ this._fields.forEach((fieldName) => {
const filter = this[fieldName];
filter.reset();
});
diff --git a/client/lib/modal.js b/client/lib/modal.js
index 5b3392b2..7b7516e0 100644
--- a/client/lib/modal.js
+++ b/client/lib/modal.js
@@ -21,9 +21,9 @@ window.Modal = new class {
}
}
- open(modalName, options) {
+ open(modalName, { onCloseGoTo = ''}) {
this._currentModal.set(modalName);
- this._onCloseGoTo = options && options.onCloseGoTo || '';
+ this._onCloseGoTo = onCloseGoTo;
}
};
diff --git a/client/lib/multiSelection.js b/client/lib/multiSelection.js
index c2bb2bbc..eeb2015d 100644
--- a/client/lib/multiSelection.js
+++ b/client/lib/multiSelection.js
@@ -119,12 +119,13 @@ MultiSelection = {
}
},
- toggle(cardIds, options) {
+ toggle(cardIds, options = {}) {
cardIds = _.isString(cardIds) ? [cardIds] : cardIds;
- options = _.extend({
+ options = {
add: true,
remove: true,
- }, options || {});
+ ...options,
+ };
if (!this.isActive()) {
this.reset();
@@ -133,7 +134,7 @@ MultiSelection = {
const selectedCards = this._selectedCards.get();
- _.each(cardIds, (cardId) => {
+ cardIds.forEach((cardId) => {
const indexOfCard = selectedCards.indexOf(cardId);
if (options.remove && indexOfCard > -1)
diff --git a/client/lib/popup.js b/client/lib/popup.js
index 3c39af29..7418d938 100644
--- a/client/lib/popup.js
+++ b/client/lib/popup.js
@@ -91,7 +91,7 @@ window.Popup = new class {
if (!self.isOpen()) {
self.current = Blaze.renderWithData(self.template, () => {
self._dep.depend();
- return _.extend(self._getTopStack(), { stack: self._stack });
+ return { ...self._getTopStack(), stack: self._stack };
}, document.body);
} else {
@@ -191,7 +191,7 @@ window.Popup = new class {
// We close a potential opened popup on any left click on the document, or go
// one step back by pressing escape.
const escapeActions = ['back', 'close'];
-_.each(escapeActions, (actionName) => {
+escapeActions.forEach((actionName) => {
EscapeActions.register(`popup-${actionName}`,
() => Popup[actionName](),
() => Popup.isOpen(),
diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json
index d2f95392..eab6ab5a 100644
--- a/i18n/en.i18n.json
+++ b/i18n/en.i18n.json
@@ -14,7 +14,7 @@
"activity-on": "on %s",
"activity-removed": "removed %s from %s",
"activity-sent": "sent %s to %s",
- "activity-unjoined": "unjoinded %s",
+ "activity-unjoined": "unjoined %s",
"add": "Add",
"add-attachment": "Add an attachment",
"add-board": "Add a new board",
diff --git a/models/boards.js b/models/boards.js
index 4d9fd7c0..1d365a95 100644
--- a/models/boards.js
+++ b/models/boards.js
@@ -279,7 +279,7 @@ Boards.before.insert((userId, doc) => {
// Handle labels
const colors = Boards.simpleSchema()._schema['labels.$.color'].allowedValues;
const defaultLabelsColors = _.clone(colors).splice(0, 6);
- doc.labels = _.map(defaultLabelsColors, (color) => {
+ doc.labels = defaultLabelsColors.map((color) => {
return {
color,
_id: Random.id(6),
diff --git a/models/users.js b/models/users.js
index 1ea09a03..b35104ec 100644
--- a/models/users.js
+++ b/models/users.js
@@ -14,13 +14,13 @@ Users.helpers({
},
starredBoards() {
- const starredBoardIds = this.profile.starredBoards || [];
- return Boards.find({archived: false, _id: {$in: starredBoardIds}});
+ const {starredBoards = []} = this.profile;
+ return Boards.find({archived: false, _id: {$in: starredBoards}});
},
hasStarred(boardId) {
- const starredBoardIds = this.profile.starredBoards || [];
- return _.contains(starredBoardIds, boardId);
+ const {starredBoards = []} = this.profile;
+ return _.contains(starredBoards, boardId);
},
isBoardMember() {
@@ -54,9 +54,9 @@ Users.helpers({
return profile.initials;
else if (profile.fullname) {
- return _.reduce(profile.fullname.split(/\s+/), (memo, word) => {
+ return profile.fullname.split(/\s+/).reduce((memo = '', word) => {
return memo + word[0];
- }, '').toUpperCase();
+ }).toUpperCase();
} else {
return this.username[0].toUpperCase();
@@ -130,7 +130,7 @@ if (Meteor.isServer) {
// b. We use it to find deleted and newly inserted ids by using it in one
// direction and then in the other.
function incrementBoards(boardsIds, inc) {
- _.forEach(boardsIds, (boardId) => {
+ boardsIds.forEach((boardId) => {
Boards.update(boardId, {$inc: {stars: inc}});
});
}
@@ -149,7 +149,7 @@ if (Meteor.isServer) {
// Insert the Welcome Board
Boards.insert(ExampleBoard, (err, boardId) => {
- _.forEach(['Basics', 'Advanced'], (title) => {
+ ['Basics', 'Advanced'].forEach((title) => {
const list = {
title,
boardId,
diff --git a/server/migrations.js b/server/migrations.js
index 509d8510..99125976 100644
--- a/server/migrations.js
+++ b/server/migrations.js
@@ -43,7 +43,7 @@ Migrations.add('board-background-color', () => {
});
Migrations.add('lowercase-board-permission', () => {
- _.forEach(['Public', 'Private'], (permission) => {
+ ['Public', 'Private'].forEach((permission) => {
Boards.update(
{ permission },
{ $set: { permission: permission.toLowerCase() } },
@@ -116,11 +116,11 @@ Migrations.add('add-member-isactive-field', () => {
const formerUsers = _.difference(allUsersWithSomeActivity, currentUsers);
const newMemberSet = [];
- _.forEach(board.members, (member) => {
+ board.members.forEach((member) => {
member.isActive = true;
newMemberSet.push(member);
});
- _.forEach(formerUsers, (userId) => {
+ formerUsers.forEach((userId) => {
newMemberSet.push({
userId,
isAdmin: false,
diff --git a/server/publications/boards.js b/server/publications/boards.js
index 403d0084..4ab7a12e 100644
--- a/server/publications/boards.js
+++ b/server/publications/boards.js
@@ -10,7 +10,7 @@ Meteor.publish('boards', function() {
// Defensive programming to verify that starredBoards has the expected
// format -- since the field is in the `profile` a user can modify it.
- const starredBoards = Users.findOne(this.userId).profile.starredBoards || [];
+ const {starredBoards = []} = Users.findOne(this.userId).profile;
check(starredBoards, [String]);
return Boards.find({