This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/components/topic-list.js.es6
Sam c51fec7fda FIX: improve last visited detection
- clear line detection cache on category change
- don't show last visited unless latest / descending
- improve perf of last visited detection algorithm
2016-08-21 17:06:00 +10:00

113 lines
2.5 KiB
JavaScript

import {default as computed, 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);
}.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('category')
categoryChanged: function(){
this.set('prevTopic', null);
},
@computed('topics.@each', 'order', 'ascending')
lastVisitedTopic(topics, order, ascending) {
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 prevTopic, topic;
prevTopic = this.get('prevTopic');
if (prevTopic) {
return prevTopic;
}
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) {
prevTopic = topics[i];
break;
}
topic = topics[i];
}
if (!prevTopic || !topic) {
return;
}
// end of list that was scanned
if (topic.get('bumpedAt') > prevVisit) {
return;
}
this.set('prevTopic', prevTopic);
return prevTopic;
},
click(e) {
var self = this;
var on = function(sel, callback){
var target = $(e.target).closest(sel);
if(target.length === 1){
callback.apply(self, [target]);
}
};
on('button.bulk-select', function(){
this.sendAction('toggleBulkSelect');
this.rerender();
});
on('th.sortable', function(e2){
this.sendAction('changeSort', e2.data('sort-order'));
this.rerender();
});
}
});