FEATURE: Embed topics list on remote sites via Javascript API. (#8008)

This adds support for a `<d-topics-list>` tag you can embed in your site
that will be rendered as a list of discourse topics. Any attributes on
the tag will be passed as filters. For example:

`<d-topics-list discourse-url="URL" category="1234">` will filter to category 1234.

To use this feature, enable the `embed topics list` site setting. Then
on the site you want to embed, include the following javascript:

`<script
src="http://URL/javascripts/embed-topics.js"></script>`

Where `URL` is your discourse forum's URL.

Then include the `<d-topics-list discourse-url="URL">` tag in your HTML document and it will
be replaced with the list of topics.
This commit is contained in:
Robin Ward
2019-08-15 13:41:06 -04:00
committed by GitHub
parent fafc6bcde0
commit 23367e79ea
12 changed files with 171 additions and 29 deletions

View File

@ -1,9 +1,11 @@
# frozen_string_literal: true
require_dependency 'topic_list_responder'
require_dependency 'topic_query_params'
class ListController < ApplicationController
include TopicListResponder
include TopicQueryParams
skip_before_action :check_xhr
@ -376,28 +378,6 @@ class ListController < ApplicationController
end
end
def build_topic_list_options
options = {}
params[:tags] = [params[:tag_id].parameterize] if params[:tag_id].present? && guardian.can_tag_pms?
TopicQuery.public_valid_options.each do |key|
if params.key?(key)
val = options[key] = params[key]
if !TopicQuery.validate?(key, val)
raise Discourse::InvalidParameters.new key
end
end
end
# hacky columns get special handling
options[:topic_ids] = param_to_integer_list(:topic_ids)
if options[:no_subcategories] == 'true'
options[:no_subcategories] = true
end
options
end
def list_target_user
if params[:user_id] && guardian.is_staff?
User.find(params[:user_id].to_i)