diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..7da32ec --- /dev/null +++ b/Gemfile @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +group :development do + gem 'rubocop-discourse' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..b1b315c --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,37 @@ +GEM + remote: https://rubygems.org/ + specs: + ast (2.4.1) + parallel (1.19.2) + parser (2.7.1.5) + ast (~> 2.4.1) + rainbow (3.0.0) + regexp_parser (1.8.1) + rexml (3.2.4) + rubocop (0.92.0) + parallel (~> 1.10) + parser (>= 2.7.1.5) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.7) + rexml + rubocop-ast (>= 0.5.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 2.0) + rubocop-ast (0.7.1) + parser (>= 2.7.1.5) + rubocop-discourse (2.3.2) + rubocop (>= 0.69.0) + rubocop-rspec (>= 1.39.0) + rubocop-rspec (1.43.2) + rubocop (~> 0.87) + ruby-progressbar (1.10.1) + unicode-display_width (1.7.0) + +PLATFORMS + ruby + +DEPENDENCIES + rubocop-discourse + +BUNDLED WITH + 2.1.4 diff --git a/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb b/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb index 7297743..9c1dd88 100644 --- a/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb +++ b/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb @@ -4,8 +4,11 @@ module KnowledgeExplorer class KnowledgeExplorerController < ApplicationController requires_plugin 'knowledge-explorer' + skip_before_action :check_xhr, only: [:index] + def index filters = { + topic: params[:topic], tags: params[:tags], category: params[:category], solved: params[:solved], @@ -16,8 +19,34 @@ module KnowledgeExplorer } query = KnowledgeExplorer::Query.new(current_user, filters).list + query["topic"] = get_topic(filters[:topic], current_user) if filters[:topic].present? - render json: query + respond_to do |format| + format.html do + render :get_topic if filters[:topic].present? + end + + format.json do + render json: query + end + end end + + def get_topic(topic_id, current_user) + @topic_view = TopicView.new(topic_id, current_user) + guardian = Guardian.new(current_user) + + return unless topic_in_explorer(@topic_view.topic.category_id, @topic_view.topic.tags) + + TopicViewSerializer.new(@topic_view, scope: guardian, root: false) + end + + def topic_in_explorer(category, tags) + category_match = KnowledgeExplorer::Query.categories.include?(category.to_s) + tag_match = KnowledgeExplorer::Query.tags.any? { |tag| tags.include?(tag) } + + category_match || tag_match + end + end end diff --git a/app/views/knowledge_explorer/knowledge_explorer/get_topic.html.erb b/app/views/knowledge_explorer/knowledge_explorer/get_topic.html.erb new file mode 100644 index 0000000..f29048f --- /dev/null +++ b/app/views/knowledge_explorer/knowledge_explorer/get_topic.html.erb @@ -0,0 +1,3 @@ +<% content_for :head do %> + <%= raw crawlable_meta_data(title: @topic_view.topic.title, description: @topic_view.topic.excerpt) %> +<% end %> diff --git a/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 b/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 index f4419ea..bca8d81 100644 --- a/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 +++ b/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 @@ -1,6 +1,5 @@ import discourseComputed from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; -import Topic from "discourse/models/topic"; import { on } from "discourse-common/utils/decorators"; import KnowledgeExplorer from "discourse/plugins/discourse-knowledge-explorer/discourse/models/knowledge-explorer"; import { getOwner } from "@ember/application"; @@ -107,19 +106,11 @@ export default Ember.Controller.extend({ actions: { setSelectedTopic(topicId) { - this.setProperties({ - isTopicLoading: true, - selectedTopic: topicId, - }); + this.set("selectedTopic", topicId); window.scrollTo(0, 0); - KnowledgeExplorer.getTopic(topicId).then((result) => { - this.setProperties({ - topic: Topic.create(result), - isTopicLoading: false, - }); - }); + this.send("refreshModel"); }, onChangeFilterSolved(solvedFilter) { @@ -225,13 +216,15 @@ export default Ember.Controller.extend({ "filterSolved", "searchTerm", "ascending", - "orderColumn" + "orderColumn", + "selectedTopic" ); KnowledgeExplorer.list(params).then((result) => { result = mergeCategories(result); this.setProperties({ model: result, + topic: result.topic, isLoading: false, }); }); diff --git a/assets/javascripts/discourse/models/knowledge-explorer.js.es6 b/assets/javascripts/discourse/models/knowledge-explorer.js.es6 index c8e4dde..02527df 100644 --- a/assets/javascripts/discourse/models/knowledge-explorer.js.es6 +++ b/assets/javascripts/discourse/models/knowledge-explorer.js.es6 @@ -1,10 +1,6 @@ import { ajax } from "discourse/lib/ajax"; import Topic from "discourse/models/topic"; -function getTopic(id) { - return ajax(`/t/${id}.json?ke=true`); -} - export default { list(params) { let filters = []; @@ -29,27 +25,22 @@ export default { if (params.page) { filters.push(`page=${params.page}`); } + if (params.selectedTopic) { + filters.push(`topic=${params.selectedTopic}`); + } let promise = ajax(`/docs.json?${filters.join("&")}`); - if (params.selectedTopic) { - promise = promise.then((data) => { - return getTopic(params.selectedTopic).then((topic) => { - data.topic = Topic.create(topic); - return data; - }); - }); - } else { - promise = promise.then((data) => { - data.topics.topic_list.topics = data.topics.topic_list.topics.map( - (topic) => { - topic = Topic.create(topic); - return topic; - } - ); - return data; - }); - } + promise = promise.then((data) => { + data.topics.topic_list.topics = data.topics.topic_list.topics.map( + (topic) => { + topic = Topic.create(topic); + return topic; + } + ); + data.topic = Topic.create(data.topic); + return data; + }); return promise; }, @@ -69,6 +60,4 @@ export default { return promise; }, - - getTopic, }; diff --git a/spec/requests/knowledge_explorer_controller_spec.rb b/spec/requests/knowledge_explorer_controller_spec.rb index 3e6f92f..60bbc0f 100644 --- a/spec/requests/knowledge_explorer_controller_spec.rb +++ b/spec/requests/knowledge_explorer_controller_spec.rb @@ -139,5 +139,21 @@ describe KnowledgeExplorer::KnowledgeExplorerController do end end + + context 'when getting topic first post contents' do + let!(:non_ke_topic) { Fabricate(:topic) } + + it 'should correctly grab the topic' do + get "/docs.json?topic=#{topic.id}" + + expect(response.parsed_body['topic']['id']).to eq(topic.id) + end + + it 'should get topics matching a selected knowledge explorer tag or category' do + get "/docs.json?topic=#{non_ke_topic.id}" + + expect(response.parsed_body['topic']).to be_blank + end + end end end