diff --git a/app/assets/javascripts/discourse/controllers/list_topics_controller.js b/app/assets/javascripts/discourse/controllers/list_topics_controller.js index 4ccb33fd3..db0ccb996 100644 --- a/app/assets/javascripts/discourse/controllers/list_topics_controller.js +++ b/app/assets/javascripts/discourse/controllers/list_topics_controller.js @@ -81,7 +81,53 @@ Discourse.ListTopicsController = Discourse.ObjectController.extend({ // Clear inserted this.set('content.inserted', Em.A()); return false; - } + }, + + allLoaded: function() { + return !this.get('loading') && !this.get('more_topics_url'); + }.property('loading', 'more_topics_url'), + + canCreateTopic: Em.computed.alias('controllers.list.canCreateTopic'), + + footerMessage: function() { + if (!this.get('allLoaded')) return; + var content = this.get('category'); + if( content ) { + return Em.String.i18n('topics.bottom.category', {category: content.get('name')}); + } else { + var split = this.get('filter').split('/'); + if (this.get('topics.length') === 0) { + return Em.String.i18n("topics.none." + split[0], { + category: split[1] + }); + } else { + return Em.String.i18n("topics.bottom." + split[0], { + category: split[1] + }); + } + } + }.property('allLoaded', 'topics.length'), + + insertedCount: function() { + var insertedLength = this.get('inserted.length'); + if (!insertedLength) return 0; + return insertedLength; + }.property('inserted.length'), + + rollUp: function() { + return this.get('insertedCount') > Discourse.SiteSettings.new_topics_rollup; + }.property('insertedCount'), + + loadMore: function() { + this.set('loadingMore', true); + var listTopicsController = this; + return this.get('model').loadMoreTopics().then(function(hasMoreTopics) { + listTopicsController.set('loadingMore', false); + return hasMoreTopics; + }); + }, + + }); diff --git a/app/assets/javascripts/discourse/models/topic_list.js b/app/assets/javascripts/discourse/models/topic_list.js index d35802e04..e5bc0f4ee 100644 --- a/app/assets/javascripts/discourse/models/topic_list.js +++ b/app/assets/javascripts/discourse/models/topic_list.js @@ -40,7 +40,10 @@ Discourse.TopicList = Discourse.Model.extend({ return result.topic_list.more_topics_url; }); } else { - return null; + // Return a promise indicating no more results + return Ember.Deferred.promise(function (p) { + p.resolve(false); + }); } }, diff --git a/app/assets/javascripts/discourse/templates/list/topics.js.handlebars b/app/assets/javascripts/discourse/templates/list/topics.js.handlebars index 825fe9edd..8d0bd897f 100644 --- a/app/assets/javascripts/discourse/templates/list/topics.js.handlebars +++ b/app/assets/javascripts/discourse/templates/list/topics.js.handlebars @@ -28,12 +28,12 @@ - {{#if view.rollUp}} + {{#if rollUp}}
- {{countI18n new_topics_inserted countBinding="view.insertedCount"}} + {{countI18n new_topics_inserted countBinding="insertedCount"}} {{i18n show_new_topics}}
@@ -54,17 +54,16 @@

- {{view.footerMessage}} - {{#if view.allLoaded}} - + {{footerMessage}} + {{#if allLoaded}} {{#if latest}} - {{#if view.canCreateTopic}} + {{#if canCreateTopic}} {{i18n topic.suggest_create_topic}} {{/if}} {{else}} diff --git a/app/assets/javascripts/discourse/views/list/list_topics_view.js b/app/assets/javascripts/discourse/views/list/list_topics_view.js index dd05ae7b9..7c48143bb 100644 --- a/app/assets/javascripts/discourse/views/list/list_topics_view.js +++ b/app/assets/javascripts/discourse/views/list/list_topics_view.js @@ -9,30 +9,11 @@ **/ Discourse.ListTopicsView = Discourse.View.extend(Discourse.Scrolling, { templateName: 'list/topics', - categoryBinding: 'controller.controllers.list.category', - canCreateTopicBinding: 'controller.controllers.list.canCreateTopic', - loadedMore: false, - currentTopicId: null, - - insertedCount: (function() { - var inserted; - inserted = this.get('controller.inserted'); - if (!inserted) return 0; - return inserted.length; - }).property('controller.inserted.@each'), - - rollUp: (function() { - return this.get('insertedCount') > Discourse.SiteSettings.new_topics_rollup; - }).property('insertedCount'), willDestroyElement: function() { this.unbindScrolling(); }, - allLoaded: (function() { - return !this.get('loading') && !this.get('controller.content.more_topics_url'); - }).property('loading', 'controller.content.more_topics_url'), - didInsertElement: function() { this.bindScrolling(); var eyeline = new Discourse.Eyeline('.topic-list-item'); @@ -53,29 +34,18 @@ Discourse.ListTopicsView = Discourse.View.extend(Discourse.Scrolling, { }); } this.set('eyeline', eyeline); - this.set('currentTopicId', null); }, loadMore: function() { - if (this.get('loading')) return; - this.set('loading', true); - var listTopicsView = this; - var promise = this.get('controller.content').loadMoreTopics(); - if (promise) { - promise.then(function(hasMoreResults) { - listTopicsView.set('loadedMore', true); - listTopicsView.set('loading', false); - Em.run.schedule('afterRender', function() { - listTopicsView.saveScrollPos(); - }); - if (!hasMoreResults) { - listTopicsView.get('eyeline').flushRest(); - } + listTopicsView.get('controller').loadMore().then(function (hasMoreResults) { + Em.run.schedule('afterRender', function() { + listTopicsView.saveScrollPos(); }); - } else { - this.set('loading', false); - } + if (!hasMoreResults) { + listTopicsView.get('eyeline').flushRest(); + } + }) }, // Remember where we were scrolled to @@ -88,30 +58,8 @@ Discourse.ListTopicsView = Discourse.View.extend(Discourse.Scrolling, { var _ref; this.saveScrollPos(); return (_ref = this.get('eyeline')) ? _ref.update() : void 0; - }, + } - footerMessage: function() { - var content, split; - if (!this.get('allLoaded')) { - return; - } - content = this.get('category'); - if( content ) { - return Em.String.i18n('topics.bottom.category', {category: content.get('name')}); - } else { - content = this.get('controller.content'); - split = content.get('filter').split('/'); - if (content.get('topics.length') === 0) { - return Em.String.i18n("topics.none." + split[0], { - category: split[1] - }); - } else { - return Em.String.i18n("topics.bottom." + split[0], { - category: split[1] - }); - } - } - }.property('allLoaded', 'controller.content.topics.length') }); diff --git a/lib/topic_query.rb b/lib/topic_query.rb index 630f13b4b..1341104f0 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -239,6 +239,7 @@ class TopicQuery end end + result = result.listable_topics.includes(category: :topic_only_relative_url) result = result.where('categories.name is null or categories.name <> ?', query_opts[:exclude_category]) if query_opts[:exclude_category] result = result.where('categories.name = ?', query_opts[:only_category]) if query_opts[:only_category]