mirror of
https://github.com/discourse/discourse.git
synced 2024-12-14 09:23:39 +08:00
e63e193a0a
We have been struggling lately finding site settings due to 30 setting limit This was introduced for performance reasons a while back but is no longer as needed given that ember is faster. Additionally searching is hard, so allow people to use fuzzy search against setting name.
176 lines
4.5 KiB
JavaScript
176 lines
4.5 KiB
JavaScript
import { alias } from "@ember/object/computed";
|
|
import Controller from "@ember/controller";
|
|
import I18n from "I18n";
|
|
import { INPUT_DELAY } from "discourse-common/config/environment";
|
|
import { isEmpty } from "@ember/utils";
|
|
import { debounce } from "discourse-common/utils/decorators";
|
|
import { observes } from "@ember-decorators/object";
|
|
import { action } from "@ember/object";
|
|
|
|
export default class AdminSiteSettingsController extends Controller {
|
|
filter = null;
|
|
|
|
@alias("model") allSiteSettings;
|
|
|
|
visibleSiteSettings = null;
|
|
onlyOverridden = false;
|
|
|
|
get maxResults() {
|
|
return 100;
|
|
}
|
|
|
|
performSearch(filter, allSiteSettings, onlyOverridden) {
|
|
let pluginFilter;
|
|
|
|
if (filter) {
|
|
filter = filter
|
|
.toLowerCase()
|
|
.split(" ")
|
|
.filter((word) => {
|
|
if (word.length === 0) {
|
|
return false;
|
|
}
|
|
|
|
if (word.startsWith("plugin:")) {
|
|
pluginFilter = word.slice("plugin:".length).trim();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
})
|
|
.join(" ")
|
|
.trim();
|
|
}
|
|
|
|
const all = {
|
|
nameKey: "all_results",
|
|
name: I18n.t("admin.site_settings.categories.all_results"),
|
|
siteSettings: [],
|
|
};
|
|
|
|
const matchesGroupedByCategory = [all];
|
|
const matches = [];
|
|
|
|
const strippedQuery = filter.replace(/[^a-z0-9]/gi, "");
|
|
let fuzzyRegex;
|
|
|
|
if (strippedQuery.length > 2) {
|
|
fuzzyRegex = new RegExp(strippedQuery.split("").join(".*"), "i");
|
|
}
|
|
|
|
allSiteSettings.forEach((settingsCategory) => {
|
|
let fuzzyMatches = [];
|
|
|
|
const siteSettings = settingsCategory.siteSettings.filter((item) => {
|
|
if (onlyOverridden && !item.get("overridden")) {
|
|
return false;
|
|
}
|
|
if (pluginFilter && item.plugin !== pluginFilter) {
|
|
return false;
|
|
}
|
|
if (filter) {
|
|
const setting = item.get("setting").toLowerCase();
|
|
let filterResult =
|
|
setting.includes(filter) ||
|
|
setting.replace(/_/g, " ").includes(filter) ||
|
|
item.get("description").toLowerCase().includes(filter) ||
|
|
(item.get("value") || "").toString().toLowerCase().includes(filter);
|
|
if (!filterResult && fuzzyRegex && fuzzyRegex.test(setting)) {
|
|
fuzzyMatches.push(item);
|
|
}
|
|
return filterResult;
|
|
} else {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
if (fuzzyMatches.length > 0) {
|
|
siteSettings.pushObjects(fuzzyMatches);
|
|
}
|
|
|
|
if (siteSettings.length > 0) {
|
|
matches.pushObjects(siteSettings);
|
|
matchesGroupedByCategory.pushObject({
|
|
nameKey: settingsCategory.nameKey,
|
|
name: I18n.t(
|
|
"admin.site_settings.categories." + settingsCategory.nameKey
|
|
),
|
|
siteSettings,
|
|
count: siteSettings.length,
|
|
});
|
|
}
|
|
});
|
|
|
|
all.siteSettings.pushObjects(matches.slice(0, this.maxResults));
|
|
all.hasMore = matches.length > this.maxResults;
|
|
all.count = all.hasMore ? `${this.maxResults}+` : matches.length;
|
|
all.maxResults = this.maxResults;
|
|
|
|
return matchesGroupedByCategory;
|
|
}
|
|
|
|
filterContentNow(category) {
|
|
if (isEmpty(this.allSiteSettings)) {
|
|
return;
|
|
}
|
|
|
|
if (isEmpty(this.filter) && !this.onlyOverridden) {
|
|
this.set("visibleSiteSettings", this.allSiteSettings);
|
|
if (this.categoryNameKey === "all_results") {
|
|
this.transitionToRoute("adminSiteSettings");
|
|
}
|
|
return;
|
|
}
|
|
|
|
const matchesGroupedByCategory = this.performSearch(
|
|
this.filter,
|
|
this.allSiteSettings,
|
|
this.onlyOverridden
|
|
);
|
|
|
|
const categoryMatches = matchesGroupedByCategory.findBy(
|
|
"nameKey",
|
|
category
|
|
);
|
|
|
|
if (!categoryMatches || categoryMatches.count === 0) {
|
|
category = "all_results";
|
|
}
|
|
|
|
this.set("visibleSiteSettings", matchesGroupedByCategory);
|
|
this.transitionToRoute(
|
|
"adminSiteSettingsCategory",
|
|
category || "all_results"
|
|
);
|
|
}
|
|
|
|
@observes("filter", "onlyOverridden", "model")
|
|
optsChanged() {
|
|
this.filterContent();
|
|
}
|
|
|
|
@debounce(INPUT_DELAY)
|
|
filterContent() {
|
|
if (this._skipBounce) {
|
|
this.set("_skipBounce", false);
|
|
} else {
|
|
if (!this.isDestroyed) {
|
|
this.filterContentNow(this.categoryNameKey);
|
|
}
|
|
}
|
|
}
|
|
|
|
@action
|
|
clearFilter() {
|
|
this.setProperties({ filter: "", onlyOverridden: false });
|
|
}
|
|
|
|
@action
|
|
toggleMenu() {
|
|
const adminDetail = document.querySelector(".admin-detail");
|
|
["mobile-closed", "mobile-open"].forEach((state) => {
|
|
adminDetail.classList.toggle(state);
|
|
});
|
|
}
|
|
}
|