diff --git a/AI-AGENTS.md b/AI-AGENTS.md index b5248b3e398..bda2eafdd1a 100644 --- a/AI-AGENTS.md +++ b/AI-AGENTS.md @@ -30,9 +30,10 @@ Discourse is large with long history. Understand context before changes. - Members: specify `@type` ## Testing +- Do not write unnecessary comments in tests, every single assertion doesn't need a comment - Don't test functionality handled by other classes/components - Don't write obvious tests -- Ruby: use `fab!()` over `let()`, system tests for UI (`spec/system`), page objects (`spec/system/page_objects`) +- Ruby: use `fab!()` over `let()`, system tests for UI (`spec/system`), use page objects for system spec finders (`spec/system/page_objects`) ### Commands ```bash diff --git a/app/assets/javascripts/admin/addon/components/site-setting.gjs b/app/assets/javascripts/admin/addon/components/site-setting.gjs index 98a1df33042..b42505d72aa 100644 --- a/app/assets/javascripts/admin/addon/components/site-setting.gjs +++ b/app/assets/javascripts/admin/addon/components/site-setting.gjs @@ -12,9 +12,11 @@ import { isNone } from "@ember/utils"; import { and } from "truth-helpers"; import DButton from "discourse/components/d-button"; import JsonSchemaEditorModal from "discourse/components/modal/json-schema-editor"; +import basePath from "discourse/helpers/base-path"; import icon from "discourse/helpers/d-icon"; import { bind } from "discourse/lib/decorators"; import { deepEqual } from "discourse/lib/object"; +import { sanitize } from "discourse/lib/text"; import { splitString } from "discourse/lib/utilities"; import { i18n } from "discourse-i18n"; import SettingValidationMessage from "admin/components/setting-validation-message"; @@ -55,6 +57,7 @@ export default class SiteSettingComponent extends Component { @service router; @service siteSettingChangeTracker; @service messageBus; + @service site; @tracked isSecret = null; @tracked status = null; @@ -92,6 +95,10 @@ export default class SiteSettingComponent extends Component { ); } + get defaultTheme() { + return this.site.user_themes.find((theme) => theme.default); + } + @bind async onMessage(membership) { this.status = membership.status; @@ -131,6 +138,20 @@ export default class SiteSettingComponent extends Component { return this.componentType !== "bool"; } + get showThemeSiteSettingWarning() { + return this.setting.themeable; + } + + get themeSiteSettingWarningText() { + return htmlSafe( + i18n("admin.theme_site_settings.site_setting_warning", { + basePath, + defaultThemeName: sanitize(this.defaultTheme.name), + defaultThemeId: this.defaultTheme.theme_id, + }) + ); + } + get dirty() { let bufferVal = this.buffered.get("value"); let settingVal = this.setting?.value; @@ -266,6 +287,10 @@ export default class SiteSettingComponent extends Component { } get canUpdate() { + if (this.setting.themeable) { + return false; + } + if (!this.status || this.status === "completed") { return true; } else { @@ -429,6 +454,7 @@ export default class SiteSettingComponent extends Component { {{else}} {{/if}} + {{#if this.showThemeSiteSettingWarning}} +
+

+ {{icon "paintbrush"}} + {{this.themeSiteSettingWarningText}} +

+
+ {{/if}} {{/if}} diff --git a/app/assets/javascripts/admin/addon/components/site-settings/bool.gjs b/app/assets/javascripts/admin/addon/components/site-settings/bool.gjs index e0249333e12..b46f60b1911 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/bool.gjs +++ b/app/assets/javascripts/admin/addon/components/site-settings/bool.gjs @@ -26,6 +26,7 @@ export default class Bool extends Component { {{on "input" this.onToggle}} type="checkbox" checked={{this.enabled}} + disabled={{@disabled}} /> {{htmlSafe @setting.description}} diff --git a/app/assets/javascripts/admin/addon/components/site-settings/enum.gjs b/app/assets/javascripts/admin/addon/components/site-settings/enum.gjs index f39ae6edebf..770b8169dae 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/enum.gjs +++ b/app/assets/javascripts/admin/addon/components/site-settings/enum.gjs @@ -11,7 +11,11 @@ export default class Enum extends Component { @onChange={{fn (mut this.value)}} @valueProperty={{this.setting.computedValueProperty}} @nameProperty={{this.setting.computedNameProperty}} - @options={{hash castInteger=true allowAny=this.setting.allowsNone}} + @options={{hash + castInteger=true + allowAny=this.setting.allowsNone + disabled=@disabled + }} /> {{this.preview}} diff --git a/app/assets/javascripts/admin/addon/components/site-settings/host-list.gjs b/app/assets/javascripts/admin/addon/components/site-settings/host-list.gjs index 7807220af25..fd63cee3356 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/host-list.gjs +++ b/app/assets/javascripts/admin/addon/components/site-settings/host-list.gjs @@ -28,7 +28,7 @@ export default class HostList extends Component { @settingName={{this.setting.setting}} @choices={{this.settingValue}} @onChange={{this.onChange}} - @options={{hash allowAny=this.allowAny}} + @options={{hash allowAny=this.allowAny disabled=@disabled}} /> } diff --git a/app/assets/javascripts/admin/addon/components/site-settings/integer.gjs b/app/assets/javascripts/admin/addon/components/site-settings/integer.gjs index 211c516b4e4..292e477438f 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/integer.gjs +++ b/app/assets/javascripts/admin/addon/components/site-settings/integer.gjs @@ -34,6 +34,7 @@ export default class SiteSettingsInteger extends Component { max={{if @setting.max @setting.max null}} class="input-setting-integer" step="1" + disabled={{@disabled}} /> } diff --git a/app/assets/javascripts/admin/addon/components/site-settings/list.gjs b/app/assets/javascripts/admin/addon/components/site-settings/list.gjs index bfedb2e3566..9a61e8332f8 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/list.gjs +++ b/app/assets/javascripts/admin/addon/components/site-settings/list.gjs @@ -8,6 +8,7 @@ export default class List extends Component { @values={{this.value}} @inputDelimiter="|" @choices={{this.setting.choices}} + @disabled={{@disabled}} /> } diff --git a/app/assets/javascripts/admin/addon/components/site-settings/string.gjs b/app/assets/javascripts/admin/addon/components/site-settings/string.gjs index 1396355e5ed..0d5a0087508 100644 --- a/app/assets/javascripts/admin/addon/components/site-settings/string.gjs +++ b/app/assets/javascripts/admin/addon/components/site-settings/string.gjs @@ -5,16 +5,25 @@ import TextField from "discourse/components/text-field"; export default class String extends Component {