From 0a69f2bc7741a2da39233bc8dac3c419fdf22030 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 1 Nov 2017 15:08:18 -0400 Subject: [PATCH] REFACTOR: Remove many `Discourse.Category.list()` calls --- .../javascripts/discourse/components/d-navigation.js.es6 | 5 ++++- .../discourse/components/edit-category-general.js.es6 | 8 +++----- .../javascripts/discourse/controllers/composer.js.es6 | 7 ++----- .../discourse/controllers/edit-category.js.es6 | 2 +- .../javascripts/discourse/controllers/tags-show.js.es6 | 6 ++---- .../javascripts/discourse/controllers/topic.js.es6 | 4 +--- app/assets/javascripts/discourse/models/category.js.es6 | 4 +--- app/assets/javascripts/discourse/models/composer.js.es6 | 4 ++-- app/assets/javascripts/discourse/models/nav-item.js.es6 | 1 + app/assets/javascripts/discourse/models/site.js.es6 | 8 ++++++++ app/assets/javascripts/discourse/models/topic.js.es6 | 2 +- .../pre-initializers/inject-discourse-objects.js.es6 | 8 ++++---- .../discourse/templates/components/d-navigation.hbs | 2 +- .../javascripts/discourse/widgets/hamburger-menu.js.es6 | 2 +- test/javascripts/helpers/qunit-helpers.js.es6 | 9 +++------ test/javascripts/test_helper.js | 7 ++++--- 16 files changed, 39 insertions(+), 40 deletions(-) diff --git a/app/assets/javascripts/discourse/components/d-navigation.js.es6 b/app/assets/javascripts/discourse/components/d-navigation.js.es6 index f2467ddcf6c..9cfcad99bc8 100644 --- a/app/assets/javascripts/discourse/components/d-navigation.js.es6 +++ b/app/assets/javascripts/discourse/components/d-navigation.js.es6 @@ -10,9 +10,12 @@ export default Ember.Component.extend({ @computed() categories() { - return Discourse.Category.list(); + return this.site.get('categoriesList'); }, + @computed('category.can_edit') + showCategoryEdit: canEdit => canEdit, + @computed("filterMode") navItems(filterMode) { // we don't want to show the period in the navigation bar since it's in a dropdown diff --git a/app/assets/javascripts/discourse/components/edit-category-general.js.es6 b/app/assets/javascripts/discourse/components/edit-category-general.js.es6 index e26c24a21ec..693a48918a4 100644 --- a/app/assets/javascripts/discourse/components/edit-category-general.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-general.js.es6 @@ -9,13 +9,13 @@ export default buildCategoryPanel('general', { // background colors are available as a pipe-separated string backgroundColors: function() { - const categories = Discourse.Category.list(); + const categories = this.site.get('categoriesList'); return this.siteSettings.category_colors.split("|").map(function(i) { return i.toUpperCase(); }).concat( categories.map(function(c) { return c.color.toUpperCase(); }) ).uniq(); }.property(), usedBackgroundColors: function() { - const categories = Discourse.Category.list(); + const categories = this.site.get('categoriesList'); const category = this.get('category'); // If editing a category, don't include its color: @@ -25,9 +25,7 @@ export default buildCategoryPanel('general', { }.property('category.id', 'category.color'), parentCategories: function() { - return Discourse.Category.list().filter(function (c) { - return !c.get('parentCategory'); - }); + return this.site.get('categoriesList').filter(c => !c.get('parentCategory')); }.property(), categoryBadgePreview: function() { diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index 61f381a2391..506bee7e02d 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -69,6 +69,7 @@ export default Ember.Controller.extend({ topic: null, linkLookup: null, whisperOrUnlistTopic: Ember.computed.or('model.whisper', 'model.unlistTopic'), + categories: Ember.computed.alias('site.categoriesList'), @computed('model.replyingToTopic', 'model.creatingPrivateMessage', 'model.targetUsernames') focusTarget(replyingToTopic, creatingPM, usernames) { @@ -396,10 +397,6 @@ export default Ember.Controller.extend({ }, - categories: function() { - return Discourse.Category.list(); - }.property(), - disableSubmit: Ember.computed.or("model.loading", "isUploading"), save(force) { @@ -654,7 +651,7 @@ export default Ember.Controller.extend({ if (!splitCategory[1]) { category = this.site.get('categories').findBy('nameLower', splitCategory[0].toLowerCase()); } else { - const categories = Discourse.Category.list(); + const categories = this.site.get('categories'); const mainCategory = categories.findBy('nameLower', splitCategory[0].toLowerCase()); category = categories.find(function(item) { return item && item.get('nameLower') === splitCategory[1].toLowerCase() && item.get('parent_category_id') === mainCategory.id; diff --git a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 b/app/assets/javascripts/discourse/controllers/edit-category.js.es6 index e05c37937b5..2af5d3593db 100644 --- a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 +++ b/app/assets/javascripts/discourse/controllers/edit-category.js.es6 @@ -65,7 +65,7 @@ export default Ember.Controller.extend(ModalFunctionality, { saveCategory() { const self = this, model = this.get('model'), - parentCategory = Discourse.Category.list().findBy('id', parseInt(model.get('parent_category_id'), 10)); + parentCategory = this.site.get('categories').findBy('id', parseInt(model.get('parent_category_id'), 10)); this.set('saving', true); model.set('parentCategory', parentCategory); diff --git a/app/assets/javascripts/discourse/controllers/tags-show.js.es6 b/app/assets/javascripts/discourse/controllers/tags-show.js.es6 index 467750926f0..4658b09f384 100644 --- a/app/assets/javascripts/discourse/controllers/tags-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tags-show.js.es6 @@ -58,6 +58,8 @@ export default Ember.Controller.extend(BulkTopicSelection, { max_posts: null, q: null, + categories: Ember.computed.alias('site.categoriesList'), + queryParams: ['order', 'ascending', 'status', 'state', 'search', 'max_posts', 'q'], navItems: function() { @@ -68,10 +70,6 @@ export default Ember.Controller.extend(BulkTopicSelection, { return Discourse.SiteSettings.show_filter_by_tag; }.property('category'), - categories: function() { - return Discourse.Category.list(); - }.property(), - showAdminControls: function() { return !this.get('additionalTags') && this.get('canAdminTag') && !this.get('category'); }.property('additionalTags', 'canAdminTag', 'category'), diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index fe2a3f4fb07..c609981c5c6 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -752,9 +752,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { return selectedPostsUsername !== undefined; }, - categories: function() { - return Discourse.Category.list(); - }.property(), + categories: Ember.computed.alias('site.categoriesList'), canSelectAll: Em.computed.not('allPostsSelected'), diff --git a/app/assets/javascripts/discourse/models/category.js.es6 b/app/assets/javascripts/discourse/models/category.js.es6 index 16304f453e6..6af4ff87509 100644 --- a/app/assets/javascripts/discourse/models/category.js.es6 +++ b/app/assets/javascripts/discourse/models/category.js.es6 @@ -205,9 +205,7 @@ Category.reopenClass({ }, list() { - return Discourse.SiteSettings.fixed_category_positions ? - Discourse.Site.currentProp('categories') : - Discourse.Site.currentProp('sortedCategories'); + return Discourse.Site.currentProp('categoriesList'); }, listByActivity() { diff --git a/app/assets/javascripts/discourse/models/composer.js.es6 b/app/assets/javascripts/discourse/models/composer.js.es6 index 48e8e261960..6094ae285d0 100644 --- a/app/assets/javascripts/discourse/models/composer.js.es6 +++ b/app/assets/javascripts/discourse/models/composer.js.es6 @@ -85,7 +85,7 @@ const Composer = RestModel.extend({ @computed("privateMessage", "archetype.hasOptions") showCategoryChooser(isPrivateMessage, hasOptions) { - const manyCategories = Discourse.Category.list().length > 1; + const manyCategories = this.site.get('categories').length > 1; return !isPrivateMessage && (hasOptions || manyCategories); }, @@ -481,7 +481,7 @@ const Composer = RestModel.extend({ this.set('categoryId', opts.categoryId || this.get('topic.category.id')); if (!this.get('categoryId') && this.get('creatingTopic')) { - const categories = Discourse.Category.list(); + const categories = this.site.get('categories'); if (categories.length === 1) { this.set('categoryId', categories[0].get('id')); } diff --git a/app/assets/javascripts/discourse/models/nav-item.js.es6 b/app/assets/javascripts/discourse/models/nav-item.js.es6 index f71842cd6e1..7616644968d 100644 --- a/app/assets/javascripts/discourse/models/nav-item.js.es6 +++ b/app/assets/javascripts/discourse/models/nav-item.js.es6 @@ -111,6 +111,7 @@ NavItem.reopenClass({ opts = opts || {}; if (anonymous && !Discourse.Site.currentProp('anonymous_top_menu_items').includes(testName)) return null; + if (!Discourse.Category.list() && testName === "categories") return null; if (!Discourse.Site.currentProp('top_menu_items').includes(testName)) return null; diff --git a/app/assets/javascripts/discourse/models/site.js.es6 b/app/assets/javascripts/discourse/models/site.js.es6 index ace9f7176ce..073f6b43f9b 100644 --- a/app/assets/javascripts/discourse/models/site.js.es6 +++ b/app/assets/javascripts/discourse/models/site.js.es6 @@ -54,6 +54,14 @@ const Site = RestModel.extend({ return result; }, + // Returns it in the correct order, by setting + @computed + categoriesList() { + return this.siteSettings.fixed_category_positions ? + this.get('categories') : + this.get('sortedCategories'); + }, + postActionTypeById(id) { return this.get("postActionByIdLookup.action" + id); }, diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index 3727290485a..df6fd563ccf 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -135,7 +135,7 @@ const Topic = RestModel.extend({ const categoryName = this.get('categoryName'); let category; if (categoryName) { - category = Discourse.Category.list().findBy('name', categoryName); + category = this.site.get('categories').findBy('name', categoryName); } this.set('category', category); }.observes('categoryName'), diff --git a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 index ca60c3c311f..453ee0612bc 100644 --- a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 @@ -36,14 +36,14 @@ export default { app.register('topic-tracking-state:main', topicTrackingState, { instantiate: false }); ALL_TARGETS.forEach(t => app.inject(t, 'topicTrackingState', 'topic-tracking-state:main')); - const site = Discourse.Site.current(); - app.register('site:main', site, { instantiate: false }); - ALL_TARGETS.forEach(t => app.inject(t, 'site', 'site:main')); - const siteSettings = Discourse.SiteSettings; app.register('site-settings:main', siteSettings, { instantiate: false }); ALL_TARGETS.forEach(t => app.inject(t, 'siteSettings', 'site-settings:main')); + const site = Discourse.Site.current(); + app.register('site:main', site, { instantiate: false }); + ALL_TARGETS.forEach(t => app.inject(t, 'site', 'site:main')); + app.register('search-service:main', SearchService); ALL_TARGETS.forEach(t => app.inject(t, 'searchService', 'search-service:main')); diff --git a/app/assets/javascripts/discourse/templates/components/d-navigation.hbs b/app/assets/javascripts/discourse/templates/components/d-navigation.hbs index 8297a4f7e1d..dd0fe03f3e6 100644 --- a/app/assets/javascripts/discourse/templates/components/d-navigation.hbs +++ b/app/assets/javascripts/discourse/templates/components/d-navigation.hbs @@ -17,7 +17,7 @@ action=createTopic disabled=createTopicDisabled}} -{{#if category.can_edit}} +{{#if showCategoryEdit}} {{d-button class="btn-default edit-category" action=editCategory diff --git a/app/assets/javascripts/discourse/widgets/hamburger-menu.js.es6 b/app/assets/javascripts/discourse/widgets/hamburger-menu.js.es6 index 2058a4b8820..c9f40de4a21 100644 --- a/app/assets/javascripts/discourse/widgets/hamburger-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/hamburger-menu.js.es6 @@ -130,7 +130,7 @@ export default createWidget('hamburger-menu', { const hideUncategorized = !this.siteSettings.allow_uncategorized_topics; const isStaff = Discourse.User.currentProp('staff'); - const categories = Discourse.Category.list().reject((c) => { + const categories = this.site.get('categoriesList').reject((c) => { if (c.get('parentCategory.show_subcategory_list')) { return true; } if (hideUncategorized && c.get('isUncategorizedCategory') && !isStaff) { return true; } return false; diff --git a/test/javascripts/helpers/qunit-helpers.js.es6 b/test/javascripts/helpers/qunit-helpers.js.es6 index f6a3a3848f1..5a7c3347048 100644 --- a/test/javascripts/helpers/qunit-helpers.js.es6 +++ b/test/javascripts/helpers/qunit-helpers.js.es6 @@ -1,7 +1,6 @@ -/* global QUnit, fixtures */ +/* global QUnit, resetSite */ import sessionFixtures from 'fixtures/session-fixtures'; -import siteFixtures from 'fixtures/site-fixtures'; import HeaderComponent from 'discourse/components/site-header'; import { forceMobile, resetMobile } from 'discourse/lib/mobile'; import { resetPluginApi } from 'discourse/lib/plugin-api'; @@ -60,7 +59,6 @@ export function acceptance(name, options) { HeaderComponent.reopen({examineDockHeader: function() { }}); resetExtraClasses(); - const siteJson = siteFixtures['site.json'].site; if (options.beforeEach) { options.beforeEach.call(this); } @@ -78,7 +76,7 @@ export function acceptance(name, options) { } if (options.site) { - Discourse.Site.resetCurrent(Discourse.Site.create(jQuery.extend(true, {}, siteJson, options.site))); + resetSite(Discourse.SiteSettings, options.site); } clearOutletCache(); @@ -93,8 +91,7 @@ export function acceptance(name, options) { } flushMap(); Discourse.User.resetCurrent(); - Discourse.Site.resetCurrent(Discourse.Site.create(jQuery.extend(true, {}, fixtures['site.json'].site))); - + resetSite(Discourse.SiteSettings); resetExtraClasses(); clearOutletCache(); clearHTMLCache(); diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js index edc11911698..97f759b0dc8 100644 --- a/test/javascripts/test_helper.js +++ b/test/javascripts/test_helper.js @@ -81,10 +81,11 @@ function dup(obj) { return jQuery.extend(true, {}, obj); } -function resetSite() { +function resetSite(siteSettings, extras) { var createStore = require('helpers/create-store').default; - var siteAttrs = dup(fixtures['site.json'].site); + var siteAttrs = $.extend({}, fixtures['site.json'].site, extras || {}); siteAttrs.store = createStore(); + siteAttrs.siteSettings = siteSettings; Discourse.Site.resetCurrent(Discourse.Site.create(siteAttrs)); } @@ -105,7 +106,7 @@ QUnit.testStart(function(ctx) { Discourse.BaseUrl = "localhost"; Discourse.Session.resetCurrent(); Discourse.User.resetCurrent(); - resetSite(); + resetSite(Discourse.SiteSettings); _DiscourseURL.redirectedTo = null; _DiscourseURL.redirectTo = function(url) {