FIX: include title in local onebox when linking to a different topic

This commit is contained in:
Régis Hanol 2018-02-19 22:40:14 +01:00
parent 614b1c8e68
commit 60ec483caa
6 changed files with 41 additions and 19 deletions

View File

@ -372,7 +372,13 @@ export default Ember.Component.extend({
post.set('refreshedPost', true);
}
$oneboxes.each((_, o) => load({ elem: o, refresh, ajax, categoryId: this.get('composer.category.id') }));
$oneboxes.each((_, o) => load({
elem: o,
refresh,
ajax,
categoryId: this.get('composer.category.id'),
topicId: this.get('composer.topic.id')
}));
},
_warnMentionedGroups($preview) {

View File

@ -86,6 +86,7 @@ export default Ember.Component.extend({
ajax,
synchronous: true,
categoryId: this.get('composer.category.id'),
topicId: this.get('composer.topic.id')
});
if (loadOnebox && loadOnebox.then) {

View File

@ -43,12 +43,17 @@ function loadNext(ajax) {
let timeoutMs = 150;
let removeLoading = true;
const { url, refresh, $elem, categoryId } = loadingQueue.shift();
const { url, refresh, $elem, categoryId, topicId } = loadingQueue.shift();
// Retrieve the onebox
return ajax("/onebox", {
dataType: 'html',
data: { url, refresh, category_id: categoryId },
data: {
url,
refresh,
category_id: categoryId,
topic_id: topicId
},
cache: true
}).then(html => {
let $html = $(html);
@ -59,7 +64,7 @@ function loadNext(ajax) {
if (result && result.jqXHR && result.jqXHR.status === 429) {
timeoutMs = 2000;
removeLoading = false;
loadingQueue.unshift({ url, refresh, $elem, categoryId });
loadingQueue.unshift({ url, refresh, $elem, categoryId, topicId });
} else {
failedCache[normalize(url)] = true;
}
@ -74,7 +79,7 @@ function loadNext(ajax) {
// Perform a lookup of a onebox based an anchor $element.
// It will insert a loading indicator and remove it when the loading is complete or fails.
export function load({ elem , refresh = true, ajax, synchronous = false, categoryId }) {
export function load({ elem , refresh = true, ajax, synchronous = false, categoryId, topicId }) {
const $elem = $(elem);
// If the onebox has loaded or is loading, return
@ -98,7 +103,7 @@ export function load({ elem , refresh = true, ajax, synchronous = false, categor
$elem.addClass('loading-onebox');
// Add to the loading queue
loadingQueue.push({ url, refresh, $elem, categoryId });
loadingQueue.push({ url, refresh, $elem, categoryId, topicId });
// Load next url in queue
if (synchronous) {

View File

@ -15,6 +15,7 @@ class OneboxController < ApplicationController
user_id = current_user.id
category_id = params[:category_id].to_i
topic_id = params[:topic_id].to_i
invalidate = params[:refresh] == 'true'
url = params[:url]
@ -24,7 +25,8 @@ class OneboxController < ApplicationController
preview = Oneboxer.preview(url,
invalidate_oneboxes: invalidate,
user_id: user_id,
category_id: category_id
category_id: category_id,
topic_id: topic_id
)
preview.strip! if preview.present?

View File

@ -170,6 +170,10 @@ module Oneboxer
return unless Guardian.new(current_user).can_see_category?(current_category)
end
if current_topic = Topic.find_by(id: opts[:topic_id])
return unless Guardian.new(current_user).can_see_topic?(current_topic)
end
topic = Topic.find_by(id: route[:topic_id])
return unless topic
@ -187,7 +191,7 @@ module Oneboxer
return if !post || post.hidden || post.post_type != Post.types[:regular]
if post_number > 1
if post_number > 1 && current_topic&.id == topic.id
excerpt = post.excerpt(SiteSetting.post_onebox_maxlength)
excerpt.gsub!(/[\r\n]+/, " ")
excerpt.gsub!("[/quote]", "[quote]") # don't break my quote

View File

@ -18,8 +18,11 @@ describe Oneboxer do
%{<a href="#{url}">#{url}</a>}
end
def preview(url, user, category = Category.first)
Oneboxer.preview("#{Discourse.base_url}#{url}", user_id: user.id, category_id: category.id).to_s
def preview(url, user = nil, category = nil, topic = nil)
Oneboxer.preview("#{Discourse.base_url}#{url}",
user_id: user&.id,
category_id: category&.id,
topic_id: topic&.id).to_s
end
it "links to a topic/post" do
@ -44,7 +47,8 @@ describe Oneboxer do
expect(preview(public_topic.relative_url, user, public_category)).to include(public_topic.title)
expect(preview(public_post.url, user, public_category)).to include(public_topic.title)
expect(preview(public_reply.url, user, public_category)).to include(public_reply.cooked)
expect(preview(public_reply.url, user, public_category)).to include(public_reply.excerpt)
expect(preview(public_reply.url, user, public_category, public_topic)).not_to include(public_topic.title)
expect(preview(public_hidden.url, user, public_category)).to match_html(link(public_hidden.url))
expect(preview(secured_topic.relative_url, user, public_category)).to match_html(link(secured_topic.relative_url))
expect(preview(secured_post.url, user, public_category)).to match_html(link(secured_post.url))
@ -57,27 +61,27 @@ describe Oneboxer do
expect(preview(public_topic.relative_url, staff, secured_category)).to include(public_topic.title)
expect(preview(public_post.url, staff, secured_category)).to include(public_topic.title)
expect(preview(public_reply.url, staff, secured_category)).to include(public_reply.cooked)
expect(preview(public_reply.url, staff, secured_category)).to include(public_reply.excerpt)
expect(preview(public_hidden.url, staff, secured_category)).to match_html(link(public_hidden.url))
expect(preview(secured_topic.relative_url, staff, secured_category)).to include(secured_topic.title)
expect(preview(secured_post.url, staff, secured_category)).to include(secured_topic.title)
expect(preview(secured_reply.url, staff, secured_category)).to include(secured_reply.cooked)
expect(preview(secured_reply.url, staff, secured_category)).to include(secured_reply.excerpt)
expect(preview(secured_reply.url, staff, secured_category, secured_topic)).not_to include(secured_topic.title)
end
it "links to an user profile" do
user = Fabricate(:user)
expect(preview("/u/does-not-exist", user)).to match_html(link("/u/does-not-exist"))
expect(preview("/u/#{user.username}", user)).to include(user.name)
expect(preview("/u/does-not-exist")).to match_html(link("/u/does-not-exist"))
expect(preview("/u/#{user.username}")).to include(user.name)
end
it "links to an upload" do
user = Fabricate(:user)
path = "/uploads/default/original/3X/e/8/e8fcfa624e4fb6623eea57f54941a58ba797f14d"
expect(preview("#{path}.pdf", user)).to match_html(link("#{path}.pdf"))
expect(preview("#{path}.MP3", user)).to include("<audio ")
expect(preview("#{path}.mov", user)).to include("<video ")
expect(preview("#{path}.pdf")).to match_html(link("#{path}.pdf"))
expect(preview("#{path}.MP3")).to include("<audio ")
expect(preview("#{path}.mov")).to include("<video ")
end
end