mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 22:43:33 +08:00
FEATURE: Filter settings by plugin (#9692)
This commit is contained in:
@ -15,12 +15,32 @@ export default Controller.extend({
|
|||||||
// If we have no content, don't bother filtering anything
|
// If we have no content, don't bother filtering anything
|
||||||
if (!!isEmpty(this.allSiteSettings)) return;
|
if (!!isEmpty(this.allSiteSettings)) return;
|
||||||
|
|
||||||
let filter;
|
let filter, pluginFilter;
|
||||||
if (this.filter) {
|
if (this.filter) {
|
||||||
filter = this.filter.toLowerCase().trim();
|
filter = this.filter
|
||||||
|
.toLowerCase()
|
||||||
|
.split(" ")
|
||||||
|
.filter(word => {
|
||||||
|
if (word.length === 0) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!filter || 0 === filter.length) && !this.onlyOverridden) {
|
if (word.startsWith("plugin:")) {
|
||||||
|
pluginFilter = word.substr("plugin:".length).trim();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
})
|
||||||
|
.join(" ")
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
(!filter || 0 === filter.length) &&
|
||||||
|
(!pluginFilter || 0 === pluginFilter.length) &&
|
||||||
|
!this.onlyOverridden
|
||||||
|
) {
|
||||||
this.set("visibleSiteSettings", this.allSiteSettings);
|
this.set("visibleSiteSettings", this.allSiteSettings);
|
||||||
if (this.categoryNameKey === "all_results") {
|
if (this.categoryNameKey === "all_results") {
|
||||||
this.transitionToRoute("adminSiteSettings");
|
this.transitionToRoute("adminSiteSettings");
|
||||||
@ -39,6 +59,7 @@ export default Controller.extend({
|
|||||||
this.allSiteSettings.forEach(settingsCategory => {
|
this.allSiteSettings.forEach(settingsCategory => {
|
||||||
const siteSettings = settingsCategory.siteSettings.filter(item => {
|
const siteSettings = settingsCategory.siteSettings.filter(item => {
|
||||||
if (this.onlyOverridden && !item.get("overridden")) return false;
|
if (this.onlyOverridden && !item.get("overridden")) return false;
|
||||||
|
if (pluginFilter && item.plugin !== pluginFilter) return false;
|
||||||
if (filter) {
|
if (filter) {
|
||||||
const setting = item.get("setting").toLowerCase();
|
const setting = item.get("setting").toLowerCase();
|
||||||
return (
|
return (
|
||||||
|
@ -9,19 +9,13 @@ export default Route.extend({
|
|||||||
const controller = this.controllerFor("adminSiteSettings");
|
const controller = this.controllerFor("adminSiteSettings");
|
||||||
this.transitionTo("adminSiteSettingsCategory", "plugins").then(() => {
|
this.transitionTo("adminSiteSettingsCategory", "plugins").then(() => {
|
||||||
if (plugin) {
|
if (plugin) {
|
||||||
const siteSettingFilter = plugin.get("enabled_setting_filter");
|
|
||||||
const match = /^(.*)_enabled/.exec(plugin.get("enabled_setting"));
|
|
||||||
const filter = siteSettingFilter || match[1];
|
|
||||||
|
|
||||||
if (filter) {
|
|
||||||
// filterContent() is normally on a debounce from typing.
|
// filterContent() is normally on a debounce from typing.
|
||||||
// Because we don't want the default of "All Results", we tell it
|
// Because we don't want the default of "All Results", we tell it
|
||||||
// to skip the next debounce.
|
// to skip the next debounce.
|
||||||
controller.set("filter", filter);
|
controller.set("filter", `plugin:${plugin.id}`);
|
||||||
controller.set("_skipBounce", true);
|
controller.set("_skipBounce", true);
|
||||||
controller.filterContentNow("plugins");
|
controller.filterContentNow("plugins");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,9 @@ class SiteSetting < ActiveRecord::Base
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.load_settings(file)
|
def self.load_settings(file, plugin: nil)
|
||||||
SiteSettings::YamlLoader.new(file).load do |category, name, default, opts|
|
SiteSettings::YamlLoader.new(file).load do |category, name, default, opts|
|
||||||
setting(name, default, opts.merge(category: category))
|
setting(name, default, opts.merge(category: category, plugin: plugin))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ class SiteSetting < ActiveRecord::Base
|
|||||||
|
|
||||||
unless Rails.env.test? && ENV['LOAD_PLUGINS'] != "1"
|
unless Rails.env.test? && ENV['LOAD_PLUGINS'] != "1"
|
||||||
Dir[File.join(Rails.root, "plugins", "*", "config", "settings.yml")].each do |file|
|
Dir[File.join(Rails.root, "plugins", "*", "config", "settings.yml")].each do |file|
|
||||||
load_settings(file)
|
load_settings(file, plugin: file.split("/")[-3])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -8,11 +8,10 @@ class AdminPluginSerializer < ApplicationSerializer
|
|||||||
:admin_route,
|
:admin_route,
|
||||||
:enabled,
|
:enabled,
|
||||||
:enabled_setting,
|
:enabled_setting,
|
||||||
:is_official,
|
:is_official
|
||||||
:enabled_setting_filter
|
|
||||||
|
|
||||||
def id
|
def id
|
||||||
object.metadata.name
|
object.directory_name
|
||||||
end
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
@ -39,14 +38,6 @@ class AdminPluginSerializer < ApplicationSerializer
|
|||||||
object.enabled_site_setting
|
object.enabled_site_setting
|
||||||
end
|
end
|
||||||
|
|
||||||
def include_enabled_setting_filter?
|
|
||||||
object.enabled_site_setting_filter.present?
|
|
||||||
end
|
|
||||||
|
|
||||||
def enabled_setting_filter
|
|
||||||
object.enabled_site_setting_filter
|
|
||||||
end
|
|
||||||
|
|
||||||
def include_url?
|
def include_url?
|
||||||
url.present?
|
url.present?
|
||||||
end
|
end
|
||||||
|
@ -801,7 +801,7 @@ module Discourse
|
|||||||
redis_key = "deprecate-notice-#{digest}"
|
redis_key = "deprecate-notice-#{digest}"
|
||||||
|
|
||||||
if !Discourse.redis.without_namespace.get(redis_key)
|
if !Discourse.redis.without_namespace.get(redis_key)
|
||||||
Rails.logger.warn(warning)
|
Rails.logger.warn(warning) if Rails.logger
|
||||||
begin
|
begin
|
||||||
Discourse.redis.without_namespace.setex(redis_key, 3600, "x")
|
Discourse.redis.without_namespace.setex(redis_key, 3600, "x")
|
||||||
rescue Redis::CommandError => e
|
rescue Redis::CommandError => e
|
||||||
|
@ -626,11 +626,7 @@ class Plugin::Instance
|
|||||||
end
|
end
|
||||||
|
|
||||||
def enabled_site_setting_filter(filter = nil)
|
def enabled_site_setting_filter(filter = nil)
|
||||||
if filter
|
Discourse.deprecate("`enabled_site_setting_filter` is deprecated", output_in_test: true)
|
||||||
@enabled_setting_filter = filter
|
|
||||||
else
|
|
||||||
@enabled_setting_filter
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def enabled_site_setting(setting = nil)
|
def enabled_site_setting(setting = nil)
|
||||||
|
@ -110,6 +110,10 @@ module SiteSettingExtension
|
|||||||
@secret_settings ||= []
|
@secret_settings ||= []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def plugins
|
||||||
|
@plugins ||= {}
|
||||||
|
end
|
||||||
|
|
||||||
def setting(name_arg, default = nil, opts = {})
|
def setting(name_arg, default = nil, opts = {})
|
||||||
name = name_arg.to_sym
|
name = name_arg.to_sym
|
||||||
|
|
||||||
@ -158,6 +162,10 @@ module SiteSettingExtension
|
|||||||
secret_settings << name
|
secret_settings << name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if opts[:plugin]
|
||||||
|
plugins[name] = opts[:plugin]
|
||||||
|
end
|
||||||
|
|
||||||
type_supervisor.load_setting(
|
type_supervisor.load_setting(
|
||||||
name,
|
name,
|
||||||
opts.extract!(*SiteSettings::TypeSupervisor::CONSUMED_OPTS)
|
opts.extract!(*SiteSettings::TypeSupervisor::CONSUMED_OPTS)
|
||||||
@ -246,6 +254,8 @@ module SiteSettingExtension
|
|||||||
placeholder: placeholder(s)
|
placeholder: placeholder(s)
|
||||||
}.merge!(type_hash)
|
}.merge!(type_hash)
|
||||||
|
|
||||||
|
opts[:plugin] = plugins[s] if plugins[s]
|
||||||
|
|
||||||
opts
|
opts
|
||||||
end.unshift(locale_setting_hash)
|
end.unshift(locale_setting_hash)
|
||||||
end
|
end
|
||||||
|
@ -502,21 +502,6 @@ describe Plugin::Instance do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#enabled_site_setting_filter' do
|
|
||||||
describe 'when filter is blank' do
|
|
||||||
it 'should return the right value' do
|
|
||||||
expect(Plugin::Instance.new.enabled_site_setting_filter).to eq(nil)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should set the right value' do
|
|
||||||
instance = Plugin::Instance.new
|
|
||||||
instance.enabled_site_setting_filter('test')
|
|
||||||
|
|
||||||
expect(instance.enabled_site_setting_filter).to eq('test')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#register_reviewable_types' do
|
describe '#register_reviewable_types' do
|
||||||
it 'Overrides the existing Reviewable types adding new ones' do
|
it 'Overrides the existing Reviewable types adding new ones' do
|
||||||
current_types = Reviewable.types
|
current_types = Reviewable.types
|
||||||
|
@ -10,7 +10,7 @@ acceptance("Admin - Site Settings", {
|
|||||||
},
|
},
|
||||||
|
|
||||||
pretend(server, helper) {
|
pretend(server, helper) {
|
||||||
server.put("/admin/site_settings/title", body => {
|
server.put("/admin/site_settings/title", (body) => {
|
||||||
titleOverride = body.requestBody.split("=")[1];
|
titleOverride = body.requestBody.split("=")[1];
|
||||||
return helper.response({ success: "OK" });
|
return helper.response({ success: "OK" });
|
||||||
});
|
});
|
||||||
@ -22,14 +22,14 @@ acceptance("Admin - Site Settings", {
|
|||||||
titleSetting.value = titleOverride;
|
titleSetting.value = titleOverride;
|
||||||
}
|
}
|
||||||
const response = {
|
const response = {
|
||||||
site_settings: [titleSetting, ...fixtures.slice(1)]
|
site_settings: [titleSetting, ...fixtures.slice(1)],
|
||||||
};
|
};
|
||||||
return helper.response(response);
|
return helper.response(response);
|
||||||
});
|
});
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test("upload site setting", async assert => {
|
QUnit.test("upload site setting", async (assert) => {
|
||||||
await visit("/admin/site_settings");
|
await visit("/admin/site_settings");
|
||||||
|
|
||||||
assert.ok(
|
assert.ok(
|
||||||
@ -40,7 +40,7 @@ QUnit.test("upload site setting", async assert => {
|
|||||||
assert.ok(exists(".row.setting.upload .undo"), "undo button is present");
|
assert.ok(exists(".row.setting.upload .undo"), "undo button is present");
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test("changing value updates dirty state", async assert => {
|
QUnit.test("changing value updates dirty state", async (assert) => {
|
||||||
await visit("/admin/site_settings");
|
await visit("/admin/site_settings");
|
||||||
await fillIn("#setting-filter", " title ");
|
await fillIn("#setting-filter", " title ");
|
||||||
assert.equal(count(".row.setting"), 1, "filter returns 1 site setting");
|
assert.equal(count(".row.setting"), 1, "filter returns 1 site setting");
|
||||||
@ -89,7 +89,7 @@ QUnit.test("changing value updates dirty state", async assert => {
|
|||||||
|
|
||||||
QUnit.test(
|
QUnit.test(
|
||||||
"always shows filtered site settings if a filter is set",
|
"always shows filtered site settings if a filter is set",
|
||||||
async assert => {
|
async (assert) => {
|
||||||
await visit("/admin/site_settings");
|
await visit("/admin/site_settings");
|
||||||
await fillIn("#setting-filter", "title");
|
await fillIn("#setting-filter", "title");
|
||||||
assert.equal(count(".row.setting"), 1);
|
assert.equal(count(".row.setting"), 1);
|
||||||
@ -103,3 +103,14 @@ QUnit.test(
|
|||||||
assert.equal(count(".row.setting"), 1);
|
assert.equal(count(".row.setting"), 1);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
QUnit.test("filter settings by plugin name", async (assert) => {
|
||||||
|
await visit("/admin/site_settings");
|
||||||
|
|
||||||
|
await fillIn("#setting-filter", "plugin:discourse-logo");
|
||||||
|
assert.equal(count(".row.setting"), 1);
|
||||||
|
|
||||||
|
// inexistent plugin
|
||||||
|
await fillIn("#setting-filter", "plugin:discourse-plugin");
|
||||||
|
assert.equal(count(".row.setting"), 0);
|
||||||
|
});
|
||||||
|
@ -9,7 +9,7 @@ export default {
|
|||||||
category: "required",
|
category: "required",
|
||||||
preview: null,
|
preview: null,
|
||||||
secret: false,
|
secret: false,
|
||||||
type: "string"
|
type: "string",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
setting: "contact_email",
|
setting: "contact_email",
|
||||||
@ -20,7 +20,7 @@ export default {
|
|||||||
category: "required",
|
category: "required",
|
||||||
preview: null,
|
preview: null,
|
||||||
secret: false,
|
secret: false,
|
||||||
type: "email"
|
type: "email",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
setting: "site_contact_username",
|
setting: "site_contact_username",
|
||||||
@ -31,7 +31,7 @@ export default {
|
|||||||
category: "required",
|
category: "required",
|
||||||
preview: null,
|
preview: null,
|
||||||
secret: false,
|
secret: false,
|
||||||
type: "username"
|
type: "username",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
setting: "logo",
|
setting: "logo",
|
||||||
@ -41,7 +41,7 @@ export default {
|
|||||||
category: "required",
|
category: "required",
|
||||||
preview: null,
|
preview: null,
|
||||||
secret: false,
|
secret: false,
|
||||||
type: "upload"
|
type: "upload",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
setting: "top_menu",
|
setting: "top_menu",
|
||||||
@ -61,13 +61,24 @@ export default {
|
|||||||
"categories",
|
"categories",
|
||||||
"read",
|
"read",
|
||||||
"posted",
|
"posted",
|
||||||
"bookmarks"
|
"bookmarks",
|
||||||
],
|
],
|
||||||
list_type: "compact"
|
list_type: "compact",
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
setting: "plugin_logo",
|
||||||
|
description: "Some plugin logo",
|
||||||
|
default: "",
|
||||||
|
value: "/some/image",
|
||||||
|
category: "required",
|
||||||
|
preview: null,
|
||||||
|
secret: false,
|
||||||
|
type: "upload",
|
||||||
|
plugin: "discourse-logo",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
diags: {
|
diags: {
|
||||||
last_message_processed: null
|
last_message_processed: null,
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user