mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 06:54:15 +08:00
55da8a7701
Adds a checkbox to filter untranslated text strings in the admin UI, behind a hidden and default `false` site setting `admin_allow_filter_untranslated_text`.
145 lines
3.2 KiB
JavaScript
145 lines
3.2 KiB
JavaScript
import { tracked } from "@glimmer/tracking";
|
|
import Controller from "@ember/controller";
|
|
import { action } from "@ember/object";
|
|
import { service } from "@ember/service";
|
|
import { disableImplicitInjections } from "discourse/lib/implicit-injections";
|
|
import discourseDebounce from "discourse-common/lib/debounce";
|
|
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 untranslated;
|
|
|
|
@tracked model;
|
|
|
|
@tracked searching = false;
|
|
@tracked preferred = false;
|
|
|
|
queryParams = ["q", "overridden", "outdated", "locale", "untranslated"];
|
|
|
|
get resolvedOverridden() {
|
|
return [true, "true"].includes(this.overridden) ?? false;
|
|
}
|
|
|
|
get resolvedOutdated() {
|
|
return [true, "true"].includes(this.outdated) ?? false;
|
|
}
|
|
|
|
get resolvedUntranslated() {
|
|
return [true, "true"].includes(this.untranslated) ?? false;
|
|
}
|
|
|
|
get resolvedLocale() {
|
|
return this.locale ?? this.siteSettings.default_locale;
|
|
}
|
|
|
|
get showUntranslated() {
|
|
return (
|
|
this.siteSettings.admin_allow_filter_untranslated_text &&
|
|
this.resolvedLocale !== "en"
|
|
);
|
|
}
|
|
|
|
async _performSearch() {
|
|
try {
|
|
this.model = await this.store.find("site-text", {
|
|
q: this.q,
|
|
overridden: this.resolvedOverridden,
|
|
outdated: this.resolvedOutdated,
|
|
locale: this.resolvedLocale,
|
|
untranslated: this.resolvedUntranslated,
|
|
});
|
|
} finally {
|
|
this.searching = false;
|
|
}
|
|
}
|
|
|
|
get availableLocales() {
|
|
return JSON.parse(this.siteSettings.available_locales);
|
|
}
|
|
|
|
get fallbackLocaleFullName() {
|
|
if (this.model.extras.fallback_locale) {
|
|
return this.availableLocales.find((l) => {
|
|
return l.value === this.model.extras.fallback_locale;
|
|
}).name;
|
|
}
|
|
}
|
|
|
|
@action
|
|
edit(siteText) {
|
|
this.router.transitionTo("adminSiteText.edit", siteText.get("id"), {
|
|
queryParams: {
|
|
locale: this.resolvedLocale,
|
|
},
|
|
});
|
|
}
|
|
|
|
@action
|
|
toggleOverridden() {
|
|
if (this.resolvedOverridden) {
|
|
this.overridden = null;
|
|
} else {
|
|
this.overridden = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
toggleOutdated() {
|
|
if (this.resolvedOutdated) {
|
|
this.outdated = null;
|
|
} else {
|
|
this.outdated = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
toggleUntranslated() {
|
|
if (this.resolvedUntranslated) {
|
|
this.untranslated = null;
|
|
} else {
|
|
this.untranslated = true;
|
|
}
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
search() {
|
|
const q = this.q;
|
|
if (q !== lastSearch) {
|
|
this.searching = true;
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
lastSearch = q;
|
|
}
|
|
}
|
|
|
|
@action
|
|
updateLocale(value) {
|
|
this.searching = true;
|
|
this.locale = value;
|
|
|
|
discourseDebounce(this, this._performSearch, 400);
|
|
}
|
|
|
|
@action
|
|
showReseedModal() {
|
|
this.modal.show(ReseedModal);
|
|
}
|
|
}
|