Spec tests & minor refactors
This commit is contained in:
parent
1b9ea64f15
commit
5d0da1fe0a
|
@ -1,3 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module KnowledgeExplorer
|
module KnowledgeExplorer
|
||||||
class KnowledgeExplorerController < ApplicationController
|
class KnowledgeExplorerController < ApplicationController
|
||||||
requires_plugin 'knowledge-explorer'
|
requires_plugin 'knowledge-explorer'
|
||||||
|
|
|
@ -1,29 +1,10 @@
|
||||||
import knowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
|
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
classNames: "knowledge-explorer-search",
|
classNames: "knowledge-explorer-search",
|
||||||
|
|
||||||
performSearch(term) {
|
|
||||||
if (term.length < this.siteSettings.min_search_term_length) {
|
|
||||||
this.set("searchResults", null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// query the search api
|
|
||||||
const tags = this.get("filterTags") || null;
|
|
||||||
if (tags && tags.includes(" ")) {
|
|
||||||
tags.join(" ");
|
|
||||||
}
|
|
||||||
knowledgeExplorer.search(tags, term).then(result => {
|
|
||||||
this.set("searchResults", result.topics || []);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
onSearchTermChange(e) {
|
onSearchTermChange(event) {
|
||||||
const term = e.target.value;
|
const term = event.target.value;
|
||||||
this.set("searchTerm", term);
|
Ember.run.debounce(this, this.onSearch, term, 250);
|
||||||
Ember.run.debounce(this, this.performSearch, term, 250);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
export default Ember.Component.extend({
|
|
||||||
classNames: "knowledge-explorer-tags"
|
|
||||||
});
|
|
|
@ -1,17 +1,6 @@
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
click() {
|
click() {
|
||||||
const tag = this.get("tag");
|
this.selectTag(this.tag);
|
||||||
let filter = this.get("filterTags");
|
return false;
|
||||||
if (filter && filter.includes(tag.id)) {
|
|
||||||
filter = filter.replace(tag.id, "");
|
|
||||||
filter = filter.replace(" ", " ");
|
|
||||||
filter = filter.replace(/^\s+|\s+$/g, "");
|
|
||||||
} else if (filter) {
|
|
||||||
filter = `${filter} ${tag.id}`;
|
|
||||||
} else {
|
|
||||||
filter = tag.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.set("filterTags", filter);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
click() {
|
click() {
|
||||||
this.set("selectedTopic", this.topic.id);
|
this.selectTopic(this.topic.id);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,6 +2,7 @@ import {
|
||||||
default as computed,
|
default as computed,
|
||||||
observes
|
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";
|
||||||
|
|
||||||
export default Ember.Controller.extend({
|
export default Ember.Controller.extend({
|
||||||
application: Ember.inject.controller(),
|
application: Ember.inject.controller(),
|
||||||
|
@ -18,23 +19,48 @@ export default Ember.Controller.extend({
|
||||||
|
|
||||||
selectedTopic: null,
|
selectedTopic: null,
|
||||||
|
|
||||||
|
searchCount: Ember.computed.readOnly("searchResults.length"),
|
||||||
|
emptySearchResults: Ember.computed.equal("searchCount", 0),
|
||||||
|
|
||||||
@computed("searchResults")
|
@computed("searchResults")
|
||||||
hasSearchResults(results) {
|
hasSearchResults(results) {
|
||||||
return !!results;
|
return !!results;
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed("searchResults")
|
|
||||||
emptySearchResults(results) {
|
|
||||||
return results.length === 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
@computed("searchResults")
|
|
||||||
searchCount(results) {
|
|
||||||
return results.length;
|
|
||||||
},
|
|
||||||
|
|
||||||
@computed("filterTags")
|
@computed("filterTags")
|
||||||
filtered(filterTags) {
|
filtered(filterTags) {
|
||||||
return !!filterTags;
|
return !!filterTags;
|
||||||
|
},
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
setSelectedTopic(topicID) {
|
||||||
|
this.set("selectedTopic", topicID);
|
||||||
|
},
|
||||||
|
updateSelectedTags(tag) {
|
||||||
|
let filter = this.filterTags;
|
||||||
|
if (filter && filter.includes(tag.id)) {
|
||||||
|
filter = filter.replace(tag.id, "");
|
||||||
|
filter = filter.replace("++", "+");
|
||||||
|
filter = filter.replace(/^\++|\++$/g, "");
|
||||||
|
} else if (filter) {
|
||||||
|
filter = `${filter}+${tag.id}`;
|
||||||
|
} else {
|
||||||
|
filter = tag.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.set("filterTags", filter);
|
||||||
|
},
|
||||||
|
performSearch(term) {
|
||||||
|
if (term.length < this.siteSettings.min_search_term_length) {
|
||||||
|
this.set("searchResults", null);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const tags = this.get("filterTags") || null;
|
||||||
|
|
||||||
|
knowledgeExplorer.search(term, tags).then(result => {
|
||||||
|
this.set("searchResults", result.topics || []);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
search(tags, filter) {
|
//write as one liner
|
||||||
if (tags) {
|
//use + instead of space for query param
|
||||||
return ajax(
|
search(filter, tags) {
|
||||||
`/search.json?q=in:kb tags:${tags.replace(/ /g, "+")} ${filter}`
|
let params = [filter];
|
||||||
);
|
if (tags) params.push(`tags:${tags}`);
|
||||||
} else {
|
const endpoint = `/search.json?q=in:kb ${params.join(" ")}`;
|
||||||
return ajax(`/search.json?q=in:kb ${filter}`);
|
return ajax(endpoint);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
{{#each tags as |tag|}}
|
|
||||||
{{knowledge-explorer-tag
|
|
||||||
tag=tag
|
|
||||||
filterTags=filterTags
|
|
||||||
}}
|
|
||||||
{{/each}}
|
|
|
@ -8,7 +8,7 @@
|
||||||
<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 selectedTopic=selectedTopic}}
|
{{knowledge-explorer-topic-link topic=topic selectTopic=selectTopic}}
|
||||||
</span>
|
</span>
|
||||||
<span class="link-bottom-line">
|
<span class="link-bottom-line">
|
||||||
{{#each topic.tags as |tag|}}
|
{{#each topic.tags as |tag|}}
|
||||||
|
|
|
@ -4,16 +4,18 @@
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="knowledge-explorer-search">
|
<div class="knowledge-explorer-search">
|
||||||
{{knowledge-explorer-search
|
{{knowledge-explorer-search
|
||||||
searchResults=searchResults
|
onSearch=(action "performSearch")
|
||||||
searchTerm=searchTerm
|
|
||||||
filterTags=filterTags
|
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
<div class="knowledge-explorer-browse">
|
<div class="knowledge-explorer-browse">
|
||||||
{{knowledge-explorer-tag-list
|
<div class="knowledge-explorer-tags">
|
||||||
tags=tags
|
{{#each tags as |tag|}}
|
||||||
filterTags=filterTags
|
{{knowledge-explorer-tag
|
||||||
}}
|
tag=tag
|
||||||
|
selectTag=(action "updateSelectedTags")
|
||||||
|
}}
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
<div class="knowledge-explorer-results">
|
<div class="knowledge-explorer-results">
|
||||||
{{#if hasSearchResults}}
|
{{#if hasSearchResults}}
|
||||||
{{#if emptySearchResults}}
|
{{#if emptySearchResults}}
|
||||||
|
@ -22,13 +24,13 @@
|
||||||
<div class="result-count">{{i18n 'knowledge_explorer.search.results' count=searchCount}}</div>
|
<div class="result-count">{{i18n 'knowledge_explorer.search.results' count=searchCount}}</div>
|
||||||
{{knowledge-explorer-topic-list
|
{{knowledge-explorer-topic-list
|
||||||
topics=searchResults
|
topics=searchResults
|
||||||
selectedTopic=selectedTopic
|
selectTopic=(action "setSelectedTopic")
|
||||||
}}
|
}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{knowledge-explorer-topic-list
|
{{knowledge-explorer-topic-list
|
||||||
topics=topics
|
topics=topics
|
||||||
selectedTopic=selectedTopic
|
selectTopic=(action "setSelectedTopic")
|
||||||
}}
|
}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_dependency "knowledge_explorer_constraint"
|
require_dependency "knowledge_explorer_constraint"
|
||||||
|
|
||||||
KnowledgeExplorer::Engine.routes.draw do
|
KnowledgeExplorer::Engine.routes.draw do
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module ::KnowledgeExplorer
|
module ::KnowledgeExplorer
|
||||||
class Engine < ::Rails::Engine
|
class Engine < ::Rails::Engine
|
||||||
isolate_namespace KnowledgeExplorer
|
isolate_namespace KnowledgeExplorer
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class KnowledgeExplorerConstraint
|
class KnowledgeExplorerConstraint
|
||||||
def matches?(request)
|
def matches?(request)
|
||||||
SiteSetting.knowledge_explorer_enabled
|
SiteSetting.knowledge_explorer_enabled
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
# name: discourse-knowledge-explorer
|
# name: discourse-knowledge-explorer
|
||||||
# about: A plugin to make it easy to explore and find knowledge base-type articles in Discourse
|
# about: A plugin to make it easy to explore and find knowledge base-type articles in Discourse
|
||||||
# version: 0.1
|
# version: 0.1
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe KnowledgeExplorer::KnowledgeExplorerController do
|
||||||
|
let!(:category) { Fabricate(:category) }
|
||||||
|
let!(:topic) { Fabricate(:topic, category: category) }
|
||||||
|
let!(:topic2) { Fabricate(:topic, category: category) }
|
||||||
|
let!(:tag) { Fabricate(:tag, topics: [topic], name: 'test') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
SiteSetting.tagging_enabled = true
|
||||||
|
SiteSetting.knowledge_explorer_enabled = true
|
||||||
|
SiteSetting.knowledge_explorer_categories = category.id.to_s
|
||||||
|
SiteSetting.knowledge_explorer_tags = 'test'
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'knowledge explorer data' do
|
||||||
|
context 'when any user' do
|
||||||
|
it 'should return the right response' do
|
||||||
|
get '/knowledge-explorer.json'
|
||||||
|
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
|
||||||
|
json = JSON.parse(response.body)
|
||||||
|
|
||||||
|
expect(json['tags'].size).to eq(1)
|
||||||
|
expect(json['topics'].size).to eq(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when some knowledge explorer topics are private" do
|
||||||
|
let!(:group) { Fabricate(:group) }
|
||||||
|
let!(:private_category) { Fabricate(:private_category, group: group) }
|
||||||
|
let!(:private_topic) { Fabricate(:topic, category: private_category) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
SiteSetting.knowledge_explorer_categories = "#{category.id}|#{private_category.id}"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should not show topics in private categories without permissions' do
|
||||||
|
get '/knowledge-explorer.json'
|
||||||
|
|
||||||
|
json = JSON.parse(response.body)
|
||||||
|
|
||||||
|
expect(json['topics'].size).to eq(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should show topics when users have permissions' do
|
||||||
|
admin = Fabricate(:admin)
|
||||||
|
sign_in(admin)
|
||||||
|
|
||||||
|
get '/knowledge-explorer.json'
|
||||||
|
|
||||||
|
json = JSON.parse(response.body)
|
||||||
|
|
||||||
|
expect(json['topics'].size).to eq(3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when filtering by tag' do
|
||||||
|
it 'should return a filtered list' do
|
||||||
|
get '/knowledge-explorer.json?tags=test'
|
||||||
|
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
|
||||||
|
json = JSON.parse(response.body)
|
||||||
|
|
||||||
|
expect(json['tags'].size).to eq(1)
|
||||||
|
expect(json['topics'].size).to eq(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue