simple_form_awesome 2.2.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 +327 -0
- data/MIT-LICENSE +20 -0
- data/README.md +25 -0
- data/lib/generators/simple_form/USAGE +3 -0
- data/lib/generators/simple_form/install_generator.rb +48 -0
- data/lib/generators/simple_form/templates/AUI_README +19 -0
- data/lib/generators/simple_form/templates/README +12 -0
- data/lib/generators/simple_form/templates/_form.html.erb +13 -0
- data/lib/generators/simple_form/templates/_form.html.haml +10 -0
- data/lib/generators/simple_form/templates/_form.html.slim +10 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +142 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form_aui.rb +21 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +45 -0
- data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +26 -0
- data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +26 -0
- data/lib/simple_form/action_view_extensions/builder.rb +340 -0
- data/lib/simple_form/action_view_extensions/form_helper.rb +72 -0
- data/lib/simple_form/components/errors.rb +35 -0
- data/lib/simple_form/components/hints.rb +18 -0
- data/lib/simple_form/components/html5.rb +26 -0
- data/lib/simple_form/components/label_input.rb +15 -0
- data/lib/simple_form/components/labels.rb +79 -0
- data/lib/simple_form/components/maxlength.rb +41 -0
- data/lib/simple_form/components/min_max.rb +50 -0
- data/lib/simple_form/components/pattern.rb +34 -0
- data/lib/simple_form/components/placeholders.rb +16 -0
- data/lib/simple_form/components/readonly.rb +22 -0
- data/lib/simple_form/components.rb +20 -0
- data/lib/simple_form/core_ext/hash.rb +16 -0
- data/lib/simple_form/error_notification.rb +48 -0
- data/lib/simple_form/form_builder.rb +482 -0
- 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 +35 -0
- data/lib/simple_form/helpers/validators.rb +44 -0
- data/lib/simple_form/helpers.rb +12 -0
- data/lib/simple_form/i18n_cache.rb +22 -0
- data/lib/simple_form/inputs/aui_string_input.rb +10 -0
- data/lib/simple_form/inputs/base.rb +184 -0
- data/lib/simple_form/inputs/block_input.rb +14 -0
- data/lib/simple_form/inputs/boolean_input.rb +78 -0
- data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
- data/lib/simple_form/inputs/collection_input.rb +101 -0
- data/lib/simple_form/inputs/collection_radio_buttons_input.rb +63 -0
- data/lib/simple_form/inputs/collection_select_input.rb +14 -0
- data/lib/simple_form/inputs/date_time_input.rb +28 -0
- data/lib/simple_form/inputs/file_input.rb +9 -0
- data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
- data/lib/simple_form/inputs/hidden_input.rb +17 -0
- data/lib/simple_form/inputs/numeric_input.rb +24 -0
- data/lib/simple_form/inputs/password_input.rb +12 -0
- data/lib/simple_form/inputs/priority_input.rb +24 -0
- data/lib/simple_form/inputs/range_input.rb +14 -0
- data/lib/simple_form/inputs/string_input.rb +23 -0
- data/lib/simple_form/inputs/text_area_input.rb +12 -0
- data/lib/simple_form/inputs/text_input.rb +11 -0
- data/lib/simple_form/inputs.rb +23 -0
- data/lib/simple_form/map_type.rb +16 -0
- data/lib/simple_form/version.rb +3 -0
- data/lib/simple_form/wrappers/builder.rb +103 -0
- data/lib/simple_form/wrappers/many.rb +73 -0
- data/lib/simple_form/wrappers/root.rb +36 -0
- data/lib/simple_form/wrappers/single.rb +24 -0
- data/lib/simple_form/wrappers.rb +8 -0
- data/lib/simple_form.rb +221 -0
- data/test/action_view_extensions/builder_test.rb +583 -0
- data/test/action_view_extensions/form_helper_test.rb +143 -0
- data/test/components/label_test.rb +327 -0
- data/test/form_builder/association_test.rb +186 -0
- data/test/form_builder/button_test.rb +47 -0
- data/test/form_builder/error_notification_test.rb +79 -0
- data/test/form_builder/error_test.rb +121 -0
- data/test/form_builder/general_test.rb +402 -0
- data/test/form_builder/hint_test.rb +138 -0
- data/test/form_builder/input_field_test.rb +63 -0
- data/test/form_builder/label_test.rb +71 -0
- data/test/form_builder/wrapper_test.rb +203 -0
- data/test/generators/simple_form_generator_test.rb +42 -0
- data/test/inputs/boolean_input_test.rb +140 -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 +78 -0
- data/test/inputs/discovery_test.rb +69 -0
- data/test/inputs/file_input_test.rb +16 -0
- data/test/inputs/general_test.rb +116 -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 +173 -0
- data/test/inputs/priority_input_test.rb +43 -0
- data/test/inputs/readonly_test.rb +101 -0
- data/test/inputs/required_test.rb +113 -0
- data/test/inputs/string_input_test.rb +146 -0
- data/test/inputs/text_input_test.rb +24 -0
- data/test/simple_form_test.rb +9 -0
- data/test/support/discovery_inputs.rb +27 -0
- data/test/support/misc_helpers.rb +138 -0
- data/test/support/mock_controller.rb +24 -0
- data/test/support/models.rb +216 -0
- data/test/test_helper.rb +95 -0
- metadata +217 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Components
|
3
|
+
# Needs to be enabled in order to do automatic lookups.
|
4
|
+
module Maxlength
|
5
|
+
def maxlength
|
6
|
+
input_html_options[:maxlength] ||= maximum_length_from_validation || limit
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def maximum_length_from_validation
|
13
|
+
maxlength = options[:maxlength]
|
14
|
+
if maxlength.is_a?(String) || maxlength.is_a?(Integer)
|
15
|
+
maxlength
|
16
|
+
else
|
17
|
+
length_validator = find_length_validator
|
18
|
+
|
19
|
+
if length_validator && !has_tokenizer?(length_validator)
|
20
|
+
length_validator.options[:is] || length_validator.options[:maximum]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_length_validator
|
26
|
+
find_validator(:length)
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_tokenizer?(length_validator)
|
30
|
+
tokenizer = length_validator.options[:tokenizer]
|
31
|
+
|
32
|
+
# TODO: Remove this check when we drop Rails 3.0 support
|
33
|
+
if ActiveModel::Validations::LengthValidator.const_defined?(:DEFAULT_TOKENIZER)
|
34
|
+
tokenizer && tokenizer != ActiveModel::Validations::LengthValidator::DEFAULT_TOKENIZER
|
35
|
+
else
|
36
|
+
tokenizer
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Components
|
3
|
+
module MinMax
|
4
|
+
def min_max
|
5
|
+
if numeric_validator = find_numericality_validator
|
6
|
+
validator_options = numeric_validator.options
|
7
|
+
input_html_options[:min] ||= minimum_value(validator_options)
|
8
|
+
input_html_options[:max] ||= maximum_value(validator_options)
|
9
|
+
end
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def integer?
|
16
|
+
input_type == :integer
|
17
|
+
end
|
18
|
+
|
19
|
+
def minimum_value(validator_options)
|
20
|
+
if integer? && validator_options.key?(:greater_than)
|
21
|
+
evaluate_numericality_validator_option(validator_options[:greater_than]) + 1
|
22
|
+
else
|
23
|
+
evaluate_numericality_validator_option(validator_options[:greater_than_or_equal_to])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def maximum_value(validator_options)
|
28
|
+
if integer? && validator_options.key?(:less_than)
|
29
|
+
evaluate_numericality_validator_option(validator_options[:less_than]) - 1
|
30
|
+
else
|
31
|
+
evaluate_numericality_validator_option(validator_options[:less_than_or_equal_to])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_numericality_validator
|
36
|
+
find_validator(:numericality)
|
37
|
+
end
|
38
|
+
|
39
|
+
def evaluate_numericality_validator_option(option)
|
40
|
+
if option.is_a?(Numeric)
|
41
|
+
option
|
42
|
+
elsif option.is_a?(Symbol)
|
43
|
+
object.send(option)
|
44
|
+
elsif option.respond_to?(:call)
|
45
|
+
option.call(object)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Components
|
3
|
+
# Needs to be enabled in order to do automatic lookups.
|
4
|
+
module Pattern
|
5
|
+
def pattern
|
6
|
+
input_html_options[:pattern] ||= pattern_source
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def pattern_source
|
13
|
+
pattern = options[:pattern]
|
14
|
+
if pattern.is_a?(String)
|
15
|
+
pattern
|
16
|
+
elsif pattern_validator = find_pattern_validator
|
17
|
+
evaluate_format_validator_option(pattern_validator.options[:with]).source
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_pattern_validator
|
22
|
+
find_validator(:format)
|
23
|
+
end
|
24
|
+
|
25
|
+
def evaluate_format_validator_option(option)
|
26
|
+
if option.respond_to?(:call)
|
27
|
+
option.call(object)
|
28
|
+
else
|
29
|
+
option
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Components
|
3
|
+
# Needs to be enabled in order to do automatic lookups.
|
4
|
+
module Placeholders
|
5
|
+
def placeholder
|
6
|
+
input_html_options[:placeholder] ||= placeholder_text
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def placeholder_text
|
11
|
+
placeholder = options[:placeholder]
|
12
|
+
placeholder.is_a?(String) ? placeholder : translate(:placeholders)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Components
|
3
|
+
# Needs to be enabled in order to do automatic lookups.
|
4
|
+
module Readonly
|
5
|
+
def readonly
|
6
|
+
if readonly_attribute? && !has_readonly?
|
7
|
+
input_html_options[:readonly] ||= true
|
8
|
+
input_html_classes << :readonly
|
9
|
+
end
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def readonly_attribute?
|
16
|
+
object.class.respond_to?(:readonly_attributes) &&
|
17
|
+
object.persisted? &&
|
18
|
+
object.class.readonly_attributes.include?(attribute_name.to_s)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
# Components are a special type of helpers that can work on their own.
|
3
|
+
# For example, by using a component, it will automatically change the
|
4
|
+
# output under given circumstances without user input. For example,
|
5
|
+
# the disabled helper always need a :disabled => true option given
|
6
|
+
# to the input in order to be enabled. On the other hand, things like
|
7
|
+
# hints can generate output automatically by doing I18n lookups.
|
8
|
+
module Components
|
9
|
+
autoload :Errors, 'simple_form/components/errors'
|
10
|
+
autoload :Hints, 'simple_form/components/hints'
|
11
|
+
autoload :HTML5, 'simple_form/components/html5'
|
12
|
+
autoload :LabelInput, 'simple_form/components/label_input'
|
13
|
+
autoload :Labels, 'simple_form/components/labels'
|
14
|
+
autoload :MinMax, 'simple_form/components/min_max'
|
15
|
+
autoload :Maxlength, 'simple_form/components/maxlength'
|
16
|
+
autoload :Pattern, 'simple_form/components/pattern'
|
17
|
+
autoload :Placeholders, 'simple_form/components/placeholders'
|
18
|
+
autoload :Readonly, 'simple_form/components/readonly'
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# TODO: Delete this file when we drop support for Rails 3.0
|
2
|
+
# This method is already implemented in active_support 3.1
|
3
|
+
|
4
|
+
unless Hash.new.respond_to?(:deep_dup)
|
5
|
+
class Hash
|
6
|
+
# Returns a deep copy of hash.
|
7
|
+
def deep_dup
|
8
|
+
duplicate = self.dup
|
9
|
+
duplicate.each_pair do |k,v|
|
10
|
+
tv = duplicate[k]
|
11
|
+
duplicate[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_dup : v
|
12
|
+
end
|
13
|
+
duplicate
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
class ErrorNotification
|
3
|
+
delegate :object, :object_name, :template, :to => :@builder
|
4
|
+
|
5
|
+
def initialize(builder, options)
|
6
|
+
@builder = builder
|
7
|
+
@message = options.delete(:message)
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def render
|
12
|
+
if has_errors?
|
13
|
+
template.content_tag(error_notification_tag, error_message, html_options)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def errors
|
20
|
+
object.errors
|
21
|
+
end
|
22
|
+
|
23
|
+
def has_errors?
|
24
|
+
object && object.respond_to?(:errors) && errors.present?
|
25
|
+
end
|
26
|
+
|
27
|
+
def error_message
|
28
|
+
(@message || translate_error_notification).html_safe
|
29
|
+
end
|
30
|
+
|
31
|
+
def error_notification_tag
|
32
|
+
SimpleForm.error_notification_tag
|
33
|
+
end
|
34
|
+
|
35
|
+
def html_options
|
36
|
+
@options[:class] = "#{SimpleForm.error_notification_class} #{@options[:class]}".strip
|
37
|
+
@options
|
38
|
+
end
|
39
|
+
|
40
|
+
def translate_error_notification
|
41
|
+
lookups = []
|
42
|
+
lookups << :"#{object_name}"
|
43
|
+
lookups << :default_message
|
44
|
+
lookups << "Please review the problems below:"
|
45
|
+
I18n.t(lookups.shift, :scope => :"simple_form.error_notification", :default => lookups)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|