diff --git a/Gemfile.lock b/Gemfile.lock
index 56b4d03c26..5d4ea41328 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -61,12 +61,12 @@ GEM
aws-sdk-sns (1.21.0)
aws-sdk-core (~> 3, >= 3.71.0)
aws-sigv4 (~> 1.1)
- aws-sigv4 (1.1.0)
+ aws-sigv4 (1.1.1)
aws-eventstream (~> 1.0, >= 1.0.2)
barber (0.12.2)
ember-source (>= 1.0, < 3.1)
execjs (>= 1.2, < 3)
- better_errors (2.5.1)
+ better_errors (2.6.0)
coderay (>= 1.0.0)
erubi (>= 1.0.0)
rack (>= 0.9.0)
@@ -141,7 +141,7 @@ GEM
globalid (0.4.2)
activesupport (>= 4.2.0)
guess_html_encoding (0.0.11)
- hashdiff (1.0.0)
+ hashdiff (1.0.1)
hashie (3.6.0)
highline (1.7.10)
hkdf (0.3.0)
@@ -171,7 +171,7 @@ GEM
logstash-event (1.2.02)
logstash-logger (0.26.1)
logstash-event (~> 1.2)
- logster (2.7.0)
+ logster (2.7.1)
loofah (2.4.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
@@ -204,7 +204,7 @@ GEM
multipart-post (2.1.1)
mustache (1.1.1)
nio4r (2.5.2)
- nokogiri (1.10.8)
+ nokogiri (1.10.9)
mini_portile2 (~> 2.4.0)
nokogumbo (2.0.2)
nokogiri (~> 1.8, >= 1.8.4)
@@ -215,7 +215,7 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
- oj (3.10.2)
+ oj (3.10.5)
omniauth (1.9.0)
hashie (>= 3.4.6, < 3.7.0)
rack (>= 1.6.2, < 3)
@@ -252,7 +252,7 @@ GEM
parallel (1.19.1)
parallel_tests (2.31.0)
parallel
- parser (2.7.0.2)
+ parser (2.7.0.4)
ast (~> 2.4.0)
pg (1.2.2)
progress (3.5.2)
@@ -264,7 +264,7 @@ GEM
pry-rails (0.3.9)
pry (>= 0.10.4)
public_suffix (4.0.3)
- puma (4.3.1)
+ puma (4.3.3)
nio4r (~> 2.0)
r2 (0.2.7)
rack (2.0.8)
@@ -279,9 +279,9 @@ GEM
nokogiri (>= 1.6)
rails-html-sanitizer (1.3.0)
loofah (~> 2.3)
- rails_multisite (2.0.7)
- activerecord (> 4.2, < 7)
- railties (> 4.2, < 7)
+ rails_multisite (2.1.0)
+ activerecord (> 5.0, < 7)
+ railties (> 5.0, < 7)
railties (6.0.1)
actionpack (= 6.0.1)
activesupport (= 6.0.1)
@@ -339,7 +339,7 @@ GEM
rspec-support (~> 3.8)
rspec-support (3.9.2)
rtlit (0.0.5)
- rubocop (0.80.0)
+ rubocop (0.80.1)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.7.0.1)
@@ -379,10 +379,10 @@ GEM
rack (~> 2.0)
rack-protection (>= 2.0.0)
redis (>= 4.1.0)
- simplecov (0.18.3)
+ simplecov (0.18.5)
docile (~> 1.1)
simplecov-html (~> 0.11)
- simplecov-html (0.12.1)
+ simplecov-html (0.12.2)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6
index 9cdca3f098..a27022390f 100644
--- a/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6
@@ -53,7 +53,7 @@ export default Controller.extend({
},
copy() {
- var newColorScheme = Ember.copy(this.model, true);
+ const newColorScheme = this.model.copy();
newColorScheme.set(
"name",
I18n.t("admin.customize.colors.copy_name_prefix") +
diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6
index 869918bebb..e2ff119aa4 100644
--- a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6
@@ -26,7 +26,7 @@ export default Controller.extend({
actions: {
newColorSchemeWithBase(baseKey) {
const base = this.baseColorSchemes.findBy("base_scheme_id", baseKey);
- const newColorScheme = Ember.copy(base, true);
+ const newColorScheme = base.copy();
newColorScheme.setProperties({
name: I18n.t("admin.customize.colors.new_name"),
base_scheme_id: base.get("base_scheme_id")
diff --git a/app/assets/javascripts/admin/models/color-scheme.js.es6 b/app/assets/javascripts/admin/models/color-scheme.js.es6
index 8486002386..afabb1ed6e 100644
--- a/app/assets/javascripts/admin/models/color-scheme.js.es6
+++ b/app/assets/javascripts/admin/models/color-scheme.js.es6
@@ -4,7 +4,7 @@ import { ajax } from "discourse/lib/ajax";
import ColorSchemeColor from "admin/models/color-scheme-color";
import EmberObject from "@ember/object";
-const ColorScheme = EmberObject.extend(Ember.Copyable, {
+const ColorScheme = EmberObject.extend({
init() {
this._super(...arguments);
diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6
index bd7074ced2..d0152c1a9e 100644
--- a/app/assets/javascripts/admin/models/report.js.es6
+++ b/app/assets/javascripts/admin/models/report.js.es6
@@ -21,6 +21,8 @@ const Report = EmberObject.extend({
average: false,
percent: false,
higher_is_better: true,
+ description_link: null,
+ description: null,
@discourseComputed("type", "start_date", "end_date")
reportUrl(type, start_date, end_date) {
diff --git a/app/assets/javascripts/admin/templates/components/admin-report.hbs b/app/assets/javascripts/admin/templates/components/admin-report.hbs
index f8a36fa7d3..cb0f333bb0 100644
--- a/app/assets/javascripts/admin/templates/components/admin-report.hbs
+++ b/app/assets/javascripts/admin/templates/components/admin-report.hbs
@@ -23,9 +23,15 @@
{{#if model.description}}
-
- {{d-icon "question-circle"}}
-
+ {{#if model.description_link}}
+
+ {{d-icon "question-circle"}}
+
+ {{else}}
+
+ {{d-icon "question-circle"}}
+
+ {{/if}}
{{/if}}
{{/unless}}
diff --git a/app/assets/javascripts/admin/templates/modal/admin-start-backup.hbs b/app/assets/javascripts/admin/templates/modal/admin-start-backup.hbs
index dd201e2aed..011de55de9 100644
--- a/app/assets/javascripts/admin/templates/modal/admin-start-backup.hbs
+++ b/app/assets/javascripts/admin/templates/modal/admin-start-backup.hbs
@@ -1,12 +1,14 @@
{{#d-modal-body title="admin.backups.operations.backup.confirm"}}
{{d-button
- class="btn-primary"
+ class="btn-primary backup-with-uploads"
action=(action "startBackupWithUploads")
label="yes_value"}}
{{d-button
+ class="backup-no-uploads"
action=(action "startBackupWithoutUploads")
label="admin.backups.operations.backup.without_uploads"}}
{{d-button
+ class="btn-default"
action=(action "cancel")
label="no_value"}}
{{/d-modal-body}}
diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6
index 24c71dd8fb..52f44e78f5 100644
--- a/app/assets/javascripts/discourse/components/composer-editor.js.es6
+++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6
@@ -1014,7 +1014,7 @@ export default Component.extend({
);
// Short upload urls need resolution
- resolveAllShortUrls(ajax);
+ resolveAllShortUrls(ajax, this.siteSettings, ".d-editor-preview-wrapper");
if (this._enableAdvancedEditorPreviewSync()) {
this._syncScroll(
diff --git a/app/assets/javascripts/discourse/components/cook-text.js.es6 b/app/assets/javascripts/discourse/components/cook-text.js.es6
index 256636a3c5..f3ad48f549 100644
--- a/app/assets/javascripts/discourse/components/cook-text.js.es6
+++ b/app/assets/javascripts/discourse/components/cook-text.js.es6
@@ -16,7 +16,7 @@ const CookText = Component.extend({
next(() =>
window
.requireModule("pretty-text/upload-short-url")
- .resolveAllShortUrls(ajax)
+ .resolveAllShortUrls(ajax, this.siteSettings)
);
});
}
diff --git a/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 b/app/assets/javascripts/discourse/components/create-topics-notice.js.es6
index 5622cfab94..7789ccd2bc 100644
--- a/app/assets/javascripts/discourse/components/create-topics-notice.js.es6
+++ b/app/assets/javascripts/discourse/components/create-topics-notice.js.es6
@@ -68,21 +68,21 @@ export default Component.extend({
"topicTrackingState.incomingCount"
)
message() {
- var msg = null;
+ let msg = null;
if (
this.publicTopicCount < this.requiredTopics &&
this.publicPostCount < this.requiredPosts
) {
- msg = "too_few_topics_and_posts_notice";
+ msg = "too_few_topics_and_posts_notice_MF";
} else if (this.publicTopicCount < this.requiredTopics) {
- msg = "too_few_topics_notice";
+ msg = "too_few_topics_notice_MF";
} else {
- msg = "too_few_posts_notice";
+ msg = "too_few_posts_notice_MF";
}
return new Handlebars.SafeString(
- I18n.t(msg, {
+ I18n.messageFormat(msg, {
requiredTopics: this.requiredTopics,
requiredPosts: this.requiredPosts,
currentTopics: this.publicTopicCount,
diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6
index 855fed4e28..eb61067167 100644
--- a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6
+++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6
@@ -219,6 +219,11 @@ export default Component.extend({
}
},
+ setCategory(category) {
+ this.set("searchedTerms.category", category);
+ this.set("category", category);
+ },
+
setSearchedTermValueForCategory() {
const match = this.filterBlocks(REGEXP_CATEGORY_PREFIX);
if (match.length !== 0) {
@@ -235,21 +240,21 @@ export default Component.extend({
(!existingInput && userInput) ||
(existingInput && userInput && existingInput.id !== userInput.id)
)
- this.set("searchedTerms.category", userInput);
+ this.setCategory(userInput);
} else if (isNaN(subcategories)) {
const userInput = Category.findSingleBySlug(subcategories[0]);
if (
(!existingInput && userInput) ||
(existingInput && userInput && existingInput.id !== userInput.id)
)
- this.set("searchedTerms.category", userInput);
+ this.setCategory(userInput);
} else {
const userInput = Category.findById(subcategories[0]);
if (
(!existingInput && userInput) ||
(existingInput && userInput && existingInput.id !== userInput.id)
)
- this.set("searchedTerms.category", userInput);
+ this.setCategory(userInput);
}
} else this.set("searchedTerms.category", "");
},
diff --git a/app/assets/javascripts/discourse/components/topic-status.js.es6 b/app/assets/javascripts/discourse/components/topic-status.js.es6
index ecd6f448de..569292eb5e 100644
--- a/app/assets/javascripts/discourse/components/topic-status.js.es6
+++ b/app/assets/javascripts/discourse/components/topic-status.js.es6
@@ -44,6 +44,17 @@ export default Component.extend({
: this._reset("warning");
},
+ @discourseComputed(
+ "showPrivateMessageIcon",
+ "topic.isPrivateMessage",
+ "topic.is_warning"
+ )
+ topicPrivateMessage(showPrivateMessageIcon, privateMessage, warning) {
+ return showPrivateMessageIcon && privateMessage && !warning
+ ? this._set("privateMessage", "envelope", "personal_message")
+ : this._reset("privateMessage");
+ },
+
@discourseComputed("topic.pinned")
topicPinned(pinned) {
return pinned
diff --git a/app/assets/javascripts/discourse/helpers/application.js.es6 b/app/assets/javascripts/discourse/helpers/application.js.es6
index e6a88ded97..71baa92c91 100644
--- a/app/assets/javascripts/discourse/helpers/application.js.es6
+++ b/app/assets/javascripts/discourse/helpers/application.js.es6
@@ -41,6 +41,11 @@ registerUnbound("number", (orig, params) => {
if (n.toString() !== title.toString() && addTitle) {
result += " title='" + Handlebars.Utils.escapeExpression(title) + "'";
}
+ if (params.ariaLabel) {
+ const ariaLabel = Handlebars.Utils.escapeExpression(params.ariaLabel);
+ result += ` aria-label='${ariaLabel}'`;
+ }
+
result += ">" + n + "";
return new safe(result);
diff --git a/app/assets/javascripts/discourse/initializers/register-service-worker.js.es6 b/app/assets/javascripts/discourse/initializers/register-service-worker.js.es6
index c0099d7f30..fbfc4484de 100644
--- a/app/assets/javascripts/discourse/initializers/register-service-worker.js.es6
+++ b/app/assets/javascripts/discourse/initializers/register-service-worker.js.es6
@@ -10,9 +10,12 @@ export default {
if (isSupported) {
const caps = Discourse.__container__.lookup("capabilities:main");
- const isApple = caps.isSafari || caps.isIOS || caps.isIpadOS;
+ const isAppleBrowser =
+ caps.isSafari ||
+ (caps.isIOS &&
+ !window.matchMedia("(display-mode: standalone)").matches);
- if (Discourse.ServiceWorkerURL && !isApple) {
+ if (Discourse.ServiceWorkerURL && !isAppleBrowser) {
navigator.serviceWorker.getRegistrations().then(registrations => {
for (let registration of registrations) {
if (
diff --git a/app/assets/javascripts/discourse/lib/url.js.es6 b/app/assets/javascripts/discourse/lib/url.js.es6
index 3dc13d0d79..93cad9b4c4 100644
--- a/app/assets/javascripts/discourse/lib/url.js.es6
+++ b/app/assets/javascripts/discourse/lib/url.js.es6
@@ -25,6 +25,7 @@ const SERVER_SIDE_ONLY = [
/^\/posts\/\d+\/raw/,
/^\/raw\/\d+/,
/^\/wizard/,
+ /^\/go\//, // EXPERIMENTAL: https://meta.discourse.org/t/-/142605
/\.rss$/,
/\.json$/,
/^\/admin\/upgrade$/,
diff --git a/app/assets/javascripts/discourse/lib/utilities.js.es6 b/app/assets/javascripts/discourse/lib/utilities.js.es6
index ce91d7c8dc..e44a60d53a 100644
--- a/app/assets/javascripts/discourse/lib/utilities.js.es6
+++ b/app/assets/javascripts/discourse/lib/utilities.js.es6
@@ -66,9 +66,12 @@ export function avatarImg(options, getURL) {
const classes =
"avatar" + (options.extraClasses ? " " + options.extraClasses : "");
- const title = options.title
- ? " title='" + escapeExpression(options.title || "") + "'"
- : "";
+
+ let title = "";
+ if (options.title) {
+ const escaped = escapeExpression(options.title || "");
+ title = ` title='${escaped}' aria-label='${escaped}'`;
+ }
return (
"{{archivedIcon}}
{{~/if~}}
+{{~#if topicPrivateMessage~}}
+ {{privateMessageIcon}}
+{{~/if~}}
{{~#if topicWarning~}}
- {{warningIcon}}
+ {{warningIcon}}
{{~/if~}}
{{~#if topicPinned~}}
{{~#if canAct~}}
diff --git a/app/assets/javascripts/discourse/templates/full-page-search.hbs b/app/assets/javascripts/discourse/templates/full-page-search.hbs
index 1317bbc753..e903c5cd02 100644
--- a/app/assets/javascripts/discourse/templates/full-page-search.hbs
+++ b/app/assets/javascripts/discourse/templates/full-page-search.hbs
@@ -36,7 +36,7 @@
{{#if canBulkSelect}}
{{d-button icon="list" class="btn-default bulk-select" title="topics.bulk.toggle" action=(action "toggleBulkSelect")}}
- {{bulk-select-button selected=selected action=(action "search")}}
+ {{bulk-select-button selected=selected category=category action=(action "search")}}
{{/if}}
{{#if bulkSelectEnabled}}
@@ -85,7 +85,8 @@
{{/if}}
- {{topic-status topic=result.topic disableActions=true}}{{#highlight-text highlight=q}}{{{unbound result.topic.fancyTitle}}}{{/highlight-text}}
+ {{topic-status topic=result.topic disableActions=true showPrivateMessageIcon=true}}
+ {{#highlight-text highlight=q}}{{{unbound result.topic.fancyTitle}}}{{/highlight-text}}