diff --git a/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb b/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb index 0ac17c9..01632fb 100644 --- a/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb +++ b/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module KnowledgeExplorer class KnowledgeExplorerController < ApplicationController requires_plugin 'knowledge-explorer' diff --git a/assets/javascripts/discourse/components/knowledge-explorer-search.js.es6 b/assets/javascripts/discourse/components/knowledge-explorer-search.js.es6 index 55f442a..d4d9765 100644 --- a/assets/javascripts/discourse/components/knowledge-explorer-search.js.es6 +++ b/assets/javascripts/discourse/components/knowledge-explorer-search.js.es6 @@ -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); } } }); diff --git a/assets/javascripts/discourse/components/knowledge-explorer-tag-list.js.es6 b/assets/javascripts/discourse/components/knowledge-explorer-tag-list.js.es6 deleted file mode 100644 index dd4e771..0000000 --- a/assets/javascripts/discourse/components/knowledge-explorer-tag-list.js.es6 +++ /dev/null @@ -1,3 +0,0 @@ -export default Ember.Component.extend({ - classNames: "knowledge-explorer-tags" -}); diff --git a/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 b/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 index 4ca65d8..e741d64 100644 --- a/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 +++ b/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 @@ -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; } }); diff --git a/assets/javascripts/discourse/components/knowledge-explorer-topic-link.js.es6 b/assets/javascripts/discourse/components/knowledge-explorer-topic-link.js.es6 index 13e489c..cc00a52 100644 --- a/assets/javascripts/discourse/components/knowledge-explorer-topic-link.js.es6 +++ b/assets/javascripts/discourse/components/knowledge-explorer-topic-link.js.es6 @@ -1,5 +1,6 @@ export default Ember.Component.extend({ click() { - this.set("selectedTopic", this.topic.id); + this.selectTopic(this.topic.id); + return false; } }); diff --git a/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 b/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 index 11eb492..dcfe8f9 100644 --- a/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 +++ b/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 @@ -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 || []); + }); + } } }); diff --git a/assets/javascripts/discourse/models/knowledge-explorer.js.es6 b/assets/javascripts/discourse/models/knowledge-explorer.js.es6 index 3f722b3..02178d7 100644 --- a/assets/javascripts/discourse/models/knowledge-explorer.js.es6 +++ b/assets/javascripts/discourse/models/knowledge-explorer.js.es6 @@ -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); } }; diff --git a/assets/javascripts/discourse/templates/components/knowledge-explorer-tag-list.hbs b/assets/javascripts/discourse/templates/components/knowledge-explorer-tag-list.hbs deleted file mode 100644 index bac6e6a..0000000 --- a/assets/javascripts/discourse/templates/components/knowledge-explorer-tag-list.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{{#each tags as |tag|}} - {{knowledge-explorer-tag - tag=tag - filterTags=filterTags - }} -{{/each}} diff --git a/assets/javascripts/discourse/templates/components/knowledge-explorer-topic-list.hbs b/assets/javascripts/discourse/templates/components/knowledge-explorer-topic-list.hbs index 40cb789..f0b55fa 100644 --- a/assets/javascripts/discourse/templates/components/knowledge-explorer-topic-list.hbs +++ b/assets/javascripts/discourse/templates/components/knowledge-explorer-topic-list.hbs @@ -8,7 +8,7 @@ - {{knowledge-explorer-topic-link topic=topic selectedTopic=selectedTopic}} + {{knowledge-explorer-topic-link topic=topic selectTopic=selectTopic}} {{#each topic.tags as |tag|}} diff --git a/assets/javascripts/discourse/templates/knowledge-explorer.hbs b/assets/javascripts/discourse/templates/knowledge-explorer.hbs index 643ba74..c3ce7b2 100644 --- a/assets/javascripts/discourse/templates/knowledge-explorer.hbs +++ b/assets/javascripts/discourse/templates/knowledge-explorer.hbs @@ -4,16 +4,18 @@ {{else}}
- {{knowledge-explorer-tag-list - tags=tags - filterTags=filterTags - }} +
+ {{#each tags as |tag|}} + {{knowledge-explorer-tag + tag=tag + selectTag=(action "updateSelectedTags") + }} + {{/each}} +
{{#if hasSearchResults}} {{#if emptySearchResults}} @@ -22,13 +24,13 @@
{{i18n 'knowledge_explorer.search.results' count=searchCount}}
{{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}}
diff --git a/config/routes.rb b/config/routes.rb index 9bd5161..60d6fdd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require_dependency "knowledge_explorer_constraint" KnowledgeExplorer::Engine.routes.draw do diff --git a/lib/knowledge_explorer/engine.rb b/lib/knowledge_explorer/engine.rb index f81ec2d..e31d9ce 100644 --- a/lib/knowledge_explorer/engine.rb +++ b/lib/knowledge_explorer/engine.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module ::KnowledgeExplorer class Engine < ::Rails::Engine isolate_namespace KnowledgeExplorer diff --git a/lib/knowledge_explorer_constraint.rb b/lib/knowledge_explorer_constraint.rb index 572d332..c954a35 100644 --- a/lib/knowledge_explorer_constraint.rb +++ b/lib/knowledge_explorer_constraint.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + class KnowledgeExplorerConstraint def matches?(request) SiteSetting.knowledge_explorer_enabled diff --git a/plugin.rb b/plugin.rb index 674f4e6..e66a959 100644 --- a/plugin.rb +++ b/plugin.rb @@ -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 diff --git a/spec/requests/knowledge_explorer_controller_spec.rb b/spec/requests/knowledge_explorer_controller_spec.rb new file mode 100644 index 0000000..43cc39f --- /dev/null +++ b/spec/requests/knowledge_explorer_controller_spec.rb @@ -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