From fdb6634fa9fc787df683e50b7642dc6f115765dd Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Thu, 19 Dec 2024 10:40:34 +1100 Subject: [PATCH] FEATURE: settings tab for permalinks (#30192) Setting tab should be added to permalinks so admins do not need to have left `/permalinks`. A new component called `AreaSetting` was added to avoid duplications and simplify adding settings to other sections. --- .../addon/components/admin-area-settings.gjs | 69 +++++ .../admin-config-areas/emojis-settings.gjs | 54 ---- .../admin-config-areas/flags-settings.gjs | 54 ---- .../controllers/admin-area-settings-base.js | 13 + .../controllers/admin-backups-settings.js | 12 +- .../admin-config-flags-settings.js | 13 +- .../controllers/admin-emojis-settings.js | 13 +- .../controllers/admin-permalinks-settings.js | 3 + .../admin-plugins-show-settings.js | 12 +- .../addon/routes/admin-backups-settings.js | 12 - .../addon/routes/admin-emojis-settings.js | 4 - .../routes/admin-plugins-show-settings.js | 2 - .../admin/addon/routes/admin-route-map.js | 2 + .../addon/templates/backups-settings.hbs | 15 +- .../addon/templates/config-flags-settings.hbs | 9 +- .../admin/addon/templates/emojis-settings.hbs | 8 +- .../addon/templates/permalinks-index.hbs | 246 ++++++++---------- .../addon/templates/permalinks-settings.hbs | 6 + .../admin/addon/templates/permalinks.hbs | 39 +++ .../addon/templates/plugins-show-settings.hbs | 15 +- .../components/admin-area-settings-test.gjs | 83 ++++++ .../stylesheets/common/admin/admin_base.scss | 14 - .../common/admin/admin_filter.scss | 14 +- .../stylesheets/common/admin/customize.scss | 7 +- .../admin/config/site_settings_controller.rb | 5 +- app/models/site_setting.rb | 2 +- config/locales/client.en.yml | 4 + config/site_settings.yml | 1 + spec/system/admin_permalinks_page_spec.rb | 6 + .../page_objects/pages/admin_permalinks.rb | 9 + 30 files changed, 396 insertions(+), 350 deletions(-) create mode 100644 app/assets/javascripts/admin/addon/components/admin-area-settings.gjs delete mode 100644 app/assets/javascripts/admin/addon/components/admin-config-areas/emojis-settings.gjs delete mode 100644 app/assets/javascripts/admin/addon/components/admin-config-areas/flags-settings.gjs create mode 100644 app/assets/javascripts/admin/addon/controllers/admin-area-settings-base.js create mode 100644 app/assets/javascripts/admin/addon/controllers/admin-permalinks-settings.js create mode 100644 app/assets/javascripts/admin/addon/templates/permalinks-settings.hbs create mode 100644 app/assets/javascripts/admin/addon/templates/permalinks.hbs create mode 100644 app/assets/javascripts/discourse/tests/integration/components/admin-area-settings-test.gjs diff --git a/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs b/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs new file mode 100644 index 00000000000..ae186024636 --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs @@ -0,0 +1,69 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { action } from "@ember/object"; +import { service } from "@ember/service"; +import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item"; +import { ajax } from "discourse/lib/ajax"; +import { bind } from "discourse-common/utils/decorators"; +import { i18n } from "discourse-i18n"; +import AdminConfigAreaEmptyList from "admin/components/admin-config-area-empty-list"; +import AdminFilteredSiteSettings from "admin/components/admin-filtered-site-settings"; +import SiteSetting from "admin/models/site-setting"; + +export default class AdminAreaSettings extends Component { + @service siteSettings; + @service router; + @tracked settings = []; + @tracked filter = ""; + + constructor() { + super(...arguments); + this.#loadSettings(); + } + + @bind + async #loadSettings() { + this.filter = this.args.filter; + const result = await ajax("/admin/config/site_settings.json", { + data: { + filter_area: this.args.area, + plugin: this.args.plugin, + categories: this.args.categories, + }, + }); + this.settings = [ + { + name: "All", + nameKey: "all_results", + siteSettings: result.site_settings.map((setting) => + SiteSetting.create(setting) + ), + }, + ]; + } + + @action + adminSettingsFilterChangedCallback(filterData) { + this.args.adminSettingsFilterChangedCallback(filterData.filter); + } + + +} diff --git a/app/assets/javascripts/admin/addon/components/admin-config-areas/emojis-settings.gjs b/app/assets/javascripts/admin/addon/components/admin-config-areas/emojis-settings.gjs deleted file mode 100644 index e500cd7ccae..00000000000 --- a/app/assets/javascripts/admin/addon/components/admin-config-areas/emojis-settings.gjs +++ /dev/null @@ -1,54 +0,0 @@ -import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import didInsert from "@ember/render-modifiers/modifiers/did-insert"; -import { service } from "@ember/service"; -import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item"; -import { ajax } from "discourse/lib/ajax"; -import { bind } from "discourse-common/utils/decorators"; -import { i18n } from "discourse-i18n"; -import AdminFilteredSiteSettings from "admin/components/admin-filtered-site-settings"; -import SiteSetting from "admin/models/site-setting"; - -export default class AdminConfigAreasEmojisSettings extends Component { - @service siteSettings; - @tracked settings; - - @bind - loadSettings() { - ajax("/admin/config/site_settings.json", { - data: { - filter_area: "emojis", - }, - }).then((result) => { - this.settings = [ - { - name: "All", - nameKey: "all_results", - siteSettings: result.site_settings.map((setting) => - SiteSetting.create(setting) - ), - }, - ]; - }); - } - - -} diff --git a/app/assets/javascripts/admin/addon/components/admin-config-areas/flags-settings.gjs b/app/assets/javascripts/admin/addon/components/admin-config-areas/flags-settings.gjs deleted file mode 100644 index 72ffe975c08..00000000000 --- a/app/assets/javascripts/admin/addon/components/admin-config-areas/flags-settings.gjs +++ /dev/null @@ -1,54 +0,0 @@ -import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import didInsert from "@ember/render-modifiers/modifiers/did-insert"; -import { service } from "@ember/service"; -import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item"; -import { ajax } from "discourse/lib/ajax"; -import { bind } from "discourse-common/utils/decorators"; -import { i18n } from "discourse-i18n"; -import AdminFilteredSiteSettings from "admin/components/admin-filtered-site-settings"; -import SiteSetting from "admin/models/site-setting"; - -export default class AdminConfigAreasFlagsSettings extends Component { - @service siteSettings; - @tracked settings; - - @bind - loadSettings() { - ajax("/admin/config/site_settings.json", { - data: { - filter_area: "flags", - }, - }).then((result) => { - this.settings = [ - { - name: "All", - nameKey: "all_results", - siteSettings: result.site_settings.map((setting) => - SiteSetting.create(setting) - ), - }, - ]; - }); - } - - -} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-area-settings-base.js b/app/assets/javascripts/admin/addon/controllers/admin-area-settings-base.js new file mode 100644 index 00000000000..02a46aab054 --- /dev/null +++ b/app/assets/javascripts/admin/addon/controllers/admin-area-settings-base.js @@ -0,0 +1,13 @@ +import { tracked } from "@glimmer/tracking"; +import Controller from "@ember/controller"; +import { action } from "@ember/object"; + +export default class AdminAreaSettingsBaseController extends Controller { + @tracked filter = ""; + queryParams = ["filter"]; + + @action + adminSettingsFilterChangedCallback(filter) { + this.filter = filter; + } +} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-backups-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-backups-settings.js index dbf604a8b39..8fe3473ef2b 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-backups-settings.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-backups-settings.js @@ -1,11 +1,3 @@ -import Controller from "@ember/controller"; -import { action } from "@ember/object"; +import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base"; -export default class AdminBackupsSettingsController extends Controller { - filter = ""; - - @action - filterChanged(filterData) { - this.set("filter", filterData.filter); - } -} +export default class AdminBackupsSettingsController extends AdminAreaSettingsBaseController {} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-config-flags-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-config-flags-settings.js index 99ca29e0cda..00a064e4e2e 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-config-flags-settings.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-config-flags-settings.js @@ -1,12 +1,3 @@ -import Controller from "@ember/controller"; -import { action } from "@ember/object"; +import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base"; -export default class AdminConfigFlagsSettingsController extends Controller { - filter = ""; - queryParams = ["filter"]; - - @action - filterChangedCallback(filterData) { - this.set("filter", filterData.filter); - } -} +export default class AdminConfigFlagsSettingsController extends AdminAreaSettingsBaseController {} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-emojis-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-emojis-settings.js index def9210357c..889dfaf82c2 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-emojis-settings.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-emojis-settings.js @@ -1,12 +1,3 @@ -import Controller from "@ember/controller"; -import { action } from "@ember/object"; +import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base"; -export default class AdminEmojisSettingsController extends Controller { - filter = ""; - queryParams = ["filter"]; - - @action - filterChangedCallback(filterData) { - this.set("filter", filterData.filter); - } -} +export default class AdminEmojisSettingsController extends AdminAreaSettingsBaseController {} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-permalinks-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-permalinks-settings.js new file mode 100644 index 00000000000..812357f94d9 --- /dev/null +++ b/app/assets/javascripts/admin/addon/controllers/admin-permalinks-settings.js @@ -0,0 +1,3 @@ +import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base"; + +export default class AdminPermalinksSettingsController extends AdminAreaSettingsBaseController {} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-plugins-show-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-plugins-show-settings.js index bf58e735b88..585ef559e85 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-plugins-show-settings.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-plugins-show-settings.js @@ -1,11 +1,3 @@ -import Controller from "@ember/controller"; -import { action } from "@ember/object"; +import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base"; -export default class AdminPluginsShowSettingsController extends Controller { - filter = ""; - - @action - filterChanged(filterData) { - this.set("filter", filterData.filter); - } -} +export default class AdminPluginsShowSettingsController extends AdminAreaSettingsBaseController {} diff --git a/app/assets/javascripts/admin/addon/routes/admin-backups-settings.js b/app/assets/javascripts/admin/addon/routes/admin-backups-settings.js index 55ba1d7e662..0acbcb1f901 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-backups-settings.js +++ b/app/assets/javascripts/admin/addon/routes/admin-backups-settings.js @@ -1,20 +1,8 @@ import DiscourseRoute from "discourse/routes/discourse"; import { i18n } from "discourse-i18n"; -import SiteSetting from "admin/models/site-setting"; export default class AdminBackupsSettingsRoute extends DiscourseRoute { - queryParams = { - filter: { replace: true }, - }; - titleToken() { return i18n("admin.backups.settings"); } - - async model(params) { - return { - settings: await SiteSetting.findAll({ categories: ["backups"] }), - initialFilter: params.filter, - }; - } } diff --git a/app/assets/javascripts/admin/addon/routes/admin-emojis-settings.js b/app/assets/javascripts/admin/addon/routes/admin-emojis-settings.js index 2512960d9b4..c222abddad6 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-emojis-settings.js +++ b/app/assets/javascripts/admin/addon/routes/admin-emojis-settings.js @@ -2,10 +2,6 @@ import DiscourseRoute from "discourse/routes/discourse"; import { i18n } from "discourse-i18n"; export default class AdminEmojisSettingsRoute extends DiscourseRoute { - queryParams = { - filter: { replace: true }, - }; - titleToken() { return i18n("settings"); } diff --git a/app/assets/javascripts/admin/addon/routes/admin-plugins-show-settings.js b/app/assets/javascripts/admin/addon/routes/admin-plugins-show-settings.js index 686a1b344e6..b1c762edc93 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-plugins-show-settings.js +++ b/app/assets/javascripts/admin/addon/routes/admin-plugins-show-settings.js @@ -1,7 +1,6 @@ import { service } from "@ember/service"; import DiscourseRoute from "discourse/routes/discourse"; import { i18n } from "discourse-i18n"; -import SiteSetting from "admin/models/site-setting"; export default class AdminPluginsShowSettingsRoute extends DiscourseRoute { @service router; @@ -14,7 +13,6 @@ export default class AdminPluginsShowSettingsRoute extends DiscourseRoute { const plugin = this.modelFor("adminPlugins.show"); return { plugin, - settings: await SiteSetting.findAll({ plugin: plugin.name }), initialFilter: params.filter, }; } diff --git a/app/assets/javascripts/admin/addon/routes/admin-route-map.js b/app/assets/javascripts/admin/addon/routes/admin-route-map.js index 30af0d6a217..96a36e604b2 100644 --- a/app/assets/javascripts/admin/addon/routes/admin-route-map.js +++ b/app/assets/javascripts/admin/addon/routes/admin-route-map.js @@ -91,6 +91,8 @@ export default function () { { path: "/permalinks", resetNamespace: true }, function () { this.route("new"); + this.route("index", { path: "/" }); + this.route("settings"); this.route("edit", { path: "/:permalink_id" }); } ); diff --git a/app/assets/javascripts/admin/addon/templates/backups-settings.hbs b/app/assets/javascripts/admin/addon/templates/backups-settings.hbs index 74fd8bc999c..72d8a08ed0b 100644 --- a/app/assets/javascripts/admin/addon/templates/backups-settings.hbs +++ b/app/assets/javascripts/admin/addon/templates/backups-settings.hbs @@ -1,9 +1,6 @@ - - -
- -
\ No newline at end of file + \ No newline at end of file diff --git a/app/assets/javascripts/admin/addon/templates/config-flags-settings.hbs b/app/assets/javascripts/admin/addon/templates/config-flags-settings.hbs index 57d321fcbcc..3e3e14722fa 100644 --- a/app/assets/javascripts/admin/addon/templates/config-flags-settings.hbs +++ b/app/assets/javascripts/admin/addon/templates/config-flags-settings.hbs @@ -1,5 +1,6 @@ - \ No newline at end of file diff --git a/app/assets/javascripts/admin/addon/templates/emojis-settings.hbs b/app/assets/javascripts/admin/addon/templates/emojis-settings.hbs index 40a5a39471d..9947f71a677 100644 --- a/app/assets/javascripts/admin/addon/templates/emojis-settings.hbs +++ b/app/assets/javascripts/admin/addon/templates/emojis-settings.hbs @@ -1,4 +1,6 @@ - \ No newline at end of file diff --git a/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs b/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs index 5676ac234bd..31e9d14a423 100644 --- a/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs +++ b/app/assets/javascripts/admin/addon/templates/permalinks-index.hbs @@ -1,138 +1,112 @@ -