diff --git a/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs b/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs
index ae186024636..65cd42794bc 100644
--- a/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs
+++ b/app/assets/javascripts/admin/addon/components/admin-area-settings.gjs
@@ -2,6 +2,7 @@ import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import { service } from "@ember/service";
+import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner";
import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
import { ajax } from "discourse/lib/ajax";
import { bind } from "discourse-common/utils/decorators";
@@ -15,31 +16,44 @@ export default class AdminAreaSettings extends Component {
@service router;
@tracked settings = [];
@tracked filter = "";
+ @tracked loading = false;
constructor() {
super(...arguments);
this.#loadSettings();
}
+ get showSettings() {
+ return !this.loading && this.settings.length > 0;
+ }
+
@bind
async #loadSettings() {
+ this.loading = true;
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)
- ),
- },
- ];
+ try {
+ 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)
+ ),
+ },
+ ];
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.warn(`Failed to load settings with error: ${error}`);
+ } finally {
+ this.loading = false;
+ }
}
@action
@@ -53,16 +67,18 @@ export default class AdminAreaSettings extends Component {
- {{#if this.settings}}
+ {{#if this.showSettings}}
{{else}}
-
+
+
+
{{/if}}
diff --git a/app/assets/javascripts/admin/addon/controllers/admin-config-files-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-config-files-settings.js
new file mode 100644
index 00000000000..16caec16269
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/controllers/admin-config-files-settings.js
@@ -0,0 +1,3 @@
+import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base";
+
+export default class AdminConfigFilesSettingsController extends AdminAreaSettingsBaseController {}
diff --git a/app/assets/javascripts/admin/addon/controllers/admin-config-other-settings.js b/app/assets/javascripts/admin/addon/controllers/admin-config-other-settings.js
new file mode 100644
index 00000000000..85b4686f3b1
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/controllers/admin-config-other-settings.js
@@ -0,0 +1,3 @@
+import AdminAreaSettingsBaseController from "admin/controllers/admin-area-settings-base";
+
+export default class AdminConfigOtherSettingsController extends AdminAreaSettingsBaseController {}
diff --git a/app/assets/javascripts/admin/addon/routes/admin-config-files.js b/app/assets/javascripts/admin/addon/routes/admin-config-files.js
new file mode 100644
index 00000000000..a920aa9f6ec
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/routes/admin-config-files.js
@@ -0,0 +1,8 @@
+import DiscourseRoute from "discourse/routes/discourse";
+import { i18n } from "discourse-i18n";
+
+export default class AdminConfigFilesRoute extends DiscourseRoute {
+ titleToken() {
+ return i18n("admin.advanced.sidebar_link.files");
+ }
+}
diff --git a/app/assets/javascripts/admin/addon/routes/admin-config-other.js b/app/assets/javascripts/admin/addon/routes/admin-config-other.js
new file mode 100644
index 00000000000..7f16e2e3e67
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/routes/admin-config-other.js
@@ -0,0 +1,8 @@
+import DiscourseRoute from "discourse/routes/discourse";
+import { i18n } from "discourse-i18n";
+
+export default class AdminConfigOtherRoute extends DiscourseRoute {
+ titleToken() {
+ return i18n("admin.advanced.sidebar_link.other_options");
+ }
+}
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 43b95204ad9..60c95bc5659 100644
--- a/app/assets/javascripts/admin/addon/routes/admin-route-map.js
+++ b/app/assets/javascripts/admin/addon/routes/admin-route-map.js
@@ -246,6 +246,16 @@ export default function () {
path: "/",
});
});
+ this.route("other", function () {
+ this.route("settings", {
+ path: "/",
+ });
+ });
+ this.route("files", function () {
+ this.route("settings", {
+ path: "/",
+ });
+ });
this.route(
"groupPermissions",
{ path: "/group-permissions" },
diff --git a/app/assets/javascripts/admin/addon/templates/config-files-settings.gjs b/app/assets/javascripts/admin/addon/templates/config-files-settings.gjs
new file mode 100644
index 00000000000..04dc8796d1c
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/templates/config-files-settings.gjs
@@ -0,0 +1,29 @@
+import RouteTemplate from "ember-route-template";
+import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
+import DPageHeader from "discourse/components/d-page-header";
+import { i18n } from "discourse-i18n";
+import AdminAreaSettings from "admin/components/admin-area-settings";
+
+export default RouteTemplate(
+
+ <:breadcrumbs>
+
+
+
+
+
+
+);
diff --git a/app/assets/javascripts/admin/addon/templates/config-other-settings.gjs b/app/assets/javascripts/admin/addon/templates/config-other-settings.gjs
new file mode 100644
index 00000000000..a7829954099
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/templates/config-other-settings.gjs
@@ -0,0 +1,29 @@
+import RouteTemplate from "ember-route-template";
+import DBreadcrumbsItem from "discourse/components/d-breadcrumbs-item";
+import DPageHeader from "discourse/components/d-page-header";
+import { i18n } from "discourse-i18n";
+import AdminAreaSettings from "admin/components/admin-area-settings";
+
+export default RouteTemplate(
+
+ <:breadcrumbs>
+
+
+
+
+
+
+);
diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js b/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js
index d96b94ba8ad..1de4d62f52b 100644
--- a/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js
+++ b/app/assets/javascripts/discourse/app/lib/sidebar/admin-nav-map.js
@@ -256,17 +256,13 @@ export const ADMIN_NAV_MAP = [
},
{
name: "admin_files",
- route: "adminSiteSettingsCategory",
- routeModels: ["files"],
- query: { filter: "" },
+ route: "adminConfig.files.settings",
label: "admin.advanced.sidebar_link.files",
icon: "file",
},
{
name: "admin_other_options",
- route: "adminSiteSettingsCategory",
- routeModels: ["uncategorized"],
- query: { filter: "" },
+ route: "adminConfig.other.settings",
label: "admin.advanced.sidebar_link.other_options",
icon: "discourse-other-tab",
},
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 88b3a0993e7..96f003853ae 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -5143,6 +5143,9 @@ en:
font_style:
title: "Font style"
header_description: "Customize the font styles used by your themes"
+ files:
+ title: "Files"
+ header_description: "Settings that control file size and type limits, avatar sizes and sources, file storage, image quality and compression, and more"
legal:
title: "Legal"
header_description: "Configure legal settings, such as terms of service, privacy policy, contact details, and EU-specific considerations"
@@ -5161,6 +5164,9 @@ en:
onebox:
title: "Onebox"
header_description: "Configure how onebox previews are generated and displayed for your site"
+ other:
+ title: "Other"
+ header_description: "Settings which do not fit into any other category"
rate_limits:
title: "Rate limits"
header_description: "Configure how often users can perform certain actions, such as creating topics, sending messages, and posting replies"
diff --git a/config/routes.rb b/config/routes.rb
index 16d9f5fc8b0..b9178f85dce 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -395,6 +395,7 @@ Discourse::Application.routes.draw do
get "developer" => "site_settings#index"
get "fonts" => "site_settings#index"
+ get "files" => "site_settings#index"
get "legal" => "site_settings#index"
get "login-and-authentication" => "site_settings#index"
get "logo" => "site_settings#index"
@@ -402,6 +403,7 @@ Discourse::Application.routes.draw do
get "notifications" => "site_settings#index"
get "rate-limits" => "site_settings#index"
get "onebox" => "site_settings#index"
+ get "other" => "site_settings#index"
get "search" => "site_settings#index"
get "security" => "site_settings#index"
get "spam" => "site_settings#index"