diff --git a/app/assets/javascripts/discourse/models/site.js b/app/assets/javascripts/discourse/models/site.js index b3a9690ccfb..b87424bdba4 100644 --- a/app/assets/javascripts/discourse/models/site.js +++ b/app/assets/javascripts/discourse/models/site.js @@ -48,9 +48,18 @@ Discourse.Site.reopenClass(Discourse.Singleton, { var result = this._super(obj); if (result.categories) { + var byId = {} result.categories = _.map(result.categories, function(c) { - return Discourse.Category.create(c); + byId[c.id] = Discourse.Category.create(c); + return byId[c.id]; }); + + // Associate the categories with their parents + result.categories.forEach(function (c) { + if (c.get('parent_category_id')) { + c.set('parentCategory', byId[c.get('parent_category_id')]); + } + }) } if (result.trust_levels) { diff --git a/app/serializers/basic_category_serializer.rb b/app/serializers/basic_category_serializer.rb index 29b45de3940..4b53d3f7179 100644 --- a/app/serializers/basic_category_serializer.rb +++ b/app/serializers/basic_category_serializer.rb @@ -10,6 +10,7 @@ class BasicCategorySerializer < ApplicationSerializer :topic_url, :hotness, :read_restricted, - :permission + :permission, + :parent_category_id end diff --git a/test/javascripts/models/category_test.js b/test/javascripts/models/category_test.js index 68956f22b30..3943562955d 100644 --- a/test/javascripts/models/category_test.js +++ b/test/javascripts/models/category_test.js @@ -10,4 +10,5 @@ test('slugFor', function(){ slugFor({id: 123, slug: ''}, "123-category", "It returns id-category for empty strings"); slugFor({id: 456}, "456-category", "It returns id-category for undefined slugs"); -}); \ No newline at end of file +}); + diff --git a/test/javascripts/models/site_test.js b/test/javascripts/models/site_test.js index 435d8341050..cc4fafa3483 100644 --- a/test/javascripts/models/site_test.js +++ b/test/javascripts/models/site_test.js @@ -9,4 +9,28 @@ test('instance', function(){ present(site.get('flagTypes'), "The instance has a list of flag types"); present(site.get('trustLevels'), "The instance has a list of trust levels"); +}); + +test('create categories', function() { + + var site = Discourse.Site.create({ + categories: [{ id: 1234, name: 'Test'}, + { id: 3456, name: 'Test Subcategory', parent_category_id: 1234}, + { id: 3456, name: 'Invalid Subcategory', parent_category_id: 6666}] + }); + + var categories = site.get('categories'); + + present(categories, "The categories are present"); + equal(categories.length, 3, "it loaded all three categories"); + + var parent = categories.findBy('id', 1234); + present(parent, "it loaded the parent category"); + blank(parent.get('parentCategory'), 'it has no parent category'); + + var subcategory = categories.findBy('id', 3456); + present(subcategory, "it loaded the subcategory"); + equal(subcategory.get('parentCategory'), parent, "it has associated the child with the parent"); + + }); \ No newline at end of file