mirror of
https://github.com/discourse/discourse.git
synced 2025-02-06 04:28:30 +08:00
154 lines
4.0 KiB
JavaScript
154 lines
4.0 KiB
JavaScript
import computed from 'ember-addons/ember-computed-decorators';
|
|
import { bufferedRender } from 'discourse-common/lib/buffered-render';
|
|
import { getOwner } from 'discourse-common/lib/get-owner';
|
|
|
|
export function showEntrance(e) {
|
|
let target = $(e.target);
|
|
|
|
if (target.hasClass('posts-map') || target.parents('.posts-map').length > 0) {
|
|
if (target.prop('tagName') !== 'A') {
|
|
target = target.find('a');
|
|
if (target.length===0) {
|
|
target = target.end();
|
|
}
|
|
}
|
|
|
|
this.appEvents.trigger('topic-entrance:show', { topic: this.get('topic'), position: target.offset() });
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export default Ember.Component.extend(bufferedRender({
|
|
rerenderTriggers: ['bulkSelectEnabled', 'topic.pinned'],
|
|
tagName: 'tr',
|
|
classNameBindings: [':topic-list-item', 'unboundClassNames'],
|
|
attributeBindings: ['data-topic-id'],
|
|
'data-topic-id': Em.computed.alias('topic.id'),
|
|
|
|
actions: {
|
|
toggleBookmark() {
|
|
this.get('topic').toggleBookmark().finally(() => this.rerenderBuffer());
|
|
}
|
|
},
|
|
|
|
buildBuffer(buffer) {
|
|
const template = getOwner(this).lookup('template:list/topic-list-item.raw');
|
|
if (template) {
|
|
buffer.push(template(this));
|
|
}
|
|
},
|
|
|
|
@computed('topic', 'lastVisitedTopic')
|
|
unboundClassNames(topic, lastVisitedTopic) {
|
|
let classes = [];
|
|
|
|
if (topic.get('category')) {
|
|
classes.push("category-" + topic.get('category.fullSlug'));
|
|
}
|
|
|
|
if (topic.get('hasExcerpt')) {
|
|
classes.push('has-excerpt');
|
|
}
|
|
|
|
_.each(['liked', 'archived', 'bookmarked'],function(name) {
|
|
if (topic.get(name)) {
|
|
classes.push(name);
|
|
}
|
|
});
|
|
|
|
if (topic === lastVisitedTopic) {
|
|
classes.push('last-visit');
|
|
}
|
|
|
|
return classes.join(' ');
|
|
},
|
|
|
|
titleColSpan: function() {
|
|
return (!this.get('hideCategory') &&
|
|
this.get('topic.isPinnedUncategorized') ? 2 : 1);
|
|
}.property("topic.isPinnedUncategorized"),
|
|
|
|
|
|
hasLikes: function() {
|
|
return this.get('topic.like_count') > 0;
|
|
},
|
|
|
|
hasOpLikes: function() {
|
|
return this.get('topic.op_like_count') > 0;
|
|
},
|
|
|
|
expandPinned: function() {
|
|
const pinned = this.get('topic.pinned');
|
|
if (!pinned) {
|
|
return false;
|
|
}
|
|
|
|
if (this.site.mobileView) {
|
|
if (!this.siteSettings.show_pinned_excerpt_mobile) {
|
|
return false;
|
|
}
|
|
} else {
|
|
if (!this.siteSettings.show_pinned_excerpt_desktop) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (this.get('expandGloballyPinned') && this.get('topic.pinned_globally')) {
|
|
return true;
|
|
}
|
|
|
|
if (this.get('expandAllPinned')) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}.property(),
|
|
|
|
click(e) {
|
|
const result = showEntrance.call(this, e);
|
|
if (result === false) { return result; }
|
|
|
|
const target = $(e.target);
|
|
if (target.hasClass('bulk-select')) {
|
|
const selected = this.get('selected');
|
|
const topic = this.get('topic');
|
|
|
|
if (target.is(':checked')) {
|
|
selected.addObject(topic);
|
|
} else {
|
|
selected.removeObject(topic);
|
|
}
|
|
}
|
|
|
|
if (target.closest('a.topic-status').length === 1) {
|
|
this.get('topic').togglePinnedForUser();
|
|
return false;
|
|
}
|
|
},
|
|
|
|
highlight(opts = { isLastViewedTopic: false }) {
|
|
const $topic = this.$();
|
|
const originalCol = $topic.css('backgroundColor');
|
|
$topic
|
|
.addClass('highlighted')
|
|
.attr('data-islastviewedtopic', opts.isLastViewedTopic)
|
|
.stop()
|
|
.animate({ backgroundColor: originalCol }, 2500, 'swing', function() {
|
|
$topic.removeClass('highlighted');
|
|
});
|
|
},
|
|
|
|
_highlightIfNeeded: function() {
|
|
// highlight the last topic viewed
|
|
if (this.session.get('lastTopicIdViewed') === this.get('topic.id')) {
|
|
this.session.set('lastTopicIdViewed', null);
|
|
this.highlight({ isLastViewedTopic: true });
|
|
} else if (this.get('topic.highlight')) {
|
|
// highlight new topics that have been loaded from the server or the one we just created
|
|
this.set('topic.highlight', false);
|
|
this.highlight();
|
|
}
|
|
}.on('didInsertElement')
|
|
|
|
}));
|