FIX: Results count not always properly shown (#21)
There was a weird case where when filtering topics by solved status did not properly show the count of filtered topics. I took this opportunity to lightly refactor the backend. There was a duplicate size operation when we searched and when calculating pagination. I've eliminated the second size call and refactored the front end to be a little bit simpler while solving the bug.
This commit is contained in:
parent
0e610cf504
commit
63a8181fa4
|
@ -1,5 +1,7 @@
|
||||||
import Controller from "@ember/controller";
|
import Controller from "@ember/controller";
|
||||||
|
import { inject } from "@ember/controller";
|
||||||
import discourseComputed from "discourse-common/utils/decorators";
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
|
import { alias, readOnly, equal } from "@ember/object/computed";
|
||||||
import { on } from "discourse-common/utils/decorators";
|
import { on } from "discourse-common/utils/decorators";
|
||||||
import KnowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
|
import KnowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
|
||||||
import { getOwner } from "@ember/application";
|
import { getOwner } from "@ember/application";
|
||||||
|
@ -14,14 +16,14 @@ export default Controller.extend({
|
||||||
searchTerm: "search",
|
searchTerm: "search",
|
||||||
selectedTopic: "topic",
|
selectedTopic: "topic",
|
||||||
},
|
},
|
||||||
application: Ember.inject.controller(),
|
application: inject(),
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
isLoadingMore: false,
|
isLoadingMore: false,
|
||||||
loadMoreUrl: Ember.computed.alias("model.topics.load_more_url"),
|
loadMoreUrl: alias("model.topics.load_more_url"),
|
||||||
isTopicLoading: false,
|
isTopicLoading: false,
|
||||||
categories: Ember.computed.readOnly("model.categories"),
|
categories: readOnly("model.categories"),
|
||||||
topics: Ember.computed.alias("model.topics.topic_list.topics"),
|
topics: alias("model.topics.topic_list.topics"),
|
||||||
tags: Ember.computed.readOnly("model.tags"),
|
tags: readOnly("model.tags"),
|
||||||
filterTags: null,
|
filterTags: null,
|
||||||
filterCategories: null,
|
filterCategories: null,
|
||||||
filterSolved: false,
|
filterSolved: false,
|
||||||
|
@ -31,6 +33,7 @@ export default Controller.extend({
|
||||||
expandedFilters: false,
|
expandedFilters: false,
|
||||||
ascending: null,
|
ascending: null,
|
||||||
orderColumn: null,
|
orderColumn: null,
|
||||||
|
topicCount: alias("model.topic_count"),
|
||||||
|
|
||||||
@on("init")
|
@on("init")
|
||||||
_setupFilters() {
|
_setupFilters() {
|
||||||
|
@ -42,7 +45,7 @@ export default Controller.extend({
|
||||||
@discourseComputed("topics", "isSearching", "filterSolved")
|
@discourseComputed("topics", "isSearching", "filterSolved")
|
||||||
emptyTopics(topics, isSearching, filterSolved) {
|
emptyTopics(topics, isSearching, filterSolved) {
|
||||||
const filtered = isSearching || filterSolved;
|
const filtered = isSearching || filterSolved;
|
||||||
return topics.length === 0 && !filtered;
|
return this.topicCount === 0 && !filtered;
|
||||||
},
|
},
|
||||||
|
|
||||||
@discourseComputed("loadMoreUrl")
|
@discourseComputed("loadMoreUrl")
|
||||||
|
@ -60,24 +63,7 @@ export default Controller.extend({
|
||||||
return isSearching || filterSolved;
|
return isSearching || filterSolved;
|
||||||
},
|
},
|
||||||
|
|
||||||
@discourseComputed("isSearching", "model")
|
emptyResults: equal("topicCount", 0),
|
||||||
searchCount(isSearching, model) {
|
|
||||||
if (isSearching) {
|
|
||||||
return model.search_count;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
emptySearchResults: Ember.computed.equal("searchCount", 0),
|
|
||||||
|
|
||||||
@discourseComputed("topics")
|
|
||||||
emptyFilteredResults(topics) {
|
|
||||||
return topics.length === 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed("emptySearchResults", "emptyFilteredResults")
|
|
||||||
emptyResults(emptySearch, emptyFiltered) {
|
|
||||||
return emptySearch || emptyFiltered;
|
|
||||||
},
|
|
||||||
|
|
||||||
@discourseComputed
|
@discourseComputed
|
||||||
canFilterSolved() {
|
canFilterSolved() {
|
||||||
|
@ -134,6 +120,7 @@ export default Controller.extend({
|
||||||
selectedTopic: null,
|
selectedTopic: null,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
performSearch(term) {
|
performSearch(term) {
|
||||||
if (term === "") {
|
if (term === "") {
|
||||||
this.set("searchTerm", null);
|
this.set("searchTerm", null);
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import Controller from "@ember/controller";
|
import Controller from "@ember/controller";
|
||||||
|
import { inject } from "@ember/controller";
|
||||||
|
|
||||||
export default Controller.extend({
|
export default Controller.extend({
|
||||||
indexController: Ember.inject.controller("knowledgeExplorer.index"),
|
indexController: inject("knowledgeExplorer.index"),
|
||||||
actions: {
|
actions: {
|
||||||
updateSelectedCategories(category) {
|
updateSelectedCategories(category) {
|
||||||
this.indexController.send("updateSelectedCategories", category);
|
this.indexController.send("updateSelectedCategories", category);
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="result-count">
|
<div class="result-count">
|
||||||
{{i18n 'knowledge_explorer.search.results'
|
{{i18n 'knowledge_explorer.search.results'
|
||||||
count=searchCount
|
count=topicCount
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -74,7 +74,6 @@ module KnowledgeExplorer
|
||||||
pd.search_data @@ #{escaped_ts_query}
|
pd.search_data @@ #{escaped_ts_query}
|
||||||
)
|
)
|
||||||
SQL
|
SQL
|
||||||
search_count = results.size
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if @filters[:order] == "title"
|
if @filters[:order] == "title"
|
||||||
|
@ -126,7 +125,7 @@ module KnowledgeExplorer
|
||||||
topic_list['load_more_url'] = nil
|
topic_list['load_more_url'] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
{ tags: tags, categories: categories, topics: topic_list, search_count: search_count }
|
{ tags: tags, categories: categories, topics: topic_list, topic_count: results_length }
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_tags_object(tags)
|
def create_tags_object(tags)
|
||||||
|
|
|
@ -29,6 +29,15 @@ describe KnowledgeExplorer::KnowledgeExplorerController do
|
||||||
expect(tags.size).to eq(1)
|
expect(tags.size).to eq(1)
|
||||||
expect(topics.size).to eq(2)
|
expect(topics.size).to eq(2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'should return a topic count' do
|
||||||
|
get '/docs.json'
|
||||||
|
|
||||||
|
json = response.parsed_body
|
||||||
|
topic_count = json['topic_count']
|
||||||
|
|
||||||
|
expect(topic_count).to eq(2)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when some knowledge explorer topics are private' do
|
context 'when some knowledge explorer topics are private' do
|
||||||
|
|
Loading…
Reference in New Issue