FEATURE: Add onebox metadata (#10)
Currently linking directly to Knowledge Explorer topics shows a generic onebox, which isn't super helpful in some cases. This commit mimics how the theme creator plugin handles adding metadata to special occurrences. However, to get this to work, how the plugin handles showing topic contents needed to be refactored. Instead of hitting the existing topic route, the plugin implements its own version of this, including adding restrictions for topics that are not in a selected Knowledge Explorer category or tag.
This commit is contained in:
parent
2c12f977ca
commit
0e1c7c7216
|
@ -0,0 +1,7 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
group :development do
|
||||||
|
gem 'rubocop-discourse'
|
||||||
|
end
|
|
@ -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
|
|
@ -4,8 +4,11 @@ module KnowledgeExplorer
|
||||||
class KnowledgeExplorerController < ApplicationController
|
class KnowledgeExplorerController < ApplicationController
|
||||||
requires_plugin 'knowledge-explorer'
|
requires_plugin 'knowledge-explorer'
|
||||||
|
|
||||||
|
skip_before_action :check_xhr, only: [:index]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
filters = {
|
filters = {
|
||||||
|
topic: params[:topic],
|
||||||
tags: params[:tags],
|
tags: params[:tags],
|
||||||
category: params[:category],
|
category: params[:category],
|
||||||
solved: params[:solved],
|
solved: params[:solved],
|
||||||
|
@ -16,8 +19,34 @@ module KnowledgeExplorer
|
||||||
}
|
}
|
||||||
|
|
||||||
query = KnowledgeExplorer::Query.new(current_user, filters).list
|
query = KnowledgeExplorer::Query.new(current_user, filters).list
|
||||||
|
query["topic"] = get_topic(filters[:topic], current_user) if filters[:topic].present?
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html do
|
||||||
|
render :get_topic if filters[:topic].present?
|
||||||
|
end
|
||||||
|
|
||||||
|
format.json do
|
||||||
render json: query
|
render json: query
|
||||||
end
|
end
|
||||||
end
|
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
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
<% content_for :head do %>
|
||||||
|
<%= raw crawlable_meta_data(title: @topic_view.topic.title, description: @topic_view.topic.excerpt) %>
|
||||||
|
<% end %>
|
|
@ -1,6 +1,5 @@
|
||||||
import discourseComputed from "discourse-common/utils/decorators";
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
import Category from "discourse/models/category";
|
import Category from "discourse/models/category";
|
||||||
import Topic from "discourse/models/topic";
|
|
||||||
import { on } from "discourse-common/utils/decorators";
|
import { on } from "discourse-common/utils/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";
|
||||||
import { getOwner } from "@ember/application";
|
import { getOwner } from "@ember/application";
|
||||||
|
@ -107,19 +106,11 @@ export default Ember.Controller.extend({
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
setSelectedTopic(topicId) {
|
setSelectedTopic(topicId) {
|
||||||
this.setProperties({
|
this.set("selectedTopic", topicId);
|
||||||
isTopicLoading: true,
|
|
||||||
selectedTopic: topicId,
|
|
||||||
});
|
|
||||||
|
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
|
|
||||||
KnowledgeExplorer.getTopic(topicId).then((result) => {
|
this.send("refreshModel");
|
||||||
this.setProperties({
|
|
||||||
topic: Topic.create(result),
|
|
||||||
isTopicLoading: false,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
onChangeFilterSolved(solvedFilter) {
|
onChangeFilterSolved(solvedFilter) {
|
||||||
|
@ -225,13 +216,15 @@ export default Ember.Controller.extend({
|
||||||
"filterSolved",
|
"filterSolved",
|
||||||
"searchTerm",
|
"searchTerm",
|
||||||
"ascending",
|
"ascending",
|
||||||
"orderColumn"
|
"orderColumn",
|
||||||
|
"selectedTopic"
|
||||||
);
|
);
|
||||||
|
|
||||||
KnowledgeExplorer.list(params).then((result) => {
|
KnowledgeExplorer.list(params).then((result) => {
|
||||||
result = mergeCategories(result);
|
result = mergeCategories(result);
|
||||||
this.setProperties({
|
this.setProperties({
|
||||||
model: result,
|
model: result,
|
||||||
|
topic: result.topic,
|
||||||
isLoading: false,
|
isLoading: false,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import Topic from "discourse/models/topic";
|
import Topic from "discourse/models/topic";
|
||||||
|
|
||||||
function getTopic(id) {
|
|
||||||
return ajax(`/t/${id}.json?ke=true`);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
list(params) {
|
list(params) {
|
||||||
let filters = [];
|
let filters = [];
|
||||||
|
@ -29,17 +25,12 @@ export default {
|
||||||
if (params.page) {
|
if (params.page) {
|
||||||
filters.push(`page=${params.page}`);
|
filters.push(`page=${params.page}`);
|
||||||
}
|
}
|
||||||
|
if (params.selectedTopic) {
|
||||||
|
filters.push(`topic=${params.selectedTopic}`);
|
||||||
|
}
|
||||||
|
|
||||||
let promise = ajax(`/docs.json?${filters.join("&")}`);
|
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) => {
|
promise = promise.then((data) => {
|
||||||
data.topics.topic_list.topics = data.topics.topic_list.topics.map(
|
data.topics.topic_list.topics = data.topics.topic_list.topics.map(
|
||||||
(topic) => {
|
(topic) => {
|
||||||
|
@ -47,9 +38,9 @@ export default {
|
||||||
return topic;
|
return topic;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
data.topic = Topic.create(data.topic);
|
||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
return promise;
|
return promise;
|
||||||
},
|
},
|
||||||
|
@ -69,6 +60,4 @@ export default {
|
||||||
|
|
||||||
return promise;
|
return promise;
|
||||||
},
|
},
|
||||||
|
|
||||||
getTopic,
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -139,5 +139,21 @@ describe KnowledgeExplorer::KnowledgeExplorerController do
|
||||||
|
|
||||||
end
|
end
|
||||||
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
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue