FIX: sorting in a category isn't working

This commit is contained in:
Régis Hanol 2015-10-19 19:04:47 +02:00
parent cca48ce22f
commit c618478e88
5 changed files with 74 additions and 42 deletions

View File

@ -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

View File

@ -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});
});
}
};

View File

@ -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('_', '-') });
});
});

View File

@ -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);

View File

@ -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' });