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.
Files changed (103) hide show
  1. data/CHANGELOG.md +327 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +25 -0
  4. data/lib/generators/simple_form/USAGE +3 -0
  5. data/lib/generators/simple_form/install_generator.rb +48 -0
  6. data/lib/generators/simple_form/templates/AUI_README +19 -0
  7. data/lib/generators/simple_form/templates/README +12 -0
  8. data/lib/generators/simple_form/templates/_form.html.erb +13 -0
  9. data/lib/generators/simple_form/templates/_form.html.haml +10 -0
  10. data/lib/generators/simple_form/templates/_form.html.slim +10 -0
  11. data/lib/generators/simple_form/templates/config/initializers/simple_form.rb +142 -0
  12. data/lib/generators/simple_form/templates/config/initializers/simple_form_aui.rb +21 -0
  13. data/lib/generators/simple_form/templates/config/initializers/simple_form_bootstrap.rb +45 -0
  14. data/lib/generators/simple_form/templates/config/initializers/simple_form_foundation.rb +26 -0
  15. data/lib/generators/simple_form/templates/config/locales/simple_form.en.yml +26 -0
  16. data/lib/simple_form/action_view_extensions/builder.rb +340 -0
  17. data/lib/simple_form/action_view_extensions/form_helper.rb +72 -0
  18. data/lib/simple_form/components/errors.rb +35 -0
  19. data/lib/simple_form/components/hints.rb +18 -0
  20. data/lib/simple_form/components/html5.rb +26 -0
  21. data/lib/simple_form/components/label_input.rb +15 -0
  22. data/lib/simple_form/components/labels.rb +79 -0
  23. data/lib/simple_form/components/maxlength.rb +41 -0
  24. data/lib/simple_form/components/min_max.rb +50 -0
  25. data/lib/simple_form/components/pattern.rb +34 -0
  26. data/lib/simple_form/components/placeholders.rb +16 -0
  27. data/lib/simple_form/components/readonly.rb +22 -0
  28. data/lib/simple_form/components.rb +20 -0
  29. data/lib/simple_form/core_ext/hash.rb +16 -0
  30. data/lib/simple_form/error_notification.rb +48 -0
  31. data/lib/simple_form/form_builder.rb +482 -0
  32. data/lib/simple_form/helpers/autofocus.rb +11 -0
  33. data/lib/simple_form/helpers/disabled.rb +15 -0
  34. data/lib/simple_form/helpers/readonly.rb +15 -0
  35. data/lib/simple_form/helpers/required.rb +35 -0
  36. data/lib/simple_form/helpers/validators.rb +44 -0
  37. data/lib/simple_form/helpers.rb +12 -0
  38. data/lib/simple_form/i18n_cache.rb +22 -0
  39. data/lib/simple_form/inputs/aui_string_input.rb +10 -0
  40. data/lib/simple_form/inputs/base.rb +184 -0
  41. data/lib/simple_form/inputs/block_input.rb +14 -0
  42. data/lib/simple_form/inputs/boolean_input.rb +78 -0
  43. data/lib/simple_form/inputs/collection_check_boxes_input.rb +21 -0
  44. data/lib/simple_form/inputs/collection_input.rb +101 -0
  45. data/lib/simple_form/inputs/collection_radio_buttons_input.rb +63 -0
  46. data/lib/simple_form/inputs/collection_select_input.rb +14 -0
  47. data/lib/simple_form/inputs/date_time_input.rb +28 -0
  48. data/lib/simple_form/inputs/file_input.rb +9 -0
  49. data/lib/simple_form/inputs/grouped_collection_select_input.rb +41 -0
  50. data/lib/simple_form/inputs/hidden_input.rb +17 -0
  51. data/lib/simple_form/inputs/numeric_input.rb +24 -0
  52. data/lib/simple_form/inputs/password_input.rb +12 -0
  53. data/lib/simple_form/inputs/priority_input.rb +24 -0
  54. data/lib/simple_form/inputs/range_input.rb +14 -0
  55. data/lib/simple_form/inputs/string_input.rb +23 -0
  56. data/lib/simple_form/inputs/text_area_input.rb +12 -0
  57. data/lib/simple_form/inputs/text_input.rb +11 -0
  58. data/lib/simple_form/inputs.rb +23 -0
  59. data/lib/simple_form/map_type.rb +16 -0
  60. data/lib/simple_form/version.rb +3 -0
  61. data/lib/simple_form/wrappers/builder.rb +103 -0
  62. data/lib/simple_form/wrappers/many.rb +73 -0
  63. data/lib/simple_form/wrappers/root.rb +36 -0
  64. data/lib/simple_form/wrappers/single.rb +24 -0
  65. data/lib/simple_form/wrappers.rb +8 -0
  66. data/lib/simple_form.rb +221 -0
  67. data/test/action_view_extensions/builder_test.rb +583 -0
  68. data/test/action_view_extensions/form_helper_test.rb +143 -0
  69. data/test/components/label_test.rb +327 -0
  70. data/test/form_builder/association_test.rb +186 -0
  71. data/test/form_builder/button_test.rb +47 -0
  72. data/test/form_builder/error_notification_test.rb +79 -0
  73. data/test/form_builder/error_test.rb +121 -0
  74. data/test/form_builder/general_test.rb +402 -0
  75. data/test/form_builder/hint_test.rb +138 -0
  76. data/test/form_builder/input_field_test.rb +63 -0
  77. data/test/form_builder/label_test.rb +71 -0
  78. data/test/form_builder/wrapper_test.rb +203 -0
  79. data/test/generators/simple_form_generator_test.rb +42 -0
  80. data/test/inputs/boolean_input_test.rb +140 -0
  81. data/test/inputs/collection_check_boxes_input_test.rb +224 -0
  82. data/test/inputs/collection_radio_buttons_input_test.rb +326 -0
  83. data/test/inputs/collection_select_input_test.rb +241 -0
  84. data/test/inputs/datetime_input_test.rb +99 -0
  85. data/test/inputs/disabled_test.rb +78 -0
  86. data/test/inputs/discovery_test.rb +69 -0
  87. data/test/inputs/file_input_test.rb +16 -0
  88. data/test/inputs/general_test.rb +116 -0
  89. data/test/inputs/grouped_collection_select_input_test.rb +118 -0
  90. data/test/inputs/hidden_input_test.rb +30 -0
  91. data/test/inputs/numeric_input_test.rb +173 -0
  92. data/test/inputs/priority_input_test.rb +43 -0
  93. data/test/inputs/readonly_test.rb +101 -0
  94. data/test/inputs/required_test.rb +113 -0
  95. data/test/inputs/string_input_test.rb +146 -0
  96. data/test/inputs/text_input_test.rb +24 -0
  97. data/test/simple_form_test.rb +9 -0
  98. data/test/support/discovery_inputs.rb +27 -0
  99. data/test/support/misc_helpers.rb +138 -0
  100. data/test/support/mock_controller.rb +24 -0
  101. data/test/support/models.rb +216 -0
  102. data/test/test_helper.rb +95 -0
  103. 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