shoelace-rails 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/app/helpers/shoelace/components/error_wrappable.rb +21 -0
  4. data/app/helpers/shoelace/components/sl_checkbox.rb +40 -0
  5. data/app/helpers/shoelace/components/sl_collection_radio_buttons.rb +47 -0
  6. data/app/helpers/shoelace/components/sl_color_picker.rb +30 -0
  7. data/app/helpers/shoelace/components/sl_input.rb +33 -0
  8. data/app/helpers/shoelace/components/sl_radio_button.rb +20 -0
  9. data/app/helpers/shoelace/components/sl_range.rb +22 -0
  10. data/app/helpers/shoelace/components/sl_select.rb +77 -0
  11. data/app/helpers/shoelace/components/sl_switch.rb +23 -0
  12. data/app/helpers/shoelace/components/sl_textarea.rb +20 -0
  13. data/app/helpers/shoelace/form_builder.rb +8 -0
  14. data/app/helpers/shoelace/sl_form_builder.rb +111 -0
  15. data/app/helpers/shoelace/sl_form_helper.rb +139 -0
  16. data/lib/shoelace/rails/version.rb +1 -1
  17. data/lib/shoelace/railtie.rb +2 -4
  18. data/test/helpers/form_builder/sl_checkbox_test.rb +45 -0
  19. data/test/helpers/form_builder/sl_color_picker_test.rb +26 -0
  20. data/test/helpers/form_builder/sl_input_test.rb +126 -0
  21. data/test/helpers/form_builder/sl_radio_group_test.rb +63 -0
  22. data/test/helpers/form_builder/sl_range_test.rb +34 -0
  23. data/test/helpers/form_builder/sl_select_test.rb +320 -0
  24. data/test/helpers/form_builder/sl_switch_test.rb +26 -0
  25. data/test/helpers/form_builder/sl_textarea_test.rb +72 -0
  26. data/test/helpers/form_builder_test.rb +16 -0
  27. data/test/helpers/form_helper_test.rb +3 -442
  28. data/test/helpers/translation_test.rb +2 -4
  29. data/test/test_helper.rb +22 -0
  30. metadata +25 -4
  31. data/app/helpers/shoelace/form_helper.rb +0 -408
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlCheckboxTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#check_box" do
10
+ sl_form_for(User.new, url: "/") do |form|
11
+ assert_dom_equal <<~HTML, form.check_box(:name)
12
+ <input name="user[name]" type="hidden" value="0" #{AUTOCOMPLETE_ATTRIBUTE} />
13
+ <sl-checkbox value="1" name="user[name]" id="user_name">Name</sl-checkbox>
14
+ HTML
15
+ end
16
+ end
17
+
18
+ test "#check_box with an invalid value" do
19
+ yuki = User.new.tap(&:validate)
20
+
21
+ sl_form_for(yuki, url: "/") do |form|
22
+ assert_dom_equal <<~HTML, form.check_box(:name)
23
+ <input name="user[name]" type="hidden" value="0" #{AUTOCOMPLETE_ATTRIBUTE} />
24
+ <sl-checkbox value="1" name="user[name]" id="user_name" data-invalid="" invalid="">Name</sl-checkbox>
25
+ HTML
26
+ end
27
+ end
28
+
29
+ test "#check_box with a block" do
30
+ sl_form_for(User.new, url: "/") do |form|
31
+ assert_dom_equal <<~HTML, form.check_box(:name) { "Maintainer Name" }
32
+ <input name="user[name]" type="hidden" value="0" #{AUTOCOMPLETE_ATTRIBUTE} />
33
+ <sl-checkbox value="1" name="user[name]" id="user_name">Maintainer Name</sl-checkbox>
34
+ HTML
35
+ end
36
+ end
37
+
38
+ test "#check_box without a hidden input" do
39
+ sl_form_for(User.new, url: "/") do |form|
40
+ assert_dom_equal <<~HTML, form.check_box(:name, include_hidden: false) { "Maintainer Name" }
41
+ <sl-checkbox value="1" name="user[name]" id="user_name">Maintainer Name</sl-checkbox>
42
+ HTML
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlColorPickerTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#color_field" do
10
+ sl_form_for(User.new, url: "/") do |form|
11
+ assert_dom_equal <<~HTML, form.color_field(:name)
12
+ <sl-color-picker name="user[name]" id="user_name" label="Name"></sl-color-picker>
13
+ HTML
14
+ end
15
+ end
16
+
17
+ test "#color_field with an invalid value" do
18
+ yuki = User.new.tap(&:validate)
19
+
20
+ sl_form_for(yuki, url: "/") do |form|
21
+ assert_dom_equal <<~HTML, form.color_field(:name)
22
+ <sl-color-picker name="user[name]" id="user_name" label="Name" data-invalid="" invalid=""></sl-color-picker>
23
+ HTML
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlInputTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#text_field" do
10
+ sl_form_for(User.new, url: "/") do |form|
11
+ assert_dom_equal <<~HTML, form.text_field(:name)
12
+ <sl-input label="Name" type="text" name="user[name]" id="user_name"></sl-input>
13
+ HTML
14
+ end
15
+ end
16
+
17
+ test "#text_field with a default value" do
18
+ sl_form_for(User.new(name: "Yuki"), url: "/") do |form|
19
+ assert_dom_equal <<~HTML, form.text_field(:name)
20
+ <sl-input label="Name" type="text" name="user[name]" id="user_name" value="Yuki"></sl-input>
21
+ HTML
22
+ end
23
+ end
24
+
25
+ test "#text_field with an invalid value" do
26
+ yuki = User.new.tap(&:validate)
27
+
28
+ sl_form_for(yuki, url: "/") do |form|
29
+ assert_dom_equal <<~HTML, form.text_field(:name)
30
+ <sl-input label="Name" type="text" name="user[name]" id="user_name" data-invalid="" invalid=""></sl-input>
31
+ HTML
32
+ end
33
+ end
34
+
35
+ test "#date_field" do
36
+ sl_form_for(User.new, url: "/") do |form|
37
+ assert_dom_equal <<~HTML, form.date_field(:name)
38
+ <sl-input label="Name" type="date" name="user[name]" id="user_name"></sl-input>
39
+ HTML
40
+ end
41
+ end
42
+
43
+ test "#email_field" do
44
+ sl_form_for(User.new, url: "/") do |form|
45
+ assert_dom_equal <<~HTML, form.email_field(:name)
46
+ <sl-input label="Name" type="email" name="user[name]" id="user_name"></sl-input>
47
+ HTML
48
+ end
49
+ end
50
+
51
+ test "#number_field" do
52
+ sl_form_for(User.new, url: "/") do |form|
53
+ assert_dom_equal <<~HTML, form.number_field(:name)
54
+ <sl-input label="Name" type="number" name="user[name]" id="user_name"></sl-input>
55
+ HTML
56
+ end
57
+ end
58
+
59
+ test "#password_field" do
60
+ sl_form_for(User.new, url: "/") do |form|
61
+ assert_dom_equal <<~HTML, form.password_field(:name)
62
+ <sl-input label="Name" type="password" name="user[name]" id="user_name"></sl-input>
63
+ HTML
64
+ end
65
+ end
66
+
67
+ test "#search_field" do
68
+ sl_form_for(User.new, url: "/") do |form|
69
+ assert_dom_equal <<~HTML, form.search_field(:name)
70
+ <sl-input label="Name" type="search" name="user[name]" id="user_name"></sl-input>
71
+ HTML
72
+ end
73
+ end
74
+
75
+ test "#telephone_field" do
76
+ sl_form_for(User.new, url: "/") do |form|
77
+ assert_dom_equal <<~HTML, form.telephone_field(:name)
78
+ <sl-input label="Name" type="tel" name="user[name]" id="user_name"></sl-input>
79
+ HTML
80
+ end
81
+ end
82
+
83
+ test "#phone_field" do
84
+ sl_form_for(User.new, url: "/") do |form|
85
+ assert_dom_equal <<~HTML, form.phone_field(:name)
86
+ <sl-input label="Name" type="tel" name="user[name]" id="user_name"></sl-input>
87
+ HTML
88
+ end
89
+ end
90
+
91
+ test "#text_field with a block" do
92
+ sl_form_for(User.new(name: "Yuki"), url: "/") do |form|
93
+ assert_dom_equal <<~HTML, form.text_field(:name) { 'slot' }
94
+ <sl-input label="Name" type="text" name="user[name]" id="user_name" value="Yuki">slot</sl-input>
95
+ HTML
96
+ end
97
+ end
98
+
99
+ test "#text_field with a default help text block" do
100
+ with_default_input_slot_method do
101
+ sl_form_for(User.new(name: "Yuki"), url: "/") do |form|
102
+ assert_dom_equal <<~HTML, form.text_field(:name)
103
+ <sl-input label="Name" type="text" name="user[name]" id="user_name" value="Yuki">
104
+ <div slot="help-text">Help text for name Yuki</div>
105
+ </sl-input>
106
+ HTML
107
+ end
108
+
109
+ sl_form_for(User.new(name: "Yuki"), url: "/") do |form|
110
+ assert_dom_equal <<~HTML, form.text_field(:name) { "slot" }
111
+ <sl-input label="Name" type="text" name="user[name]" id="user_name" value="Yuki">
112
+ slot
113
+ </sl-input>
114
+ HTML
115
+ end
116
+ end
117
+ end
118
+
119
+ test "#url_field" do
120
+ sl_form_for(User.new, url: "/") do |form|
121
+ assert_dom_equal <<~HTML, form.url_field(:name)
122
+ <sl-input label="Name" type="url" name="user[name]" id="user_name"></sl-input>
123
+ HTML
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlRadioGroupTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#collection_radio_buttons" do
10
+ users = {
11
+ 1 => "Yuki Nishijima",
12
+ 2 => "Matz",
13
+ 3 => "Koichi Sasada",
14
+ }
15
+
16
+ sl_form_for(User.new, url: "/") do |form|
17
+ assert_dom_equal <<~HTML, form.collection_radio_buttons(:name, users, :first, :last)
18
+ <sl-radio-group label="Name" name="user[name]" id="user_name">
19
+ <sl-radio value="1" id="user_name_1">Yuki Nishijima</sl-radio>
20
+ <sl-radio value="2" id="user_name_2">Matz</sl-radio>
21
+ <sl-radio value="3" id="user_name_3">Koichi Sasada</sl-radio>
22
+ </sl-radio-group>
23
+ HTML
24
+ end
25
+ end
26
+
27
+ test "#collection_radio_buttons with an invalid value" do
28
+ yuki = User.new.tap(&:validate)
29
+ users = {
30
+ 1 => "Yuki Nishijima",
31
+ 2 => "Matz",
32
+ 3 => "Koichi Sasada",
33
+ }
34
+
35
+ sl_form_for(yuki, url: "/") do |form|
36
+ assert_dom_equal <<~HTML, form.collection_radio_buttons(:name, users, :first, :last)
37
+ <sl-radio-group label="Name" name="user[name]" id="user_name" data-invalid="" invalid="">
38
+ <sl-radio value="1" id="user_name_1">Yuki Nishijima</sl-radio>
39
+ <sl-radio value="2" id="user_name_2">Matz</sl-radio>
40
+ <sl-radio value="3" id="user_name_3">Koichi Sasada</sl-radio>
41
+ </sl-radio-group>
42
+ HTML
43
+ end
44
+ end
45
+
46
+ test "#collection_radio_buttons with a default value" do
47
+ users = {
48
+ 1 => "Yuki Nishijima",
49
+ 2 => "Matz",
50
+ 3 => "Koichi Sasada",
51
+ }
52
+
53
+ sl_form_for(User.new(name: 1), url: "/") do |form|
54
+ assert_dom_equal <<~HTML, form.collection_radio_buttons(:name, users, :first, :last)
55
+ <sl-radio-group label="Name" name="user[name]" value="1" id="user_name">
56
+ <sl-radio value="1" id="user_name_1">Yuki Nishijima</sl-radio>
57
+ <sl-radio value="2" id="user_name_2">Matz</sl-radio>
58
+ <sl-radio value="3" id="user_name_3">Koichi Sasada</sl-radio>
59
+ </sl-radio-group>
60
+ HTML
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlRangeTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#range_field" do
10
+ sl_form_for(User.new, url: "/") do |form|
11
+ assert_dom_equal <<~HTML, form.range_field(:name)
12
+ <sl-range label="Name" name="user[name]" id="user_name"></sl-range>
13
+ HTML
14
+ end
15
+ end
16
+
17
+ test "#range_field with an invalid value" do
18
+ yuki = User.new.tap(&:validate)
19
+
20
+ sl_form_for(yuki, url: "/") do |form|
21
+ assert_dom_equal <<~HTML, form.range_field(:name)
22
+ <sl-range label="Name" name="user[name]" id="user_name" data-invalid="" invalid=""></sl-range>
23
+ HTML
24
+ end
25
+ end
26
+
27
+ test "#range_field without a label" do
28
+ sl_form_for(User.new, url: "/") do |form|
29
+ assert_dom_equal <<~HTML, form.range_field(:name, label: nil)
30
+ <sl-range name="user[name]" id="user_name"></sl-range>
31
+ HTML
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,320 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlSelectTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#select" do
10
+ users = {
11
+ "Yuki Nishijima" => 1,
12
+ "Matz" => 2,
13
+ "Koichi Sasada" => 3
14
+ }
15
+
16
+ sl_form_for(User.new, url: "/") do |form|
17
+ assert_dom_equal <<~HTML, form.select(:name, users)
18
+ <sl-select label="Name" name="user[name]" id="user_name">
19
+ <sl-option value="1">Yuki Nishijima</sl-option>
20
+ <sl-option value="2">Matz</sl-option>
21
+ <sl-option value="3">Koichi Sasada</sl-option>
22
+ </sl-select>
23
+ HTML
24
+ end
25
+ end
26
+
27
+ test "#select with an invalid value" do
28
+ yuki = User.new.tap(&:validate)
29
+ users = {
30
+ "Yuki Nishijima" => 1,
31
+ "Matz" => 2,
32
+ "Koichi Sasada" => 3
33
+ }
34
+
35
+ sl_form_for(yuki, url: "/") do |form|
36
+ assert_dom_equal <<~HTML, form.select(:name, users)
37
+ <sl-select label="Name" name="user[name]" id="user_name" data-invalid="" invalid="">
38
+ <sl-option value="1">Yuki Nishijima</sl-option>
39
+ <sl-option value="2">Matz</sl-option>
40
+ <sl-option value="3">Koichi Sasada</sl-option>
41
+ </sl-select>
42
+ HTML
43
+ end
44
+ end
45
+
46
+ test "#select with a default help text block" do
47
+ with_default_input_slot_method do
48
+ sl_form_for(User.new, url: "/") do |form|
49
+ assert_dom_equal <<~HTML, form.select(:name, "Yuki Nishijima" => 1)
50
+ <sl-select label="Name" name="user[name]" id="user_name">
51
+ <sl-option value="1">Yuki Nishijima</sl-option>
52
+ <div slot="help-text">Help text for name</div>
53
+ </sl-select>
54
+ HTML
55
+ end
56
+ end
57
+ end
58
+
59
+ test "#select with a block that does not return anything" do
60
+ sl_form_for(User.new, url: "/") do |form|
61
+ assert_dom_equal <<~HTML, form.select(:name, "Yuki Nishijima" => 1) { }
62
+ <sl-select label="Name" name="user[name]" id="user_name">
63
+ <sl-option value="1">Yuki Nishijima</sl-option>
64
+ </sl-select>
65
+ HTML
66
+ end
67
+ end
68
+
69
+ test "#select with a custom value" do
70
+ users = {
71
+ "Yuki Nishijima" => 1,
72
+ "Matz" => 2,
73
+ "Koichi Sasada" => 3
74
+ }
75
+
76
+ sl_form_for(User.new, url: "/") do |form|
77
+ assert_dom_equal <<~HTML, form.select(:name, users, {}, { value: 3 })
78
+ <sl-select label="Name" value="3" name="user[name]" id="user_name">
79
+ <sl-option value="1">Yuki Nishijima</sl-option>
80
+ <sl-option value="2">Matz</sl-option>
81
+ <sl-option value="3">Koichi Sasada</sl-option>
82
+ </sl-select>
83
+ HTML
84
+ end
85
+ end
86
+
87
+ test "#select with custom selected and disabled values" do
88
+ users = {
89
+ "Yuki Nishijima" => 1,
90
+ "Matz" => 2,
91
+ "Koichi Sasada" => 3
92
+ }
93
+
94
+ sl_form_for(User.new, url: "/") do |form|
95
+ assert_dom_equal <<~HTML, form.select(:name, users, selected: 3, disabled: 1)
96
+ <sl-select label="Name" name="user[name]" id="user_name">
97
+ <sl-option value="1" disabled="disabled">Yuki Nishijima</sl-option>
98
+ <sl-option value="2">Matz</sl-option>
99
+ <sl-option value="3" checked="checked">Koichi Sasada</sl-option>
100
+ </sl-select>
101
+ HTML
102
+ end
103
+ end
104
+
105
+ test "#select with multiple" do
106
+ users = {
107
+ "Yuki Nishijima" => 1,
108
+ "Matz" => 2,
109
+ "Koichi Sasada" => 3
110
+ }
111
+
112
+ sl_form_for(User.new, url: "/") do |form|
113
+ assert_dom_equal <<~HTML, form.select(:name, users, {}, { multiple: true })
114
+ <sl-select label="Name" name="user[name][]" id="user_name" multiple="multiple">
115
+ <sl-option value="1">Yuki Nishijima</sl-option>
116
+ <sl-option value="2">Matz</sl-option>
117
+ <sl-option value="3">Koichi Sasada</sl-option>
118
+ </sl-select>
119
+ HTML
120
+ end
121
+ end
122
+
123
+ test "#select with grouped options" do
124
+ users = {
125
+ "Main maintainers" => [
126
+ ["Matz", 2],
127
+ ["Koichi Sasada", 3]
128
+ ],
129
+ "Default gem maintainers" => [
130
+ ["Yuki Nishijima", 1],
131
+ ]
132
+ }
133
+
134
+ sl_form_for(User.new, url: "/") do |form|
135
+ assert_dom_equal <<~HTML, form.select(:name, users)
136
+ <sl-select label="Name" name="user[name]" id="user_name">
137
+ <small>Main maintainers</small>
138
+ <sl-option value="2">Matz</sl-option>
139
+ <sl-option value="3">Koichi Sasada</sl-option>
140
+ <sl-divider></sl-divider>
141
+ <small>Default gem maintainers</small>
142
+ <sl-option value="1">Yuki Nishijima</sl-option>
143
+ </sl-select>
144
+ HTML
145
+ end
146
+ end
147
+
148
+ test "#select with grouped options with a default value" do
149
+ users = {
150
+ "Main maintainers" => [
151
+ ["Matz", 2],
152
+ ["Koichi Sasada", 3]
153
+ ],
154
+ "Default gem maintainers" => [
155
+ ["Yuki Nishijima", 1],
156
+ ]
157
+ }
158
+
159
+ sl_form_for(User.new(name: 2), url: "/") do |form|
160
+ assert_dom_equal <<~HTML, form.select(:name, users)
161
+ <sl-select label="Name" name="user[name]" id="user_name" value="2">
162
+ <small>Main maintainers</small>
163
+ <sl-option value="2" checked="checked">Matz</sl-option>
164
+ <sl-option value="3">Koichi Sasada</sl-option>
165
+ <sl-divider></sl-divider>
166
+ <small>Default gem maintainers</small>
167
+ <sl-option value="1">Yuki Nishijima</sl-option>
168
+ </sl-select>
169
+ HTML
170
+ end
171
+ end
172
+
173
+ test "#collection_select" do
174
+ users = {
175
+ 1 => "Yuki Nishijima",
176
+ 2 => "Matz",
177
+ 3 => "Koichi Sasada",
178
+ }
179
+
180
+ sl_form_for(User.new, url: "/") do |form|
181
+ assert_dom_equal <<~HTML, form.collection_select(:name, users, :first, :last)
182
+ <sl-select label="Name" name="user[name]" id="user_name">
183
+ <sl-option value="1">Yuki Nishijima</sl-option>
184
+ <sl-option value="2">Matz</sl-option>
185
+ <sl-option value="3">Koichi Sasada</sl-option>
186
+ </sl-select>
187
+ HTML
188
+ end
189
+ end
190
+
191
+ test "#collection_select with a default help text block" do
192
+ with_default_input_slot_method do
193
+ sl_form_for(User.new, url: "/") do |form|
194
+ assert_dom_equal <<~HTML, form.collection_select(:name, { 1 => "Yuki Nishijima" }, :first, :last)
195
+ <sl-select label="Name" name="user[name]" id="user_name">
196
+ <sl-option value="1">Yuki Nishijima</sl-option>
197
+ <div slot="help-text">Help text for name </div>
198
+ </sl-select>
199
+ HTML
200
+ end
201
+ end
202
+ end
203
+
204
+ test "#collection_select with an invalid value" do
205
+ yuki = User.new.tap(&:validate)
206
+ users = {
207
+ 1 => "Yuki Nishijima",
208
+ 2 => "Matz",
209
+ 3 => "Koichi Sasada",
210
+ }
211
+
212
+ sl_form_for(yuki, url: "/") do |form|
213
+ assert_dom_equal <<~HTML, form.collection_select(:name, users, :first, :last)
214
+ <sl-select label="Name" name="user[name]" id="user_name" data-invalid="" invalid="">
215
+ <sl-option value="1">Yuki Nishijima</sl-option>
216
+ <sl-option value="2">Matz</sl-option>
217
+ <sl-option value="3">Koichi Sasada</sl-option>
218
+ </sl-select>
219
+ HTML
220
+ end
221
+ end
222
+
223
+ test "#collection_select with a default value" do
224
+ users = {
225
+ 1 => "Yuki Nishijima",
226
+ 2 => "Matz",
227
+ 3 => "Koichi Sasada",
228
+ }
229
+
230
+ sl_form_for(User.new(name: "2"), url: "/") do |form|
231
+ assert_dom_equal <<~HTML, form.collection_select(:name, users, :first, :last)
232
+ <sl-select label="Name" name="user[name]" id="user_name" value="2">
233
+ <sl-option value="1">Yuki Nishijima</sl-option>
234
+ <sl-option value="2" checked="checked">Matz</sl-option>
235
+ <sl-option value="3">Koichi Sasada</sl-option>
236
+ </sl-select>
237
+ HTML
238
+ end
239
+ end
240
+
241
+ test "#grouped_collection_select" do
242
+ users = [
243
+ OpenStruct.new(
244
+ group_name: "Main maintainers",
245
+ members: [
246
+ OpenStruct.new(id: 1, name: "Matz"),
247
+ OpenStruct.new(id: 2, name: "Koichi Sasada"),
248
+ ]
249
+ ),
250
+ OpenStruct.new(
251
+ group_name: "Default gem maintainers",
252
+ members: [OpenStruct.new(id: 3, name: "Yuki Nishijima")]
253
+ ),
254
+ ]
255
+
256
+ sl_form_for(User.new(name: "2"), url: "/") do |form|
257
+ assert_dom_equal <<~HTML, form.grouped_collection_select(:name, users, :members, :group_name, :id, :name)
258
+ <sl-select label="Name" name="user[name]" id="user_name" value="2">
259
+ <small>Main maintainers</small>
260
+ <sl-option value="1">Matz</sl-option>
261
+ <sl-option value="2" checked="checked">Koichi Sasada</sl-option>
262
+ <sl-divider></sl-divider>
263
+ <small>Default gem maintainers</small>
264
+ <sl-option value="3">Yuki Nishijima</sl-option>
265
+ </sl-select>
266
+ HTML
267
+ end
268
+ end
269
+
270
+ test "#grouped_collection_select with a default help text block" do
271
+ users = [
272
+ OpenStruct.new(
273
+ group_name: "Default gem maintainers",
274
+ members: [OpenStruct.new(id: 3, name: "Yuki Nishijima")]
275
+ ),
276
+ ]
277
+
278
+ with_default_input_slot_method do
279
+ sl_form_for(User.new(name: "2"), url: "/") do |form|
280
+ assert_dom_equal <<~HTML, form.grouped_collection_select(:name, users, :members, :group_name, :id, :name)
281
+ <sl-select label="Name" name="user[name]" id="user_name" value="2">
282
+ <small>Default gem maintainers</small>
283
+ <sl-option value="3">Yuki Nishijima</sl-option>
284
+ <div slot="help-text">Help text for name 2</div>
285
+ </sl-select>
286
+ HTML
287
+ end
288
+ end
289
+ end
290
+
291
+ test "#grouped_collection_select with an invalid value" do
292
+ yuki = User.new.tap(&:validate)
293
+ users = [
294
+ OpenStruct.new(
295
+ group_name: "Main maintainers",
296
+ members: [
297
+ OpenStruct.new(id: 1, name: "Matz"),
298
+ OpenStruct.new(id: 2, name: "Koichi Sasada"),
299
+ ]
300
+ ),
301
+ OpenStruct.new(
302
+ group_name: "Default gem maintainers",
303
+ members: [OpenStruct.new(id: 3, name: "Yuki Nishijima")]
304
+ ),
305
+ ]
306
+
307
+ sl_form_for(yuki, url: "/") do |form|
308
+ assert_dom_equal <<~HTML, form.grouped_collection_select(:name, users, :members, :group_name, :id, :name)
309
+ <sl-select label="Name" name="user[name]" id="user_name" data-invalid="" invalid="">
310
+ <small>Main maintainers</small>
311
+ <sl-option value="1">Matz</sl-option>
312
+ <sl-option value="2">Koichi Sasada</sl-option>
313
+ <sl-divider></sl-divider>
314
+ <small>Default gem maintainers</small>
315
+ <sl-option value="3">Yuki Nishijima</sl-option>
316
+ </sl-select>
317
+ HTML
318
+ end
319
+ end
320
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ require_relative '../../../app/helpers/shoelace/sl_form_helper'
5
+
6
+ class FormBuilderSlRangeTest < ActionView::TestCase
7
+ include Shoelace::SlFormHelper
8
+
9
+ test "#switch_field" do
10
+ sl_form_for(User.new, url: "/") do |form|
11
+ assert_dom_equal <<~HTML, form.switch_field(:name)
12
+ <sl-switch name="user[name]" id="user_name">Name</sl-switch>
13
+ HTML
14
+ end
15
+ end
16
+
17
+ test "#switch_field with an invalid value" do
18
+ yuki = User.new.tap(&:validate)
19
+
20
+ sl_form_for(yuki, url: "/") do |form|
21
+ assert_dom_equal <<~HTML, form.switch_field(:name)
22
+ <sl-switch name="user[name]" id="user_name" data-invalid="" invalid="">Name</sl-switch>
23
+ HTML
24
+ end
25
+ end
26
+ end