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,10 +1,12 @@
# frozen_string_literal: true
class EmbedController < ApplicationController
include TopicQueryParams
skip_before_action :check_xhr, :preload_json, :verify_authenticity_token
before_action :ensure_embeddable, except: [ :info ]
before_action :get_embeddable_css_class, except: [ :info ]
before_action :ensure_embeddable, except: [ :info, :topics ]
before_action :get_embeddable_css_class, except: [ :info, :topics ]
before_action :ensure_api_request, only: [ :info ]
layout 'embed'
@ -16,7 +18,26 @@ class EmbedController < ApplicationController
@show_reason = true
@hosts = EmbeddableHost.all
end
render 'embed_error'
render 'embed_error', status: 400
end
def topics
discourse_expires_in 1.minute
response.headers['X-Frame-Options'] = "ALLOWALL"
unless SiteSetting.embed_topics_list?
render 'embed_topics_error', status: 400
return
end
if @embed_id = params[:discourse_embed_id]
raise Discourse::InvalidParameters.new(:embed_id) unless @embed_id =~ /^de\-[a-zA-Z0-9]+$/
end
list_options = build_topic_list_options
list_options[:per_page] = params[:per_page].to_i if params.has_key?(:per_page)
topic_query = TopicQuery.new(current_user, list_options)
@list = topic_query.list_latest
end
def comments