diff --git a/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 b/app/assets/javascripts/discourse/components/bread-crumbs.js.es6
index 2e59c25a583..e61d5b8cff1 100644
--- a/app/assets/javascripts/discourse/components/bread-crumbs.js.es6
+++ b/app/assets/javascripts/discourse/components/bread-crumbs.js.es6
@@ -29,12 +29,13 @@ export default Ember.Component.extend({
}.property('category', 'parentCategory'),
childCategories: function() {
+ if (this.get('hideSubcategories')) { return []; }
var firstCategory = this.get('firstCategory');
- if (!firstCategory) { return; }
+ if (!firstCategory) { return []; }
return this.get('categories').filter(function (c) {
return c.get('parentCategory') === firstCategory;
});
- }.property('firstCategory')
+ }.property('firstCategory', 'hideSubcategories')
});
diff --git a/app/assets/javascripts/discourse/components/category-title-link.js.es6 b/app/assets/javascripts/discourse/components/category-title-link.js.es6
new file mode 100644
index 00000000000..96de552c17b
--- /dev/null
+++ b/app/assets/javascripts/discourse/components/category-title-link.js.es6
@@ -0,0 +1,21 @@
+export default Em.Component.extend({
+ tagName: 'h3',
+
+ render: function(buffer) {
+ var category = this.get('category'),
+ logoUrl = category.get('logo_url');
+
+ if (category.get('read_restricted')) {
+ buffer.push(" ");
+ }
+
+ buffer.push("");
+
+ if (Em.isEmpty(logoUrl)) {
+ buffer.push(Handlebars.Utils.escapeExpression(category.get('name')));
+ } else {
+ buffer.push("");
+ }
+ buffer.push("");
+ }
+});
diff --git a/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6 b/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6
index bc7b489991c..8276b094c14 100644
--- a/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6
+++ b/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6
@@ -1,3 +1,3 @@
import NavigationDefaultController from 'discourse/controllers/navigation/default';
-export default NavigationDefaultController.extend({});
+export default NavigationDefaultController.extend();
diff --git a/app/assets/javascripts/discourse/controllers/navigation/category.js.es6 b/app/assets/javascripts/discourse/controllers/navigation/category.js.es6
index 3f9289cd0f8..4abaf1da274 100644
--- a/app/assets/javascripts/discourse/controllers/navigation/category.js.es6
+++ b/app/assets/javascripts/discourse/controllers/navigation/category.js.es6
@@ -1,7 +1,12 @@
import NavigationDefaultController from 'discourse/controllers/navigation/default';
export default NavigationDefaultController.extend({
+ subcategoryListSetting: Discourse.computed.setting('show_subcategory_list'),
+ showingParentCategory: Em.computed.none('category.parentCategory'),
+ showingSubcategoryList: Em.computed.and('subcategoryListSetting', 'showingParentCategory'),
+
navItems: function() {
+ if (this.get('showingSubcategoryList')) { return []; }
return Discourse.NavItem.buildList(this.get('category'), { noSubcategories: this.get('noSubcategories') });
}.property('category', 'noSubcategories')
});
diff --git a/app/assets/javascripts/discourse/ember/resolver.js b/app/assets/javascripts/discourse/ember/resolver.js
index 831fc397b42..5e7eec5831c 100644
--- a/app/assets/javascripts/discourse/ember/resolver.js
+++ b/app/assets/javascripts/discourse/ember/resolver.js
@@ -77,6 +77,10 @@ Discourse.Resolver = Ember.DefaultResolver.extend({
return this.customResolve(parsedName) || this._super(parsedName);
},
+ resolveRoute: function(parsedName) {
+ return this.customResolve(parsedName) || this._super(parsedName);
+ },
+
/**
Attaches a view and wires up the container properly
diff --git a/app/assets/javascripts/discourse/initializers/dynamic-route-builders.js.es6 b/app/assets/javascripts/discourse/initializers/dynamic-route-builders.js.es6
index 63434dda8e4..67f7fc6f61c 100644
--- a/app/assets/javascripts/discourse/initializers/dynamic-route-builders.js.es6
+++ b/app/assets/javascripts/discourse/initializers/dynamic-route-builders.js.es6
@@ -3,6 +3,7 @@ import buildTopicRoute from 'discourse/routes/build-topic-route';
export default {
name: 'dynamic-route-builders',
+ after: 'register-discourse-location',
initialize: function(container, app) {
app.DiscoveryCategoryRoute = buildCategoryRoute('latest');
diff --git a/app/assets/javascripts/discourse/models/category_list.js b/app/assets/javascripts/discourse/models/category_list.js
index 5048316ed31..d9c98d7c1c0 100644
--- a/app/assets/javascripts/discourse/models/category_list.js
+++ b/app/assets/javascripts/discourse/models/category_list.js
@@ -7,7 +7,6 @@
@module Discourse
**/
Discourse.CategoryList = Ember.ArrayProxy.extend({
-
init: function() {
this.content = [];
this._super();
@@ -22,7 +21,6 @@ Discourse.CategoryList = Ember.ArrayProxy.extend({
});
Discourse.CategoryList.reopenClass({
-
categoriesFrom: function(result) {
var categories = Discourse.CategoryList.create(),
users = Discourse.Model.extractByKey(result.featured_users, Discourse.User),
@@ -55,6 +53,15 @@ Discourse.CategoryList.reopenClass({
return categories;
},
+ listForParent: function(category) {
+ var self = this;
+ return Discourse.ajax('/categories.json?parent_category_id=' + category.get('id')).then(function(result) {
+ return Discourse.CategoryList.create({
+ categories: self.categoriesFrom(result)
+ });
+ });
+ },
+
list: function() {
var self = this;
diff --git a/app/assets/javascripts/discourse/routes/build-category-route.js.es6 b/app/assets/javascripts/discourse/routes/build-category-route.js.es6
index dbca1126b11..466600e5036 100644
--- a/app/assets/javascripts/discourse/routes/build-category-route.js.es6
+++ b/app/assets/javascripts/discourse/routes/build-category-route.js.es6
@@ -1,8 +1,8 @@
// A helper function to create a category route with parameters
export default function(filter, params) {
return Discourse.Route.extend({
- model: function(params) {
- return Discourse.Category.findBySlug(params.slug, params.parentSlug);
+ model: function(modelParams) {
+ return Discourse.Category.findBySlug(modelParams.slug, modelParams.parentSlug);
},
afterModel: function(model, transaction) {
@@ -11,21 +11,44 @@ export default function(filter, params) {
return;
}
- var self = this,
- noSubcategories = params && !!params.no_subcategories,
- filterMode = "category/" + Discourse.Category.slugFor(model) + (noSubcategories ? "/none" : "") + "/l/" + filter,
- listFilter = "category/" + Discourse.Category.slugFor(model) + "/l/" + filter;
-
this.controllerFor('search').set('searchContext', model.get('searchContext'));
+ this._setupNavigation(model);
+ return Em.RSVP.all([this._createSubcategoryList(model),
+ this._retrieveTopicList(model, transaction)]);
+ },
- var opts = { category: model, filterMode: filterMode };
- opts.noSubcategories = params && params.no_subcategories;
- opts.canEditCategory = Discourse.User.currentProp('staff');
+ _setupNavigation: function(model) {
+ var noSubcategories = params && !!params.no_subcategories,
+ filterMode = "category/" + Discourse.Category.slugFor(model) + (noSubcategories ? "/none" : "") + "/l/" + filter;
- opts.canChangeCategoryNotificationLevel = Discourse.User.current();
- this.controllerFor('navigation/category').setProperties(opts);
+ this.controllerFor('navigation/category').setProperties({
+ category: model,
+ filterMode: filterMode,
+ noSubcategories: params && params.no_subcategories,
+ canEditCategory: Discourse.User.currentProp('staff'),
+ canChangeCategoryNotificationLevel: Discourse.User.current()
+ });
+ },
+
+ _createSubcategoryList: function(model) {
+ this._categoryList = null;
+ if (Em.isNone(model.get('parentCategory')) && Discourse.SiteSettings.show_subcategory_list) {
+ var self = this;
+ return Discourse.CategoryList.listForParent(model).then(function(list) {
+ console.log('loaded list');
+ self._categoryList = list;
+ });
+ }
+
+ // If we're not loading a subcategory list just resolve
+ return Em.RSVP.resolve();
+ },
+
+ _retrieveTopicList: function(model, transaction) {
+ var queryParams = transaction.queryParams,
+ listFilter = "category/" + Discourse.Category.slugFor(model) + "/l/" + filter,
+ self = this;
- var queryParams = transaction.queryParams;
params = params || {};
if (queryParams && queryParams.order) { params.order = queryParams.order; }
@@ -67,6 +90,10 @@ export default function(filter, params) {
renderTemplate: function() {
this.render('navigation/category', { outlet: 'navigation-bar' });
+
+ if (this._categoryList) {
+ this.render('discovery/categories', { outlet: 'header-list-container', model: this._categoryList });
+ }
this.render('discovery/topics', { controller: 'discovery/topics', outlet: 'list-container' });
},
diff --git a/app/assets/javascripts/discourse/templates/discovery.js.handlebars b/app/assets/javascripts/discourse/templates/discovery.js.handlebars
index 14b79688c8a..c4ba98bede8 100644
--- a/app/assets/javascripts/discourse/templates/discovery.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/discovery.js.handlebars
@@ -14,7 +14,16 @@