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)