mirror of
https://github.com/discourse/discourse.git
synced 2025-01-26 15:00:44 +08:00
56cbfa2611
When there is a topic draft in place instead of showing "+ New Topic" we will show "+ Open Draft", this allows topic drafts to be much less intrusive. Also, fixes draft handling of tags
126 lines
4.0 KiB
JavaScript
126 lines
4.0 KiB
JavaScript
import { queryParams } from 'discourse/controllers/discovery-sortable';
|
|
import { defaultHomepage } from 'discourse/lib/utilities';
|
|
|
|
// A helper to build a topic route for a filter
|
|
function filterQueryParams(params, defaultParams) {
|
|
const findOpts = defaultParams || {};
|
|
if (params) {
|
|
Object.keys(queryParams).forEach(function(opt) {
|
|
if (params[opt]) { findOpts[opt] = params[opt]; }
|
|
});
|
|
}
|
|
return findOpts;
|
|
}
|
|
|
|
function findTopicList(store, tracking, filter, filterParams, extras) {
|
|
extras = extras || {};
|
|
return new Ember.RSVP.Promise(function(resolve) {
|
|
const session = Discourse.Session.current();
|
|
|
|
if (extras.cached) {
|
|
const cachedList = session.get('topicList');
|
|
|
|
// Try to use the cached version if it exists and is greater than the topics per page
|
|
if (cachedList && (cachedList.get('filter') === filter) &&
|
|
(cachedList.get('topics.length') || 0) > cachedList.get('per_page') &&
|
|
_.isEqual(cachedList.get('listParams'), filterParams)) {
|
|
cachedList.set('loaded', true);
|
|
|
|
if (tracking) {
|
|
tracking.updateTopics(cachedList.get('topics'));
|
|
}
|
|
return resolve(cachedList);
|
|
}
|
|
session.set('topicList', null);
|
|
} else {
|
|
// Clear the cache
|
|
session.setProperties({topicList: null, topicListScrollPosition: null});
|
|
}
|
|
|
|
// Clean up any string parameters that might slip through
|
|
filterParams = filterParams || {};
|
|
Object.keys(filterParams).forEach(function(k) {
|
|
const val = filterParams[k];
|
|
if (val === "undefined" || val === "null" || val === 'false') {
|
|
filterParams[k] = undefined;
|
|
}
|
|
});
|
|
|
|
return resolve(store.findFiltered('topicList', { filter, params: filterParams || {} }));
|
|
}).then(function(list) {
|
|
list.set('listParams', filterParams);
|
|
if (tracking) {
|
|
tracking.sync(list, list.filter);
|
|
tracking.trackIncoming(list.filter);
|
|
}
|
|
Discourse.Session.currentProp('topicList', list);
|
|
if (list.topic_list && list.topic_list.top_tags) {
|
|
Discourse.Site.currentProp('top_tags', list.topic_list.top_tags);
|
|
}
|
|
return list;
|
|
});
|
|
}
|
|
|
|
export default function(filter, extras) {
|
|
extras = extras || {};
|
|
return Discourse.Route.extend({
|
|
queryParams,
|
|
|
|
beforeModel() {
|
|
this.controllerFor('navigation/default').set('filterMode', filter);
|
|
},
|
|
|
|
model(data, transition) {
|
|
// attempt to stop early cause we need this to be called before .sync
|
|
this.screenTrack.stop();
|
|
|
|
const findOpts = filterQueryParams(data),
|
|
findExtras = { cached: this.isPoppedState(transition) };
|
|
|
|
return findTopicList(this.store, this.topicTrackingState, filter, findOpts, findExtras);
|
|
},
|
|
|
|
titleToken() {
|
|
if (filter === defaultHomepage()) { return; }
|
|
|
|
const filterText = I18n.t('filters.' + filter.replace('/', '.') + '.title');
|
|
return I18n.t('filters.with_topics', {filter: filterText});
|
|
},
|
|
|
|
setupController(controller, model) {
|
|
const topicOpts = {
|
|
model,
|
|
category: null,
|
|
period: model.get('for_period') || (filter.indexOf('top/') >= 0 ? filter.split('/')[1] : ''),
|
|
selected: [],
|
|
expandGloballyPinned: true
|
|
};
|
|
|
|
const params = model.get('params');
|
|
if (params && Object.keys(params).length) {
|
|
if (params.order !== undefined) {
|
|
topicOpts.order = params.order;
|
|
}
|
|
if (params.ascending !== undefined) {
|
|
topicOpts.ascending = params.ascending;
|
|
}
|
|
}
|
|
this.controllerFor('discovery/topics').setProperties(topicOpts);
|
|
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' });
|
|
}
|
|
}, extras);
|
|
}
|
|
|
|
export { filterQueryParams, findTopicList };
|