FEATURE: Sorting per column on topic list
This commit is contained in:
parent
312cbf883e
commit
1dd582e1b1
|
@ -9,6 +9,8 @@ module KnowledgeExplorer
|
||||||
tags: params[:tags],
|
tags: params[:tags],
|
||||||
category: params[:category],
|
category: params[:category],
|
||||||
search_term: params[:search],
|
search_term: params[:search],
|
||||||
|
ascending: params[:ascending],
|
||||||
|
order: params[:order],
|
||||||
page: params[:page]
|
page: params[:page]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,25 @@
|
||||||
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
classNames: "knowledge-explorer-topic-list"
|
classNames: "knowledge-explorer-topic-list",
|
||||||
|
@discourseComputed("order")
|
||||||
|
sortTitle(order) {
|
||||||
|
return order === "title";
|
||||||
|
},
|
||||||
|
|
||||||
|
@discourseComputed("order")
|
||||||
|
sortActivity(order) {
|
||||||
|
return order === "activity";
|
||||||
|
},
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
sortListActivity() {
|
||||||
|
this.sortBy("activity");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
sortListTitle() {
|
||||||
|
this.sortBy("title");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -18,8 +18,10 @@ function mergeCategories(results) {
|
||||||
export default Ember.Controller.extend({
|
export default Ember.Controller.extend({
|
||||||
application: Ember.inject.controller(),
|
application: Ember.inject.controller(),
|
||||||
queryParams: {
|
queryParams: {
|
||||||
|
ascending: "ascending",
|
||||||
filterCategories: "category",
|
filterCategories: "category",
|
||||||
filterTags: "tags",
|
filterTags: "tags",
|
||||||
|
orderColumn: "order",
|
||||||
searchTerm: "search",
|
searchTerm: "search",
|
||||||
selectedTopic: "topic"
|
selectedTopic: "topic"
|
||||||
},
|
},
|
||||||
|
@ -36,6 +38,8 @@ export default Ember.Controller.extend({
|
||||||
selectedTopic: null,
|
selectedTopic: null,
|
||||||
topic: null,
|
topic: null,
|
||||||
expandedFilters: false,
|
expandedFilters: false,
|
||||||
|
ascending: null,
|
||||||
|
orderColumn: null,
|
||||||
|
|
||||||
@on("init")
|
@on("init")
|
||||||
_setupFilters() {
|
_setupFilters() {
|
||||||
|
@ -149,6 +153,21 @@ export default Ember.Controller.extend({
|
||||||
this.send("refreshModel");
|
this.send("refreshModel");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
sortBy(column) {
|
||||||
|
const order = this.orderColumn;
|
||||||
|
const ascending = this.ascending;
|
||||||
|
if (column === "title") {
|
||||||
|
this.set("orderColumn", "title");
|
||||||
|
} else if (column === "activity") {
|
||||||
|
this.set("orderColumn", "activity");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ascending && order) this.set("ascending", true);
|
||||||
|
else this.set("ascending", "");
|
||||||
|
|
||||||
|
this.send("refreshModel");
|
||||||
|
},
|
||||||
|
|
||||||
loadMore() {
|
loadMore() {
|
||||||
if (this.canLoadMore) {
|
if (this.canLoadMore) {
|
||||||
this.set("isLoadingMore", true);
|
this.set("isLoadingMore", true);
|
||||||
|
@ -172,7 +191,9 @@ export default Ember.Controller.extend({
|
||||||
const params = this.getProperties(
|
const params = this.getProperties(
|
||||||
"filterCategories",
|
"filterCategories",
|
||||||
"filterTags",
|
"filterTags",
|
||||||
"searchTerm"
|
"searchTerm",
|
||||||
|
"ascending",
|
||||||
|
"orderColumn"
|
||||||
);
|
);
|
||||||
|
|
||||||
KnowledgeExplorer.list(params).then(result => {
|
KnowledgeExplorer.list(params).then(result => {
|
||||||
|
|
|
@ -11,6 +11,8 @@ export default {
|
||||||
filters.push(`category=${params.filterCategories}`);
|
filters.push(`category=${params.filterCategories}`);
|
||||||
if (params.filterTags) filters.push(`tags=${params.filterTags}`);
|
if (params.filterTags) filters.push(`tags=${params.filterTags}`);
|
||||||
if (params.searchTerm) filters.push(`search=${params.searchTerm}`);
|
if (params.searchTerm) filters.push(`search=${params.searchTerm}`);
|
||||||
|
if (params.ascending) filters.push("ascending=true");
|
||||||
|
if (params.orderColumn) filters.push(`order=${params.orderColumn}`);
|
||||||
if (params.page) filters.push(`page=${params.page}`);
|
if (params.page) filters.push(`page=${params.page}`);
|
||||||
|
|
||||||
let promise = ajax(`/knowledge-explorer.json?${filters.join("&")}`);
|
let promise = ajax(`/knowledge-explorer.json?${filters.join("&")}`);
|
||||||
|
|
|
@ -1,8 +1,26 @@
|
||||||
{{#load-more selector=".topic-list tr" action=loadMore}}
|
{{#load-more selector=".topic-list tr" action=loadMore}}
|
||||||
<table class="topic-list">
|
<table class="topic-list">
|
||||||
<thead>
|
<thead>
|
||||||
<th>Topic</th>
|
<th {{action "sortListTitle"}}>
|
||||||
<th>Activity</th>
|
Topic
|
||||||
|
{{#if sortTitle}}
|
||||||
|
{{#if ascending}}
|
||||||
|
{{d-icon 'angle-up'}}
|
||||||
|
{{else}}
|
||||||
|
{{d-icon 'angle-down'}}
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
</th>
|
||||||
|
<th {{action "sortListActivity"}}>
|
||||||
|
Activity
|
||||||
|
{{#if sortActivity}}
|
||||||
|
{{#if ascending}}
|
||||||
|
{{d-icon 'angle-up'}}
|
||||||
|
{{else}}
|
||||||
|
{{d-icon 'angle-down'}}
|
||||||
|
{{/if}}
|
||||||
|
{{/if}}
|
||||||
|
</th>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{{#each topics as |topic|}}
|
{{#each topics as |topic|}}
|
||||||
|
|
|
@ -62,6 +62,9 @@
|
||||||
{{#unless emptySearchResults}}
|
{{#unless emptySearchResults}}
|
||||||
{{knowledge-explorer-topic-list
|
{{knowledge-explorer-topic-list
|
||||||
topics=topics
|
topics=topics
|
||||||
|
ascending=ascending
|
||||||
|
order=orderColumn
|
||||||
|
sortBy=(action "sortBy")
|
||||||
selectTopic=(action "setSelectedTopic")
|
selectTopic=(action "setSelectedTopic")
|
||||||
loadMore=(action "loadMore")
|
loadMore=(action "loadMore")
|
||||||
loading=isLoadingMore
|
loading=isLoadingMore
|
||||||
|
|
|
@ -115,6 +115,18 @@
|
||||||
.knowledge-explorer-topic-list {
|
.knowledge-explorer-topic-list {
|
||||||
flex-basis: 100%;
|
flex-basis: 100%;
|
||||||
|
|
||||||
|
th {
|
||||||
|
min-width: 5em;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $primary-low;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d-icon {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.badge-wrapper .badge-category .category-name {
|
.badge-wrapper .badge-category .category-name {
|
||||||
// extra protection for ultra-long category names
|
// extra protection for ultra-long category names
|
||||||
max-width: 30vw;
|
max-width: 30vw;
|
||||||
|
|
|
@ -49,6 +49,20 @@ module KnowledgeExplorer
|
||||||
results = results.where('lower(title) LIKE ?', "%#{@filters[:search_term].downcase}%")
|
results = results.where('lower(title) LIKE ?', "%#{@filters[:search_term].downcase}%")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if @filters[:order] == "title"
|
||||||
|
if @filters[:ascending].present?
|
||||||
|
results = results.reorder('title')
|
||||||
|
else
|
||||||
|
results = results.reorder('title DESC')
|
||||||
|
end
|
||||||
|
elsif @filters[:order] == "activity"
|
||||||
|
if @filters[:ascending].present?
|
||||||
|
results = results.reorder('last_posted_at')
|
||||||
|
else
|
||||||
|
results = results.reorder('last_posted_at DESC')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
tags = tag_count(results)
|
tags = tag_count(results)
|
||||||
categories = categories_count(results)
|
categories = categories_count(results)
|
||||||
|
|
||||||
|
@ -120,6 +134,7 @@ module KnowledgeExplorer
|
||||||
filters.push("tags=#{@filters[:tags]}") if @filters[:tags].present?
|
filters.push("tags=#{@filters[:tags]}") if @filters[:tags].present?
|
||||||
filters.push("category=#{@filters[:category]}") if @filters[:category].present?
|
filters.push("category=#{@filters[:category]}") if @filters[:category].present?
|
||||||
filters.push("search=#{@filters[:search_term]}") if @filters[:search_term].present?
|
filters.push("search=#{@filters[:search_term]}") if @filters[:search_term].present?
|
||||||
|
filters.push("sort=#{@filters[:sort]}") if @filters[:sort].present?
|
||||||
|
|
||||||
if @filters[:page].present?
|
if @filters[:page].present?
|
||||||
filters.push("page=#{@filters[:page].to_i + 1}")
|
filters.push("page=#{@filters[:page].to_i + 1}")
|
||||||
|
|
Loading…
Reference in New Issue