discourse/app/assets/javascripts/admin/addon/controllers/admin-site-text-index.js
Renato Atilio 55da8a7701
FEATURE: add Untranslated filter to admin text customization (#27555)
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`.
2024-06-24 06:24:06 -03:00

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);
}
}