From 1ba72ccab8698c156e502452a036bc7be6e7857b Mon Sep 17 00:00:00 2001
From: Neil Lalonde <neillalonde@gmail.com>
Date: Thu, 18 Apr 2019 13:44:58 -0400
Subject: [PATCH] DEV: add site setting type group_list for a list of groups

Add a js test
---
 .../site-settings/group-list.js.es6           |  8 +++
 .../admin/mixins/setting-component.js.es6     |  3 +-
 .../components/site-settings/group-list.hbs   |  3 +
 config/locales/client.en.yml                  |  1 +
 lib/site_settings/type_supervisor.rb          |  1 +
 .../site_settings/type_supervisor_spec.rb     |  7 ++-
 .../components/group-list-setting-test.js.es6 | 57 +++++++++++++++++++
 7 files changed, 78 insertions(+), 2 deletions(-)
 create mode 100644 app/assets/javascripts/admin/components/site-settings/group-list.js.es6
 create mode 100644 app/assets/javascripts/admin/templates/components/site-settings/group-list.hbs
 create mode 100644 test/javascripts/admin/components/group-list-setting-test.js.es6

diff --git a/app/assets/javascripts/admin/components/site-settings/group-list.js.es6 b/app/assets/javascripts/admin/components/site-settings/group-list.js.es6
new file mode 100644
index 00000000000..c67f41f8d0c
--- /dev/null
+++ b/app/assets/javascripts/admin/components/site-settings/group-list.js.es6
@@ -0,0 +1,8 @@
+import computed from "ember-addons/ember-computed-decorators";
+
+export default Ember.Component.extend({
+  @computed()
+  groupChoices() {
+    return this.site.get('groups').map(g => g.name);
+  }
+});
diff --git a/app/assets/javascripts/admin/mixins/setting-component.js.es6 b/app/assets/javascripts/admin/mixins/setting-component.js.es6
index 444fe6aa76b..c3f4f19e3d3 100644
--- a/app/assets/javascripts/admin/mixins/setting-component.js.es6
+++ b/app/assets/javascripts/admin/mixins/setting-component.js.es6
@@ -13,7 +13,8 @@ const CUSTOM_TYPES = [
   "uploaded_image_list",
   "compact_list",
   "secret_list",
-  "upload"
+  "upload",
+  "group_list"
 ];
 
 export default Ember.Mixin.create({
diff --git a/app/assets/javascripts/admin/templates/components/site-settings/group-list.hbs b/app/assets/javascripts/admin/templates/components/site-settings/group-list.hbs
new file mode 100644
index 00000000000..adb6ec50982
--- /dev/null
+++ b/app/assets/javascripts/admin/templates/components/site-settings/group-list.hbs
@@ -0,0 +1,3 @@
+{{list-setting settingValue=value choices=groupChoices settingName=setting.setting}}
+{{setting-validation-message message=validationMessage}}
+<div class='desc'>{{{unbound setting.description}}}</div>
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 6d217d85c46..336179ecb24 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -4106,6 +4106,7 @@ en:
         clear_filter: "Clear"
         add_url: "add URL"
         add_host: "add host"
+        add_group: "add group"
         uploaded_image_list:
           label: "Edit list"
           empty: "There are no pictures yet. Please upload one."
diff --git a/lib/site_settings/type_supervisor.rb b/lib/site_settings/type_supervisor.rb
index 2137561b88b..da210d82109 100644
--- a/lib/site_settings/type_supervisor.rb
+++ b/lib/site_settings/type_supervisor.rb
@@ -33,6 +33,7 @@ class SiteSettings::TypeSupervisor
       uploaded_image_list: 17,
       upload: 18,
       group: 19,
+      group_list: 20,
     )
   end
 
diff --git a/spec/components/site_settings/type_supervisor_spec.rb b/spec/components/site_settings/type_supervisor_spec.rb
index f795d824434..2fae2ff5818 100644
--- a/spec/components/site_settings/type_supervisor_spec.rb
+++ b/spec/components/site_settings/type_supervisor_spec.rb
@@ -72,10 +72,15 @@ describe SiteSettings::TypeSupervisor do
       it "'uploaded_image_list' should be at 17th position" do
         expect(SiteSettings::TypeSupervisor.types[:uploaded_image_list]).to eq(17)
       end
-
       it "'upload' should be at the right position" do
         expect(SiteSettings::TypeSupervisor.types[:upload]).to eq(18)
       end
+      it "'group' should be at the right position" do
+        expect(SiteSettings::TypeSupervisor.types[:group]).to eq(19)
+      end
+      it "'group_list' should be at the right position" do
+        expect(SiteSettings::TypeSupervisor.types[:group_list]).to eq(20)
+      end
     end
   end
 
diff --git a/test/javascripts/admin/components/group-list-setting-test.js.es6 b/test/javascripts/admin/components/group-list-setting-test.js.es6
new file mode 100644
index 00000000000..d64bd9d7d11
--- /dev/null
+++ b/test/javascripts/admin/components/group-list-setting-test.js.es6
@@ -0,0 +1,57 @@
+import componentTest from "helpers/component-test";
+
+moduleForComponent("group-list", { integration: true });
+
+componentTest("default", {
+  template: "{{site-setting setting=setting}}",
+
+  beforeEach() {
+    this.site.groups = [
+      {
+        id: 1,
+        name: "Donuts"
+      },
+      {
+        id: 2,
+        name: "Cheese cake"
+      }
+    ];
+
+    this.set(
+      "setting",
+      Ember.Object.create({
+        allowsNone: undefined,
+        category: "foo",
+        default: "",
+        description: "Choose groups",
+        overridden: false,
+        placeholder: null,
+        preview: null,
+        secret: false,
+        setting: "foo_bar",
+        type: "group_list",
+        validValues: undefined,
+        value: "Donuts"
+      })
+    );
+  },
+
+  async test(assert) {
+    const subject = selectKit(".list-setting");
+
+    assert.equal(
+      subject.header().value(),
+      "Donuts",
+      "it selects the setting's value"
+    );
+
+    await subject.expand();
+    await subject.selectRowByValue("Cheese cake");
+
+    assert.equal(
+      subject.header().value(),
+      "Donuts,Cheese cake",
+      "it allows to select a setting from the list of choices"
+    );
+  }
+});