From dd95ecba98b02ede9ac474adfbdd963324eaf541 Mon Sep 17 00:00:00 2001 From: Maxime Quandalle Date: Sun, 6 Sep 2015 23:42:52 +0200 Subject: Fix some dead links This commit fixes the download link in the activity feed on the sidebar and the mention link on card description and comments (replaced by a popup). `eslint .` now passes without any error or warning. Fixes #286 --- client/components/activities/activities.js | 4 +-- client/components/main/editor.js | 52 +++++++++++++++++++++++++++++- client/components/users/userHeader.js | 2 +- client/config/blazeHelpers.js | 38 ---------------------- 4 files changed, 54 insertions(+), 42 deletions(-) (limited to 'client') diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index d6a0cf7f..5c5d8370 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -69,8 +69,8 @@ BlazeComponent.extendComponent({ attachmentLink() { const attachment = this.currentData().attachment(); return attachment && Blaze.toHTML(HTML.A({ - href: attachment.url(), - 'class': 'js-open-attachment-viewer', + href: attachment.url({ download: true }), + target: '_blank', }, attachment.name())); }, diff --git a/client/components/main/editor.js b/client/components/main/editor.js index c34539b3..1d88fe74 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -68,7 +68,55 @@ EscapeActions.register('textcomplete', () => dropdownMenuIsOpened ); +// 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 = Boards.findOne(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, linkClass, linkValue, link; + while (Boolean(currentMention = mentionRegex.exec(content))) { + + knowedUser = _.findWhere(knowedUsers, { username: currentMention[1] }); + if (!knowedUser) + continue; + + linkValue = [' ', at, knowedUser.username]; + linkClass = 'atMention js-open-member'; + if (knowedUser.userId === Meteor.userId()) + linkClass += ' me'; + link = HTML.A({ + 'class': linkClass, + // XXX Hack. Since we stringify this render function result below with + // `Blaze.toHTML` we can't rely on blaze data contexts to pass the + // `userId` to the popup as usual, and we need to store it in the DOM + // using a data attribute. + 'data-userId': knowedUser.userId, + }, linkValue); + + content = content.replace(currentMention[0], Blaze.toHTML(link)); + } + + return HTML.Raw(content); +})); + Template.viewer.events({ + 'click .js-open-member'(evt, tpl) { + const userId = evt.currentTarget.dataset.userid; + Popup.open('member').call({ userId }, evt, tpl); + }, + // Viewer sometimes have click-able wrapper around them (for instance to edit // the corresponding text). Clicking a link shouldn't fire these actions, stop // we stop these event at the viewer component level. @@ -81,6 +129,8 @@ Template.viewer.events({ // by using directly `_blank` attribute in the rendered HTML. evt.preventDefault(); const href = evt.currentTarget.href; - window.open(href, '_blank'); + if (href) { + window.open(href, '_blank'); + } }, }); diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index d8b1ee48..0f91fd15 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -35,7 +35,7 @@ Template.editProfilePopup.events({ // XXX For some reason the useraccounts autofocus isnt working in this case. // See https://github.com/meteor-useraccounts/core/issues/384 -Template.changePasswordPopup.onRendered(() => { +Template.changePasswordPopup.onRendered(function() { this.find('#at-field-current_password').focus(); }); diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index 2c55bc40..12990ed7 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -13,41 +13,3 @@ Blaze.registerHelper('currentCard', () => { }); 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); -})); -- cgit v1.2.3-1-g7c22