From c618478e88bda42788e024c2e12ee7ba984174ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 19 Oct 2015 19:04:47 +0200 Subject: [PATCH] FIX: sorting in a category isn't working --- .../controllers/discovery-sortable.js.es6 | 2 +- .../dynamic-route-builders.js.es6 | 35 ++++++++++++++----- .../discourse/routes/app-route-map.js.es6 | 30 ++++++++-------- .../routes/build-category-route.js.es6 | 32 ++++++++++++----- .../discourse/routes/build-topic-route.js.es6 | 17 +++++---- 5 files changed, 74 insertions(+), 42 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 b/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 index c0d0b0178d9..8786828d7aa 100644 --- a/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery-sortable.js.es6 @@ -12,7 +12,7 @@ export var queryParams = { // Basic controller options var controllerOpts = { needs: ['discovery/topics'], - queryParams: Ember.keys(queryParams) + queryParams: Ember.keys(queryParams), }; // Aliases for the values diff --git a/app/assets/javascripts/discourse/pre-initializers/dynamic-route-builders.js.es6 b/app/assets/javascripts/discourse/pre-initializers/dynamic-route-builders.js.es6 index acaef8f0577..1bd40078369 100644 --- a/app/assets/javascripts/discourse/pre-initializers/dynamic-route-builders.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/dynamic-route-builders.js.es6 @@ -7,19 +7,32 @@ export default { name: 'dynamic-route-builders', initialize(container, app) { + app.DiscoveryCategoryController = DiscoverySortableController.extend(); + app.DiscoveryParentCategoryController = DiscoverySortableController.extend(); + app.DiscoveryCategoryNoneController = DiscoverySortableController.extend(); + app.DiscoveryCategoryRoute = buildCategoryRoute('latest'); app.DiscoveryParentCategoryRoute = buildCategoryRoute('latest'); app.DiscoveryCategoryNoneRoute = buildCategoryRoute('latest', {no_subcategories: true}); const site = Discourse.Site.current(); site.get('filters').forEach(filter => { - app["Discovery" + filter.capitalize() + "Controller"] = DiscoverySortableController.extend(); - app["Discovery" + filter.capitalize() + "Route"] = buildTopicRoute(filter); - app["Discovery" + filter.capitalize() + "CategoryRoute"] = buildCategoryRoute(filter); - app["Discovery" + filter.capitalize() + "CategoryNoneRoute"] = buildCategoryRoute(filter, {no_subcategories: true}); + const filterCapitalized = filter.capitalize(); + app[`Discovery${filterCapitalized}Controller`] = DiscoverySortableController.extend(); + app[`Discovery${filterCapitalized}CategoryController`] = DiscoverySortableController.extend(); + app[`Discovery${filterCapitalized}ParentCategoryController`] = DiscoverySortableController.extend(); + app[`Discovery${filterCapitalized}CategoryNoneController`] = DiscoverySortableController.extend(); + app[`Discovery${filterCapitalized}Route`] = buildTopicRoute(filter); + app[`Discovery${filterCapitalized}CategoryRoute`] = buildCategoryRoute(filter); + app[`Discovery${filterCapitalized}ParentCategoryRoute`] = buildCategoryRoute(filter); + app[`Discovery${filterCapitalized}CategoryNoneRoute`] = buildCategoryRoute(filter, {no_subcategories: true}); }); Discourse.DiscoveryTopController = DiscoverySortableController.extend(); + Discourse.DiscoveryTopCategoryController = DiscoverySortableController.extend(); + Discourse.DiscoveryTopParentCategoryController = DiscoverySortableController.extend(); + Discourse.DiscoveryTopCategoryNoneController = DiscoverySortableController.extend(); + Discourse.DiscoveryTopRoute = buildTopicRoute('top', { actions: { willTransition() { @@ -30,13 +43,19 @@ export default { } }); Discourse.DiscoveryTopCategoryRoute = buildCategoryRoute('top'); + Discourse.DiscoveryTopParentCategoryRoute = buildCategoryRoute('top'); Discourse.DiscoveryTopCategoryNoneRoute = buildCategoryRoute('top', {no_subcategories: true}); site.get('periods').forEach(period => { - app["DiscoveryTop" + period.capitalize() + "Controller"] = DiscoverySortableController.extend(); - app["DiscoveryTop" + period.capitalize() + "Route"] = buildTopicRoute('top/' + period); - app["DiscoveryTop" + period.capitalize() + "CategoryRoute"] = buildCategoryRoute('top/' + period); - app["DiscoveryTop" + period.capitalize() + "CategoryNoneRoute"] = buildCategoryRoute('top/' + period, {no_subcategories: true}); + const periodCapitalized = period.capitalize(); + app[`DiscoveryTop${periodCapitalized}Controller`] = DiscoverySortableController.extend(); + app[`DiscoveryTop${periodCapitalized}CategoryController`] = DiscoverySortableController.extend(); + app[`DiscoveryTop${periodCapitalized}ParentCategoryController`] = DiscoverySortableController.extend(); + app[`DiscoveryTop${periodCapitalized}CategoryNoneController`] = DiscoverySortableController.extend(); + app[`DiscoveryTop${periodCapitalized}Route`] = buildTopicRoute('top/' + period); + app[`DiscoveryTop${periodCapitalized}CategoryRoute`] = buildCategoryRoute('top/' + period); + app[`DiscoveryTop${periodCapitalized}ParentCategoryRoute`] = buildCategoryRoute('top/' + period); + app[`DiscoveryTop${periodCapitalized}CategoryNoneRoute`] = buildCategoryRoute('top/' + period, {no_subcategories: true}); }); } }; diff --git a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 index 172bd050e27..34f0a98b44a 100644 --- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 +++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 @@ -15,26 +15,25 @@ export default function() { this.resource('discovery', { path: '/' }, function() { // top this.route('top'); - this.route('topCategory', { path: '/c/:slug/l/top' }); + this.route('topParentCategory', { path: '/c/:slug/l/top' }); this.route('topCategoryNone', { path: '/c/:slug/none/l/top' }); this.route('topCategory', { path: '/c/:parentSlug/:slug/l/top' }); // top by periods - var self = this; - Discourse.Site.currentProp('periods').forEach(function(period) { - var top = 'top' + period.capitalize(); - self.route(top, { path: '/top/' + period }); - self.route(top + 'Category', { path: '/c/:slug/l/top/' + period }); - self.route(top + 'CategoryNone', { path: '/c/:slug/none/l/top/' + period }); - self.route(top + 'Category', { path: '/c/:parentSlug/:slug/l/top/' + period }); + Discourse.Site.currentProp('periods').forEach(period => { + const top = 'top' + period.capitalize(); + this.route(top, { path: '/top/' + period }); + this.route(top + 'ParentCategory', { path: '/c/:slug/l/top/' + period }); + this.route(top + 'CategoryNone', { path: '/c/:slug/none/l/top/' + period }); + this.route(top + 'Category', { path: '/c/:parentSlug/:slug/l/top/' + period }); }); // filters - Discourse.Site.currentProp('filters').forEach(function(filter) { - self.route(filter, { path: '/' + filter }); - self.route(filter + 'Category', { path: '/c/:slug/l/' + filter }); - self.route(filter + 'CategoryNone', { path: '/c/:slug/none/l/' + filter }); - self.route(filter + 'Category', { path: '/c/:parentSlug/:slug/l/' + filter }); + Discourse.Site.currentProp('filters').forEach(filter => { + this.route(filter, { path: '/' + filter }); + this.route(filter + 'ParentCategory', { path: '/c/:slug/l/' + filter }); + this.route(filter + 'CategoryNone', { path: '/c/:slug/none/l/' + filter }); + this.route(filter + 'Category', { path: '/c/:parentSlug/:slug/l/' + filter }); }); this.route('categories'); @@ -56,9 +55,8 @@ export default function() { this.resource('users'); this.resource('user', { path: '/users/:username' }, function() { this.resource('userActivity', { path: '/activity' }, function() { - var self = this; - _.map(Discourse.UserAction.TYPES, function (id, userAction) { - self.route(userAction, { path: userAction.replace('_', '-') }); + _.map(Discourse.UserAction.TYPES, (id, userAction) => { + this.route(userAction, { path: userAction.replace('_', '-') }); }); }); 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 b0dfc941ca1..b1d75980d1b 100644 --- a/app/assets/javascripts/discourse/routes/build-category-route.js.es6 +++ b/app/assets/javascripts/discourse/routes/build-category-route.js.es6 @@ -1,9 +1,10 @@ -import { queryParams, filterQueryParams, findTopicList } from 'discourse/routes/build-topic-route'; +import { filterQueryParams, findTopicList } from 'discourse/routes/build-topic-route'; +import { queryParams } from 'discourse/controllers/discovery-sortable'; // A helper function to create a category route with parameters export default (filter, params) => { return Discourse.Route.extend({ - queryParams: queryParams, + queryParams, model(modelParams) { return Discourse.Category.findBySlug(modelParams.slug, modelParams.parentSlug); @@ -63,7 +64,6 @@ export default (filter, params) => { setupController(controller, model) { const topics = this.get('topics'), - periodId = topics.get('for_period') || (filter.indexOf('/') > 0 ? filter.split('/')[1] : ''), canCreateTopic = topics.get('can_create_topic'), canCreateTopicOnCategory = model.get('permission') === Discourse.PermissionType.FULL; @@ -72,19 +72,29 @@ export default (filter, params) => { cannotCreateTopicOnCategory: !canCreateTopicOnCategory, canCreateTopic: canCreateTopic }); - this.controllerFor('discovery/topics').setProperties({ + + var topicOpts = { model: topics, category: model, - period: periodId, + period: topics.get('for_period') || (filter.indexOf('/') > 0 ? filter.split('/')[1] : ''), selected: [], noSubcategories: params && !!params.no_subcategories, - order: topics.get('params.order'), - ascending: topics.get('params.ascending'), expandAllPinned: true, canCreateTopic: canCreateTopic, canCreateTopicOnCategory: canCreateTopicOnCategory - }); + }; + const p = model.get('params'); + if (p && Object.keys(p).length) { + if (p.order !== undefined) { + topicOpts.order = p.order; + } + if (p.ascending !== undefined) { + topicOpts.ascending = p.ascending; + } + } + + this.controllerFor('discovery/topics').setProperties(topicOpts); this.searchService.set('searchContext', model.get('searchContext')); this.set('topics', null); @@ -100,6 +110,12 @@ export default (filter, params) => { this.render('discovery/topics', { controller: 'discovery/topics', outlet: 'list-container' }); }, + resetController(controller, isExiting) { + if (isExiting) { + controller.setProperties({ order: "default", ascending: false }); + } + }, + deactivate() { this._super(); this.searchService.set('searchContext', null); diff --git a/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 b/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 index 342b2258eea..0da680a200f 100644 --- a/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 +++ b/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 @@ -84,18 +84,11 @@ export default function(filter, extras) { return I18n.t('filters.with_topics', {filter: filterText}); }, - setupController(controller, model, trans) { - if (trans) { - controller.setProperties(Em.getProperties(trans, _.keys(queryParams).map(function(v){ - return 'queryParams.' + v; - }))); - } - - const period = model.get('for_period') || (filter.indexOf('/') > 0 ? filter.split('/')[1] : ''); + setupController(controller, model) { const topicOpts = { model, category: null, - period, + period: model.get('for_period') || (filter.indexOf('/') > 0 ? filter.split('/')[1] : ''), selected: [], expandGloballyPinned: true }; @@ -115,6 +108,12 @@ export default function(filter, extras) { this.controllerFor('navigation/default').set('canCreateTopic', model.get('can_create_topic')); }, + resetController(controller, isExiting) { + if (isExiting) { + controller.setProperties({ order: "default", ascending: false }); + } + }, + renderTemplate() { this.render('navigation/default', { outlet: 'navigation-bar' }); this.render('discovery/topics', { controller: 'discovery/topics', outlet: 'list-container' });