bootstrap_form 5.1.0 → 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +21 -8
  3. data/.gitignore +4 -2
  4. data/.rubocop.yml +2 -1
  5. data/.yarnrc +5 -0
  6. data/CHANGELOG.md +13 -3
  7. data/CONTRIBUTING.md +101 -14
  8. data/Dangerfile +4 -4
  9. data/Dockerfile +5 -5
  10. data/Gemfile +5 -21
  11. data/README.md +108 -42
  12. data/RELEASING.md +12 -1
  13. data/Rakefile +7 -6
  14. data/bootstrap_form.gemspec +6 -8
  15. data/docker-compose.yml +6 -24
  16. data/gemfiles/6.0.gemfile +1 -1
  17. data/gemfiles/6.1.gemfile +1 -1
  18. data/gemfiles/7.0.gemfile +2 -3
  19. data/gemfiles/common.gemfile +28 -0
  20. data/gemfiles/edge.gemfile +3 -2
  21. data/lib/bootstrap_form/components/labels.rb +3 -9
  22. data/lib/bootstrap_form/components/validation.rb +36 -19
  23. data/lib/bootstrap_form/form_builder.rb +4 -1
  24. data/lib/bootstrap_form/form_group.rb +9 -6
  25. data/lib/bootstrap_form/form_group_builder.rb +10 -7
  26. data/lib/bootstrap_form/helpers/bootstrap.rb +7 -8
  27. data/lib/bootstrap_form/helpers/field.rb +26 -0
  28. data/lib/bootstrap_form/helpers.rb +1 -0
  29. data/lib/bootstrap_form/inputs/base.rb +2 -2
  30. data/lib/bootstrap_form/inputs/check_box.rb +22 -6
  31. data/lib/bootstrap_form/inputs/radio_button.rb +3 -3
  32. data/lib/bootstrap_form/inputs/range_field.rb +1 -1
  33. data/lib/bootstrap_form/inputs.rb +1 -1
  34. data/lib/bootstrap_form/version.rb +2 -1
  35. data/lib/bootstrap_form.rb +1 -1
  36. metadata +14 -146
  37. data/demo/.postcssrc.yml +0 -3
  38. data/demo/.ruby-version +0 -1
  39. data/demo/Gemfile +0 -80
  40. data/demo/Gemfile.lock +0 -261
  41. data/demo/Procfile.dev +0 -2
  42. data/demo/README.md +0 -17
  43. data/demo/Rakefile +0 -6
  44. data/demo/app/assets/builds/.keep +0 -0
  45. data/demo/app/assets/builds/application.js.LICENSE.txt +0 -9
  46. data/demo/app/assets/config/manifest.js +0 -2
  47. data/demo/app/assets/stylesheets/actiontext.css +0 -31
  48. data/demo/app/assets/stylesheets/actiontext.scss +0 -38
  49. data/demo/app/assets/stylesheets/application.scss +0 -1
  50. data/demo/app/controllers/application_controller.rb +0 -2
  51. data/demo/app/controllers/bootstrap_controller.rb +0 -29
  52. data/demo/app/controllers/users_controller.rb +0 -9
  53. data/demo/app/helpers/bootstrap_helper.rb +0 -27
  54. data/demo/app/javascript/application.js +0 -3
  55. data/demo/app/javascript/channels/consumer.js +0 -6
  56. data/demo/app/javascript/channels/index.js +0 -5
  57. data/demo/app/javascript/packs/application.js +0 -11
  58. data/demo/app/models/address.rb +0 -3
  59. data/demo/app/models/application_record.rb +0 -3
  60. data/demo/app/models/faux_user.rb +0 -9
  61. data/demo/app/models/skill.rb +0 -15
  62. data/demo/app/models/super_user.rb +0 -2
  63. data/demo/app/models/user.rb +0 -25
  64. data/demo/app/views/active_storage/blobs/_blob.html.erb +0 -14
  65. data/demo/app/views/bootstrap/form.html.erb +0 -67
  66. data/demo/app/views/layouts/action_text/contents/_content.html.erb +0 -3
  67. data/demo/app/views/layouts/application.html.erb +0 -76
  68. data/demo/bin/bundle +0 -3
  69. data/demo/bin/dev +0 -9
  70. data/demo/bin/rails +0 -4
  71. data/demo/bin/rake +0 -4
  72. data/demo/bin/setup +0 -36
  73. data/demo/bin/update +0 -31
  74. data/demo/bin/webpack +0 -15
  75. data/demo/bin/webpack-dev-server +0 -15
  76. data/demo/bin/yarn +0 -11
  77. data/demo/config/application.rb +0 -21
  78. data/demo/config/boot.rb +0 -5
  79. data/demo/config/database.yml +0 -21
  80. data/demo/config/environment.rb +0 -5
  81. data/demo/config/environments/development.rb +0 -60
  82. data/demo/config/environments/production.rb +0 -48
  83. data/demo/config/environments/test.rb +0 -46
  84. data/demo/config/initializers/application_controller_renderer.rb +0 -8
  85. data/demo/config/initializers/backtrace_silencers.rb +0 -7
  86. data/demo/config/initializers/cookies_serializer.rb +0 -5
  87. data/demo/config/initializers/filter_parameter_logging.rb +0 -4
  88. data/demo/config/initializers/inflections.rb +0 -16
  89. data/demo/config/initializers/mime_types.rb +0 -4
  90. data/demo/config/initializers/wrap_parameters.rb +0 -14
  91. data/demo/config/locales/en.yml +0 -33
  92. data/demo/config/puma.rb +0 -56
  93. data/demo/config/routes.rb +0 -6
  94. data/demo/config/spring.rb +0 -6
  95. data/demo/config/storage.yml +0 -35
  96. data/demo/config/webpack/development.js +0 -5
  97. data/demo/config/webpack/environment.js +0 -3
  98. data/demo/config/webpack/production.js +0 -5
  99. data/demo/config/webpack/test.js +0 -5
  100. data/demo/config/webpacker.yml +0 -92
  101. data/demo/config.ru +0 -5
  102. data/demo/db/schema.rb +0 -84
  103. data/demo/doc/screenshots/bootstrap/index/00_horizontal_form.png +0 -0
  104. data/demo/doc/screenshots/bootstrap/index/01_with_validation_error.png +0 -0
  105. data/demo/doc/screenshots/bootstrap/index/02_inline_form.png +0 -0
  106. data/demo/doc/screenshots/bootstrap/index/03_simple_action_text_example.png +0 -0
  107. data/demo/doc/screenshots/bootstrap/index/04_floating_labels.png +0 -0
  108. data/demo/doc/screenshots/bootstrap/readme/00_example.png +0 -0
  109. data/demo/doc/screenshots/bootstrap/readme/01_example.png +0 -0
  110. data/demo/doc/screenshots/bootstrap/readme/02_example.png +0 -0
  111. data/demo/doc/screenshots/bootstrap/readme/03_example.png +0 -0
  112. data/demo/doc/screenshots/bootstrap/readme/04_example.png +0 -0
  113. data/demo/doc/screenshots/bootstrap/readme/05_example.png +0 -0
  114. data/demo/doc/screenshots/bootstrap/readme/06_example.png +0 -0
  115. data/demo/doc/screenshots/bootstrap/readme/07_example.png +0 -0
  116. data/demo/doc/screenshots/bootstrap/readme/08_example.png +0 -0
  117. data/demo/doc/screenshots/bootstrap/readme/09_example.png +0 -0
  118. data/demo/doc/screenshots/bootstrap/readme/10_example.png +0 -0
  119. data/demo/doc/screenshots/bootstrap/readme/11_example.png +0 -0
  120. data/demo/doc/screenshots/bootstrap/readme/12_example.png +0 -0
  121. data/demo/doc/screenshots/bootstrap/readme/13_example.png +0 -0
  122. data/demo/doc/screenshots/bootstrap/readme/14_example.png +0 -0
  123. data/demo/doc/screenshots/bootstrap/readme/15_example.png +0 -0
  124. data/demo/doc/screenshots/bootstrap/readme/16_example.png +0 -0
  125. data/demo/doc/screenshots/bootstrap/readme/17_example.png +0 -0
  126. data/demo/doc/screenshots/bootstrap/readme/18_example.png +0 -0
  127. data/demo/doc/screenshots/bootstrap/readme/19_example.png +0 -0
  128. data/demo/doc/screenshots/bootstrap/readme/20_example.png +0 -0
  129. data/demo/doc/screenshots/bootstrap/readme/21_example.png +0 -0
  130. data/demo/doc/screenshots/bootstrap/readme/22_example.png +0 -0
  131. data/demo/doc/screenshots/bootstrap/readme/23_example.png +0 -0
  132. data/demo/doc/screenshots/bootstrap/readme/24_example.png +0 -0
  133. data/demo/doc/screenshots/bootstrap/readme/25_example.png +0 -0
  134. data/demo/doc/screenshots/bootstrap/readme/26_example.png +0 -0
  135. data/demo/doc/screenshots/bootstrap/readme/27_example.png +0 -0
  136. data/demo/doc/screenshots/bootstrap/readme/28_example.png +0 -0
  137. data/demo/doc/screenshots/bootstrap/readme/29_example.png +0 -0
  138. data/demo/doc/screenshots/bootstrap/readme/30_example.png +0 -0
  139. data/demo/doc/screenshots/bootstrap/readme/31_example.png +0 -0
  140. data/demo/doc/screenshots/bootstrap/readme/32_example.png +0 -0
  141. data/demo/doc/screenshots/bootstrap/readme/33_example.png +0 -0
  142. data/demo/doc/screenshots/bootstrap/readme/34_example.png +0 -0
  143. data/demo/doc/screenshots/bootstrap/readme/35_example.png +0 -0
  144. data/demo/doc/screenshots/bootstrap/readme/36_example.png +0 -0
  145. data/demo/doc/screenshots/bootstrap/readme/37_example.png +0 -0
  146. data/demo/doc/screenshots/bootstrap/readme/38_example.png +0 -0
  147. data/demo/doc/screenshots/bootstrap/readme/39_example.png +0 -0
  148. data/demo/doc/screenshots/bootstrap/readme/40_example.png +0 -0
  149. data/demo/doc/screenshots/bootstrap/readme/41_example.png +0 -0
  150. data/demo/doc/screenshots/bootstrap/readme/42_example.png +0 -0
  151. data/demo/doc/screenshots/bootstrap/readme/43_example.png +0 -0
  152. data/demo/doc/screenshots/bootstrap/readme/44_example.png +0 -0
  153. data/demo/doc/screenshots/bootstrap/readme/45_example.png +0 -0
  154. data/demo/doc/screenshots/bootstrap/readme/46_example.png +0 -0
  155. data/demo/doc/screenshots/bootstrap/readme/47_example.png +0 -0
  156. data/demo/doc/screenshots/bootstrap/readme/48_example.png +0 -0
  157. data/demo/doc/screenshots/bootstrap/readme/49_example.png +0 -0
  158. data/demo/doc/screenshots/bootstrap/readme/50_example.png +0 -0
  159. data/demo/log/.keep +0 -0
  160. data/demo/package.json +0 -21
  161. data/demo/public/favicon.ico +0 -0
  162. data/demo/test/application_system_test_case.rb +0 -8
  163. data/demo/test/controllers/bootstrap_controller_test.rb +0 -8
  164. data/demo/test/controllers/users_controller_test.rb +0 -13
  165. data/demo/test/fixtures/action_text/rich_texts.yml +0 -4
  166. data/demo/test/fixtures/users.yml +0 -2
  167. data/demo/test/system/bootstrap_test.rb +0 -84
  168. data/demo/test/test_helper.rb +0 -10
  169. data/demo/webpack.config.js +0 -20
  170. data/demo/yarn.lock +0 -7176
  171. data/gemfiles/5.2.gemfile +0 -4
@@ -8,35 +8,45 @@ module BootstrapForm
8
8
  private
9
9
 
10
10
  def error?(name)
11
- object.respond_to?(:errors) && !(name.nil? || object.errors[name].empty?)
11
+ name && object.respond_to?(:errors) && (object.errors[name].any? || association_error?(name))
12
+ end
13
+
14
+ def association_error?(name)
15
+ object.class.try(:reflections)&.any? do |association_name, a|
16
+ next unless a.is_a?(ActiveRecord::Reflection::BelongsToReflection)
17
+ next unless a.foreign_key == name.to_s
18
+
19
+ object.errors[association_name].any?
20
+ end
12
21
  end
13
22
 
14
23
  def required_attribute?(obj, attribute)
15
24
  return false unless obj && attribute
16
25
 
17
26
  target = obj.instance_of?(Class) ? obj : obj.class
27
+ return false unless target.respond_to? :validators_on
18
28
 
19
- target_validators = if target.respond_to? :validators_on
20
- target.validators_on(attribute).map(&:class)
21
- else
22
- []
23
- end
24
-
25
- presence_validator?(target_validators)
29
+ presence_validator?(target_validators(target, attribute)) ||
30
+ required_association?(target, attribute)
26
31
  end
27
32
 
28
- def presence_validator?(target_validators)
29
- has_presence_validator = target_validators.include?(
30
- ActiveModel::Validations::PresenceValidator
31
- )
32
-
33
- if defined? ActiveRecord::Validations::PresenceValidator
34
- has_presence_validator |= target_validators.include?(
35
- ActiveRecord::Validations::PresenceValidator
36
- )
33
+ def required_association?(target, attribute)
34
+ target.try(:reflections)&.find do |name, a|
35
+ next unless a.is_a?(ActiveRecord::Reflection::BelongsToReflection)
36
+ next unless a.foreign_key == attribute.to_s
37
+
38
+ presence_validator?(target_validators(target, name))
37
39
  end
40
+ end
41
+
42
+ def target_validators(target, attribute)
43
+ target.validators_on(attribute).map(&:class)
44
+ end
38
45
 
39
- has_presence_validator
46
+ def presence_validator?(target_validators)
47
+ target_validators.include?(ActiveModel::Validations::PresenceValidator) ||
48
+ (defined?(ActiveRecord::Validations::PresenceValidator) &&
49
+ target_validators.include?(ActiveRecord::Validations::PresenceValidator))
40
50
  end
41
51
 
42
52
  def inline_error?(name)
@@ -54,7 +64,14 @@ module BootstrapForm
54
64
  end
55
65
 
56
66
  def get_error_messages(name)
57
- object.errors[name].join(", ")
67
+ messages = object.errors[name]
68
+ object.class.try(:reflections)&.each do |association_name, a|
69
+ next unless a.is_a?(ActiveRecord::Reflection::BelongsToReflection)
70
+ next unless a.foreign_key == name.to_s
71
+
72
+ messages << object.errors[association_name]
73
+ end
74
+ messages.join(", ")
58
75
  end
59
76
  end
60
77
  end
@@ -1,10 +1,12 @@
1
1
  # require 'bootstrap_form/aliasing'
2
2
 
3
+ # rubocop:disable Metrics/ClassLength
3
4
  module BootstrapForm
4
5
  class FormBuilder < ActionView::Helpers::FormBuilder
5
6
  attr_reader :layout, :label_col, :control_col, :has_error, :inline_errors,
6
7
  :label_errors, :acts_like_form_tag
7
8
 
9
+ include BootstrapForm::Helpers::Field
8
10
  include BootstrapForm::Helpers::Bootstrap
9
11
 
10
12
  include BootstrapForm::FormGroupBuilder
@@ -31,7 +33,7 @@ module BootstrapForm
31
33
  include BootstrapForm::Inputs::PhoneField
32
34
  include BootstrapForm::Inputs::RadioButton
33
35
  include BootstrapForm::Inputs::RangeField
34
- include BootstrapForm::Inputs::RichTextArea if Rails::VERSION::MAJOR >= 6
36
+ include BootstrapForm::Inputs::RichTextArea
35
37
  include BootstrapForm::Inputs::SearchField
36
38
  include BootstrapForm::Inputs::Select
37
39
  include BootstrapForm::Inputs::TelephoneField
@@ -130,3 +132,4 @@ module BootstrapForm
130
132
  end
131
133
  end
132
134
  end
135
+ # rubocop:enable Metrics/ClassLength
@@ -32,15 +32,18 @@ module BootstrapForm
32
32
  end
33
33
  end
34
34
 
35
- def form_group_content(label, help_text, options, &block)
35
+ def form_group_content(label, help_text, options, &block) # rubocop:disable Metrics/AbcSize
36
+ label ||= ActiveSupport::SafeBuffer.new
36
37
  if group_layout_horizontal?(options[:layout])
37
- concat(label).concat(tag.div(capture(&block) + help_text, class: form_group_control_class(options)))
38
+ label + tag.div(capture(&block) + help_text, class: form_group_control_class(options))
38
39
  else
40
+ content = ActiveSupport::SafeBuffer.new
39
41
  # Floating labels need to be rendered after the field
40
- concat(label) unless options[:floating]
41
- concat(capture(&block))
42
- concat(label) if options[:floating]
43
- concat(help_text) if help_text
42
+ content << label unless options[:floating]
43
+ content << capture(&block)
44
+ content << label if options[:floating]
45
+ content << help_text if help_text
46
+ content
44
47
  end
45
48
  end
46
49
 
@@ -28,8 +28,7 @@ module BootstrapForm
28
28
  def form_group_builder_options(options, method)
29
29
  options.symbolize_keys!
30
30
  options = convert_form_tag_options(method, options) if acts_like_form_tag
31
- options[:required] = form_group_required(options) if !options[:skip_label] && options.key?(:skip_required)
32
- options
31
+ options.merge!(required_field_options(options, method))
33
32
  end
34
33
 
35
34
  def convert_form_tag_options(method, options={})
@@ -77,11 +76,15 @@ module BootstrapForm
77
76
  classes
78
77
  end
79
78
 
80
- def form_group_required(options)
81
- return unless options.key?(:skip_required)
82
-
83
- warn "`:skip_required` is deprecated, use `:required: false` instead"
84
- options[:skip_required] ? false : :default
79
+ def form_group_required(options, method)
80
+ if options[:skip_required]
81
+ warn "`:skip_required` is deprecated, use `:required: false` instead"
82
+ false
83
+ elsif options.key?(:required)
84
+ options[:required]
85
+ else
86
+ required_attribute?(object, method)
87
+ end
85
88
  end
86
89
 
87
90
  def form_group_css_options(method, html_options, options)
@@ -30,8 +30,7 @@ module BootstrapForm
30
30
  if options[:error_summary] == false
31
31
  title
32
32
  else
33
- concat tag.p title
34
- concat error_summary
33
+ tag.p(title) + error_summary
35
34
  end
36
35
  end
37
36
  end
@@ -39,9 +38,9 @@ module BootstrapForm
39
38
  def error_summary
40
39
  return unless object.errors.any?
41
40
 
42
- tag.ul class: "rails-bootstrap-forms-error-summary" do
43
- object.errors.full_messages.each do |error|
44
- concat tag.li(error)
41
+ tag.ul(class: "rails-bootstrap-forms-error-summary") do
42
+ object.errors.full_messages.reduce(ActiveSupport::SafeBuffer.new) do |acc, error|
43
+ acc << tag.li(error)
45
44
  end
46
45
  end
47
46
  end
@@ -83,12 +82,12 @@ module BootstrapForm
83
82
  end
84
83
 
85
84
  def prepend_and_append_input(name, options, &block)
86
- options = options.extract!(:prepend, :append, :input_group_class)
85
+ options = options.extract!(:prepend, :append, :input_group_class).compact
87
86
 
88
87
  input = capture(&block) || ActiveSupport::SafeBuffer.new
89
88
 
90
89
  input = attach_input(options, :prepend) + input + attach_input(options, :append)
91
- input += generate_error(name)
90
+ input << generate_error(name)
92
91
  options.present? &&
93
92
  input = tag.div(input, class: ["input-group", options[:input_group_class]].compact)
94
93
  input
@@ -100,7 +99,7 @@ module BootstrapForm
100
99
  end
101
100
 
102
101
  def input_group_content(content)
103
- return content if /btn/.match?(content)
102
+ return content if content.include?("btn")
104
103
 
105
104
  tag.span(content, class: "input-group-text")
106
105
  end
@@ -0,0 +1,26 @@
1
+ module BootstrapForm
2
+ module Helpers
3
+ module Field
4
+ def required_field_options(options, method)
5
+ required = required_field?(options, method)
6
+ {}.tap do |option|
7
+ option[:required] = required
8
+ option[:aria] = { required: true } if required
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def required_field?(options, method)
15
+ if options[:skip_required]
16
+ warn "`:skip_required` is deprecated, use `:required: false` instead"
17
+ false
18
+ elsif options.key?(:required)
19
+ options[:required]
20
+ else
21
+ required_attribute?(object, method)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -5,5 +5,6 @@ module BootstrapForm
5
5
  extend ActiveSupport::Autoload
6
6
 
7
7
  autoload :Bootstrap
8
+ autoload :Field
8
9
  end
9
10
  end
@@ -6,8 +6,8 @@ module BootstrapForm
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  class_methods do
9
- def bootstrap_field(field_name)
10
- define_method "#{field_name}_with_bootstrap" do |name, options={}|
9
+ def bootstrap_field(field_name, control_class: nil)
10
+ define_method "#{field_name}_with_bootstrap" do |name, options={ control_class: control_class }.compact|
11
11
  form_group_builder(name, options) do
12
12
  prepend_and_append_input(name, options) do
13
13
  options[:placeholder] ||= name if options[:floating]
@@ -9,14 +9,11 @@ module BootstrapForm
9
9
  included do
10
10
  def check_box_with_bootstrap(name, options={}, checked_value="1", unchecked_value="0", &block)
11
11
  options = options.symbolize_keys!
12
- check_box_options = options.except(:class, :label, :label_class, :error_message, :help,
13
- :inline, :hide_label, :skip_label, :wrapper, :wrapper_class, :switch)
14
- check_box_options[:class] = check_box_classes(name, options)
15
12
 
16
13
  tag.div(class: check_box_wrapper_class(options), **options[:wrapper].to_h.except(:class)) do
17
- html = check_box_without_bootstrap(name, check_box_options, checked_value, unchecked_value)
18
- html.concat(check_box_label(name, options, checked_value, &block)) unless options[:skip_label]
19
- html.concat(generate_error(name)) if options[:error_message]
14
+ html = check_box_without_bootstrap(name, check_box_options(name, options), checked_value, unchecked_value)
15
+ html << check_box_label(name, options, checked_value, &block) unless options[:skip_label]
16
+ html << generate_error(name) if options[:error_message]
20
17
  html
21
18
  end
22
19
  end
@@ -26,6 +23,13 @@ module BootstrapForm
26
23
 
27
24
  private
28
25
 
26
+ def check_box_options(name, options)
27
+ check_box_options = options.except(:class, :label, :label_class, :error_message, :help,
28
+ :inline, :hide_label, :skip_label, :wrapper, :wrapper_class, :switch)
29
+ check_box_options[:class] = check_box_classes(name, options)
30
+ check_box_options.merge!(required_field_options(options, name))
31
+ end
32
+
29
33
  def check_box_label(name, options, checked_value, &block)
30
34
  label_name = if options[:multiple]
31
35
  check_box_value(name, checked_value)
@@ -59,6 +63,7 @@ module BootstrapForm
59
63
  def check_box_label_class(options)
60
64
  classes = ["form-check-label"]
61
65
  classes << options[:label_class]
66
+ classes << "required" if options[:required]
62
67
  classes << hide_class if options[:hide_label]
63
68
  classes.flatten.compact
64
69
  end
@@ -72,6 +77,17 @@ module BootstrapForm
72
77
  classes << options[:wrapper_class].presence
73
78
  classes.flatten.compact
74
79
  end
80
+
81
+ def checkbox_required(options, method)
82
+ if options[:skip_required]
83
+ warn "`:skip_required` is deprecated, use `:required: false` instead"
84
+ false
85
+ elsif options.key?(:required)
86
+ options[:required]
87
+ else
88
+ required_attribute?(object, method)
89
+ end
90
+ end
75
91
  end
76
92
  end
77
93
  end
@@ -13,8 +13,8 @@ module BootstrapForm
13
13
  wrapper_attributes[:class] = radio_button_wrapper_class(options)
14
14
  tag.div(**wrapper_attributes) do
15
15
  html = radio_button_without_bootstrap(name, value, radio_button_options(name, options))
16
- html.concat(radio_button_label(name, value, options)) unless options[:skip_label]
17
- html.concat(generate_error(name)) if options[:error_message]
16
+ html << radio_button_label(name, value, options) unless options[:skip_label]
17
+ html << generate_error(name) if options[:error_message]
18
18
  html
19
19
  end
20
20
  end
@@ -28,7 +28,7 @@ module BootstrapForm
28
28
  radio_button_options = options.except(:class, :label, :label_class, :error_message, :help,
29
29
  :inline, :hide_label, :skip_label, :wrapper, :wrapper_class)
30
30
  radio_button_options[:class] = radio_button_classes(name, options)
31
- radio_button_options
31
+ radio_button_options.merge!(required_field_options(options, name))
32
32
  end
33
33
 
34
34
  def radio_button_label(name, value, options)
@@ -7,7 +7,7 @@ module BootstrapForm
7
7
  include Base
8
8
 
9
9
  included do
10
- bootstrap_field :range_field
10
+ bootstrap_field :range_field, control_class: "form-range"
11
11
  end
12
12
  end
13
13
  end
@@ -25,7 +25,7 @@ module BootstrapForm
25
25
  autoload :PhoneField
26
26
  autoload :RadioButton
27
27
  autoload :RangeField
28
- autoload :RichTextArea if Rails::VERSION::MAJOR >= 6
28
+ autoload :RichTextArea
29
29
  autoload :SearchField
30
30
  autoload :Select
31
31
  autoload :TelephoneField
@@ -1,3 +1,4 @@
1
1
  module BootstrapForm
2
- VERSION = "5.1.0".freeze
2
+ VERSION = "5.2.1".freeze
3
+ REQUIRED_RAILS_VERSION = ">= 6.0".freeze
3
4
  end
@@ -1,7 +1,7 @@
1
1
  # NOTE: The rich_text_area and rich_text_area_tag helpers are defined in a file with a different
2
2
  # name and not in the usual autoload-reachable way.
3
3
  # The following line is definitely need to make `bootstrap_form` work.
4
- if ::Rails::VERSION::STRING > "6"
4
+ if Rails::VERSION::STRING > "6"
5
5
  require "#{Gem::Specification.find_by_name('actiontext').gem_dir}/app/helpers/action_text/tag_helper"
6
6
  end
7
7
  require "action_view"
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Potenza
8
8
  - Carlos Lopes
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-06-25 00:00:00.000000000 Z
12
+ date: 2023-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -17,28 +17,28 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '5.2'
20
+ version: '6.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '5.2'
27
+ version: '6.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: activemodel
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '5.2'
34
+ version: '6.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '5.2'
41
+ version: '6.0'
42
42
  description: bootstrap_form is a rails form builder that makes it super easy to create
43
43
  beautiful-looking forms using Bootstrap 5
44
44
  email:
@@ -52,6 +52,7 @@ files:
52
52
  - ".github/workflows/ruby.yml"
53
53
  - ".gitignore"
54
54
  - ".rubocop.yml"
55
+ - ".yarnrc"
55
56
  - CHANGELOG.md
56
57
  - CODE_OF_CONDUCT.md
57
58
  - CONTRIBUTING.md
@@ -67,145 +68,11 @@ files:
67
68
  - UPGRADE-5.0.md
68
69
  - app/assets/stylesheets/rails_bootstrap_forms.css
69
70
  - bootstrap_form.gemspec
70
- - demo/.postcssrc.yml
71
- - demo/.ruby-version
72
- - demo/Gemfile
73
- - demo/Gemfile.lock
74
- - demo/Procfile.dev
75
- - demo/README.md
76
- - demo/Rakefile
77
- - demo/app/assets/builds/.keep
78
- - demo/app/assets/builds/application.js.LICENSE.txt
79
- - demo/app/assets/config/manifest.js
80
- - demo/app/assets/stylesheets/actiontext.css
81
- - demo/app/assets/stylesheets/actiontext.scss
82
- - demo/app/assets/stylesheets/application.scss
83
- - demo/app/controllers/application_controller.rb
84
- - demo/app/controllers/bootstrap_controller.rb
85
- - demo/app/controllers/users_controller.rb
86
- - demo/app/helpers/bootstrap_helper.rb
87
- - demo/app/javascript/application.js
88
- - demo/app/javascript/channels/consumer.js
89
- - demo/app/javascript/channels/index.js
90
- - demo/app/javascript/packs/application.js
91
- - demo/app/models/address.rb
92
- - demo/app/models/application_record.rb
93
- - demo/app/models/faux_user.rb
94
- - demo/app/models/skill.rb
95
- - demo/app/models/super_user.rb
96
- - demo/app/models/user.rb
97
- - demo/app/views/active_storage/blobs/_blob.html.erb
98
- - demo/app/views/bootstrap/form.html.erb
99
- - demo/app/views/layouts/action_text/contents/_content.html.erb
100
- - demo/app/views/layouts/application.html.erb
101
- - demo/bin/bundle
102
- - demo/bin/dev
103
- - demo/bin/rails
104
- - demo/bin/rake
105
- - demo/bin/setup
106
- - demo/bin/update
107
- - demo/bin/webpack
108
- - demo/bin/webpack-dev-server
109
- - demo/bin/yarn
110
- - demo/config.ru
111
- - demo/config/application.rb
112
- - demo/config/boot.rb
113
- - demo/config/database.yml
114
- - demo/config/environment.rb
115
- - demo/config/environments/development.rb
116
- - demo/config/environments/production.rb
117
- - demo/config/environments/test.rb
118
- - demo/config/initializers/application_controller_renderer.rb
119
- - demo/config/initializers/backtrace_silencers.rb
120
- - demo/config/initializers/cookies_serializer.rb
121
- - demo/config/initializers/filter_parameter_logging.rb
122
- - demo/config/initializers/inflections.rb
123
- - demo/config/initializers/mime_types.rb
124
- - demo/config/initializers/wrap_parameters.rb
125
- - demo/config/locales/en.yml
126
- - demo/config/puma.rb
127
- - demo/config/routes.rb
128
- - demo/config/spring.rb
129
- - demo/config/storage.yml
130
- - demo/config/webpack/development.js
131
- - demo/config/webpack/environment.js
132
- - demo/config/webpack/production.js
133
- - demo/config/webpack/test.js
134
- - demo/config/webpacker.yml
135
- - demo/db/schema.rb
136
- - demo/doc/screenshots/bootstrap/index/00_horizontal_form.png
137
- - demo/doc/screenshots/bootstrap/index/01_with_validation_error.png
138
- - demo/doc/screenshots/bootstrap/index/02_inline_form.png
139
- - demo/doc/screenshots/bootstrap/index/03_simple_action_text_example.png
140
- - demo/doc/screenshots/bootstrap/index/04_floating_labels.png
141
- - demo/doc/screenshots/bootstrap/readme/00_example.png
142
- - demo/doc/screenshots/bootstrap/readme/01_example.png
143
- - demo/doc/screenshots/bootstrap/readme/02_example.png
144
- - demo/doc/screenshots/bootstrap/readme/03_example.png
145
- - demo/doc/screenshots/bootstrap/readme/04_example.png
146
- - demo/doc/screenshots/bootstrap/readme/05_example.png
147
- - demo/doc/screenshots/bootstrap/readme/06_example.png
148
- - demo/doc/screenshots/bootstrap/readme/07_example.png
149
- - demo/doc/screenshots/bootstrap/readme/08_example.png
150
- - demo/doc/screenshots/bootstrap/readme/09_example.png
151
- - demo/doc/screenshots/bootstrap/readme/10_example.png
152
- - demo/doc/screenshots/bootstrap/readme/11_example.png
153
- - demo/doc/screenshots/bootstrap/readme/12_example.png
154
- - demo/doc/screenshots/bootstrap/readme/13_example.png
155
- - demo/doc/screenshots/bootstrap/readme/14_example.png
156
- - demo/doc/screenshots/bootstrap/readme/15_example.png
157
- - demo/doc/screenshots/bootstrap/readme/16_example.png
158
- - demo/doc/screenshots/bootstrap/readme/17_example.png
159
- - demo/doc/screenshots/bootstrap/readme/18_example.png
160
- - demo/doc/screenshots/bootstrap/readme/19_example.png
161
- - demo/doc/screenshots/bootstrap/readme/20_example.png
162
- - demo/doc/screenshots/bootstrap/readme/21_example.png
163
- - demo/doc/screenshots/bootstrap/readme/22_example.png
164
- - demo/doc/screenshots/bootstrap/readme/23_example.png
165
- - demo/doc/screenshots/bootstrap/readme/24_example.png
166
- - demo/doc/screenshots/bootstrap/readme/25_example.png
167
- - demo/doc/screenshots/bootstrap/readme/26_example.png
168
- - demo/doc/screenshots/bootstrap/readme/27_example.png
169
- - demo/doc/screenshots/bootstrap/readme/28_example.png
170
- - demo/doc/screenshots/bootstrap/readme/29_example.png
171
- - demo/doc/screenshots/bootstrap/readme/30_example.png
172
- - demo/doc/screenshots/bootstrap/readme/31_example.png
173
- - demo/doc/screenshots/bootstrap/readme/32_example.png
174
- - demo/doc/screenshots/bootstrap/readme/33_example.png
175
- - demo/doc/screenshots/bootstrap/readme/34_example.png
176
- - demo/doc/screenshots/bootstrap/readme/35_example.png
177
- - demo/doc/screenshots/bootstrap/readme/36_example.png
178
- - demo/doc/screenshots/bootstrap/readme/37_example.png
179
- - demo/doc/screenshots/bootstrap/readme/38_example.png
180
- - demo/doc/screenshots/bootstrap/readme/39_example.png
181
- - demo/doc/screenshots/bootstrap/readme/40_example.png
182
- - demo/doc/screenshots/bootstrap/readme/41_example.png
183
- - demo/doc/screenshots/bootstrap/readme/42_example.png
184
- - demo/doc/screenshots/bootstrap/readme/43_example.png
185
- - demo/doc/screenshots/bootstrap/readme/44_example.png
186
- - demo/doc/screenshots/bootstrap/readme/45_example.png
187
- - demo/doc/screenshots/bootstrap/readme/46_example.png
188
- - demo/doc/screenshots/bootstrap/readme/47_example.png
189
- - demo/doc/screenshots/bootstrap/readme/48_example.png
190
- - demo/doc/screenshots/bootstrap/readme/49_example.png
191
- - demo/doc/screenshots/bootstrap/readme/50_example.png
192
- - demo/log/.keep
193
- - demo/package.json
194
- - demo/public/favicon.ico
195
- - demo/test/application_system_test_case.rb
196
- - demo/test/controllers/bootstrap_controller_test.rb
197
- - demo/test/controllers/users_controller_test.rb
198
- - demo/test/fixtures/action_text/rich_texts.yml
199
- - demo/test/fixtures/users.yml
200
- - demo/test/system/bootstrap_test.rb
201
- - demo/test/test_helper.rb
202
- - demo/webpack.config.js
203
- - demo/yarn.lock
204
71
  - docker-compose.yml
205
- - gemfiles/5.2.gemfile
206
72
  - gemfiles/6.0.gemfile
207
73
  - gemfiles/6.1.gemfile
208
74
  - gemfiles/7.0.gemfile
75
+ - gemfiles/common.gemfile
209
76
  - gemfiles/edge.gemfile
210
77
  - lib/bootstrap_form.rb
211
78
  - lib/bootstrap_form/action_view_extensions/form_helper.rb
@@ -221,6 +88,7 @@ files:
221
88
  - lib/bootstrap_form/form_group_builder.rb
222
89
  - lib/bootstrap_form/helpers.rb
223
90
  - lib/bootstrap_form/helpers/bootstrap.rb
91
+ - lib/bootstrap_form/helpers/field.rb
224
92
  - lib/bootstrap_form/inputs.rb
225
93
  - lib/bootstrap_form/inputs/base.rb
226
94
  - lib/bootstrap_form/inputs/check_box.rb
@@ -260,7 +128,7 @@ licenses:
260
128
  - MIT
261
129
  metadata:
262
130
  rubygems_mfa_required: 'true'
263
- post_install_message:
131
+ post_install_message:
264
132
  rdoc_options: []
265
133
  require_paths:
266
134
  - lib
@@ -268,15 +136,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
268
136
  requirements:
269
137
  - - ">="
270
138
  - !ruby/object:Gem::Version
271
- version: '2.7'
139
+ version: '3.0'
272
140
  required_rubygems_version: !ruby/object:Gem::Requirement
273
141
  requirements:
274
142
  - - ">="
275
143
  - !ruby/object:Gem::Version
276
144
  version: '0'
277
145
  requirements: []
278
- rubygems_version: 3.1.2
279
- signing_key:
146
+ rubygems_version: 3.4.10
147
+ signing_key:
280
148
  specification_version: 4
281
149
  summary: Rails form builder that makes it easy to style forms using Bootstrap 5
282
150
  test_files: []
data/demo/.postcssrc.yml DELETED
@@ -1,3 +0,0 @@
1
- plugins:
2
- postcss-import: {}
3
- postcss-cssnext: {}
data/demo/.ruby-version DELETED
@@ -1 +0,0 @@
1
- ruby-2.7.6