diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js b/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js
index 7dbc7229b21..45b0e797cba 100644
--- a/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js
+++ b/app/assets/javascripts/admin/addon/controllers/admin-site-text-edit.js
@@ -16,6 +16,11 @@ export default Controller.extend(bufferedProperty("siteText"), {
return this.siteText.value === value;
},
+ @discourseComputed("siteText.status")
+ isOutdated(status) {
+ return status === "outdated";
+ },
+
@action
saveChanges() {
const attrs = this.buffered.getProperties("value");
@@ -49,6 +54,16 @@ export default Controller.extend(bufferedProperty("siteText"), {
});
},
+ @action
+ dismissOutdated() {
+ this.siteText
+ .dismissOutdated(this.locale)
+ .then(() => {
+ this.siteText.set("status", "up_to_date");
+ })
+ .catch(popupAjaxError);
+ },
+
get interpolationKeys() {
return this.siteText.interpolation_keys.join(", ");
},
diff --git a/app/assets/javascripts/admin/addon/models/site-text.js b/app/assets/javascripts/admin/addon/models/site-text.js
index 916030b8d3a..0460ab3d9dc 100644
--- a/app/assets/javascripts/admin/addon/models/site-text.js
+++ b/app/assets/javascripts/admin/addon/models/site-text.js
@@ -8,4 +8,13 @@ export default class SiteText extends RestModel {
type: "DELETE",
}).then((result) => getProperties(result.site_text, "value", "can_revert"));
}
+
+ dismissOutdated(locale) {
+ return ajax(
+ `/admin/customize/site_texts/${this.id}/dismiss_outdated?locale=${locale}`,
+ {
+ type: "PUT",
+ }
+ );
+ }
}
diff --git a/app/assets/javascripts/admin/addon/templates/site-text-edit.hbs b/app/assets/javascripts/admin/addon/templates/site-text-edit.hbs
index ef327ab4067..33eee6fc3f1 100644
--- a/app/assets/javascripts/admin/addon/templates/site-text-edit.hbs
+++ b/app/assets/javascripts/admin/addon/templates/site-text-edit.hbs
@@ -7,6 +7,22 @@
{{i18n "admin.site_text.locale"}} {{this.localeFullName}}
+ {{#if this.isOutdated}}
+
+
{{i18n "admin.site_text.outdated.title"}}
+
{{i18n "admin.site_text.outdated.description"}}
+
{{i18n "admin.site_text.outdated.old_default"}}
+
{{this.siteText.old_default}}
+
{{i18n "admin.site_text.outdated.new_default"}}
+
{{this.siteText.new_default}}
+
+
+ {{/if}}
+
"site_texts#revert", :constraints => { id: /[\w.\-\+\%\&]+/i }
+ put "site_texts/:id/dismiss_outdated" => "site_texts#dismiss_outdated",
+ :constraints => {
+ id: /[\w.\-\+\%\&]+/i,
+ }
+ put "site_texts/:id/dismiss_outdated.json" => "site_texts#dismiss_outdated",
+ :constraints => {
+ id: /[\w.\-\+\%\&]+/i,
+ }
get "reseed" => "site_texts#get_reseed_options"
post "reseed" => "site_texts#reseed"
diff --git a/spec/requests/admin/site_texts_controller_spec.rb b/spec/requests/admin/site_texts_controller_spec.rb
index 03a9e71e23e..c9336bf827d 100644
--- a/spec/requests/admin/site_texts_controller_spec.rb
+++ b/spec/requests/admin/site_texts_controller_spec.rb
@@ -224,6 +224,9 @@ RSpec.describe Admin::SiteTextsController do
{
id: "colour.#{key}",
value: value,
+ status: "up_to_date",
+ old_default: nil,
+ new_default: nil,
can_revert: overridden,
overridden: overridden,
interpolation_keys: interpolation_keys,
@@ -815,6 +818,70 @@ RSpec.describe Admin::SiteTextsController do
end
end
+ describe "#dismiss_outdated" do
+ before { sign_in(admin) }
+
+ context "when using a key which isn't overridden" do
+ it "returns a not found error" do
+ put "/admin/customize/site_texts/title/dismiss_outdated.json",
+ params: {
+ locale: default_locale,
+ }
+
+ expect(response.status).to eq(404)
+
+ json = response.parsed_body
+ expect(json["error_type"]).to eq("not_found")
+ end
+ end
+
+ context "when the override isn't outdated" do
+ before do
+ Fabricate(
+ :translation_override,
+ locale: default_locale,
+ translation_key: "title",
+ value: "My Forum",
+ )
+ end
+
+ it "returns an unprocessable entity error" do
+ put "/admin/customize/site_texts/title/dismiss_outdated.json",
+ params: {
+ locale: default_locale,
+ }
+
+ expect(response.status).to eq(422)
+
+ json = response.parsed_body
+ expect(json["failed"]).to eq("FAILED")
+ expect(json["message"]).to eq("Can only dismiss outdated translations")
+ end
+ end
+
+ context "when the override is outdated" do
+ before do
+ Fabricate(
+ :translation_override,
+ locale: default_locale,
+ translation_key: "title",
+ value: "My Forum",
+ status: "outdated",
+ )
+ end
+
+ it "returns success" do
+ put "/admin/customize/site_texts/title/dismiss_outdated.json",
+ params: {
+ locale: default_locale,
+ }
+
+ expect(response.status).to eq(200)
+ expect(response.parsed_body["success"]).to eq("OK")
+ end
+ end
+ end
+
context "when reseeding" do
before do
staff_category = Fabricate(:category, name: "Staff EN", user: Discourse.system_user)