mirror of
https://github.com/flarum/framework.git
synced 2024-12-04 08:13:39 +08:00
176 lines
4.3 KiB
JavaScript
176 lines
4.3 KiB
JavaScript
|
import Ember from 'ember';
|
||
|
|
||
|
import DiscussionResult from '../models/discussion-result';
|
||
|
import PostResult from '../models/post-result';
|
||
|
|
||
|
export default Ember.ArrayController.extend(Ember.Evented, {
|
||
|
|
||
|
needs: ['application', 'composer'],
|
||
|
|
||
|
paned: false,
|
||
|
paneShowing: false,
|
||
|
paneTimeout: null,
|
||
|
panePinned: false,
|
||
|
|
||
|
current: null,
|
||
|
|
||
|
index: function() {
|
||
|
var index = '?';
|
||
|
var id = this.get('current.id');
|
||
|
this.get('model').some(function(result, i) {
|
||
|
if (result.get('id') == id) {
|
||
|
index = i + 1;
|
||
|
return true;
|
||
|
}
|
||
|
});
|
||
|
return index;
|
||
|
}.property('current', 'model.@each'),
|
||
|
|
||
|
count: function() {
|
||
|
return this.get('model.length');
|
||
|
}.property('model.@each'),
|
||
|
|
||
|
previous: function() {
|
||
|
var result = this.get('model').objectAt(this.get('index') - 2);
|
||
|
return result && result.get('content');
|
||
|
}.property('index'),
|
||
|
|
||
|
next: function() {
|
||
|
var result = this.get('model').objectAt(this.get('index'));
|
||
|
return result && result.get('content');
|
||
|
}.property('index'),
|
||
|
|
||
|
queryParams: ['sort', 'show', {searchQuery: 'q'}, 'filter'],
|
||
|
sort: 'recent',
|
||
|
show: 'discussions',
|
||
|
filter: '',
|
||
|
|
||
|
searchQuery: '',
|
||
|
loadingMore: false,
|
||
|
|
||
|
sortOptions: [
|
||
|
{sort: 'recent', label: 'Recent'},
|
||
|
{sort: 'replies', label: 'Replies'},
|
||
|
{sort: 'newest', label: 'Newest'},
|
||
|
{sort: 'oldest', label: 'Oldest'},
|
||
|
],
|
||
|
|
||
|
displayStartUsers: function() {
|
||
|
return ['newest', 'oldest'].indexOf(this.get('sort')) != -1;
|
||
|
}.property('sort'),
|
||
|
|
||
|
discussionsCount: function() {
|
||
|
return this.get('model.length');
|
||
|
}.property('@each'),
|
||
|
|
||
|
resultsLoading: false,
|
||
|
|
||
|
start: 0,
|
||
|
|
||
|
moreResults: function() {
|
||
|
return !! this.get('meta.moreUrl');
|
||
|
}.property('meta.moreUrl'),
|
||
|
|
||
|
meta: null,
|
||
|
|
||
|
getResults: function(start) {
|
||
|
var sort = this.get('sort');
|
||
|
// var order = this.get('order');
|
||
|
var order;
|
||
|
var show = this.get('show');
|
||
|
var searchQuery = this.get('searchQuery');
|
||
|
|
||
|
if (sort == 'newest') sort = 'created';
|
||
|
else if (sort == 'oldest') {
|
||
|
sort = 'created';
|
||
|
order = 'asc';
|
||
|
}
|
||
|
else if (sort == 'recent') {
|
||
|
sort = '';
|
||
|
}
|
||
|
else if (sort == 'replies') {
|
||
|
order = 'desc';
|
||
|
}
|
||
|
|
||
|
var params = {
|
||
|
sort: (order == 'desc' ? '-' : '')+sort,
|
||
|
q: searchQuery,
|
||
|
start: start
|
||
|
};
|
||
|
|
||
|
if (show == 'posts') {
|
||
|
if (searchQuery) params.include = 'relevantPosts';
|
||
|
else if (sort == 'created') params.include = 'startPost,startUser';
|
||
|
else params.include = 'lastPost,lastUser';
|
||
|
}
|
||
|
|
||
|
return this.store.find('discussion', params).then(function(discussions) {
|
||
|
var results = Em.A();
|
||
|
discussions.forEach(function(discussion) {
|
||
|
var relevantPosts = Em.A();
|
||
|
discussion.get('relevantPosts.content').forEach(function(post) {
|
||
|
relevantPosts.pushObject(PostResult.create(post));
|
||
|
});
|
||
|
results.pushObject(DiscussionResult.create({
|
||
|
content: discussion,
|
||
|
relevantPosts: relevantPosts,
|
||
|
lastPost: PostResult.create(discussion.get('lastPost')),
|
||
|
startPost: PostResult.create(discussion.get('startPost'))
|
||
|
}));
|
||
|
results.set('meta', discussions.get('meta'));
|
||
|
});
|
||
|
return results;
|
||
|
});
|
||
|
},
|
||
|
|
||
|
actions: {
|
||
|
showDiscussionPane: function() {
|
||
|
this.set('paneShowing', true);
|
||
|
},
|
||
|
|
||
|
hideDiscussionPane: function() {
|
||
|
this.set('paneShowing', false);
|
||
|
},
|
||
|
|
||
|
togglePinned: function() {
|
||
|
this.set('panePinned', ! this.get('panePinned'));
|
||
|
},
|
||
|
|
||
|
loadMore: function() {
|
||
|
var self = this;
|
||
|
this.set('start', this.get('length'));
|
||
|
this.set('loadingMore', true);
|
||
|
|
||
|
this.getResults(this.get('start')).then(function(results) {
|
||
|
self.get('model').addObjects(results);
|
||
|
self.set('meta', results.get('meta'));
|
||
|
// self.set('moreResults', !! results.get('meta.moreUrl'));
|
||
|
self.set('loadingMore', false);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
delete: function(discussion) {
|
||
|
alert('are you sure you want to delete discusn: '+discussion.get('title'));
|
||
|
}
|
||
|
},
|
||
|
|
||
|
queryDidChange: function(q) {
|
||
|
this.get('controllers.application').set('searchQuery', this.get('searchQuery'));
|
||
|
this.get('controllers.application').set('searchActive', !! this.get('searchQuery'));
|
||
|
|
||
|
var sortOptions = this.get('sortOptions');
|
||
|
|
||
|
if (this.get('searchQuery') && sortOptions[0].sort != 'relevance') {
|
||
|
sortOptions.unshiftObject({sort: 'relevance', label: 'Relevance'});
|
||
|
}
|
||
|
else if ( ! this.get('searchQuery') && sortOptions[0].sort == 'relevance') {
|
||
|
sortOptions.shiftObject();
|
||
|
}
|
||
|
}.observes('searchQuery'),
|
||
|
|
||
|
paramsDidChange: function(show) {
|
||
|
this.set('start', 0);
|
||
|
}.observes('show', 'sort', 'searchQuery')
|
||
|
|
||
|
});
|