bootstrap_form 5.1.0 → 5.2.1

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 (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