From 78bafb331ab4e8132511915b70cf0adb5643c8d5 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Mon, 18 Mar 2024 08:50:39 +1000 Subject: [PATCH] FEATURE: Allow site settings to be edited throughout admin UI (#26154) This commit makes it so the site settings filter controls and the list of settings input editors themselves can be used elsewhere in the admin UI outside of /admin/site_settings This allows us to provide more targeted groups of settings in different UI areas where it makes sense to provide them, such as on plugin pages. You could open a single page for a plugin where you can see information about that plugin, change settings, and configure it with custom UIs in the one place. In future we will do this in "config areas" for other parts of the admin UI. --- .../admin-plugin-filtered-site-settings.gjs | 75 +++++++++ .../admin-site-settings-filter-controls.gjs | 87 ++++++++++ .../addon/components/site-settings/string.hbs | 7 +- .../admin-plugins-show-settings.js | 11 ++ .../addon/controllers/admin-site-settings.js | 158 ++---------------- .../admin/addon/models/site-setting.js | 6 +- .../routes/admin-plugins-show-settings.js | 18 ++ .../addon/templates/plugins-show-settings.hbs | 11 +- .../admin/addon/templates/site-settings.hbs | 36 +--- .../discourse/app/lib/site-setting-filter.js | 144 ++++++++++++++++ .../acceptance/admin-site-settings-test.js | 25 +++ .../discourse/tests/fixtures/site-settings.js | 1 + .../controllers/admin-site-settings-test.js | 81 --------- .../stylesheets/common/admin/plugins.scss | 14 ++ .../admin/site_settings_controller.rb | 10 +- lib/site_setting_extension.rb | 34 +++- .../spec/lib/site_setting_extension_spec.rb | 14 ++ spec/models/site_setting_spec.rb | 25 +++ spec/system/admin_site_setting_search_spec.rb | 17 ++ .../page_objects/pages/admin_settings.rb | 20 ++- 20 files changed, 532 insertions(+), 262 deletions(-) create mode 100644 app/assets/javascripts/admin/addon/components/admin-plugin-filtered-site-settings.gjs create mode 100644 app/assets/javascripts/admin/addon/components/admin-site-settings-filter-controls.gjs create mode 100644 app/assets/javascripts/admin/addon/controllers/admin-plugins-show-settings.js create mode 100644 app/assets/javascripts/admin/addon/routes/admin-plugins-show-settings.js create mode 100644 app/assets/javascripts/discourse/app/lib/site-setting-filter.js delete mode 100644 app/assets/javascripts/discourse/tests/unit/controllers/admin-site-settings-test.js create mode 100644 plugins/chat/spec/lib/site_setting_extension_spec.rb diff --git a/app/assets/javascripts/admin/addon/components/admin-plugin-filtered-site-settings.gjs b/app/assets/javascripts/admin/addon/components/admin-plugin-filtered-site-settings.gjs new file mode 100644 index 00000000000..a367e47900e --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/admin-plugin-filtered-site-settings.gjs @@ -0,0 +1,75 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { action } from "@ember/object"; +import { cancel } from "@ember/runloop"; +import { inject as service } from "@ember/service"; +import { isEmpty } from "@ember/utils"; +import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; +import SiteSettingFilter from "discourse/lib/site-setting-filter"; +import i18n from "discourse-common/helpers/i18n"; +import discourseDebounce from "discourse-common/lib/debounce"; +import AdminSiteSettingsFilterControls from "admin/components/admin-site-settings-filter-controls"; +import SiteSetting from "admin/components/site-setting"; + +export default class AdminPluginFilteredSiteSettings extends Component { + @service currentUser; + @tracked visibleSettings; + @tracked loading = true; + + siteSettingFilter = new SiteSettingFilter(this.args.settings); + + constructor() { + super(...arguments); + this.filterChanged({ filter: "", onlyOverridden: false }); + } + + filterSettings(filterData) { + this.args.onFilterChanged(filterData); + this.visibleSettings = this.siteSettingFilter.filterSettings( + filterData.filter, + { + includeAllCategory: false, + onlyOverridden: filterData.onlyOverridden, + } + )[0]?.siteSettings; + this.loading = false; + } + + @action + filterChanged(filterData) { + this._debouncedOnChangeFilter(filterData); + } + + get noResults() { + return isEmpty(this.visibleSettings) && !this.loading; + } + + _debouncedOnChangeFilter(filterData) { + cancel(this.onChangeFilterHandler); + this.onChangeFilterHandler = discourseDebounce( + this, + this.filterSettings, + filterData, + 100 + ); + } + + +} diff --git a/app/assets/javascripts/admin/addon/components/admin-site-settings-filter-controls.gjs b/app/assets/javascripts/admin/addon/components/admin-site-settings-filter-controls.gjs new file mode 100644 index 00000000000..cab0c72738d --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/admin-site-settings-filter-controls.gjs @@ -0,0 +1,87 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { Input } from "@ember/component"; +import { on } from "@ember/modifier"; +import { action } from "@ember/object"; +import didInsert from "@ember/render-modifiers/modifiers/did-insert"; +import DButton from "discourse/components/d-button"; +import TextField from "discourse/components/text-field"; +import i18n from "discourse-common/helpers/i18n"; + +export default class AdminSiteSettingsFilterControls extends Component { + @tracked filter = this.args.initialFilter || ""; + @tracked onlyOverridden = false; + + @action + clearFilter() { + this.filter = ""; + this.onlyOverridden = false; + this.onChangeFilter(); + } + + @action + onChangeFilter() { + this.args.onChangeFilter({ + filter: this.filter, + onlyOverridden: this.onlyOverridden, + }); + } + + @action + onToggleOverridden(event) { + this.onlyOverridden = event.target.checked; + this.onChangeFilter(); + } + + @action + runInitialFilter() { + this.onChangeFilter(); + } + + +} diff --git a/app/assets/javascripts/admin/addon/components/site-settings/string.hbs b/app/assets/javascripts/admin/addon/components/site-settings/string.hbs index 4a9a4f9985f..d9ac8d61cc6 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/string.hbs +++ b/app/assets/javascripts/admin/addon/components/site-settings/string.hbs @@ -1,7 +1,12 @@ {{#if this.setting.textarea}}