mirror of
https://github.com/discourse/discourse.git
synced 2024-11-29 22:33:45 +08:00
d3793f7aea
1. rename watched-word-test to watched-word-testing (to fix ember/no-test-import-export lint) 2. convert it to gjs 3. minor tweaks to admin-watched-words-action (async/await, string interpolation, chaining operator, for-of loop) 4. drop action helper usage
112 lines
3.0 KiB
JavaScript
112 lines
3.0 KiB
JavaScript
import Controller, { inject as controller } from "@ember/controller";
|
|
import { action } from "@ember/object";
|
|
import { or } from "@ember/object/computed";
|
|
import { schedule } from "@ember/runloop";
|
|
import { service } from "@ember/service";
|
|
import { ajax } from "discourse/lib/ajax";
|
|
import { fmt } from "discourse/lib/computed";
|
|
import discourseComputed from "discourse-common/utils/decorators";
|
|
import I18n from "discourse-i18n";
|
|
import WatchedWordTestingModal from "admin/components/modal/watched-word-testing";
|
|
import WatchedWord from "admin/models/watched-word";
|
|
|
|
export default class AdminWatchedWordsActionController extends Controller {
|
|
@service dialog;
|
|
@service modal;
|
|
@controller adminWatchedWords;
|
|
|
|
actionNameKey = null;
|
|
|
|
@fmt("actionNameKey", "/admin/customize/watched_words/action/%@/download")
|
|
downloadLink;
|
|
|
|
@or("adminWatchedWords.showWords", "adminWatchedWords.filter")
|
|
showWordsList;
|
|
|
|
findAction(actionName) {
|
|
return (this.adminWatchedWords.model || []).findBy("nameKey", actionName);
|
|
}
|
|
|
|
@discourseComputed("actionNameKey", "adminWatchedWords.model")
|
|
currentAction(actionName) {
|
|
return this.findAction(actionName);
|
|
}
|
|
|
|
@discourseComputed("currentAction.words.[]")
|
|
regexpError(words) {
|
|
for (const { regexp, word } of words) {
|
|
try {
|
|
RegExp(regexp);
|
|
} catch {
|
|
return I18n.t("admin.watched_words.invalid_regex", { word });
|
|
}
|
|
}
|
|
}
|
|
|
|
@discourseComputed("actionNameKey")
|
|
actionDescription(actionNameKey) {
|
|
return I18n.t(`admin.watched_words.action_descriptions.${actionNameKey}`);
|
|
}
|
|
|
|
@action
|
|
recordAdded(arg) {
|
|
const foundAction = this.findAction(this.actionNameKey);
|
|
if (!foundAction) {
|
|
return;
|
|
}
|
|
|
|
foundAction.words.unshiftObject(arg);
|
|
schedule("afterRender", () => {
|
|
// remove from other actions lists
|
|
for (const otherAction of this.adminWatchedWords.model) {
|
|
if (otherAction.nameKey === this.actionNameKey) {
|
|
continue;
|
|
}
|
|
|
|
const match = otherAction.words.findBy("id", arg.id);
|
|
if (match) {
|
|
otherAction.words.removeObject(match);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@action
|
|
recordRemoved(arg) {
|
|
this.currentAction?.words.removeObject(arg);
|
|
}
|
|
|
|
@action
|
|
async uploadComplete() {
|
|
const data = await WatchedWord.findAll();
|
|
this.adminWatchedWords.set("model", data);
|
|
}
|
|
|
|
@action
|
|
async test() {
|
|
const data = await WatchedWord.findAll();
|
|
this.adminWatchedWords.set("model", data);
|
|
this.modal.show(WatchedWordTestingModal, {
|
|
model: { watchedWord: this.currentAction },
|
|
});
|
|
}
|
|
|
|
@action
|
|
clearAll() {
|
|
const actionKey = this.actionNameKey;
|
|
this.dialog.yesNoConfirm({
|
|
message: I18n.t("admin.watched_words.clear_all_confirm", {
|
|
action: I18n.t(`admin.watched_words.actions.${actionKey}`),
|
|
}),
|
|
didConfirm: async () => {
|
|
await ajax(`/admin/customize/watched_words/action/${actionKey}.json`, {
|
|
type: "DELETE",
|
|
});
|
|
|
|
this.findAction(actionKey)?.set("words", []);
|
|
},
|
|
});
|
|
}
|
|
}
|