REFACTOR: various refactorings/fixes (#2)

This commit is contained in:
Joffrey JAFFEUX 2019-11-03 22:49:22 +01:00 committed by Sam
parent a34e4468c1
commit 1c845cd517
11 changed files with 145 additions and 90 deletions

View File

@ -1,10 +1,23 @@
import debounce from "discourse/lib/debounce";
export default Ember.Component.extend({ export default Ember.Component.extend({
classNames: "knowledge-explorer-search", classNames: "knowledge-explorer-search",
didUpdateAttrs() {
this._super(...arguments);
Ember.run.schedule("afterRender", () => {
document.querySelector(".knowledge-explorer-search-bar").focus();
});
},
debouncedSearch: debounce(function(term) {
this.onSearch(term);
}, 250),
actions: { actions: {
onSearchTermChange(event) { onSearchTermChange(term) {
const term = event.target.value; this.debouncedSearch(term);
Ember.run.debounce(this, this.onSearch, term, 250);
} }
} }
}); });

View File

@ -1,7 +1,6 @@
import { default as computed } from "ember-addons/ember-computed-decorators";
export default Ember.Component.extend({ export default Ember.Component.extend({
classNames: "knowledge-explorer-topic", classNames: "knowledge-explorer-topic",
originalPostContent: Ember.computed.readOnly( originalPostContent: Ember.computed.readOnly(
"topic.post_stream.posts.firstObject.cooked" "topic.post_stream.posts.firstObject.cooked"
) )

View File

@ -1,6 +1,5 @@
import { import {
default as computed, default as computed
observes
} from "ember-addons/ember-computed-decorators"; } from "ember-addons/ember-computed-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";
@ -15,6 +14,15 @@ export default Ember.Controller.extend({
isLoading: false, isLoading: false,
isLoadingMore: false, isLoadingMore: false,
loadMoreUrl: Ember.computed.alias("model.topics.load_more_url"), loadMoreUrl: Ember.computed.alias("model.topics.load_more_url"),
isTopicLoading: false,
topics: Ember.computed.alias("model.topics.topic_list.topics"),
tags: Ember.computed.readOnly("model.tags"),
filterTags: null,
filterCategory: null,
searchTerm: null,
selectedTopic: null,
topic: null,
@computed("loadMoreUrl") @computed("loadMoreUrl")
canLoadMore(loadMoreUrl) { canLoadMore(loadMoreUrl) {
if (loadMoreUrl === null || this.isLoadingMore) { if (loadMoreUrl === null || this.isLoadingMore) {
@ -22,15 +30,6 @@ export default Ember.Controller.extend({
} }
return true; return true;
}, },
isTopicLoading: false,
topics: Ember.computed.alias("model.topics.topic_list.topics"),
tags: Ember.computed.readOnly("model.tags"),
filterTags: null,
filterCategory: null,
searchTerm: null,
selectedTopic: null,
topic: null,
@computed("searchTerm") @computed("searchTerm")
isSearching(searchTerm) { isSearching(searchTerm) {
@ -41,6 +40,7 @@ export default Ember.Controller.extend({
searchCount(isSearching, topics) { searchCount(isSearching, topics) {
if (isSearching) return topics.length; if (isSearching) return topics.length;
}, },
emptySearchResults: Ember.computed.equal("searchCount", 0), emptySearchResults: Ember.computed.equal("searchCount", 0),
@computed("filterTags") @computed("filterTags")
@ -50,29 +50,40 @@ export default Ember.Controller.extend({
actions: { actions: {
setSelectedTopic(topicId) { setSelectedTopic(topicId) {
this.set("isTopicLoading", true); this.setProperties({
this.set("selectedTopic", topicId); isTopicLoading: true,
selectedTopic: topicId
});
KnowledgeExplorer.getTopic(topicId).then(result => { KnowledgeExplorer.getTopic(topicId).then(result => {
this.set("topic", result); this.setProperties({
this.set("isTopicLoading", false); topic: result,
isTopicLoading: false
});
}); });
}, },
updateSelectedTags(tag) { updateSelectedTags(tag) {
let filter = this.filterTags; let filter = this.filterTags;
if (filter && filter.includes(tag.id)) { if (filter && filter.includes(tag.id)) {
filter = filter.replace(tag.id, ""); filter = filter
filter = filter.replace("|", "|"); .replace(tag.id, "")
filter = filter.replace(/^\|+|\|+$/g, ""); .replace("|", "|")
.replace(/^\|+|\|+$/g, "");
} else if (filter) { } else if (filter) {
filter = `${filter}|${tag.id}`; filter = `${filter}|${tag.id}`;
} else { } else {
filter = tag.id; filter = tag.id;
} }
this.set("filterTags", filter); this.setProperties({
this.set("selectedTopic", null); filterTags: filter,
selectedTopic: null
});
this.send("refreshModel"); this.send("refreshModel");
}, },
performSearch(term) { performSearch(term) {
if (term === "") { if (term === "") {
this.set("searchTerm", null); this.set("searchTerm", null);
@ -84,35 +95,44 @@ export default Ember.Controller.extend({
return false; return false;
} }
this.set("searchTerm", term); this.setProperties({
this.set("selectedTopic", null); searchTerm: term,
selectedTopic: null
});
this.send("refreshModel"); this.send("refreshModel");
}, },
loadMore() { loadMore() {
if (this.canLoadMore) { if (this.canLoadMore) {
this.set("isLoadingMore", true); this.set("isLoadingMore", true);
KnowledgeExplorer.loadMore(this.loadMoreUrl).then(result => { KnowledgeExplorer.loadMore(this.loadMoreUrl).then(result => {
let topics = this.topics; const topics = this.topics.concat(result.topics.topic_list.topics);
topics = topics.concat(result.topics.topic_list.topics); this.setProperties({
topics,
this.set("topics", topics); loadMoreUrl: result.topics.load_more_url || null,
this.set("loadMoreUrl", result.topics.load_more_url || null); isLoadingMore: false
this.set("isLoadingMore", false); });
}); });
} }
}, },
refreshModel() { refreshModel() {
this.set("isLoading", true); this.set("isLoading", true);
const params = this.getProperties( const params = this.getProperties(
"filterCategory", "filterCategory",
"filterTags", "filterTags",
"searchTerm" "searchTerm"
); );
KnowledgeExplorer.list(params).then(result => { KnowledgeExplorer.list(params).then(result => {
this.set("model", result); this.setProperties({
this.set("isLoading", false); model: result,
isLoading: false
});
}); });
} }
} }

View File

@ -2,6 +2,7 @@ import { withPluginApi } from "discourse/lib/plugin-api";
export default { export default {
name: "setup-knowledge-explorer", name: "setup-knowledge-explorer",
initialize() { initialize() {
withPluginApi("0.8", api => { withPluginApi("0.8", api => {
api.decorateWidget("hamburger-menu:generalLinks", () => { api.decorateWidget("hamburger-menu:generalLinks", () => {

View File

@ -9,9 +9,11 @@ export default {
return ajax(`/knowledge-explorer.json?${filters.join("&")}`); return ajax(`/knowledge-explorer.json?${filters.join("&")}`);
}, },
loadMore(loadMoreUrl) { loadMore(loadMoreUrl) {
return ajax(loadMoreUrl); return ajax(loadMoreUrl);
}, },
getTopic(id) { getTopic(id) {
return ajax(`/t/${id}.json`); return ajax(`/t/${id}.json`);
} }

View File

@ -1,7 +1,12 @@
import { ajax } from "discourse/lib/ajax";
import KnowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer"; import KnowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
export default Ember.Route.extend({ export default Ember.Route.extend({
queryParams: {
searchTerm: {
replace: true
}
},
model(params) { model(params) {
return KnowledgeExplorer.list(params); return KnowledgeExplorer.list(params);
} }

View File

@ -1,7 +1,8 @@
<input {{input
type="text" type="text"
value={{searchTerm}} value=(readonly searchTerm)
oninput={{action "onSearchTermChange"}} input=(action "onSearchTermChange" value="target.value")
class="knowledge-explorer-search-bar" class="knowledge-explorer-search-bar"
autocorrect="off" autocorrect="off"
autocapitalize="off"> autocapitalize="off"
}}

View File

@ -2,7 +2,8 @@
{{#unless tag.active}} {{#unless tag.active}}
{{d-icon "plus"}} {{d-icon "plus"}}
{{/unless}} {{/unless}}
<span class="tag-id">{{tag.id}}</span><span class="tag-count">({{tag.count}})</span> <span class="tag-id">{{tag.id}}</span>
<span class="tag-count">({{tag.count}})</span>
{{#if tag.active}} {{#if tag.active}}
{{d-icon "times-circle"}} {{d-icon "times-circle"}}
{{/if}} {{/if}}

View File

@ -1,28 +1,32 @@
{{#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>Topic</th>
<th>Activity</th> <th>Activity</th>
</thead> </thead>
<tbody> <tbody>
{{#each topics as |topic|}} {{#each topics as |topic|}}
<tr> <tr>
<td class="main-link"> <td class="main-link">
<span class="link-top-line"> <span class="link-top-line">
{{knowledge-explorer-topic-link topic=topic selectTopic=selectTopic}} {{knowledge-explorer-topic-link
</span> topic=topic
<span class="link-bottom-line"> selectTopic=selectTopic
{{#each topic.tags as |tag|}} }}
<span class="discourse-tag">{{tag}}</span> </span>
{{/each}} <span class="link-bottom-line">
</span> {{#each topic.tags as |tag|}}
</td> <span class="discourse-tag">{{tag}}</span>
<td> {{/each}}
{{format-date topic.bumped_at format="tiny" noTitle="true"}} </span>
</td> </td>
</tr> <td>
{{/each}} {{format-date topic.bumped_at format="tiny" noTitle="true"}}
</tbody> </td>
</table> </tr>
{{/each}}
</tbody>
</table>
{{/load-more}} {{/load-more}}
{{conditional-loading-spinner condition=loading}} {{conditional-loading-spinner condition=loading}}

View File

@ -1,8 +1,12 @@
{{#link-to 'knowledgeExplorer' (query-params topic=null) class='knowledge-explorer-nav-link return'}} {{#link-to 'knowledgeExplorer' (query-params topic=null) class='knowledge-explorer-nav-link return'}}
{{i18n 'knowledge_explorer.topic.back'}} {{i18n 'knowledge_explorer.topic.back'}}
{{/link-to}} {{/link-to}}
<div class="topic-content"> <div class="topic-content">
<h1>{{topic.title}}</h1> <h1>{{topic.title}}</h1>
{{{originalPostContent}}} {{{originalPostContent}}}
</div> </div>
<a class="knowledge-explorer-nav-link more" href="/t/{{topic.id}}">{{i18n 'knowledge_explorer.topic.navigate_to_topic'}}</a>
<a class="knowledge-explorer-nav-link more" href="/t/{{topic.id}}">
{{i18n 'knowledge_explorer.topic.navigate_to_topic'}}
</a>

View File

@ -1,17 +1,16 @@
<div class="knowledge-explorer"> <div class="knowledge-explorer">
<div class="knowledge-explorer-search"> {{knowledge-explorer-search
{{knowledge-explorer-search searchTerm=(readonly searchTerm)
onSearch=(action "performSearch") onSearch=(action "performSearch")
}} }}
</div>
{{#conditional-loading-spinner condition=isLoading}} {{#conditional-loading-spinner condition=isLoading}}
<div class="knowledge-explorer-browse"> <div class="knowledge-explorer-browse">
<div class="knowledge-explorer-tags"> <div class="knowledge-explorer-tags">
{{#each tags as |tag|}} {{#each tags as |tag|}}
{{knowledge-explorer-tag {{knowledge-explorer-tag
tag=tag tag=tag
selectTag=(action "updateSelectedTags") selectTag=(action "updateSelectedTags")
}} }}
{{/each}} {{/each}}
</div> </div>
{{#if selectedTopic}} {{#if selectedTopic}}
@ -20,21 +19,27 @@
{{/conditional-loading-spinner}} {{/conditional-loading-spinner}}
{{else}} {{else}}
<div class="knowledge-explorer-results"> <div class="knowledge-explorer-results">
{{#if isSearching}} {{#if isSearching}}
{{#if emptySearchResults}} {{#if emptySearchResults}}
<div class="result-count no-result">{{i18n 'search.no_results'}}</div> <div class="result-count no-result">
{{else}} {{i18n 'search.no_results'}}
<div class="result-count">{{i18n 'knowledge_explorer.search.results' count=searchCount}}</div> </div>
{{else}}
<div class="result-count">
{{i18n 'knowledge_explorer.search.results'
count=searchCount
}}
</div>
{{/if}}
{{/if}} {{/if}}
{{/if}} {{#unless emptySearchResults}}
{{#unless emptySearchResults}} {{knowledge-explorer-topic-list
{{knowledge-explorer-topic-list topics=topics
topics=topics selectTopic=(action "setSelectedTopic")
selectTopic=(action "setSelectedTopic") loadMore=(action "loadMore")
loadMore=(action "loadMore") loading=isLoadingMore
loading=isLoadingMore }}
}} {{/unless}}
{{/unless}}
</div> </div>
{{/if}} {{/if}}
</div> </div>