diff --git a/app/assets/javascripts/discourse.js b/app/assets/javascripts/discourse.js index 4b845c4c8..d05de2e48 100644 --- a/app/assets/javascripts/discourse.js +++ b/app/assets/javascripts/discourse.js @@ -105,19 +105,20 @@ Discourse = Ember.Application.createWithMixins(Discourse.Ajax, { $('#main').on('click.discourse', 'a', function(e) { if (e.isDefaultPrevented() || e.shiftKey || e.metaKey || e.ctrlKey) { return; } - var $currentTarget = $(e.currentTarget); - var href = $currentTarget.attr('href'); - if (!href) { return; } - if (href === '#') { return; } - if ($currentTarget.attr('target')) { return; } - if ($currentTarget.data('auto-route')) { return; } + var $currentTarget = $(e.currentTarget), + href = $currentTarget.attr('href'); - // If it's an ember #link-to skip it - if ($currentTarget.hasClass('ember-view')) { return; } - - if ($currentTarget.hasClass('lightbox')) { return; } - if (href.indexOf("mailto:") === 0) { return; } - if (href.match(/^http[s]?:\/\//i) && !href.match(new RegExp("^http:\\/\\/" + window.location.hostname, "i"))) { return; } + if (!href || + href === '#' || + $currentTarget.attr('target') || + $currentTarget.data('ember-action') || + $currentTarget.data('auto-route') || + $currentTarget.hasClass('ember-view') || + $currentTarget.hasClass('lightbox') || + href.indexOf("mailto:") === 0 || + (href.match(/^http[s]?:\/\//i) && !href.match(new RegExp("^http:\\/\\/" + window.location.hostname, "i")))) { + return; + } e.preventDefault(); Discourse.URL.routeTo(href); diff --git a/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js b/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js new file mode 100644 index 000000000..61cab9438 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js @@ -0,0 +1,30 @@ +/** + A controller for expanding information about a poster. + + @class PosterExpansion + @extends Discourse.ObjectController + @namespace Discourse + @module Discourse +**/ +Discourse.PosterExpansionController = Discourse.ObjectController.extend({ + needs: ['topic'], + + show: function(user, post) { + this.setProperties({model: user, post: post}); + }, + + close: function() { + this.set('model', null); + }, + + actions: { + togglePosts: function(user) { + var postStream = this.get('controllers.topic.postStream'); + postStream.toggleParticipant(user.get('username')); + this.close(); + } + } + +}); + + diff --git a/app/assets/javascripts/discourse/models/post_stream.js b/app/assets/javascripts/discourse/models/post_stream.js index c8c6636fd..c4c0217d5 100644 --- a/app/assets/javascripts/discourse/models/post_stream.js +++ b/app/assets/javascripts/discourse/models/post_stream.js @@ -133,7 +133,6 @@ Discourse.PostStream = Em.Object.extend({ hasNoFilters: Em.computed.empty('filterDesc'), - /** Returns the window of posts above the current set in the stream, bound to the top of the stream. This is the collection we'll ask for when scrolling upwards. diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index 627918c61..b3fee4385 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -259,7 +259,6 @@ Discourse.User = Discourse.Model.extend({ json.user.invited_by = Discourse.User.create(json.user.invited_by); } - user.setProperties(json.user); return user; }); @@ -297,6 +296,17 @@ Discourse.User = Discourse.Model.extend({ Discourse.User.reopenClass(Discourse.Singleton, { + /** + Find a `Discourse.User` for a given username. + + @method findByUsername + @returns {Promise} a promise that resolves to a `Discourse.User` + **/ + findByUsername: function(username) { + var user = Discourse.User.create({username: username}); + return user.findDetails(); + }, + /** The current singleton will retrieve its attributes from the `PreloadStore` if it exists. Otherwise, no instance is created. @@ -325,7 +335,6 @@ Discourse.User.reopenClass(Discourse.Singleton, { }); }, - /** Checks if given username is valid for this email address diff --git a/app/assets/javascripts/discourse/routes/topic_route.js b/app/assets/javascripts/discourse/routes/topic_route.js index 6865e340d..375a33cf4 100644 --- a/app/assets/javascripts/discourse/routes/topic_route.js +++ b/app/assets/javascripts/discourse/routes/topic_route.js @@ -13,6 +13,14 @@ Discourse.TopicRoute = Discourse.Route.extend({ actions: { // Modals that can pop up within a topic + showPosterExpansion: function(post) { + var self = this; + + Discourse.User.findByUsername(post.get('username')).then(function (user) { + self.controllerFor('posterExpansion').show(user, post); + }); + }, + showFlags: function(post) { Discourse.Route.showModal(this, 'flag', post); this.controllerFor('flag').setProperties({ selected: null }); @@ -80,9 +88,10 @@ Discourse.TopicRoute = Discourse.Route.extend({ // Clear the search context this.controllerFor('search').set('searchContext', null); + this.controllerFor('posterExpansion').set('model', null); - var topicController = this.controllerFor('topic'); - var postStream = topicController.get('postStream'); + var topicController = this.controllerFor('topic'), + postStream = topicController.get('postStream'); postStream.cancelFilter(); topicController.set('multiSelect', false); diff --git a/app/assets/javascripts/discourse/templates/post.js.handlebars b/app/assets/javascripts/discourse/templates/post.js.handlebars index 516556941..534080598 100644 --- a/app/assets/javascripts/discourse/templates/post.js.handlebars +++ b/app/assets/javascripts/discourse/templates/post.js.handlebars @@ -19,9 +19,9 @@