diff --git a/app/assets/javascripts/discourse/templates/topic.js.handlebars b/app/assets/javascripts/discourse/templates/topic.js.handlebars index 2ea701e39..d1adbc9af 100644 --- a/app/assets/javascripts/discourse/templates/topic.js.handlebars +++ b/app/assets/javascripts/discourse/templates/topic.js.handlebars @@ -57,7 +57,7 @@ {{#if view.loadingAbove}}
{{i18n loading}}
{{/if}} - {{view Discourse.TopicPostsView contentBinding="content.posts" topicViewBinding="view"}} + {{collection itemViewClass="Discourse.PostView" contentBinding="content.posts" topicViewBinding="view"}} {{#if view.loadingBelow}}
{{i18n loading}}
diff --git a/app/assets/javascripts/discourse/views/post_view.js b/app/assets/javascripts/discourse/views/post_view.js index f3f68d15b..bce2a325d 100644 --- a/app/assets/javascripts/discourse/views/post_view.js +++ b/app/assets/javascripts/discourse/views/post_view.js @@ -9,16 +9,18 @@ Discourse.PostView = Discourse.View.extend({ classNames: ['topic-post', 'clearfix'], templateName: 'post', - classNameBindings: ['lastPostClass', 'postTypeClass', 'selectedClass', 'post.hidden:hidden', 'isDeleted:deleted', 'parentPost:replies-above'], + classNameBindings: ['post.lastPost', + 'postTypeClass', + 'post.selected', + 'post.hidden:hidden', + 'post.deleted_at:deleted', + 'parentPost:replies-above'], + siteBinding: Ember.Binding.oneWay('Discourse.site'), composeViewBinding: Ember.Binding.oneWay('Discourse.composeView'), quoteButtonViewBinding: Ember.Binding.oneWay('Discourse.quoteButtonView'), postBinding: 'content', - isDeleted: (function() { - return !!this.get('post.deleted_at'); - }).property('post.deleted_at'), - // TODO really we should do something cleaner here... this makes it work in debug but feels really messy screenTrack: (function() { var parentView, screenTrack; @@ -31,53 +33,36 @@ Discourse.PostView = Discourse.View.extend({ return screenTrack; }).property('parentView'), - lastPostClass: (function() { - if (this.get('post.lastPost')) { - return 'last-post'; - } - }).property('post.lastPost'), - postTypeClass: (function() { - if (this.get('post.post_type') === Discourse.get('site.post_types.moderator_action')) { - return 'moderator'; - } + if (this.get('post.post_type') === Discourse.get('site.post_types.moderator_action')) return 'moderator'; return 'regular'; }).property('post.post_type'), - selectedClass: (function() { - if (this.get('post.selected')) { - return 'selected'; - } - return null; - }).property('post.selected'), - // If the cooked content changed, add the quote controls cookedChanged: (function() { - var _this = this; - return Em.run.next(function() { - return _this.insertQuoteControls(); + var postView = this; + Em.run.next(function() { + postView.insertQuoteControls(); }); }).observes('post.cooked'), init: function() { this._super(); - return this.set('context', this.get('content')); + this.set('context', this.get('content')); }, mouseUp: function(e) { - var $target, qbc; if (this.get('controller.multiSelect') && (e.metaKey || e.ctrlKey)) { this.toggleProperty('post.selected'); } - $target = $(e.target); + var $target = $(e.target); if ($target.closest('.cooked').length === 0) return; - qbc = this.get('controller.controllers.quoteButton'); - + var qbc = this.get('controller.controllers.quoteButton'); if (qbc && Discourse.get('currentUser.enable_quoting')) { e.context = this.get('post'); - return qbc.selectText(e); + qbc.selectText(e); } }, @@ -96,12 +81,12 @@ Discourse.PostView = Discourse.View.extend({ // Click on the replies button showReplies: function() { - var _this = this; + var postView = this; if (this.get('repliesShown')) { this.set('repliesShown', false); } else { this.get('post').loadReplies().then(function() { - return _this.set('repliesShown', true); + postView.set('repliesShown', true); }); } return false; @@ -136,11 +121,14 @@ Discourse.PostView = Discourse.View.extend({ }, updateQuoteElements: function($aside, desc) { - var expandContract, navLink, postNumber, quoteTitle, topic, topicId; - navLink = ""; - quoteTitle = Em.String.i18n("post.follow_quote"); + var navLink = ""; + var quoteTitle = Em.String.i18n("post.follow_quote"); + var postNumber; + if (postNumber = $aside.data('post')) { + // If we have a topic reference + var topicId, topic; if (topicId = $aside.data('topic')) { topic = this.get('controller.content'); @@ -151,39 +139,39 @@ Discourse.PostView = Discourse.View.extend({ // Made up slug should be replaced with canonical URL navLink = ""; } + } else if (topic = this.get('controller.content')) { // assume the same topic navLink = ""; } } // Only add the expand/contract control if it's not a full post - expandContract = ""; + var expandContract = ""; if (!$aside.data('full')) { expandContract = ""; $aside.css('cursor', 'pointer'); } - return $('.quote-controls', $aside).html("" + expandContract + navLink); + $('.quote-controls', $aside).html("" + expandContract + navLink); }, toggleQuote: function($aside) { - var $blockQuote, originalText, post, topic_id; $aside.data('expanded',!$aside.data('expanded')); if ($aside.data('expanded')) { this.updateQuoteElements($aside, 'chevron-up'); // Show expanded quote - $blockQuote = $('blockquote', $aside); + var $blockQuote = $('blockquote', $aside); $aside.data('original-contents',$blockQuote.html()); - originalText = $blockQuote.text().trim(); + + var originalText = $blockQuote.text().trim(); $blockQuote.html(Em.String.i18n("loading")); - post = this.get('post'); - topic_id = post.get('topic_id'); + var topic_id = this.get('post.topic_id'); if ($aside.data('topic')) { topic_id = $aside.data('topic'); } $.getJSON(Discourse.getURL("/posts/by_number/") + topic_id + "/" + ($aside.data('post')), function(result) { var parsed = $(result.cooked); parsed.replaceText(originalText, "" + originalText + ""); - return $blockQuote.showHtml(parsed); + $blockQuote.showHtml(parsed); }); } else { // Hide expanded quote @@ -195,14 +183,15 @@ Discourse.PostView = Discourse.View.extend({ // Show how many times links have been clicked on showLinkCounts: function() { - var link_counts, - _this = this; + + var postView = this; + var link_counts; + if (link_counts = this.get('post.link_counts')) { - return link_counts.each(function(lc) { + link_counts.each(function(lc) { if (lc.clicks > 0) { - return _this.$(".cooked a[href]").each(function() { - var link; - link = $(this); + postView.$(".cooked a[href]").each(function() { + var link = $(this); if (link.attr('href') === lc.url) { return link.append("" + lc.clicks + ""); } @@ -214,40 +203,36 @@ Discourse.PostView = Discourse.View.extend({ // Add the quote controls to a post insertQuoteControls: function() { - var _this = this; + var postView = this; + return this.$('aside.quote').each(function(i, e) { var $aside, $title; $aside = $(e); - _this.updateQuoteElements($aside, 'chevron-down'); + postView.updateQuoteElements($aside, 'chevron-down'); $title = $('.title', $aside); // Unless it's a full quote, allow click to expand if (!($aside.data('full') || $title.data('has-quote-controls'))) { $title.on('click', function(e) { - if ($(e.target).is('a')) { - // if we clicked on a link, follow it - return true; - } - return _this.toggleQuote($aside); + if ($(e.target).is('a')) return true; + postView.toggleQuote($aside); }); - return $title.data('has-quote-controls', true); + $title.data('has-quote-controls', true); } }); }, didInsertElement: function(e) { - var $contents, $post, newSize, originalCol, post, postNumber, scrollTo, _ref; - $post = this.$(); - post = this.get('post'); - - postNumber = post.get('scrollToAfterInsert'); + var $post = this.$(); + var post = this.get('post'); + var postNumber = post.get('scrollToAfterInsert'); // Do we want to scroll to this post now that we've inserted it? if (postNumber) { Discourse.TopicView.scrollTo(this.get('post.topic_id'), postNumber); if (postNumber === post.get('post_number')) { - $contents = $('.topic-body .contents', $post); - originalCol = $contents.css('backgroundColor'); + var $contents = $('.topic-body .contents', $post); + var originalCol = $contents.css('backgroundColor'); $contents.css({ backgroundColor: "#ffffcc" }).animate({ @@ -257,8 +242,9 @@ Discourse.PostView = Discourse.View.extend({ } this.showLinkCounts(); - if (_ref = this.get('screenTrack')) { - _ref.track(this.$().prop('id'), this.get('post.post_number')); + var screenTrack = this.get('screenTrack'); + if (screenTrack) { + screenTrack.track(this.$().prop('id'), this.get('post.post_number')); } // Add syntax highlighting @@ -266,8 +252,9 @@ Discourse.PostView = Discourse.View.extend({ Discourse.Lightbox.apply($post); // If we're scrolling upwards, adjust the scroll position accordingly + var scrollTo; if (scrollTo = this.get('post.scrollTo')) { - newSize = ($(document).height() - scrollTo.height) + scrollTo.top; + var newSize = ($(document).height() - scrollTo.height) + scrollTo.top; $('body').scrollTop(newSize); $('section.divider').addClass('fade'); } diff --git a/app/assets/javascripts/discourse/views/topic_posts_view.js b/app/assets/javascripts/discourse/views/topic_posts_view.js deleted file mode 100644 index af65ced89..000000000 --- a/app/assets/javascripts/discourse/views/topic_posts_view.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - This view is for rendering the posts in a topic - - @class TopicPostsView - @extends Ember.CollectionView - @namespace Discourse - @module Discourse -**/ -Discourse.TopicPostsView = Em.CollectionView.extend({ - itemViewClass: Discourse.PostView -}); - -