Spec tests & minor refactors
This commit is contained in:
parent
1b9ea64f15
commit
5d0da1fe0a
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module KnowledgeExplorer
|
||||
class KnowledgeExplorerController < ApplicationController
|
||||
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({
|
||||
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: {
|
||||
onSearchTermChange(e) {
|
||||
const term = e.target.value;
|
||||
this.set("searchTerm", term);
|
||||
Ember.run.debounce(this, this.performSearch, term, 250);
|
||||
onSearchTermChange(event) {
|
||||
const term = event.target.value;
|
||||
Ember.run.debounce(this, this.onSearch, term, 250);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
export default Ember.Component.extend({
|
||||
classNames: "knowledge-explorer-tags"
|
||||
});
|
|
@ -1,17 +1,6 @@
|
|||
export default Ember.Component.extend({
|
||||
click() {
|
||||
const tag = this.get("tag");
|
||||
let filter = this.get("filterTags");
|
||||
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);
|
||||
this.selectTag(this.tag);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
export default Ember.Component.extend({
|
||||
click() {
|
||||
this.set("selectedTopic", this.topic.id);
|
||||
this.selectTopic(this.topic.id);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -2,6 +2,7 @@ import {
|
|||
default as computed,
|
||||
observes
|
||||
} from "ember-addons/ember-computed-decorators";
|
||||
import knowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer";
|
||||
|
||||
export default Ember.Controller.extend({
|
||||
application: Ember.inject.controller(),
|
||||
|
@ -18,23 +19,48 @@ export default Ember.Controller.extend({
|
|||
|
||||
selectedTopic: null,
|
||||
|
||||
searchCount: Ember.computed.readOnly("searchResults.length"),
|
||||
emptySearchResults: Ember.computed.equal("searchCount", 0),
|
||||
|
||||
@computed("searchResults")
|
||||
hasSearchResults(results) {
|
||||
return !!results;
|
||||
},
|
||||
|
||||
@computed("searchResults")
|
||||
emptySearchResults(results) {
|
||||
return results.length === 0;
|
||||
},
|
||||
|
||||
@computed("searchResults")
|
||||
searchCount(results) {
|
||||
return results.length;
|
||||
},
|
||||
|
||||
@computed("filterTags")
|
||||
filtered(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";
|
||||
|
||||
export default {
|
||||
search(tags, filter) {
|
||||
if (tags) {
|
||||
return ajax(
|
||||
`/search.json?q=in:kb tags:${tags.replace(/ /g, "+")} ${filter}`
|
||||
);
|
||||
} else {
|
||||
return ajax(`/search.json?q=in:kb ${filter}`);
|
||||
}
|
||||
//write as one liner
|
||||
//use + instead of space for query param
|
||||
search(filter, tags) {
|
||||
let params = [filter];
|
||||
if (tags) params.push(`tags:${tags}`);
|
||||
const endpoint = `/search.json?q=in:kb ${params.join(" ")}`;
|
||||
return ajax(endpoint);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
{{#each tags as |tag|}}
|
||||
{{knowledge-explorer-tag
|
||||
tag=tag
|
||||
filterTags=filterTags
|
||||
}}
|
||||
{{/each}}
|
|
@ -8,7 +8,7 @@
|
|||
<tr>
|
||||
<td class="main-link">
|
||||
<span class="link-top-line">
|
||||
{{knowledge-explorer-topic-link topic=topic selectedTopic=selectedTopic}}
|
||||
{{knowledge-explorer-topic-link topic=topic selectTopic=selectTopic}}
|
||||
</span>
|
||||
<span class="link-bottom-line">
|
||||
{{#each topic.tags as |tag|}}
|
||||
|
|
|
@ -4,16 +4,18 @@
|
|||
{{else}}
|
||||
<div class="knowledge-explorer-search">
|
||||
{{knowledge-explorer-search
|
||||
searchResults=searchResults
|
||||
searchTerm=searchTerm
|
||||
filterTags=filterTags
|
||||
onSearch=(action "performSearch")
|
||||
}}
|
||||
</div>
|
||||
<div class="knowledge-explorer-browse">
|
||||
{{knowledge-explorer-tag-list
|
||||
tags=tags
|
||||
filterTags=filterTags
|
||||
}}
|
||||
<div class="knowledge-explorer-tags">
|
||||
{{#each tags as |tag|}}
|
||||
{{knowledge-explorer-tag
|
||||
tag=tag
|
||||
selectTag=(action "updateSelectedTags")
|
||||
}}
|
||||
{{/each}}
|
||||
</div>
|
||||
<div class="knowledge-explorer-results">
|
||||
{{#if hasSearchResults}}
|
||||
{{#if emptySearchResults}}
|
||||
|
@ -22,13 +24,13 @@
|
|||
<div class="result-count">{{i18n 'knowledge_explorer.search.results' count=searchCount}}</div>
|
||||
{{knowledge-explorer-topic-list
|
||||
topics=searchResults
|
||||
selectedTopic=selectedTopic
|
||||
selectTopic=(action "setSelectedTopic")
|
||||
}}
|
||||
{{/if}}
|
||||
{{else}}
|
||||
{{knowledge-explorer-topic-list
|
||||
topics=topics
|
||||
selectedTopic=selectedTopic
|
||||
selectTopic=(action "setSelectedTopic")
|
||||
}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_dependency "knowledge_explorer_constraint"
|
||||
|
||||
KnowledgeExplorer::Engine.routes.draw do
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module ::KnowledgeExplorer
|
||||
class Engine < ::Rails::Engine
|
||||
isolate_namespace KnowledgeExplorer
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class KnowledgeExplorerConstraint
|
||||
def matches?(request)
|
||||
SiteSetting.knowledge_explorer_enabled
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# name: discourse-knowledge-explorer
|
||||
# about: A plugin to make it easy to explore and find knowledge base-type articles in Discourse
|
||||
# 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