simple_form 3.5.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of simple_form might be problematic. Click here for more details.

@@ -249,6 +249,15 @@ class IsolatedLabelTest < ActionView::TestCase
249
249
  end
250
250
  end
251
251
 
252
+ test 'label uses custom i18n scope to find required text' do
253
+ store_translations(:en, my_scope: { required: { text: 'Pflichtfeld' } }) do
254
+ swap SimpleForm, i18n_scope: :my_scope do
255
+ with_label_for @user, :name, :string
256
+ assert_select 'form label abbr[title="Pflichtfeld"]', '*'
257
+ end
258
+ end
259
+ end
260
+
252
261
  test 'label uses i18n to find required mark' do
253
262
  store_translations(:en, simple_form: { required: { mark: '*-*' } }) do
254
263
  with_label_for @user, :name, :string
@@ -256,6 +265,15 @@ class IsolatedLabelTest < ActionView::TestCase
256
265
  end
257
266
  end
258
267
 
268
+ test 'label uses custom i18n scope to find required mark' do
269
+ store_translations(:en, my_scope: { required: { mark: '!!' } }) do
270
+ swap SimpleForm, i18n_scope: :my_scope do
271
+ with_label_for @user, :name, :string
272
+ assert_select 'form label abbr', '!!'
273
+ end
274
+ end
275
+ end
276
+
259
277
  test 'label uses i18n to find required string tag' do
260
278
  store_translations(:en, simple_form: { required: { html: '<span class="required" title="requerido">*</span>' } }) do
261
279
  with_label_for @user, :name, :string
@@ -264,6 +282,16 @@ class IsolatedLabelTest < ActionView::TestCase
264
282
  end
265
283
  end
266
284
 
285
+ test 'label uses custom i18n scope to find required string tag' do
286
+ store_translations(:en, my_scope: { required: { html: '<span class="mandatory" title="Pflichtfeld">!!</span>' } }) do
287
+ swap SimpleForm, i18n_scope: :my_scope do
288
+ with_label_for @user, :name, :string
289
+ assert_no_select 'form label abbr'
290
+ assert_select 'form label span.mandatory[title=Pflichtfeld]', '!!'
291
+ end
292
+ end
293
+ end
294
+
267
295
  test 'label allows overwriting input id' do
268
296
  with_label_for @user, :name, :string, input_html: { id: 'my_new_id' }
269
297
  assert_select 'label[for=my_new_id]'
@@ -142,6 +142,24 @@ class FormBuilderTest < ActionView::TestCase
142
142
  assert_select 'form input#user_description.string'
143
143
  end
144
144
 
145
+ test 'builder generates text areas for hstore columns' do
146
+ with_form_for @user, :hstore
147
+ assert_no_select 'form input#user_hstore.string'
148
+ assert_select 'form textarea#user_hstore.text'
149
+ end
150
+
151
+ test 'builder generates text areas for json columns' do
152
+ with_form_for @user, :json
153
+ assert_no_select 'form input#user_json.string'
154
+ assert_select 'form textarea#user_json.text'
155
+ end
156
+
157
+ test 'builder generates text areas for jsonb columns' do
158
+ with_form_for @user, :jsonb
159
+ assert_no_select 'form input#user_jsonb.string'
160
+ assert_select 'form textarea#user_jsonb.text'
161
+ end
162
+
145
163
  test 'builder generates a checkbox for boolean columns' do
146
164
  with_form_for @user, :active
147
165
  assert_select 'form input[type=checkbox]#user_active.boolean'
@@ -166,6 +184,11 @@ class FormBuilderTest < ActionView::TestCase
166
184
  end
167
185
  end
168
186
 
187
+ test 'builder generates string fields for citext columns' do
188
+ with_form_for @user, :citext
189
+ assert_select 'form input#user_citext.string'
190
+ end
191
+
169
192
  test 'builder generates password fields for columns that matches password' do
170
193
  with_form_for @user, :password
171
194
  assert_select 'form input#user_password.password'
@@ -219,6 +242,16 @@ class FormBuilderTest < ActionView::TestCase
219
242
  test 'builder generates file for file columns' do
220
243
  @user.avatar = MiniTest::Mock.new
221
244
  @user.avatar.expect(:public_filename, true)
245
+ @user.avatar.expect(:!, false)
246
+
247
+ with_form_for @user, :avatar
248
+ assert_select 'form input#user_avatar.file'
249
+ end
250
+
251
+ test 'builder generates file for activestorage entries' do
252
+ @user.avatar = MiniTest::Mock.new
253
+ @user.avatar.expect(:attached?, false)
254
+ @user.avatar.expect(:!, false)
222
255
 
223
256
  with_form_for @user, :avatar
224
257
  assert_select 'form input#user_avatar.file'
@@ -227,6 +260,7 @@ class FormBuilderTest < ActionView::TestCase
227
260
  test 'builder generates file for attributes that are real db columns but have file methods' do
228
261
  @user.home_picture = MiniTest::Mock.new
229
262
  @user.home_picture.expect(:mounted_as, true)
263
+ @user.home_picture.expect(:!, false)
230
264
 
231
265
  with_form_for @user, :home_picture
232
266
  assert_select 'form input#user_home_picture.file'
@@ -173,4 +173,29 @@ class InputFieldTest < ActionView::TestCase
173
173
  assert_select 'input[readonly="readonly"]'
174
174
  end
175
175
  end
176
+
177
+ test 'adds valid class to input_field when it is configured' do
178
+ swap SimpleForm, input_field_valid_class: 'is-valid' do
179
+ @user.instance_eval { undef errors }
180
+ with_input_field_for @user, :name
181
+
182
+ assert_select 'input.string.required.is-valid'
183
+ end
184
+ end
185
+
186
+ test 'adds error class to input_field when it is configured' do
187
+ swap SimpleForm, input_field_error_class: 'is-invalid' do
188
+ with_input_field_for @user, :name
189
+
190
+ assert_select 'input.string.required.is-invalid'
191
+ end
192
+ end
193
+
194
+ test 'does not add validation classes to input_field when it is not configured' do
195
+ swap SimpleForm, input_field_error_class: nil, input_field_valid_class: nil do
196
+ with_input_field_for @user, :name
197
+
198
+ assert_select 'input.string.required'
199
+ end
200
+ end
176
201
  end
@@ -38,6 +38,27 @@ class WrapperTest < ActionView::TestCase
38
38
  assert_select 'div.field_with_errors'
39
39
  end
40
40
 
41
+ test 'wrapper adds error class to input for attribute with errors' do
42
+ with_form_for @user, :name, wrapper: custom_wrapper_with_input_error_class
43
+ assert_select 'div.field_with_errors'
44
+ assert_select 'input.is-invalid'
45
+ end
46
+
47
+ test 'wrapper does not add error class to input when the attribute is valid' do
48
+ with_form_for @user, :phone_number, wrapper: custom_wrapper_with_input_error_class
49
+ assert_no_select 'div.field_with_errors'
50
+ assert_no_select 'input.is-invalid'
51
+ end
52
+
53
+ test 'wrapper adds valid class for present attribute without errors' do
54
+ @user.instance_eval { undef errors }
55
+ with_form_for @user, :name, wrapper: custom_wrapper_with_input_valid_class
56
+ assert_select 'div.field_without_errors'
57
+ assert_select 'input.is-valid'
58
+ assert_no_select 'div.field_with_errors'
59
+ assert_no_select 'input.is-invalid'
60
+ end
61
+
41
62
  test 'wrapper adds hint class for attribute with a hint' do
42
63
  with_form_for @user, :name, hint: 'hint'
43
64
  assert_select 'div.field_with_hint'
@@ -264,8 +285,6 @@ class WrapperTest < ActionView::TestCase
264
285
  end
265
286
 
266
287
  test "input with aria attributes will merge with wrapper_options' aria" do
267
- skip unless ActionPack::VERSION::MAJOR == '4' && ActionPack::VERSION::MINOR >= '2'
268
-
269
288
  swap_wrapper :default, custom_wrapper_with_input_aria_modal do
270
289
  with_concat_form_for @user do |f|
271
290
  concat f.input :name, input_html: { aria: { modal: 'another-aria', target: 'merge-aria' } }
@@ -206,6 +206,20 @@ module MiscHelpers
206
206
  end
207
207
  end
208
208
 
209
+ def custom_wrapper_with_input_error_class
210
+ SimpleForm.build tag: :div, class: "custom_wrapper", error_class: :field_with_errors do |b|
211
+ b.use :label
212
+ b.use :input, class: 'inline-class', error_class: 'is-invalid'
213
+ end
214
+ end
215
+
216
+ def custom_wrapper_with_input_valid_class
217
+ SimpleForm.build tag: :div, class: "custom_wrapper", valid_class: :field_without_errors do |b|
218
+ b.use :label
219
+ b.use :input, class: 'inline-class', valid_class: 'is-valid'
220
+ end
221
+ end
222
+
209
223
  def custom_form_for(object, *args, &block)
210
224
  simple_form_for(object, *args, { builder: CustomFormBuilder }, &block)
211
225
  end
@@ -90,7 +90,8 @@ class User
90
90
  :avatar, :home_picture, :email, :status, :residence_country, :phone_number,
91
91
  :post_count, :lock_version, :amount, :attempts, :action, :credit_card, :gender,
92
92
  :extra_special_company_id, :pictures, :picture_ids, :special_pictures,
93
- :special_picture_ids, :uuid, :friends, :friend_ids, :special_tags, :special_tag_ids
93
+ :special_picture_ids, :uuid, :friends, :friend_ids, :special_tags, :special_tag_ids,
94
+ :citext, :hstore, :json, :jsonb
94
95
 
95
96
  def self.build(extra_attributes = {})
96
97
  attributes = {
@@ -141,7 +142,7 @@ class User
141
142
  when :attempts then :integer
142
143
  when :action then :string
143
144
  when :credit_card then :string
144
- when :uuid then :uuid
145
+ else attribute.to_sym
145
146
  end
146
147
  Column.new(attribute, column_type, limit)
147
148
  end
@@ -175,6 +176,10 @@ class User
175
176
  when 'action' then :string
176
177
  when 'credit_card' then :string
177
178
  when 'uuid' then :string
179
+ when 'citext' then :string
180
+ when 'hstore' then [:text, 200]
181
+ when 'json' then [:text, 200]
182
+ when 'jsonb' then [:text, 200]
178
183
  end
179
184
 
180
185
  ActiveModel::Type.lookup(column_type, limit: limit)
@@ -187,7 +192,8 @@ class User
187
192
  when :name, :status, :password, :description, :age,
188
193
  :credit_limit, :active, :born_at, :delivery_time,
189
194
  :created_at, :updated_at, :lock_version, :home_picture,
190
- :amount, :attempts, :action, :credit_card, :uuid then true
195
+ :amount, :attempts, :action, :credit_card, :uuid,
196
+ :citext, :hstore, :json, :jsonb then true
191
197
  else false
192
198
  end
193
199
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-02-15 00:00:00.000000000 Z
13
+ date: 2018-04-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -19,9 +19,6 @@ dependencies:
19
19
  - - ">"
20
20
  - !ruby/object:Gem::Version
21
21
  version: '4'
22
- - - "<"
23
- - !ruby/object:Gem::Version
24
- version: '5.2'
25
22
  type: :runtime
26
23
  prerelease: false
27
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,9 +26,6 @@ dependencies:
29
26
  - - ">"
30
27
  - !ruby/object:Gem::Version
31
28
  version: '4'
32
- - - "<"
33
- - !ruby/object:Gem::Version
34
- version: '5.2'
35
29
  - !ruby/object:Gem::Dependency
36
30
  name: actionpack
37
31
  requirement: !ruby/object:Gem::Requirement
@@ -39,9 +33,6 @@ dependencies:
39
33
  - - ">"
40
34
  - !ruby/object:Gem::Version
41
35
  version: '4'
42
- - - "<"
43
- - !ruby/object:Gem::Version
44
- version: '5.2'
45
36
  type: :runtime
46
37
  prerelease: false
47
38
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,9 +40,6 @@ dependencies:
49
40
  - - ">"
50
41
  - !ruby/object:Gem::Version
51
42
  version: '4'
52
- - - "<"
53
- - !ruby/object:Gem::Version
54
- version: '5.2'
55
43
  description: Forms made easy!
56
44
  email: opensource@plataformatec.com.br
57
45
  executables: []
@@ -125,6 +113,7 @@ files:
125
113
  - lib/simple_form/wrappers/single.rb
126
114
  - test/action_view_extensions/builder_test.rb
127
115
  - test/action_view_extensions/form_helper_test.rb
116
+ - test/components/custom_components_test.rb
128
117
  - test/components/label_test.rb
129
118
  - test/form_builder/association_test.rb
130
119
  - test/form_builder/button_test.rb
@@ -186,6 +175,7 @@ summary: Forms made easy!
186
175
  test_files:
187
176
  - test/action_view_extensions/builder_test.rb
188
177
  - test/action_view_extensions/form_helper_test.rb
178
+ - test/components/custom_components_test.rb
189
179
  - test/components/label_test.rb
190
180
  - test/form_builder/association_test.rb
191
181
  - test/form_builder/button_test.rb