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]