mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
PERF: improve rendering speed of topic header
This also ensures we have a clean point to override rendering of topic list header in case we decide to add/remove columns, you no longer need to override the entire discovery template, only the header and item templates.
This commit is contained in:
parent
ef62933034
commit
a6fbf7d86b
@ -1,27 +0,0 @@
|
|||||||
/**
|
|
||||||
Renders a heading for a table with optional sorting controls.
|
|
||||||
|
|
||||||
@class SortableHeadingComponent
|
|
||||||
@extends Ember.Component
|
|
||||||
@namespace Discourse
|
|
||||||
@module Discourse
|
|
||||||
**/
|
|
||||||
export default Ember.Component.extend({
|
|
||||||
tagName: 'th',
|
|
||||||
classNameBindings: ['number:num', 'sortBy', 'iconSortClass:sorting', 'sortable:sortable'],
|
|
||||||
attributeBindings: ['colspan'],
|
|
||||||
|
|
||||||
sortable: function() {
|
|
||||||
return this.get('sortBy');
|
|
||||||
}.property('sortBy'),
|
|
||||||
|
|
||||||
iconSortClass: function() {
|
|
||||||
if (this.get('sortable') && this.get('sortBy') === this.get('order')) {
|
|
||||||
return this.get('ascending') ? 'fa fa-chevron-up' : 'fa fa-chevron-down';
|
|
||||||
}
|
|
||||||
}.property('sortable', 'order', 'ascending'),
|
|
||||||
|
|
||||||
click: function() {
|
|
||||||
this.sendAction('action', this.get('sortBy'));
|
|
||||||
}
|
|
||||||
});
|
|
@ -0,0 +1,67 @@
|
|||||||
|
import StringBuffer from 'discourse/mixins/string-buffer';
|
||||||
|
|
||||||
|
export default Ember.Component.extend(StringBuffer, {
|
||||||
|
tagName: 'tr',
|
||||||
|
|
||||||
|
rerenderTriggers: ['order', 'ascending'],
|
||||||
|
|
||||||
|
click: function(e) {
|
||||||
|
var target = $(e.target);
|
||||||
|
|
||||||
|
if(target.parents().andSelf().hasClass('bulk-select')){
|
||||||
|
this.sendAction('toggleBulkSelect');
|
||||||
|
} else {
|
||||||
|
var th = target.closest('th.sortable');
|
||||||
|
if(th.length > 0) {
|
||||||
|
this.sendAction('changeSort', th.data('sort-order'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
renderColumn: function(buffer, options){
|
||||||
|
var className = options.sortable ? "sortable " : "";
|
||||||
|
className += options.order || "";
|
||||||
|
|
||||||
|
var sortIcon = "";
|
||||||
|
if(this.get("order") === options.order){
|
||||||
|
className += " sorting";
|
||||||
|
sortIcon = " <i class='fa fa-chevron-" + (this.get('ascending') ? 'up' : 'down') + "'></i>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(options.number){
|
||||||
|
className += " num";
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.push("<th data-sort-order='" + options.order + "' class='"+ className +"'>" + I18n.t(options.name) + sortIcon + "</th>");
|
||||||
|
},
|
||||||
|
|
||||||
|
renderString: function(buffer){
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(this.get('currentUser')){
|
||||||
|
buffer.push("<th class='star'>");
|
||||||
|
if(this.get('canBulkSelect')){
|
||||||
|
var title = I18n.t('topics.bulk.toggle');
|
||||||
|
buffer.push("<button class='btn bulk-select' title='" + title + "'><i class='fa fa-list'></i></button>");
|
||||||
|
}
|
||||||
|
buffer.push("</th>");
|
||||||
|
}
|
||||||
|
|
||||||
|
var column = function(options){
|
||||||
|
self.renderColumn(buffer, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
column({name: 'topic.title', sortable: false, order: 'default'});
|
||||||
|
|
||||||
|
if(!this.get('hideCategory')) {
|
||||||
|
column({name: 'category_title', sortable: true, order: 'category'});
|
||||||
|
}
|
||||||
|
|
||||||
|
column({sortable: false, order: 'posters', name: 'users'});
|
||||||
|
column({sortable: true, order: 'posts', name: 'posts', number: true});
|
||||||
|
column({sortable: true, order: 'views', name: 'views', number: true});
|
||||||
|
column({sortable: true, order: 'activity', name: 'activity', number: true});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
@ -1,2 +0,0 @@
|
|||||||
{{yield}}
|
|
||||||
<i {{bind-attr class="iconSortClass"}}></i>
|
|
@ -37,31 +37,7 @@
|
|||||||
{{#if hasTopics}}
|
{{#if hasTopics}}
|
||||||
<table class='topic-list'>
|
<table class='topic-list'>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
{{topic-list-header currentUser=currentUser canBulkSelect=canBulkSelect changeSort="changeSort" toggleBulkSelect="toggleBulkSelect" hideCategory=hideCategory order=order ascending=ascending}}
|
||||||
{{#if currentUser}}
|
|
||||||
<th class='star'>
|
|
||||||
{{#if canBulkSelect}}
|
|
||||||
<button class='btn bulk-select' {{action "toggleBulkSelect"}} title="{{i18n 'topics.bulk.toggle'}}"><i class='fa fa-list'></i></button>
|
|
||||||
{{/if}}
|
|
||||||
</th>
|
|
||||||
{{/if}}
|
|
||||||
{{#sortable-heading class="default"}} {{i18n 'topic.title'}} {{/sortable-heading}}
|
|
||||||
{{#unless controller.hideCategory}}
|
|
||||||
{{#sortable-heading sortBy="category" action="changeSort" order=order ascending=ascending}}
|
|
||||||
{{i18n 'category_title'}}
|
|
||||||
{{/sortable-heading}}
|
|
||||||
{{/unless}}
|
|
||||||
{{#sortable-heading class="posters"}} {{i18n 'users'}} {{/sortable-heading}}
|
|
||||||
{{#sortable-heading sortBy="posts" number=true action="changeSort" order=order ascending=ascending}}
|
|
||||||
{{i18n 'posts'}}
|
|
||||||
{{/sortable-heading}}
|
|
||||||
{{#sortable-heading sortBy="views" number=true action="changeSort" order=order ascending=ascending}}
|
|
||||||
{{i18n 'views'}}
|
|
||||||
{{/sortable-heading}}
|
|
||||||
{{#sortable-heading sortBy="activity" number=true action="changeSort" order=order ascending=ascending}}
|
|
||||||
{{i18n 'activity'}}
|
|
||||||
{{/sortable-heading}}
|
|
||||||
</tr>
|
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{each content in topics itemController="topic-list-item" itemView="topic-list-item"}}
|
{{each content in topics itemController="topic-list-item" itemView="topic-list-item"}}
|
||||||
|
Loading…
Reference in New Issue
Block a user