From 341acacba83ad30aa62a479e913839cfd26076f5 Mon Sep 17 00:00:00 2001 From: Ted Johansson Date: Wed, 19 Jul 2023 23:06:13 +0800 Subject: [PATCH] DEV: Add endpoint for dismissing outdated translations (#22509) Recently we started giving admins a notice in the advice panel when their translations have become outdated due to changes in core. However, we didn't include any additional information. This PR adds more information about the outdated translation inside the site text edit page, together with an option to dismiss the warning. --- .../addon/controllers/admin-site-text-edit.js | 15 +++++ .../admin/addon/models/site-text.js | 9 +++ .../admin/addon/templates/site-text-edit.hbs | 16 +++++ .../stylesheets/common/admin/admin_base.scss | 12 ++++ .../admin/site_texts_controller.rb | 20 ++++++ app/models/translation_override.rb | 16 ++--- app/serializers/site_text_serializer.rb | 34 +++++++++- config/locales/client.en.yml | 6 ++ config/routes.rb | 8 +++ .../admin/site_texts_controller_spec.rb | 67 +++++++++++++++++++ 10 files changed, 192 insertions(+), 11 deletions(-) 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)