130 lines
2.9 KiB
JavaScript
130 lines
2.9 KiB
JavaScript
import { observes } from 'ember-addons/ember-computed-decorators';
|
|
|
|
export default Ember.Component.extend({
|
|
tagName: 'table',
|
|
classNames: ['topic-list'],
|
|
showTopicPostBadges: true,
|
|
|
|
_init: function(){
|
|
this.addObserver('hideCategory', this.rerender);
|
|
this.addObserver('order', this.rerender);
|
|
this.addObserver('ascending', this.rerender);
|
|
this.refreshLastVisited();
|
|
}.on('init'),
|
|
|
|
toggleInTitle: function(){
|
|
return !this.get('bulkSelectEnabled') && this.get('canBulkSelect');
|
|
}.property('bulkSelectEnabled'),
|
|
|
|
sortable: function(){
|
|
return !!this.get('changeSort');
|
|
}.property(),
|
|
|
|
skipHeader: function() {
|
|
return this.site.mobileView;
|
|
}.property(),
|
|
|
|
showLikes: function(){
|
|
return this.get('order') === "likes";
|
|
}.property('order'),
|
|
|
|
showOpLikes: function(){
|
|
return this.get('order') === "op_likes";
|
|
}.property('order'),
|
|
|
|
@observes('topics.[]')
|
|
topicsAdded() {
|
|
// special case so we don't keep scanning huge lists
|
|
if (!this.get('lastVisitedTopic')) {
|
|
this.refreshLastVisited();
|
|
}
|
|
},
|
|
|
|
@observes('topics', 'order', 'ascending', 'category')
|
|
lastVisitedTopicChanged() {
|
|
this.refreshLastVisited();
|
|
},
|
|
|
|
_updateLastVisitedTopic(topics, order, ascending) {
|
|
|
|
this.set('lastVisitedTopic', null);
|
|
|
|
if (!this.get('highlightLastVisited')) {
|
|
return;
|
|
}
|
|
|
|
if (order !== "default" && order !== "activity") {
|
|
return;
|
|
}
|
|
|
|
if (!topics || topics.length === 1) {
|
|
return;
|
|
}
|
|
|
|
if (ascending) {
|
|
return;
|
|
}
|
|
|
|
let user = Discourse.User.current();
|
|
if (!user || !user.previous_visit_at) {
|
|
return;
|
|
}
|
|
|
|
let lastVisitedTopic, topic;
|
|
|
|
let prevVisit = user.get('previousVisitAt');
|
|
|
|
// this is more efficient cause we keep appending to list
|
|
// work backwards
|
|
let start = 0;
|
|
while(topics[start] && topics[start].get('pinned')) {
|
|
start++;
|
|
}
|
|
|
|
let i;
|
|
for(i=topics.length-1;i>=start;i--){
|
|
if (topics[i].get('bumpedAt') > prevVisit) {
|
|
lastVisitedTopic = topics[i];
|
|
break;
|
|
}
|
|
topic = topics[i];
|
|
}
|
|
|
|
if (!lastVisitedTopic || !topic) {
|
|
return;
|
|
}
|
|
|
|
// end of list that was scanned
|
|
if (topic.get('bumpedAt') > prevVisit) {
|
|
return;
|
|
}
|
|
|
|
this.set('lastVisitedTopic', lastVisitedTopic);
|
|
},
|
|
|
|
refreshLastVisited() {
|
|
this._updateLastVisitedTopic(this.get('topics'), this.get('order'), this.get('ascending'));
|
|
},
|
|
|
|
click(e) {
|
|
var self = this;
|
|
var onClick = function(sel, callback){
|
|
var target = $(e.target).closest(sel);
|
|
|
|
if(target.length === 1){
|
|
callback.apply(self, [target]);
|
|
}
|
|
};
|
|
|
|
onClick('button.bulk-select', function(){
|
|
this.sendAction('toggleBulkSelect');
|
|
this.rerender();
|
|
});
|
|
|
|
onClick('th.sortable', function(e2){
|
|
this.sendAction('changeSort', e2.data('sort-order'));
|
|
this.rerender();
|
|
});
|
|
}
|
|
});
|