diff options
Diffstat (limited to 'client/config')
-rw-r--r-- | client/config/accounts.js | 26 | ||||
-rw-r--r-- | client/config/blazeHelpers.js | 48 | ||||
-rw-r--r-- | client/config/reactiveTabs.js | 5 | ||||
-rw-r--r-- | client/config/router.js | 38 |
4 files changed, 77 insertions, 40 deletions
diff --git a/client/config/accounts.js b/client/config/accounts.js index a448d612..df0935f7 100644 --- a/client/config/accounts.js +++ b/client/config/accounts.js @@ -1,11 +1,11 @@ -var passwordField = AccountsTemplates.removeField('password'); -var emailField = AccountsTemplates.removeField('email'); +const passwordField = AccountsTemplates.removeField('password'); +const emailField = AccountsTemplates.removeField('email'); AccountsTemplates.addFields([{ _id: 'username', type: 'text', displayName: 'username', required: true, - minLength: 2 + minLength: 2, }, emailField, passwordField]); AccountsTemplates.configure({ @@ -15,36 +15,34 @@ AccountsTemplates.configure({ enablePasswordChange: true, sendVerificationEmail: true, showForgotPasswordLink: true, - onLogoutHook: function() { - var homePage = 'home'; + onLogoutHook() { + const homePage = 'home'; if (FlowRouter.getRouteName() === homePage) { FlowRouter.reload(); } else { FlowRouter.go(homePage); } - } + }, }); _.each(['signIn', 'signUp', 'resetPwd', 'forgotPwd', 'enrollAccount'], - function(routeName) { - AccountsTemplates.configureRoute(routeName); -}); + (routeName) => AccountsTemplates.configureRoute(routeName)); // We display the form to change the password in a popup window that already // have a title, so we unset the title automatically displayed by useraccounts. AccountsTemplates.configure({ texts: { title: { - changePwd: '' - } - } + changePwd: '', + }, + }, }); AccountsTemplates.configureRoute('changePwd', { - redirect: function() { + redirect() { // XXX We should emit a notification once we have a notification system. // Currently the user has no indication that his modification has been // applied. Popup.back(); - } + }, }); diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index 1be44728..2c55bc40 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -1,13 +1,53 @@ -Blaze.registerHelper('currentBoard', function() { - var boardId = Session.get('currentBoard'); +Blaze.registerHelper('currentBoard', () => { + const boardId = Session.get('currentBoard'); if (boardId) { return Boards.findOne(boardId); } }); -Blaze.registerHelper('currentCard', function() { - var cardId = Session.get('currentCard'); +Blaze.registerHelper('currentCard', () => { + const cardId = Session.get('currentCard'); if (cardId) { return Cards.findOne(cardId); } }); + +Blaze.registerHelper('getUser', (userId) => Users.findOne(userId)); + +// XXX I believe we should compute a HTML rendered field on the server that +// would handle markdown, emojies and user mentions. We can simply have two +// fields, one source, and one compiled version (in HTML) and send only the +// compiled version to most users -- who don't need to edit. +// In the meantime, all the transformation are done on the client using the +// Blaze API. +const at = HTML.CharRef({html: '@', str: '@'}); +Blaze.Template.registerHelper('mentions', new Template('mentions', function() { + const view = this; + const currentBoard = Session.get('currentBoard'); + const knowedUsers = _.map(currentBoard.members, (member) => { + member.username = Users.findOne(member.userId).username; + return member; + }); + const mentionRegex = /\B@(\w*)/gi; + let content = Blaze.toHTML(view.templateContentBlock); + + let currentMention, knowedUser, href, linkClass, linkValue, link; + while (Boolean(currentMention = mentionRegex.exec(content))) { + + knowedUser = _.findWhere(knowedUsers, { username: currentMention[1] }); + if (!knowedUser) + continue; + + linkValue = [' ', at, knowedUser.username]; + // XXX We need to convert to flow router + href = Router.url('Profile', { username: knowedUser.username }); + linkClass = 'atMention'; + if (knowedUser.userId === Meteor.userId()) + linkClass += ' me'; + link = HTML.A({ href, 'class': linkClass }, linkValue); + + content = content.replace(currentMention[0], Blaze.toHTML(link)); + } + + return HTML.Raw(content); +})); diff --git a/client/config/reactiveTabs.js b/client/config/reactiveTabs.js index 937057f7..5365c6d1 100644 --- a/client/config/reactiveTabs.js +++ b/client/config/reactiveTabs.js @@ -1,5 +1,4 @@ // XXX Since Blaze doesn't have a clean high component API, component API are // also tweaky to use. I guess React would be a solution. -ReactiveTabs.createInterface({ - template: 'basicTabs' -}); +const template = 'basicTabs'; +ReactiveTabs.createInterface({ template }); diff --git a/client/config/router.js b/client/config/router.js index 77b17b63..5260e03f 100644 --- a/client/config/router.js +++ b/client/config/router.js @@ -6,7 +6,7 @@ FlowRouter.triggers.exit([({path}) => { FlowRouter.route('/', { name: 'home', triggersEnter: [AccountsTemplates.ensureSignedIn], - action: function() { + action() { Session.set('currentBoard', null); Session.set('currentCard', null); @@ -14,14 +14,14 @@ FlowRouter.route('/', { EscapeActions.executeAll(); BlazeLayout.render('defaultLayout', { content: 'boardList' }); - } + }, }); FlowRouter.route('/b/:id/:slug', { name: 'board', - action: function(params) { - let currentBoard = params.id; - let previousBoard = Session.get('currentBoard'); + action(params) { + const currentBoard = params.id; + const previousBoard = Session.get('currentBoard'); Session.set('currentBoard', currentBoard); Session.set('currentCard', null); @@ -32,57 +32,57 @@ FlowRouter.route('/b/:id/:slug', { } BlazeLayout.render('defaultLayout', { content: 'board' }); - } + }, }); FlowRouter.route('/b/:boardId/:slug/:cardId', { name: 'card', - action: function(params) { + action(params) { Session.set('currentBoard', params.boardId); Session.set('currentCard', params.cardId); EscapeActions.executeUpTo('inlinedForm'); BlazeLayout.render('defaultLayout', { content: 'board' }); - } + }, }); FlowRouter.route('/shortcuts', { name: 'shortcuts', - action: function(params) { + action() { const shortcutsTemplate = 'keyboardShortcuts'; EscapeActions.executeUpTo('popup-close'); if (previousPath) { Modal.open(shortcutsTemplate, { - onCloseGoTo: previousPath + onCloseGoTo: previousPath, }); } else { // XXX There is currently no way to escape this page on Sandstorm BlazeLayout.render('defaultLayout', { content: shortcutsTemplate }); } - } + }, }); FlowRouter.notFound = { - action: function() { + action() { BlazeLayout.render('defaultLayout', { content: 'notFound' }); - } -} + }, +}; // We maintain a list of redirections to ensure that we don't break old URLs // when we change our routing scheme. -var redirections = { +const redirections = { '/boards': '/', '/boards/:id/:slug': '/b/:id/:slug', - '/boards/:id/:slug/:cardId': '/b/:id/:slug/:cardId' + '/boards/:id/:slug/:cardId': '/b/:id/:slug/:cardId', }; -_.each(redirections, function(newPath, oldPath) { +_.each(redirections, (newPath, oldPath) => { FlowRouter.route(oldPath, { - triggersEnter: [function(context, redirect) { + triggersEnter: [(context, redirect) => { redirect(FlowRouter.path(newPath, context.params)); - }] + }], }); }); |