DEV: allow the plugin to register valid site setting areas (#29432)

In this PR, we defined the ability to group site settings by area - https://github.com/discourse/discourse/pull/28570

Plugins should be able to register in their own areas.
This commit is contained in:
Krzysztof Kotlarek 2024-10-29 09:40:31 +11:00 committed by GitHub
parent 4529b0614c
commit 0839bce7b6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 27 additions and 3 deletions

View File

@ -12,7 +12,7 @@ class Admin::Config::SiteSettingsController < Admin::AdminController
# UI itself uses the Admin::SiteSettingsController#index endpoint, # UI itself uses the Admin::SiteSettingsController#index endpoint,
# which also supports a `category` and `plugin` filter. # which also supports a `category` and `plugin` filter.
def index def index
if params[:filter_names].blank? && SiteSetting::VALID_AREAS.exclude?(params[:filter_area]) if params[:filter_names].blank? && SiteSetting.valid_areas.exclude?(params[:filter_area])
raise Discourse::InvalidParameters raise Discourse::InvalidParameters
end end

View File

@ -72,6 +72,7 @@ class DiscoursePluginRegistry
define_register :demon_processes, Set define_register :demon_processes, Set
define_register :groups_callback_for_users_search_controller_action, Hash define_register :groups_callback_for_users_search_controller_action, Hash
define_register :mail_pollers, Set define_register :mail_pollers, Set
define_register :site_setting_areas, Set
define_filtered_register :staff_user_custom_fields define_filtered_register :staff_user_custom_fields
define_filtered_register :public_user_custom_fields define_filtered_register :public_user_custom_fields

View File

@ -849,6 +849,14 @@ class Plugin::Instance
end end
end end
# Site setting areas are a way to group site settings below
# the setting category level. This is useful for creating focused
# config areas that update a small selection of settings, and otherwise
# grouping related settings in the UI.
def register_site_setting_area(area)
DiscoursePluginRegistry.site_setting_areas << area
end
def javascript_includes def javascript_includes
assets assets
.map do |asset, opts| .map do |asset, opts|

View File

@ -523,6 +523,10 @@ module SiteSettingExtension
end end
end end
def valid_areas
Set.new(SiteSetting::VALID_AREAS | DiscoursePluginRegistry.site_setting_areas.to_a)
end
protected protected
def clear_cache! def clear_cache!
@ -695,9 +699,9 @@ module SiteSettingExtension
if opts[:area] if opts[:area]
split_areas = opts[:area].split("|") split_areas = opts[:area].split("|")
if split_areas.any? { |area| !SiteSetting::VALID_AREAS.include?(area) } if split_areas.any? { |area| !SiteSetting.valid_areas.include?(area) }
raise Discourse::InvalidParameters.new( raise Discourse::InvalidParameters.new(
"Area is incorrect. Valid areas: #{SiteSetting::VALID_AREAS.join(", ")}", "Area is invalid, valid areas are: #{SiteSetting.valid_areas.join(", ")}",
) )
end end
areas[name] = split_areas areas[name] = split_areas

View File

@ -510,6 +510,17 @@ RSpec.describe SiteSettingExtension do
settings.refresh! settings.refresh!
}.to raise_error(Discourse::InvalidParameters) }.to raise_error(Discourse::InvalidParameters)
end end
it "allows plugin to register valid areas" do
plugin = Plugin::Instance.new nil, "/tmp/test.rb"
plugin.register_site_setting_area("plugin_area")
settings.setting(:test_plugin_setting, 88, area: "plugin_area")
expect(
settings
.all_settings(filter_area: "plugin_area", include_locale_setting: false)
.map { |s| s[:setting].to_sym },
).to eq(%i[test_plugin_setting])
end
end end
describe "setting with a validator" do describe "setting with a validator" do