Merge branch 'master' into vdom
This commit is contained in:
commit
d0a86f8032
|
@ -58,7 +58,13 @@ export default function(options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.length !== 1) {
|
if (this.length !== 1) {
|
||||||
alert("only supporting one matcher at the moment");
|
if (window.console) {
|
||||||
|
window.console.log("WARNING: passed multiple elements to $.autocomplete, skipping.");
|
||||||
|
if (window.Error) {
|
||||||
|
window.console.log((new window.Error()).stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
var disabled = options && options.disabled;
|
var disabled = options && options.disabled;
|
||||||
|
|
|
@ -16,9 +16,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.close {
|
.close {
|
||||||
font-size: 1.786em !important;
|
font-size: 1.786em;
|
||||||
margin-top: -10px !important;
|
margin-top: -10px;
|
||||||
color: darken($tertiary, 45%);
|
color: scale-color($tertiary, $lightness: 70%);
|
||||||
|
padding-left: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meta {
|
.meta {
|
||||||
|
|
|
@ -236,25 +236,20 @@ class UserNotifications < ActionMailer::Base
|
||||||
user_name = name unless name.blank?
|
user_name = name unless name.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
title = notification_data[:topic_title]
|
|
||||||
allow_reply_by_email = opts[:allow_reply_by_email] unless user.suspended?
|
allow_reply_by_email = opts[:allow_reply_by_email] unless user.suspended?
|
||||||
use_site_subject = opts[:use_site_subject]
|
|
||||||
add_re_to_subject = opts[:add_re_to_subject]
|
|
||||||
show_category_in_subject = opts[:show_category_in_subject]
|
|
||||||
use_template_html = opts[:use_template_html]
|
|
||||||
original_username = notification_data[:original_username] || notification_data[:display_username]
|
original_username = notification_data[:original_username] || notification_data[:display_username]
|
||||||
|
|
||||||
send_notification_email(
|
send_notification_email(
|
||||||
title: title,
|
title: notification_data[:topic_title],
|
||||||
post: post,
|
post: post,
|
||||||
username: original_username,
|
username: original_username,
|
||||||
from_alias: user_name,
|
from_alias: user_name,
|
||||||
allow_reply_by_email: allow_reply_by_email,
|
allow_reply_by_email: allow_reply_by_email,
|
||||||
use_site_subject: use_site_subject,
|
use_site_subject: opts[:use_site_subject],
|
||||||
add_re_to_subject: add_re_to_subject,
|
add_re_to_subject: opts[:add_re_to_subject],
|
||||||
show_category_in_subject: show_category_in_subject,
|
show_category_in_subject: opts[:show_category_in_subject],
|
||||||
notification_type: notification_type,
|
notification_type: notification_type,
|
||||||
use_template_html: use_template_html,
|
use_template_html: opts[:use_template_html],
|
||||||
user: user
|
user: user
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -98,8 +98,8 @@ class Notification < ActiveRecord::Base
|
||||||
# Be wary of calling this frequently. O(n) JSON parsing can suck.
|
# Be wary of calling this frequently. O(n) JSON parsing can suck.
|
||||||
def data_hash
|
def data_hash
|
||||||
@data_hash ||= begin
|
@data_hash ||= begin
|
||||||
|
|
||||||
return nil if data.blank?
|
return nil if data.blank?
|
||||||
|
|
||||||
parsed = JSON.parse(data)
|
parsed = JSON.parse(data)
|
||||||
return nil if parsed.blank?
|
return nil if parsed.blank?
|
||||||
|
|
||||||
|
|
|
@ -259,8 +259,16 @@ class PostAlerter
|
||||||
|
|
||||||
UserActionObserver.log_notification(original_post, user, type, opts[:acting_user_id])
|
UserActionObserver.log_notification(original_post, user, type, opts[:acting_user_id])
|
||||||
|
|
||||||
|
topic_title = post.topic.title
|
||||||
|
# when sending a private message email, keep the original title
|
||||||
|
if post.topic.private_message? && modifications = post.revisions.map(&:modifications).to_a
|
||||||
|
if first_title_modification = modifications.first { |m| m.has_key?("title") }
|
||||||
|
topic_title = first_title_modification["title"][0]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
notification_data = {
|
notification_data = {
|
||||||
topic_title: post.topic.title,
|
topic_title: topic_title,
|
||||||
original_post_id: original_post.id,
|
original_post_id: original_post.id,
|
||||||
original_post_type: original_post.post_type,
|
original_post_type: original_post.post_type,
|
||||||
original_username: original_username,
|
original_username: original_username,
|
||||||
|
|
|
@ -1490,7 +1490,7 @@ en:
|
||||||
|
|
||||||
- If you run your own mail server, check to make sure the IPs of your mail server are [not on any email blacklists][4]. Also verify that it is definitely sending a fully-qualified hostname that resolves in DNS in its HELO message. If not, this will cause your email to be rejected by many mail services.
|
- If you run your own mail server, check to make sure the IPs of your mail server are [not on any email blacklists][4]. Also verify that it is definitely sending a fully-qualified hostname that resolves in DNS in its HELO message. If not, this will cause your email to be rejected by many mail services.
|
||||||
|
|
||||||
- Send a test email to [mail-tester.com][mt] to verify that everything is working correctly.
|
- Send a test email to [mail-tester.com][mt] to verify that everything is working correctly.
|
||||||
|
|
||||||
(The *easy* way is to create a free account on [Mandrill][md] or [Mailgun][mg] or [Mailjet][mj], which have free generous free mailing plans and will be fine for small communities. You'll still need to set up the SPF and DKIM records in your DNS, though!)
|
(The *easy* way is to create a free account on [Mandrill][md] or [Mailgun][mg] or [Mailjet][mj], which have free generous free mailing plans and will be fine for small communities. You'll still need to set up the SPF and DKIM records in your DNS, though!)
|
||||||
|
|
||||||
|
@ -1515,13 +1515,11 @@ en:
|
||||||
new_version_mailer:
|
new_version_mailer:
|
||||||
subject_template: "[%{site_name}] New Discourse version, update available"
|
subject_template: "[%{site_name}] New Discourse version, update available"
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
A new version of [Discourse](http://www.discourse.org) is available.
|
Hooray, a new version of [Discourse](http://www.discourse.org) is available! :)
|
||||||
|
|
||||||
Your version: %{installed_version}
|
Your version: %{installed_version}
|
||||||
New version: **%{new_version}**
|
New version: **%{new_version}**
|
||||||
|
|
||||||
You may want to:
|
|
||||||
|
|
||||||
- See what's new in the [GitHub changelog](https://github.com/discourse/discourse/commits/master).
|
- See what's new in the [GitHub changelog](https://github.com/discourse/discourse/commits/master).
|
||||||
|
|
||||||
- Upgrade from your browser at [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade).
|
- Upgrade from your browser at [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade).
|
||||||
|
@ -1531,13 +1529,11 @@ en:
|
||||||
new_version_mailer_with_notes:
|
new_version_mailer_with_notes:
|
||||||
subject_template: "[%{site_name}] update available"
|
subject_template: "[%{site_name}] update available"
|
||||||
text_body_template: |
|
text_body_template: |
|
||||||
A new version of [Discourse](http://www.discourse.org) is available.
|
Hooray, a new version of [Discourse](http://www.discourse.org) is available! :)
|
||||||
|
|
||||||
Your version: %{installed_version}
|
Your version: %{installed_version}
|
||||||
New version: **%{new_version}**
|
New version: **%{new_version}**
|
||||||
|
|
||||||
You may want to:
|
|
||||||
|
|
||||||
- See what's new in the [GitHub changelog](https://github.com/discourse/discourse/commits/master).
|
- See what's new in the [GitHub changelog](https://github.com/discourse/discourse/commits/master).
|
||||||
|
|
||||||
- Upgrade from your browser at [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade).
|
- Upgrade from your browser at [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade).
|
||||||
|
|
|
@ -28,6 +28,7 @@ module I18n
|
||||||
@overrides_by_site = {}
|
@overrides_by_site = {}
|
||||||
|
|
||||||
reload_no_cache!
|
reload_no_cache!
|
||||||
|
ensure_all_loaded!
|
||||||
end
|
end
|
||||||
|
|
||||||
LOAD_MUTEX = Mutex.new
|
LOAD_MUTEX = Mutex.new
|
||||||
|
@ -105,8 +106,7 @@ module I18n
|
||||||
|
|
||||||
by_site = @overrides_by_site[site]
|
by_site = @overrides_by_site[site]
|
||||||
|
|
||||||
by_locale = nil
|
unless by_site && by_site.has_key?(locale)
|
||||||
unless by_site
|
|
||||||
by_site = @overrides_by_site[site] = {}
|
by_site = @overrides_by_site[site] = {}
|
||||||
|
|
||||||
# Load overrides
|
# Load overrides
|
||||||
|
|
|
@ -43,7 +43,13 @@ module I18n
|
||||||
end
|
end
|
||||||
|
|
||||||
def search(locale, query)
|
def search(locale, query)
|
||||||
find_results(/#{query}/i, {}, translations[locale])
|
results = {}
|
||||||
|
|
||||||
|
fallbacks(locale).each do |fallback|
|
||||||
|
find_results(/#{query}/i, results, translations[fallback])
|
||||||
|
end
|
||||||
|
|
||||||
|
results
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
@ -54,7 +60,9 @@ module I18n
|
||||||
k = k_sym.to_s
|
k = k_sym.to_s
|
||||||
key_path = path ? "#{path}.#{k}" : k
|
key_path = path ? "#{path}.#{k}" : k
|
||||||
if v.is_a?(String)
|
if v.is_a?(String)
|
||||||
results[key_path] = v if key_path =~ regexp || v =~ regexp
|
unless results.has_key?(key_path)
|
||||||
|
results[key_path] = v if key_path =~ regexp || v =~ regexp
|
||||||
|
end
|
||||||
elsif v.is_a?(Hash)
|
elsif v.is_a?(Hash)
|
||||||
find_results(regexp, results, v, key_path)
|
find_results(regexp, results, v, key_path)
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,6 +15,7 @@ describe I18n::Backend::DiscourseI18n do
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
after do
|
||||||
|
I18n.locale = :en
|
||||||
I18n.reload!
|
I18n.reload!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -40,6 +41,11 @@ describe I18n::Backend::DiscourseI18n do
|
||||||
expect(results['items.other']).to eq('%{count} items')
|
expect(results['items.other']).to eq('%{count} items')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'uses fallback locales for searching' do
|
||||||
|
expect(backend.search(:de, 'bar')).to eq({'bar' => 'Bar in :de'})
|
||||||
|
expect(backend.search(:de, 'foo')).to eq({'foo' => 'Foo in :en'})
|
||||||
|
end
|
||||||
|
|
||||||
describe '#exists?' do
|
describe '#exists?' do
|
||||||
it 'returns true when a key is given that exists' do
|
it 'returns true when a key is given that exists' do
|
||||||
expect(backend.exists?(:de, :bar)).to eq(true)
|
expect(backend.exists?(:de, :bar)).to eq(true)
|
||||||
|
@ -73,15 +79,23 @@ describe I18n::Backend::DiscourseI18n do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'with overrides' do
|
describe 'with overrides' do
|
||||||
it 'returns the overriden key' do
|
it 'returns the overridden key' do
|
||||||
TranslationOverride.upsert!('en', 'foo', 'Overwritten foo')
|
TranslationOverride.upsert!('en', 'foo', 'Overwritten foo')
|
||||||
expect(I18n.translate('foo')).to eq('Overwritten foo')
|
expect(I18n.translate('foo')).to eq('Overwritten foo')
|
||||||
|
|
||||||
TranslationOverride.upsert!('en', 'foo', 'new value')
|
TranslationOverride.upsert!('en', 'foo', 'new value')
|
||||||
I18n.reload!
|
|
||||||
expect(I18n.translate('foo')).to eq('new value')
|
expect(I18n.translate('foo')).to eq('new value')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'returns the overridden key after switching the locale' do
|
||||||
|
TranslationOverride.upsert!('en', 'foo', 'Overwritten foo in EN')
|
||||||
|
TranslationOverride.upsert!('de', 'foo', 'Overwritten foo in DE')
|
||||||
|
|
||||||
|
expect(I18n.translate('foo')).to eq('Overwritten foo in EN')
|
||||||
|
I18n.locale = :de
|
||||||
|
expect(I18n.translate('foo')).to eq('Overwritten foo in DE')
|
||||||
|
end
|
||||||
|
|
||||||
it "can be searched" do
|
it "can be searched" do
|
||||||
TranslationOverride.upsert!('en', 'wat', 'Overwritten value')
|
TranslationOverride.upsert!('en', 'wat', 'Overwritten value')
|
||||||
expect(I18n.search('wat', backend: backend)).to eq({'wat' => 'Overwritten value'})
|
expect(I18n.search('wat', backend: backend)).to eq({'wat' => 'Overwritten value'})
|
||||||
|
|
|
@ -150,4 +150,26 @@ describe PostAlerter do
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
describe ".create_notification" do
|
||||||
|
|
||||||
|
it "keeps the original title for PMs" do
|
||||||
|
user = Fabricate(:user)
|
||||||
|
topic = Fabricate(:private_message_topic, user: user, created_at: 1.hour.ago)
|
||||||
|
post = Fabricate(:post, topic: topic, created_at: 1.hour.ago)
|
||||||
|
|
||||||
|
original_title = topic.title
|
||||||
|
|
||||||
|
post.revise(user, { title: "This is the revised title" }, revised_at: Time.now)
|
||||||
|
|
||||||
|
expect {
|
||||||
|
PostAlerter.new.create_notification(user, Notification.types[:private_message], post)
|
||||||
|
}.to change { user.notifications.count }
|
||||||
|
|
||||||
|
expect(user.notifications.last.data_hash["topic_title"]).to eq(original_title)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue