simple_form 1.5.2 → 2.0.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.
- data/CHANGELOG.md +234 -0
- data/MIT-LICENSE +1 -1
- data/README.md +816 -0
- data/lib/generators/simple_form/install_generator.rb +15 -1
- data/lib/generators/simple_form/templates/README +12 -0
- data/lib/generators/simple_form/templates/_form.html.erb +2 -2
- data/lib/generators/simple_form/templates/_form.html.haml +2 -2
- data/lib/generators/simple_form/templates/_form.html.slim +4 -4
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb.tt +176 -0
- data/lib/simple_form/action_view_extensions/builder.rb +206 -59
- data/lib/simple_form/action_view_extensions/form_helper.rb +30 -23
- data/lib/simple_form/components/errors.rb +6 -24
- data/lib/simple_form/components/hints.rb +7 -21
- data/lib/simple_form/components/html5.rb +26 -0
- data/lib/simple_form/components/labels.rb +22 -14
- data/lib/simple_form/components/maxlength.rb +41 -0
- data/lib/simple_form/components/min_max.rb +49 -0
- data/lib/simple_form/components/pattern.rb +34 -0
- data/lib/simple_form/components/placeholders.rb +5 -17
- data/lib/simple_form/components/readonly.rb +22 -0
- data/lib/simple_form/components.rb +11 -1
- data/lib/simple_form/core_ext/hash.rb +16 -0
- data/lib/simple_form/error_notification.rb +9 -3
- data/lib/simple_form/form_builder.rb +105 -28
- data/lib/simple_form/helpers/autofocus.rb +11 -0
- data/lib/simple_form/helpers/disabled.rb +15 -0
- data/lib/simple_form/helpers/readonly.rb +15 -0
- data/lib/simple_form/helpers/required.rb +10 -11
- data/lib/simple_form/helpers/validators.rb +4 -4
- data/lib/simple_form/helpers.rb +7 -4
- data/lib/simple_form/inputs/base.rb +53 -81
- data/lib/simple_form/inputs/boolean_input.rb +46 -4
- data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
- data/lib/simple_form/inputs/collection_input.rb +27 -13
- data/lib/simple_form/inputs/collection_radio_buttons_input.rb +67 -0
- data/lib/simple_form/inputs/collection_select_input.rb +14 -0
- data/lib/simple_form/inputs/date_time_input.rb +10 -6
- data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
- data/lib/simple_form/inputs/hidden_input.rb +3 -6
- data/lib/simple_form/inputs/numeric_input.rb +3 -51
- data/lib/simple_form/inputs/password_input.rb +1 -2
- data/lib/simple_form/inputs/priority_input.rb +2 -2
- data/lib/simple_form/inputs/range_input.rb +1 -3
- data/lib/simple_form/inputs/string_input.rb +6 -8
- data/lib/simple_form/inputs/text_input.rb +1 -2
- data/lib/simple_form/inputs.rb +17 -13
- data/lib/simple_form/version.rb +1 -1
- data/lib/simple_form/wrappers/builder.rb +103 -0
- data/lib/simple_form/wrappers/many.rb +69 -0
- data/lib/simple_form/wrappers/root.rb +34 -0
- data/lib/simple_form/wrappers/single.rb +18 -0
- data/lib/simple_form/wrappers.rb +8 -0
- data/lib/simple_form.rb +118 -48
- data/test/action_view_extensions/builder_test.rb +285 -102
- data/test/action_view_extensions/form_helper_test.rb +32 -10
- data/test/components/label_test.rb +44 -5
- data/test/form_builder/association_test.rb +177 -0
- data/test/form_builder/button_test.rb +47 -0
- data/test/{error_notification_test.rb → form_builder/error_notification_test.rb} +18 -1
- data/test/form_builder/error_test.rb +121 -0
- data/test/form_builder/general_test.rb +356 -0
- data/test/form_builder/hint_test.rb +123 -0
- data/test/form_builder/input_field_test.rb +63 -0
- data/test/form_builder/label_test.rb +65 -0
- data/test/form_builder/wrapper_test.rb +149 -0
- data/test/generators/simple_form_generator_test.rb +32 -0
- data/test/inputs/boolean_input_test.rb +101 -0
- data/test/inputs/collection_check_boxes_input_test.rb +224 -0
- data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
- data/test/inputs/collection_select_input_test.rb +241 -0
- data/test/inputs/datetime_input_test.rb +99 -0
- data/test/inputs/disabled_test.rb +38 -0
- data/test/inputs/discovery_test.rb +61 -0
- data/test/inputs/file_input_test.rb +16 -0
- data/test/inputs/general_test.rb +69 -0
- data/test/inputs/grouped_collection_select_input_test.rb +118 -0
- data/test/inputs/hidden_input_test.rb +30 -0
- data/test/inputs/numeric_input_test.rb +167 -0
- data/test/inputs/priority_input_test.rb +43 -0
- data/test/inputs/readonly_test.rb +61 -0
- data/test/inputs/required_test.rb +113 -0
- data/test/inputs/string_input_test.rb +140 -0
- data/test/inputs/text_input_test.rb +24 -0
- data/test/support/misc_helpers.rb +53 -12
- data/test/support/mock_controller.rb +2 -2
- data/test/support/models.rb +20 -5
- data/test/test_helper.rb +11 -12
- metadata +124 -96
- data/.gitignore +0 -3
- data/.gitmodules +0 -3
- data/.travis.yml +0 -15
- data/CHANGELOG.rdoc +0 -159
- data/Gemfile +0 -9
- data/README.rdoc +0 -466
- data/Rakefile +0 -27
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +0 -93
- data/lib/simple_form/components/wrapper.rb +0 -38
- data/lib/simple_form/helpers/has_errors.rb +0 -15
- data/lib/simple_form/helpers/maxlength.rb +0 -24
- data/lib/simple_form/helpers/pattern.rb +0 -28
- data/simple_form.gemspec +0 -25
- data/test/components/error_test.rb +0 -56
- data/test/components/hint_test.rb +0 -74
- data/test/components/wrapper_test.rb +0 -63
- data/test/custom_components.rb +0 -7
- data/test/form_builder_test.rb +0 -930
- data/test/inputs_test.rb +0 -995
- /data/test/{discovery_inputs.rb → support/discovery_inputs.rb} +0 -0
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
module SimpleForm
|
|
2
|
-
module Helpers
|
|
3
|
-
# Helper methods for pattern.
|
|
4
|
-
module Pattern #:nodoc:
|
|
5
|
-
private
|
|
6
|
-
|
|
7
|
-
def add_pattern!
|
|
8
|
-
input_html_options[:pattern] ||= pattern_source if options[:pattern]
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def pattern_source
|
|
12
|
-
if options[:pattern] == true
|
|
13
|
-
if has_validators? && pattern_validator
|
|
14
|
-
pattern_validator.options[:with].source
|
|
15
|
-
else
|
|
16
|
-
raise "Could not find format validator for #{attribute_name}"
|
|
17
|
-
end
|
|
18
|
-
else
|
|
19
|
-
options[:pattern]
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def pattern_validator
|
|
24
|
-
@pattern_validator ||= find_validator(ActiveModel::Validations::FormatValidator)
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
data/simple_form.gemspec
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
-
require "simple_form/version"
|
|
4
|
-
|
|
5
|
-
Gem::Specification.new do |s|
|
|
6
|
-
s.name = "simple_form"
|
|
7
|
-
s.version = SimpleForm::VERSION.dup
|
|
8
|
-
s.platform = Gem::Platform::RUBY
|
|
9
|
-
s.summary = "Forms made easy!"
|
|
10
|
-
s.email = "contact@plataformatec.com.br"
|
|
11
|
-
s.homepage = "http://github.com/plataformatec/simple_form"
|
|
12
|
-
s.description = "Forms made easy!"
|
|
13
|
-
s.authors = ['José Valim', 'Carlos Antônio']
|
|
14
|
-
|
|
15
|
-
s.files = `git ls-files`.split("\n")
|
|
16
|
-
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
-
s.test_files -= Dir["test/support/country_select/**/*"]
|
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
19
|
-
s.require_paths = ["lib"]
|
|
20
|
-
|
|
21
|
-
s.rubyforge_project = "simple_form"
|
|
22
|
-
|
|
23
|
-
s.add_dependency('activemodel', '~> 3.0')
|
|
24
|
-
s.add_dependency('actionpack', '~> 3.0')
|
|
25
|
-
end
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class ErrorTest < ActionView::TestCase
|
|
4
|
-
|
|
5
|
-
def with_error_for(object, attribute_name, type, options={}, &block)
|
|
6
|
-
with_concat_form_for(object) do |f|
|
|
7
|
-
options[:reflection] = Association.new(Company, :company, {}) if options.delete(:setup_association)
|
|
8
|
-
SimpleForm::Inputs::Base.new(f, attribute_name, nil, type, options).error.to_s
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
test 'error should not generate content for attribute without errors' do
|
|
13
|
-
with_error_for @user, :active, :boolean
|
|
14
|
-
assert_no_select 'span.error'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
test 'error should not generate messages when object is not present' do
|
|
18
|
-
with_error_for :project, :name, :string
|
|
19
|
-
assert_no_select 'span.error'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
test "error should not generate messages when object doesn't respond to errors method" do
|
|
23
|
-
@user.instance_eval { undef errors }
|
|
24
|
-
with_error_for @user, :name, :string
|
|
25
|
-
assert_no_select 'span.error'
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
test 'error should generate messages for attribute with single error' do
|
|
29
|
-
with_error_for @user, :name, :string
|
|
30
|
-
assert_select 'span.error', "can't be blank"
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
test 'error should generate messages for attribute with one error when using first' do
|
|
34
|
-
swap SimpleForm, :error_method => :first do
|
|
35
|
-
with_error_for @user, :age, :numeric
|
|
36
|
-
assert_select 'span.error', 'is not a number'
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
test 'error should generate messages for attribute with several errors when using to_sentence' do
|
|
41
|
-
swap SimpleForm, :error_method => :to_sentence do
|
|
42
|
-
with_error_for @user, :age, :numeric
|
|
43
|
-
assert_select 'span.error', 'is not a number and must be greater than 18'
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
test 'error should be able to pass html options' do
|
|
48
|
-
with_error_for @user, :name, :string, :error_html => { :id => 'error', :class => 'yay' }
|
|
49
|
-
assert_select 'span#error.error.yay'
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
test 'error should find errors on attribute and association' do
|
|
53
|
-
with_error_for @user, :company_id, :select, :setup_association => true, :error_method => :to_sentence
|
|
54
|
-
assert_select 'span.error', 'must be valid and company must be present'
|
|
55
|
-
end
|
|
56
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class HintTest < ActionView::TestCase
|
|
4
|
-
|
|
5
|
-
def with_hint_for(object, attribute_name, type, options={}, &block)
|
|
6
|
-
with_concat_form_for(object) do |f|
|
|
7
|
-
options[:reflection] = Association.new(Company, :company, {}) if options.delete(:setup_association)
|
|
8
|
-
SimpleForm::Inputs::Base.new(f, attribute_name, nil, type, options).hint.to_s
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
test 'hint should not be generated by default' do
|
|
13
|
-
with_hint_for @user, :name, :string
|
|
14
|
-
assert_no_select 'span.hint'
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
test 'hint should be generated with input text' do
|
|
18
|
-
with_hint_for @user, :name, :string, :hint => 'Use with care...'
|
|
19
|
-
assert_select 'span.hint', 'Use with care...'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
test 'hint uses the current component tag set' do
|
|
23
|
-
swap SimpleForm, :hint_tag => :p do
|
|
24
|
-
with_hint_for @user, :name, :string, :hint => 'Use with care...'
|
|
25
|
-
assert_select 'p.hint', 'Use with care...'
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
test 'hint should use i18n based on model, action, and attribute to lookup translation' do
|
|
30
|
-
store_translations(:en, :simple_form => { :hints => { :user => {
|
|
31
|
-
:edit => { :name => 'Content of this input will be truncated...' }
|
|
32
|
-
} } }) do
|
|
33
|
-
with_hint_for @user, :name, :string
|
|
34
|
-
assert_select 'span.hint', 'Content of this input will be truncated...'
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
test 'hint should use i18n with model and attribute to lookup translation' do
|
|
39
|
-
store_translations(:en, :simple_form => { :hints => { :user => {
|
|
40
|
-
:name => 'Content of this input will be capitalized...'
|
|
41
|
-
} } }) do
|
|
42
|
-
with_hint_for @user, :name, :string
|
|
43
|
-
assert_select 'span.hint', 'Content of this input will be capitalized...'
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
test 'hint should use i18n just with attribute to lookup translation' do
|
|
48
|
-
store_translations(:en, :simple_form => { :hints => {
|
|
49
|
-
:name => 'Content of this input will be downcased...'
|
|
50
|
-
} }) do
|
|
51
|
-
with_hint_for @user, :name, :string
|
|
52
|
-
assert_select 'span.hint', 'Content of this input will be downcased...'
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
test 'hint should use i18n with lookup for association name' do
|
|
57
|
-
store_translations(:en, :simple_form => { :hints => {
|
|
58
|
-
:user => { :company => 'My company!' }
|
|
59
|
-
} } ) do
|
|
60
|
-
with_hint_for @user, :company_id, :string, :setup_association => true
|
|
61
|
-
assert_select 'span.hint', /My company!/
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
test 'hint should generate properly when object is not present' do
|
|
66
|
-
with_hint_for :project, :name, :string, :hint => 'Test without object'
|
|
67
|
-
assert_select 'span.hint', 'Test without object'
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
test 'hint should be able to pass html options' do
|
|
71
|
-
with_hint_for @user, :name, :string, :hint => 'Yay!', :hint_html => { :id => 'hint', :class => 'yay' }
|
|
72
|
-
assert_select 'span#hint.hint.yay'
|
|
73
|
-
end
|
|
74
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
|
|
3
|
-
class WrapperTest < ActionView::TestCase
|
|
4
|
-
def with_error_for(object, attribute_name, &block)
|
|
5
|
-
with_concat_form_for(object) do |f|
|
|
6
|
-
f.input attribute_name
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def with_form_for(object, *args, &block)
|
|
11
|
-
with_concat_form_for(object) do |f|
|
|
12
|
-
f.input(*args, &block)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
test 'wrapper should not have error class for attribute without errors' do
|
|
17
|
-
with_error_for @user, :active
|
|
18
|
-
assert_no_select 'div.field_with_errors'
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
test 'wrapper should not have error class when object is not present' do
|
|
22
|
-
with_error_for :project, :name
|
|
23
|
-
assert_no_select 'div.field_with_errors'
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
test 'wrapper should add error class for attribute with errors' do
|
|
27
|
-
with_error_for @user, :name
|
|
28
|
-
assert_select 'div.field_with_errors'
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
test 'wrapper should add chosen error class for attribute with errors' do
|
|
32
|
-
swap SimpleForm, :wrapper_error_class => "omgError" do
|
|
33
|
-
with_error_for @user, :name
|
|
34
|
-
assert_select 'div.omgError'
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
test 'wrapper should add chosen wrapper class' do
|
|
39
|
-
swap SimpleForm, :wrapper_class => "wrapper" do
|
|
40
|
-
with_form_for @user, :active
|
|
41
|
-
assert_select 'div.wrapper'
|
|
42
|
-
assert_no_select 'div.input'
|
|
43
|
-
|
|
44
|
-
with_form_for @user, :name
|
|
45
|
-
assert_select 'div.wrapper'
|
|
46
|
-
assert_no_select 'div.input'
|
|
47
|
-
|
|
48
|
-
with_form_for :project, :name
|
|
49
|
-
assert_select 'div.wrapper'
|
|
50
|
-
assert_no_select 'div.input'
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
test 'wrapper should not have disabled class by default' do
|
|
55
|
-
with_form_for @user, :active
|
|
56
|
-
assert_no_select 'div.disabled'
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
test 'wrapper should add disabled class when the input is disabled' do
|
|
60
|
-
with_form_for @user, :active, :disabled => true
|
|
61
|
-
assert_select 'div.disabled'
|
|
62
|
-
end
|
|
63
|
-
end
|