From 7b8c7ff3ef62568c1dd4f0ade2dbdb81030b2b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 12 Feb 2015 18:21:07 +0100 Subject: [PATCH] FIX: sub-categories with the same name had the same background image --- .../discourse/mixins/add-category-class.js.es6 | 12 ++++++------ app/assets/javascripts/discourse/models/category.js | 4 ++++ app/assets/javascripts/discourse/models/site.js | 6 ++---- app/assets/javascripts/discourse/models/topic.js | 4 ++-- .../discourse/views/navigation-category.js.es6 | 2 +- .../discourse/views/topic-list-item.js.es6 | 7 +++---- app/models/category.rb | 10 +++++++--- lib/sass/discourse_sass_importer.rb | 2 +- 8 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 b/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 index 209b105f3..25f50ba28 100644 --- a/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 +++ b/app/assets/javascripts/discourse/mixins/add-category-class.js.es6 @@ -1,8 +1,8 @@ -// Mix this in to a view that has a `categorySlug` property to automatically +// Mix this in to a view that has a `categoryFullSlug` property to automatically // add it to the body as the view is entered / left / model is changed. // This is used for keeping the `body` style in sync for the background image. export default { - _enterView: function() { this.get('categorySlug'); }.on('init'), + _enterView: function() { this.get('categoryFullSlug'); }.on('init'), _removeClasses: function() { $('body').removeClass(function(idx, css) { @@ -11,13 +11,13 @@ export default { }, _categoryChanged: function() { - var categorySlug = this.get('categorySlug'); + var categoryFullSlug = this.get('categoryFullSlug'); this._removeClasses(); - if (categorySlug) { - $('body').addClass('category-' + categorySlug); + if (categoryFullSlug) { + $('body').addClass('category-' + categoryFullSlug); } - }.observes('categorySlug'), + }.observes('categoryFullSlug'), _leaveView: function() { this._removeClasses(); }.on('willDestroyElement') }; diff --git a/app/assets/javascripts/discourse/models/category.js b/app/assets/javascripts/discourse/models/category.js index e7bc7dd6f..64a92a903 100644 --- a/app/assets/javascripts/discourse/models/category.js +++ b/app/assets/javascripts/discourse/models/category.js @@ -29,6 +29,10 @@ Discourse.Category = Discourse.Model.extend({ return Discourse.getURL("/c/") + Discourse.Category.slugFor(this); }.property('name'), + fullSlug: function() { + return this.get("url").slice(3).replace("/", "-"); + }.property("url"), + nameLower: function() { return this.get('name').toLowerCase(); }.property('name'), diff --git a/app/assets/javascripts/discourse/models/site.js b/app/assets/javascripts/discourse/models/site.js index e81c16002..93263d381 100644 --- a/app/assets/javascripts/discourse/models/site.js +++ b/app/assets/javascripts/discourse/models/site.js @@ -85,15 +85,13 @@ Discourse.Site.reopenClass(Discourse.Singleton, { if (result.categories) { result.categoriesById = {}; result.categories = _.map(result.categories, function(c) { - result.categoriesById[c.id] = Discourse.Category.create(c); - return result.categoriesById[c.id]; + return result.categoriesById[c.id] = Discourse.Category.create(c); }); // Associate the categories with their parents result.categories.forEach(function (c) { if (c.get('parent_category_id')) { - c.set('parentCategory', - result.categoriesById[c.get('parent_category_id')]); + c.set('parentCategory', result.categoriesById[c.get('parent_category_id')]); } }); } diff --git a/app/assets/javascripts/discourse/models/topic.js b/app/assets/javascripts/discourse/models/topic.js index fd7ec8a7b..0d301fe18 100644 --- a/app/assets/javascripts/discourse/models/topic.js +++ b/app/assets/javascripts/discourse/models/topic.js @@ -48,8 +48,8 @@ Discourse.Topic = Discourse.Model.extend({ }.property('category_id', 'categoryName'), categoryClass: function() { - return 'category-' + Discourse.Category.slugFor(this.get('category')); - }.property('category'), + return 'category-' + this.get('category.fullSlug'); + }.property('category.fullSlug'), shareUrl: function(){ var user = Discourse.User.current(); diff --git a/app/assets/javascripts/discourse/views/navigation-category.js.es6 b/app/assets/javascripts/discourse/views/navigation-category.js.es6 index 35adfe459..f5e5c3d97 100644 --- a/app/assets/javascripts/discourse/views/navigation-category.js.es6 +++ b/app/assets/javascripts/discourse/views/navigation-category.js.es6 @@ -1,5 +1,5 @@ import AddCategoryClass from 'discourse/mixins/add-category-class'; export default Em.View.extend(AddCategoryClass, { - categorySlug: Em.computed.alias('controller.category.slug') + categoryFullSlug: Em.computed.alias('controller.category.fullSlug') }); diff --git a/app/assets/javascripts/discourse/views/topic-list-item.js.es6 b/app/assets/javascripts/discourse/views/topic-list-item.js.es6 index f7f033817..dbe3fb042 100644 --- a/app/assets/javascripts/discourse/views/topic-list-item.js.es6 +++ b/app/assets/javascripts/discourse/views/topic-list-item.js.es6 @@ -27,12 +27,11 @@ export default Discourse.View.extend(StringBuffer, { }.property('controller.selectedRow'), unboundClassNames: function(){ - var classes = []; - var topic = this.get('topic'); - + let classes = []; + const topic = this.get('topic'); if (topic.get('category')) { - classes.push("category-" + topic.get('category.slug')); + classes.push("category-" + topic.get('category.fullSlug')); } if(topic.get('hasExcerpt')){ diff --git a/app/models/category.rb b/app/models/category.rb index 0af7e22f9..e35f78468 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -341,9 +341,9 @@ SQL self.where(id: parent_slug.to_i).pluck(:id).first end - def self.query_category(slug, parent_category_id) - self.where(slug: slug, parent_category_id: parent_category_id).includes(:featured_users).first || - self.where(id: slug.to_i, parent_category_id: parent_category_id).includes(:featured_users).first + def self.query_category(slug_or_id, parent_category_id) + self.where(slug: slug_or_id, parent_category_id: parent_category_id).includes(:featured_users).first || + self.where(id: slug_or_id.to_i, parent_category_id: parent_category_id).includes(:featured_users).first end def self.find_by_email(email) @@ -366,6 +366,10 @@ SQL @@url_cache.clear end + def full_slug + url[3..-1].gsub("/", "-") + end + def url url = @@url_cache[self.id] unless url diff --git a/lib/sass/discourse_sass_importer.rb b/lib/sass/discourse_sass_importer.rb index ce16a8073..b9ad83da3 100644 --- a/lib/sass/discourse_sass_importer.rb +++ b/lib/sass/discourse_sass_importer.rb @@ -50,7 +50,7 @@ class DiscourseSassImporter < Sass::Importers::Filesystem contents = "" Category.where('background_url IS NOT NULL').each do |c| if c.background_url.present? - contents << "body.category-#{c.slug} { background-image: url(#{c.background_url}) }\n" + contents << "body.category-#{c.full_slug} { background-image: url(#{c.background_url}) }\n" end end return Sass::Engine.new(contents, options.merge(