From 4fe99e39c36a4a903ecb430f39efeb7f89177d87 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Tue, 8 Mar 2022 13:18:43 +0200 Subject: [PATCH] FEATURE: Add new site setting list type with name and values (#16045) These changes include a bug fix because allow_any attribute of site settings was completely ignored before. --- .../components/site-settings/named-list.js | 33 +++++++++++++++++++ .../admin/addon/mixins/setting-component.js | 1 + .../admin/addon/mixins/setting-object.js | 3 ++ .../components/site-settings/named-list.hbs | 14 ++++++++ lib/site_settings/type_supervisor.rb | 4 +++ 5 files changed, 55 insertions(+) create mode 100644 app/assets/javascripts/admin/addon/components/site-settings/named-list.js create mode 100644 app/assets/javascripts/admin/addon/templates/components/site-settings/named-list.hbs diff --git a/app/assets/javascripts/admin/addon/components/site-settings/named-list.js b/app/assets/javascripts/admin/addon/components/site-settings/named-list.js new file mode 100644 index 00000000000..c6cf872d79a --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/site-settings/named-list.js @@ -0,0 +1,33 @@ +import Component from "@ember/component"; +import { action, computed } from "@ember/object"; + +export default Component.extend({ + tokenSeparator: "|", + + @computed("value") + get settingValue() { + return this.value.toString().split(this.tokenSeparator).filter(Boolean); + }, + + @computed("setting.choices.[]", "settingValue") + get settingChoices() { + let choices = this.setting.choices; + + if (this.settingValue) { + const valuesSet = new Set(choices.map((choice) => choice.value)); + + choices = choices.concat( + this.settingValue + .filter((value) => !valuesSet.has(value)) + .map((value) => ({ name: value, value })) + ); + } + + return choices; + }, + + @action + onChangeListSetting(value) { + this.set("value", value.join(this.tokenSeparator)); + }, +}); diff --git a/app/assets/javascripts/admin/addon/mixins/setting-component.js b/app/assets/javascripts/admin/addon/mixins/setting-component.js index 9585168210e..ebf012aae9d 100644 --- a/app/assets/javascripts/admin/addon/mixins/setting-component.js +++ b/app/assets/javascripts/admin/addon/mixins/setting-component.js @@ -32,6 +32,7 @@ const CUSTOM_TYPES = [ "color", "simple_list", "emoji_list", + "named_list", ]; const AUTO_REFRESH_ON_SAVE = ["logo", "logo_small", "large_icon"]; diff --git a/app/assets/javascripts/admin/addon/mixins/setting-object.js b/app/assets/javascripts/admin/addon/mixins/setting-object.js index 2bf9e0c0820..ce1952013dc 100644 --- a/app/assets/javascripts/admin/addon/mixins/setting-object.js +++ b/app/assets/javascripts/admin/addon/mixins/setting-object.js @@ -1,6 +1,7 @@ import I18n from "I18n"; import Mixin from "@ember/object/mixin"; import { computed } from "@ember/object"; +import { readOnly } from "@ember/object/computed"; import discourseComputed from "discourse-common/utils/decorators"; import { isPresent } from "@ember/utils"; @@ -66,4 +67,6 @@ export default Mixin.create({ return "admin.settings.none"; } }, + + anyValue: readOnly("allow_any"), }); diff --git a/app/assets/javascripts/admin/addon/templates/components/site-settings/named-list.hbs b/app/assets/javascripts/admin/addon/templates/components/site-settings/named-list.hbs new file mode 100644 index 00000000000..8e2a8aac50f --- /dev/null +++ b/app/assets/javascripts/admin/addon/templates/components/site-settings/named-list.hbs @@ -0,0 +1,14 @@ +{{list-setting + value=settingValue + settingName=setting.setting + choices=settingChoices + nameProperty="name" + valueProperty="value" + onChange=(action "onChangeListSetting") + options=(hash + allowAny=allowAny + ) +}} + +{{setting-validation-message message=validationMessage}} +
{{html-safe setting.description}}
diff --git a/lib/site_settings/type_supervisor.rb b/lib/site_settings/type_supervisor.rb index 5c37f26c89f..80a51e81e92 100644 --- a/lib/site_settings/type_supervisor.rb +++ b/lib/site_settings/type_supervisor.rb @@ -164,6 +164,10 @@ class SiteSettings::TypeSupervisor end end + if type == :list + result[:allow_any] = @allow_any[name] + end + result[:choices] = @choices[name] if @choices.has_key? name result[:list_type] = @list_type[name] if @list_type.has_key? name result[:textarea] = @textareas[name] if @textareas.has_key? name