From a60d7a2bc77a1be01384dec7144d493be268a0ab Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 14 Sep 2023 11:27:09 +0100 Subject: [PATCH] DEV: Modernize admin-site-text route/controller (#23581) - Switch to `@tracked` and native getters - Remove queryParam defaults which are awkward to work with. Instead, add `resolvedBlah` getters - Add 'no results found' text - Use standard 'model' key instead of a custom `setupController` method - Remove use of `route-action` - Remove `{{action` helper Default queryParams in ember controllers are tricky to work with, especially when combined with the new router service. Instead, we can handle defaults ourselves --- .../controllers/admin-site-text-index.js | 101 +++++++++++------- .../addon/routes/admin-site-text-index.js | 26 ++--- .../admin/addon/templates/site-text-index.hbs | 32 +++--- config/locales/client.en.yml | 1 + 4 files changed, 91 insertions(+), 69 deletions(-) diff --git a/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js b/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js index 041c2d835bc..bf35700c0ac 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js @@ -1,51 +1,65 @@ import { action } from "@ember/object"; import Controller from "@ember/controller"; -import discourseComputed from "discourse-common/utils/decorators"; import discourseDebounce from "discourse-common/lib/debounce"; import { inject as service } from "@ember/service"; +import { tracked } from "@glimmer/tracking"; +import { disableImplicitInjections } from "discourse/lib/implicit-injections"; +import ReseedModal from "admin/components/modal/reseed"; + let lastSearch; +@disableImplicitInjections export default class AdminSiteTextIndexController extends Controller { @service router; @service siteSettings; + @service modal; + @service store; + + @tracked locale; + @tracked q; + @tracked overridden; + @tracked outdated; + + @tracked model; + + @tracked searching = false; + @tracked preferred = false; - searching = false; - siteTexts = null; - preferred = false; queryParams = ["q", "overridden", "outdated", "locale"]; - locale = null; - q = null; - overridden = false; - outdated = false; - init() { - super.init(...arguments); - - this.set("locale", this.siteSettings.default_locale); + get resolvedOverridden() { + return [true, "true"].includes(this.overridden) ?? false; } - _performSearch() { - this.store - .find( - "site-text", - this.getProperties("q", "overridden", "outdated", "locale") - ) - .then((results) => { - this.set("siteTexts", results); - }) - .finally(() => this.set("searching", false)); + get resolvedOutdated() { + return [true, "true"].includes(this.outdated) ?? false; } - @discourseComputed() - availableLocales() { + get resolvedLocale() { + return this.locale ?? this.siteSettings.default_locale; + } + + async _performSearch() { + try { + this.model = await this.store.find("site-text", { + q: this.q, + overridden: this.resolvedOverridden, + outdated: this.resolvedOutdated, + locale: this.resolvedLocale, + }); + } finally { + this.searching = false; + } + } + + get availableLocales() { return JSON.parse(this.siteSettings.available_locales); } - @discourseComputed("locale") - fallbackLocaleFullName() { - if (this.siteTexts.extras.fallback_locale) { + get fallbackLocaleFullName() { + if (this.model.extras.fallback_locale) { return this.availableLocales.find((l) => { - return l.value === this.siteTexts.extras.fallback_locale; + return l.value === this.model.extras.fallback_locale; }).name; } } @@ -54,22 +68,30 @@ export default class AdminSiteTextIndexController extends Controller { edit(siteText) { this.router.transitionTo("adminSiteText.edit", siteText.get("id"), { queryParams: { - locale: this.locale, + locale: this.resolvedLocale, }, }); } @action toggleOverridden() { - this.toggleProperty("overridden"); - this.set("searching", true); + if (this.resolvedOverridden) { + this.overridden = null; + } else { + this.overridden = true; + } + this.searching = true; discourseDebounce(this, this._performSearch, 400); } @action toggleOutdated() { - this.toggleProperty("outdated"); - this.set("searching", true); + if (this.resolvedOutdated) { + this.outdated = null; + } else { + this.outdated = true; + } + this.searching = true; discourseDebounce(this, this._performSearch, 400); } @@ -77,7 +99,7 @@ export default class AdminSiteTextIndexController extends Controller { search() { const q = this.q; if (q !== lastSearch) { - this.set("searching", true); + this.searching = true; discourseDebounce(this, this._performSearch, 400); lastSearch = q; } @@ -85,11 +107,14 @@ export default class AdminSiteTextIndexController extends Controller { @action updateLocale(value) { - this.setProperties({ - searching: true, - locale: value, - }); + this.searching = true; + this.locale = value; discourseDebounce(this, this._performSearch, 400); } + + @action + showReseedModal() { + this.modal.show(ReseedModal); + } } diff --git a/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js b/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js index 3d10f340e0a..a424d954be7 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js +++ b/app/assets/javascripts/admin/addon/routes/admin-site-text-index.js @@ -1,10 +1,11 @@ import Route from "@ember/routing/route"; -import { action, getProperties } from "@ember/object"; +import { disableImplicitInjections } from "discourse/lib/implicit-injections"; import { inject as service } from "@ember/service"; -import ReseedModal from "admin/components/modal/reseed"; +@disableImplicitInjections export default class AdminSiteTextIndexRoute extends Route { - @service modal; + @service siteSettings; + @service store; queryParams = { q: { replace: true }, @@ -14,18 +15,11 @@ export default class AdminSiteTextIndexRoute extends Route { }; model(params) { - return this.store.find( - "site-text", - getProperties(params, "q", "overridden", "outdated", "locale") - ); - } - - setupController(controller, model) { - controller.set("siteTexts", model); - } - - @action - showReseedModal() { - this.modal.show(ReseedModal); + return this.store.find("site-text", { + q: params.q, + overridden: params.overridden ?? false, + outdated: params.outdated ?? false, + locale: params.locale ?? this.siteSettings.default_locale, + }); } } diff --git a/app/assets/javascripts/admin/addon/templates/site-text-index.hbs b/app/assets/javascripts/admin/addon/templates/site-text-index.hbs index c9c1587cc51..cf6b7c2d3c0 100644 --- a/app/assets/javascripts/admin/addon/templates/site-text-index.hbs +++ b/app/assets/javascripts/admin/addon/templates/site-text-index.hbs @@ -6,12 +6,12 @@ @placeholderKey="admin.site_text.search" @class="no-blur site-text-search" @autofocus="true" - @key-up={{action "search"}} + @key-up={{this.search}} />