{{i18n 'admin.email.advanced_test.text'}}
+{{{text}}}
+ diff --git a/.rubocop.yml b/.rubocop.yml index e28a0876aa..9d2e219e3c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -114,3 +114,10 @@ Layout/AlignHash: Bundler/OrderedGems: Enabled: false + +Style/SingleLineMethods: + Enabled: true + +Style/Semicolon: + Enabled: true + AllowAsExpressionSeparator: true diff --git a/Gemfile b/Gemfile index f91aeca1e5..cb127b5ca1 100644 --- a/Gemfile +++ b/Gemfile @@ -13,13 +13,15 @@ if rails_master? gem 'rails', git: 'https://github.com/rails/rails.git' gem 'seed-fu', git: 'https://github.com/SamSaffron/seed-fu.git', branch: 'discourse' else - gem 'actionmailer', '5.2' - gem 'actionpack', '5.2' - gem 'actionview', '5.2' - gem 'activemodel', '5.2' - gem 'activerecord', '5.2' - gem 'activesupport', '5.2' - gem 'railties', '5.2' + # until rubygems gives us optional dependencies we are stuck with this + # bundle update actionmailer actionpack actionview activemodel activerecord activesupport railties + gem 'actionmailer', '5.2.2' + gem 'actionpack', '5.2.2' + gem 'actionview', '5.2.2' + gem 'activemodel', '5.2.2' + gem 'activerecord', '5.2.2' + gem 'activesupport', '5.2.2' + gem 'railties', '5.2.2' gem 'sprockets-rails' gem 'seed-fu' end @@ -34,7 +36,7 @@ gem 'redis-namespace' gem 'active_model_serializers', '~> 0.8.3' -gem 'onebox', '1.8.68' +gem 'onebox', '1.8.69' gem 'http_accept_language', '~>2.0.5', require: false @@ -43,7 +45,12 @@ gem 'ember-source', '2.13.3' gem 'ember-handlebars-template', '0.7.5' gem 'barber' -gem 'message_bus' +# message bus 2.2.0 should be very stable +# we trimmed some of the internal API surface down so we went with +# a pre release here to make we don't do a full release prior to +# baking here. Remove 2.2.0.pre no later than Jan 2019 and move back +# to the standard releases +gem 'message_bus', '2.2.0.pre.1' gem 'rails_multisite' diff --git a/Gemfile.lock b/Gemfile.lock index 22551fd1a3..859d13a075 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,37 +1,37 @@ GEM remote: https://rubygems.org/ specs: - actionmailer (5.2.0) - actionpack (= 5.2.0) - actionview (= 5.2.0) - activejob (= 5.2.0) + actionmailer (5.2.2) + actionpack (= 5.2.2) + actionview (= 5.2.2) + activejob (= 5.2.2) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.0) - actionview (= 5.2.0) - activesupport (= 5.2.0) + actionpack (5.2.2) + actionview (= 5.2.2) + activesupport (= 5.2.2) rack (~> 2.0) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.0) - activesupport (= 5.2.0) + actionview (5.2.2) + activesupport (= 5.2.2) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) active_model_serializers (0.8.4) activemodel (>= 3.0) - activejob (5.2.0) - activesupport (= 5.2.0) + activejob (5.2.2) + activesupport (= 5.2.2) globalid (>= 0.3.6) - activemodel (5.2.0) - activesupport (= 5.2.0) - activerecord (5.2.0) - activemodel (= 5.2.0) - activesupport (= 5.2.0) + activemodel (5.2.2) + activesupport (= 5.2.2) + activerecord (5.2.2) + activemodel (= 5.2.2) + activesupport (= 5.2.2) arel (>= 9.0) - activesupport (5.2.0) + activesupport (5.2.2) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -83,7 +83,7 @@ GEM open4 (~> 1.3) coderay (1.1.2) colored2 (3.1.2) - concurrent-ruby (1.0.5) + concurrent-ruby (1.1.3) connection_pool (2.2.2) cork (0.3.0) colored2 (~> 3.1) @@ -158,7 +158,7 @@ GEM hkdf (0.3.0) htmlentities (4.3.4) http_accept_language (2.0.5) - i18n (1.0.1) + i18n (1.1.1) concurrent-ruby (~> 1.0) image_size (1.5.0) in_threads (1.5.0) @@ -193,11 +193,11 @@ GEM mini_mime (>= 0.1.1) maxminddb (0.1.21) memory_profiler (0.9.12) - message_bus (2.1.6) + message_bus (2.2.0.pre.1) rack (>= 1.1.3) metaclass (0.0.4) method_source (0.8.2) - mini_mime (1.0.0) + mini_mime (1.0.1) mini_portile2 (2.3.0) mini_racer (0.2.3) libv8 (>= 6.3) @@ -258,7 +258,7 @@ GEM omniauth-twitter (1.4.0) omniauth-oauth (~> 1.1) rack - onebox (1.8.68) + onebox (1.8.69) htmlentities (~> 4.3) moneta (~> 1.0) multi_json (~> 1.11) @@ -270,7 +270,7 @@ GEM redis ruby-openid parallel (1.12.1) - parser (2.5.1.0) + parser (2.5.3.0) ast (~> 2.4.0) pg (1.1.3) powerpack (0.1.2) @@ -287,14 +287,14 @@ GEM puma (3.11.4) r2 (0.2.7) rack (2.0.6) - rack-mini-profiler (1.0.0) + rack-mini-profiler (1.0.1) rack (>= 1.2.0) rack-openid (1.3.1) rack (>= 1.1.0) ruby-openid (>= 2.1.8) rack-protection (2.0.3) rack - rack-test (1.0.0) + rack-test (1.1.0) rack (>= 1.0, < 3) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) @@ -304,15 +304,15 @@ GEM rails_multisite (2.0.4) activerecord (> 4.2, < 6) railties (> 4.2, < 6) - railties (5.2.0) - actionpack (= 5.2.0) - activesupport (= 5.2.0) + railties (5.2.2) + actionpack (= 5.2.2) + activesupport (= 5.2.2) method_source rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) + thor (>= 0.19.0, < 2.0) rainbow (3.0.0) raindrops (0.19.0) - rake (12.3.1) + rake (12.3.2) rake-compiler (1.0.4) rake rb-fsevent (0.10.3) @@ -357,17 +357,17 @@ GEM rspec-support (~> 3.7.0) rspec-support (3.7.1) rtlit (0.0.5) - rubocop (0.57.2) + rubocop (0.60.0) jaro_winkler (~> 1.5.1) parallel (~> 1.10) - parser (>= 2.5) + parser (>= 2.5, != 2.5.1.1) powerpack (~> 0.1) rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) - unicode-display_width (~> 1.0, >= 1.0.1) + unicode-display_width (~> 1.4.0) ruby-openid (2.7.0) ruby-prof (0.17.0) - ruby-progressbar (1.9.0) + ruby-progressbar (1.10.0) ruby-readability (0.7.0) guess_html_encoding (>= 0.0.4) nokogiri (>= 1.6.0) @@ -443,13 +443,13 @@ PLATFORMS ruby DEPENDENCIES - actionmailer (= 5.2) - actionpack (= 5.2) - actionview (= 5.2) + actionmailer (= 5.2.2) + actionpack (= 5.2.2) + actionview (= 5.2.2) active_model_serializers (~> 0.8.3) - activemodel (= 5.2) - activerecord (= 5.2) - activesupport (= 5.2) + activemodel (= 5.2.2) + activerecord (= 5.2.2) + activesupport (= 5.2.2) annotate aws-sdk-s3 barber @@ -491,7 +491,7 @@ DEPENDENCIES mail (= 2.7.1.rc1) maxminddb memory_profiler - message_bus + message_bus (= 2.2.0.pre.1) mini_mime mini_racer mini_scheduler @@ -512,7 +512,7 @@ DEPENDENCIES omniauth-oauth2 omniauth-openid omniauth-twitter - onebox (= 1.8.68) + onebox (= 1.8.69) openid-redis-store pg pry-nav @@ -522,7 +522,7 @@ DEPENDENCIES rack-mini-profiler rack-protection rails_multisite - railties (= 5.2) + railties (= 5.2.2) rake rb-fsevent rb-inotify (~> 0.9) diff --git a/app/assets/images/push-notifications/check.png b/app/assets/images/push-notifications/check.png index ad223d26f3..b613330693 100644 Binary files a/app/assets/images/push-notifications/check.png and b/app/assets/images/push-notifications/check.png differ diff --git a/app/assets/images/push-notifications/group_mentioned.png b/app/assets/images/push-notifications/group_mentioned.png index ebb5560414..c3edbcc20b 100644 Binary files a/app/assets/images/push-notifications/group_mentioned.png and b/app/assets/images/push-notifications/group_mentioned.png differ diff --git a/app/assets/images/push-notifications/linked.png b/app/assets/images/push-notifications/linked.png index 5e25f2426a..f4770f17c9 100644 Binary files a/app/assets/images/push-notifications/linked.png and b/app/assets/images/push-notifications/linked.png differ diff --git a/app/assets/images/push-notifications/mentioned.png b/app/assets/images/push-notifications/mentioned.png index ebb5560414..c3edbcc20b 100644 Binary files a/app/assets/images/push-notifications/mentioned.png and b/app/assets/images/push-notifications/mentioned.png differ diff --git a/app/assets/images/push-notifications/posted.png b/app/assets/images/push-notifications/posted.png index 41d02aff0e..8835fcbe04 100644 Binary files a/app/assets/images/push-notifications/posted.png and b/app/assets/images/push-notifications/posted.png differ diff --git a/app/assets/images/push-notifications/private_message.png b/app/assets/images/push-notifications/private_message.png index 8e71e69c7f..2f1d97b204 100644 Binary files a/app/assets/images/push-notifications/private_message.png and b/app/assets/images/push-notifications/private_message.png differ diff --git a/app/assets/images/push-notifications/quoted.png b/app/assets/images/push-notifications/quoted.png index 01d889b468..16d44dd1f3 100644 Binary files a/app/assets/images/push-notifications/quoted.png and b/app/assets/images/push-notifications/quoted.png differ diff --git a/app/assets/images/push-notifications/replied.png b/app/assets/images/push-notifications/replied.png index 41d02aff0e..8835fcbe04 100644 Binary files a/app/assets/images/push-notifications/replied.png and b/app/assets/images/push-notifications/replied.png differ diff --git a/app/assets/javascripts/admin/components/admin-report-chart.js.es6 b/app/assets/javascripts/admin/components/admin-report-chart.js.es6 index 8994c9d9b4..d103e6f912 100644 --- a/app/assets/javascripts/admin/components/admin-report-chart.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-chart.js.es6 @@ -6,58 +6,79 @@ export default Ember.Component.extend({ limit: 8, total: 0, + init() { + this._super(...arguments); + + this.resizeHandler = () => + Ember.run.debounce(this, this._scheduleChartRendering, 500); + }, + + didInsertElement() { + this._super(...arguments); + + $(window).on("resize.chart", this.resizeHandler); + }, + willDestroyElement() { this._super(...arguments); + $(window).off("resize.chart", this.resizeHandler); + this._resetChart(); }, didReceiveAttrs() { this._super(...arguments); + Ember.run.debounce(this, this._scheduleChartRendering, 100); + }, + + _scheduleChartRendering() { Ember.run.schedule("afterRender", () => { - const $chartCanvas = this.$(".chart-canvas"); - if (!$chartCanvas || !$chartCanvas.length) return; + this._renderChart(this.get("model"), this.$(".chart-canvas")); + }); + }, - const context = $chartCanvas[0].getContext("2d"); - const model = this.get("model"); - const chartData = Ember.makeArray( - model.get("chartData") || model.get("data") - ); - const prevChartData = Ember.makeArray( - model.get("prevChartData") || model.get("prev_data") - ); + _renderChart(model, $chartCanvas) { + if (!$chartCanvas || !$chartCanvas.length) return; - const labels = chartData.map(d => d.x); + const context = $chartCanvas[0].getContext("2d"); + const chartData = Ember.makeArray( + model.get("chartData") || model.get("data") + ); + const prevChartData = Ember.makeArray( + model.get("prevChartData") || model.get("prev_data") + ); - const data = { - labels, - datasets: [ - { - data: chartData.map(d => Math.round(parseFloat(d.y))), - backgroundColor: prevChartData.length - ? "transparent" - : model.secondary_color, - borderColor: model.primary_color - } - ] - }; + const labels = chartData.map(d => d.x); - if (prevChartData.length) { - data.datasets.push({ - data: prevChartData.map(d => Math.round(parseFloat(d.y))), - borderColor: model.primary_color, - borderDash: [5, 5], - backgroundColor: "transparent", - borderWidth: 1, - pointRadius: 0 - }); - } + const data = { + labels, + datasets: [ + { + data: chartData.map(d => Math.round(parseFloat(d.y))), + backgroundColor: prevChartData.length + ? "transparent" + : model.secondary_color, + borderColor: model.primary_color + } + ] + }; - loadScript("/javascripts/Chart.min.js").then(() => { - this._resetChart(); - this._chart = new window.Chart(context, this._buildChartConfig(data)); + if (prevChartData.length) { + data.datasets.push({ + data: prevChartData.map(d => Math.round(parseFloat(d.y))), + borderColor: model.primary_color, + borderDash: [5, 5], + backgroundColor: "transparent", + borderWidth: 1, + pointRadius: 0 }); + } + + loadScript("/javascripts/Chart.min.js").then(() => { + this._resetChart(); + this._chart = new window.Chart(context, this._buildChartConfig(data)); }); }, diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 index c8082cc84d..a8acc0e2f0 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 @@ -154,7 +154,7 @@ export default Ember.Controller.extend({ @computed("maximized") maximizeIcon(maximized) { - return maximized ? "compress" : "expand"; + return maximized ? "discourse-compress" : "discourse-expand"; }, @computed("model.isSaving") diff --git a/app/assets/javascripts/admin/controllers/admin-email-advanced-test.js.es6 b/app/assets/javascripts/admin/controllers/admin-email-advanced-test.js.es6 new file mode 100644 index 0000000000..34b2d7b049 --- /dev/null +++ b/app/assets/javascripts/admin/controllers/admin-email-advanced-test.js.es6 @@ -0,0 +1,30 @@ +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; + +export default Ember.Controller.extend({ + email: null, + text: null, + elided: null, + format: null, + loading: null, + + actions: { + run() { + this.set("loading", true); + + ajax("/admin/email/advanced-test", { + type: "POST", + data: { email: this.get("email") } + }) + .then(data => { + this.setProperties({ + text: data.text, + elided: data.elided, + format: data.format + }); + }) + .catch(popupAjaxError) + .finally(() => this.set("loading", false)); + } + } +}); diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 index c2d96201bd..a5831299ec 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 @@ -4,7 +4,7 @@ export default Ember.Controller.extend({ categoryNameKey: null, adminSiteSettings: Ember.inject.controller(), - @computed("adminSiteSettings.model", "categoryNameKey") + @computed("adminSiteSettings.visibleSiteSettings", "categoryNameKey") category(categories, nameKey) { return (categories || []).findBy("nameKey", nameKey); }, diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 index 5d34c26293..25420b562d 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings.js.es6 @@ -2,6 +2,8 @@ import debounce from "discourse/lib/debounce"; export default Ember.Controller.extend({ filter: null, + allSiteSettings: Ember.computed.alias("model"), + visibleSiteSettings: null, onlyOverridden: false, filterContentNow(category) { @@ -14,7 +16,7 @@ export default Ember.Controller.extend({ } if ((!filter || 0 === filter.length) && !this.get("onlyOverridden")) { - this.set("model", this.get("allSiteSettings")); + this.set("visibleSiteSettings", this.get("allSiteSettings")); this.transitionToRoute("adminSiteSettings"); return; } @@ -62,7 +64,7 @@ export default Ember.Controller.extend({ all.hasMore = matches.length > 30; all.count = all.hasMore ? "30+" : matches.length; - this.set("model", matchesGroupedByCategory); + this.set("visibleSiteSettings", matchesGroupedByCategory); this.transitionToRoute( "adminSiteSettingsCategory", category || "all_results" diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 index 279fc53536..55e6b007fd 100644 --- a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 @@ -9,6 +9,11 @@ export default Ember.Controller.extend({ defaultEventTypes: Ember.computed.alias("adminWebHooks.defaultEventTypes"), contentTypes: Ember.computed.alias("adminWebHooks.contentTypes"), + @computed + showTagsFilter() { + return this.siteSettings.tagging_enabled; + }, + @computed("model.isSaving", "saved", "saveButtonDisabled") savingStatus(isSaving, saved, saveButtonDisabled) { if (isSaving) { diff --git a/app/assets/javascripts/admin/models/admin-user.js.es6 b/app/assets/javascripts/admin/models/admin-user.js.es6 index fc36b9bfe8..d98e148a5a 100644 --- a/app/assets/javascripts/admin/models/admin-user.js.es6 +++ b/app/assets/javascripts/admin/models/admin-user.js.es6 @@ -98,6 +98,7 @@ const AdminUser = Discourse.User.extend({ }, deleteAllPosts() { + let deletedPosts = 0; const user = this, message = I18n.messageFormat("admin.user.delete_all_posts_confirm_MF", { POSTS: user.get("post_count"), @@ -114,13 +115,52 @@ const AdminUser = Discourse.User.extend({ `${iconHTML("exclamation-triangle")} ` + I18n.t("admin.user.delete_all_posts"), class: "btn btn-danger", - callback: function() { - ajax("/admin/users/" + user.get("id") + "/delete_all_posts", { - type: "PUT" - }).then(() => user.set("post_count", 0)); + callback: () => { + openProgressModal(); + performDelete(); } } - ]; + ], + openProgressModal = () => { + bootbox.dialog( + `
${I18n.t( + "admin.user.delete_posts_progress" + )}
`, + [], + { classes: "delete-posts-progress" } + ); + }, + performDelete = () => { + let deletedPercentage = 0; + return ajax(`/admin/users/${user.get("id")}/delete_posts_batch`, { + type: "PUT" + }) + .then(({ posts_deleted }) => { + if (posts_deleted === 0) { + user.set("post_count", 0); + bootbox.hideAll(); + } else { + deletedPosts += posts_deleted; + deletedPercentage = Math.floor( + (deletedPosts * 100) / user.get("post_count") + ); + $(".delete-posts-progress .progress-bar > span").css({ + width: `${deletedPercentage}%` + }); + performDelete(); + } + }) + .catch(e => { + bootbox.hideAll(); + let error; + AdminUser.find(user.get("id")).then(u => user.setProperties(u)); + if (e.responseJSON && e.responseJSON.errors) { + error = e.responseJSON.errors[0]; + } + error = error || I18n.t("admin.user.delete_posts_failed"); + bootbox.alert(error); + }); + }; bootbox.dialog(message, buttons, { classes: "delete-all-posts" }); }, diff --git a/app/assets/javascripts/admin/models/flagged-post.js.es6 b/app/assets/javascripts/admin/models/flagged-post.js.es6 index d2a9c4510f..fde2cdf01a 100644 --- a/app/assets/javascripts/admin/models/flagged-post.js.es6 +++ b/app/assets/javascripts/admin/models/flagged-post.js.es6 @@ -136,7 +136,7 @@ export default Post.extend({ label: I18n.t("yes_value"), class: "btn-danger", callback() { - Post.deleteMany(replies.map(r => r.id)) + Post.deleteMany(replies.map(r => r.id), { deferFlags: true }) .then(action) .then(resolve) .catch(error => { diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6 index 709dac0a52..6fc812f349 100644 --- a/app/assets/javascripts/admin/models/report.js.es6 +++ b/app/assets/javascripts/admin/models/report.js.es6 @@ -276,9 +276,13 @@ const Report = Discourse.Model.extend({ return this._numberLabel(value, opts); } if (type === "date") { - const date = moment(value, "YYYY-MM-DD"); + const date = moment(value); if (date.isValid()) return this._dateLabel(value, date); } + if (type === "precise_date") { + const date = moment(value); + if (date.isValid()) return this._dateLabel(value, date, "LLL"); + } if (type === "text") return this._textLabel(value); return { @@ -377,10 +381,10 @@ const Report = Discourse.Model.extend({ }; }, - _dateLabel(value, date) { + _dateLabel(value, date, format = "LL") { return { value, - formatedValue: value ? date.format("LL") : "—" + formatedValue: value ? date.format(format) : "—" }; }, diff --git a/app/assets/javascripts/admin/models/web-hook.js.es6 b/app/assets/javascripts/admin/models/web-hook.js.es6 index 142d22b797..a2a7ae79fb 100644 --- a/app/assets/javascripts/admin/models/web-hook.js.es6 +++ b/app/assets/javascripts/admin/models/web-hook.js.es6 @@ -63,6 +63,7 @@ export default RestModel.extend({ createProperties() { const types = this.get("web_hook_event_types"); const categoryIds = this.get("categories").map(c => c.id); + const tagNames = this.get("tag_names"); // Hack as {{group-selector}} accepts a comma-separated string as data source, but // we use an array to populate the datasource above. @@ -81,6 +82,7 @@ export default RestModel.extend({ ? [null] : types.map(type => type.id), category_ids: Ember.isEmpty(categoryIds) ? [null] : categoryIds, + tag_names: Ember.isEmpty(tagNames) ? [null] : tagNames, group_ids: Ember.isEmpty(groupNames) || Ember.isEmpty(groupNames[0]) ? [null] diff --git a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 index 110ec6231b..4ce0b8f313 100644 --- a/app/assets/javascripts/admin/routes/admin-route-map.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-route-map.js.es6 @@ -8,6 +8,10 @@ export default function() { path: "/dashboard/moderation", resetNamespace: true }); + this.route("admin.dashboardNextSecurity", { + path: "/dashboard/security", + resetNamespace: true + }); }); this.route( @@ -31,6 +35,7 @@ export default function() { this.route("received"); this.route("rejected"); this.route("previewDigest", { path: "/preview-digest" }); + this.route("advancedTest", { path: "/advanced-test" }); } ); diff --git a/app/assets/javascripts/admin/routes/admin-site-settings-index.js.es6 b/app/assets/javascripts/admin/routes/admin-site-settings-index.js.es6 index 451fe71d2f..59e851e509 100644 --- a/app/assets/javascripts/admin/routes/admin-site-settings-index.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-site-settings-index.js.es6 @@ -6,7 +6,8 @@ export default Discourse.Route.extend({ beforeModel() { this.replaceWith( "adminSiteSettingsCategory", - this.modelFor("adminSiteSettings")[0].nameKey + this.controllerFor("adminSiteSettings").get("visibleSiteSettings")[0] + .nameKey ); } }); diff --git a/app/assets/javascripts/admin/routes/admin-site-settings.js.es6 b/app/assets/javascripts/admin/routes/admin-site-settings.js.es6 index 48418d3132..58ac7246f5 100644 --- a/app/assets/javascripts/admin/routes/admin-site-settings.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-site-settings.js.es6 @@ -10,9 +10,10 @@ export default Discourse.Route.extend({ }, afterModel(siteSettings) { - this.controllerFor("adminSiteSettings").set( - "allSiteSettings", - siteSettings - ); + const controller = this.controllerFor("adminSiteSettings"); + + if (!controller.get("visibleSiteSettings")) { + controller.set("visibleSiteSettings", siteSettings); + } } }); diff --git a/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 b/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 index f548a4e202..611b015dcb 100644 --- a/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-web-hooks-show.js.es6 @@ -19,6 +19,7 @@ export default Discourse.Route.extend({ } model.set("category_ids", model.get("category_ids")); + model.set("tag_names", model.get("tag_names")); model.set("group_ids", model.get("group_ids")); controller.setProperties({ model, saved: false }); }, diff --git a/app/assets/javascripts/admin/templates/dashboard_next.hbs b/app/assets/javascripts/admin/templates/dashboard_next.hbs index 176f90c22d..e7b1e1c576 100644 --- a/app/assets/javascripts/admin/templates/dashboard_next.hbs +++ b/app/assets/javascripts/admin/templates/dashboard_next.hbs @@ -21,6 +21,11 @@ {{i18n "admin.dashboard.moderation_tab"}} {{/link-to}} +{{i18n 'admin.email.advanced_test.desc'}}
+ +{{{text}}}
+ {{{elided}}}
+ -HTML diff --git a/test/javascripts/acceptance/admin-emails-test.js.es6 b/test/javascripts/acceptance/admin-emails-test.js.es6 new file mode 100644 index 0000000000..f44cf638e9 --- /dev/null +++ b/test/javascripts/acceptance/admin-emails-test.js.es6 @@ -0,0 +1,41 @@ +import { acceptance } from "helpers/qunit-helpers"; + +acceptance("Admin - Emails", { loggedIn: true }); + +const email = ` +From: "somebody"quoted post
+quoted
test:smile:test
` + ); + + assert.cookedOptions( + "test:smile:test", + { siteSettings: { enable_inline_emoji_translation: true } }, + `test
test