rails_bootstrap_form 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1031de2aa81bb74657e9a45f334c4dc4d67ee673e89874358881d8021388d8b9
4
- data.tar.gz: 4a5d3c85afb71bd06005eb95c0b8abb76a429a46ea49f22b470943bba2a6f7ae
3
+ metadata.gz: aa73fbc58e6dd0b2dc4b823cd6732de17b0e84e52d9177bce4684b61609238e0
4
+ data.tar.gz: f190515751e2cbc2bf51c195c8aa0ac7e2459ae040f1ba8dd544532f6887a514
5
5
  SHA512:
6
- metadata.gz: 188081d3651b5f6977df21c3bfb4436e44b3d96685ef8b6fc36b7805056b205ab77ced5f3ad4d3094217116e47f04e8a07a914db1f073c60be664bd4acf33694
7
- data.tar.gz: 180295d5dbc0159f5181183be148203565d877d874d978074af43dd31ba0cfb7e7d8d2be3bcf3d3c72e1abe6d4ff58636da8c4386be3b09d64380edc4ef06b2d
6
+ metadata.gz: f41528a442151162803ec730b18fde0d10cd002446e5a402c037acb4aea7933e5749a5f5d3824762a83fc41a5fc2d87ecedafc7371755c45cdeafcb783f13a7f
7
+ data.tar.gz: 139a3f9bd52be5936676ddc8b730a9a211f715f32b8ca8ba12ad6d045233ed9836e90317bf33a43ab07e27ac52c0ae77e5c9c290e9157e75def6b07341a96a30
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_bootstrap_form (0.5.3)
4
+ rails_bootstrap_form (0.6.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -20,3 +20,6 @@ label.required::after {
20
20
  display: inline-block;
21
21
  width: auto;
22
22
  }
23
+ .invalid-feedback {
24
+ display: block;
25
+ }
@@ -3,3 +3,5 @@
3
3
  <% end %>
4
4
 
5
5
  <%= render partial: "users/vertical_form" %>
6
+
7
+ <%= render partial: "users/horizontal_form" %>
@@ -0,0 +1,32 @@
1
+ <div class="card card-primary my-3">
2
+ <div class="card-header fw-bold">
3
+ Profile Form (Horizontal layout)
4
+ </div>
5
+ <div class="card-body">
6
+ <%= bootstrap_form_for @user, bootstrap_form: {layout: :horizontal} do |form| %>
7
+ <%= form.text_field :name, autocomplete: "new-name" %>
8
+ <%= form.text_field :email, autocomplete: "new-email" %>
9
+ <%= form.text_field :password, autocomplete: "new-password" %>
10
+ <%= form.phone_field :mobile_number %>
11
+ <%= form.date_field :birth_date %>
12
+ <%= form.radio_button :terms, 1, required: true %>
13
+ <%= form.range_field :excellence %>
14
+ <%= form.url_field :blog_url %>
15
+ <%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {bootstrap_form: {}, checked: form.object.fruit_id} %>
16
+ <%= form.color_field :favorite_color %>
17
+ <%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap_form: {}} %>
18
+ <%= form.fields_for :address, include_id: false, bootstrap_form: {layout: :horizontal} do |address_form| %>
19
+ <%= address_form.text_area :street %>
20
+ <%= address_form.text_field :state %>
21
+ <%= address_form.grouped_collection_select :city, ::Country.includes(:cities), :cities, :name, :id, :name, {include_blank: "Select city"} %>
22
+ <%= address_form.text_field :postal_code %>
23
+ <%= address_form.select :country_id, options_for_select(::Country.pluck(:name, :id), address_form.object.country_id),
24
+ {include_blank: "Select Country", bootstrap_form: {}} %>
25
+ <% end %>
26
+ <div class="mt-3">
27
+ <%= form.submit "Register", class: "btn btn-primary" %>
28
+ <%= link_to "Cancel", users_path, class: "btn btn-secondary" %>
29
+ </div>
30
+ <% end %>
31
+ </div>
32
+ </div>
@@ -12,9 +12,9 @@
12
12
  <%= form.check_box :terms, bootstrap_form: {switch: false}, required: true %>
13
13
  <%= form.range_field :excellence %>
14
14
  <%= form.url_field :blog_url %>
15
- <%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {bootstrap_form: {inline: true}, checked: form.object.fruit_id} %>
15
+ <%= form.collection_radio_buttons :fruit_id, ::Fruit.all, :id, :name, {bootstrap_form: {}, checked: form.object.fruit_id} %>
16
16
  <%= form.color_field :favorite_color %>
17
- <%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap_form: {inline: true}} %>
17
+ <%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap_form: {}} %>
18
18
  <%= form.fields_for :address, include_id: false do |address_form| %>
19
19
  <%= address_form.text_area :street %>
20
20
  <%= address_form.text_field :state %>
@@ -50,8 +50,9 @@ module RailsBootstrapForm
50
50
  # readers. Default is `visually-hidden`
51
51
  attr_accessor :hide_class
52
52
 
53
- # Default CSS class that will be applied to all label tags.
54
- # Default is `form-label`.
53
+ # Default CSS class that will be applied to all label tags when layout is
54
+ # vertical.
55
+ # The default value is `form-label`.
55
56
  attr_accessor :label_class
56
57
 
57
58
  # An additional CSS class that will be added along with the existing
@@ -105,6 +106,19 @@ module RailsBootstrapForm
105
106
  # form.collection_radio_buttons :choices, ["yes", "no"], :to_s, :to_s, bootstrap_form: {inline: true}
106
107
  attr_accessor :inline
107
108
 
109
+ # Default CSS class that will be applied to all label tags when layout is
110
+ # horizontal.
111
+ # The default value is `col-form-label`.
112
+ attr_accessor :label_col_class
113
+
114
+ # Default CSS class for label column when using horizontal form.
115
+ # The default value is `col-sm-2`.
116
+ attr_accessor :label_col_wrapper_class
117
+
118
+ # Default CSS class for control column when using horizontal form.
119
+ # The default value is `col-sm-10`.
120
+ attr_accessor :field_col_wrapper_class
121
+
108
122
  def initialize(options = {})
109
123
  set_defaults
110
124
  set_bootstrap_form_options(options)
@@ -131,7 +145,7 @@ module RailsBootstrapForm
131
145
  # to a given form field. For example, we can change grid just for one field:
132
146
  #
133
147
  # bootstrap_form_with model: @user do |f|
134
- # f.text_field :email, bootstrap_form: {label_col_class: "col-md-6", control_col_class: "col-md-6"}
148
+ # f.text_field :email, bootstrap_form: {label_col_wrapper_class: "col-md-6", field_col_wrapper_class: "col-md-6"}
135
149
  # f.password_field :password
136
150
  # end
137
151
  #
@@ -173,6 +187,10 @@ module RailsBootstrapForm
173
187
  @size = nil
174
188
 
175
189
  @inline = false
190
+
191
+ @label_col_class = "col-form-label"
192
+ @label_col_wrapper_class = "col-sm-2"
193
+ @field_col_wrapper_class = "col-sm-10"
176
194
  end
177
195
 
178
196
  private :set_defaults
@@ -7,6 +7,8 @@ module RailsBootstrapForm
7
7
  module CheckBox
8
8
  extend ActiveSupport::Concern
9
9
 
10
+ include RailsBootstrapForm::Helpers
11
+
10
12
  def self.included(base_class)
11
13
  def check_box_label(attribute, checked_value, options, bootstrap_options, &block)
12
14
  unless bootstrap_options.skip_label
@@ -62,11 +64,18 @@ module RailsBootstrapForm
62
64
  classes = Array("form-check")
63
65
  classes << "form-switch" if bootstrap_options.switch
64
66
  classes << "form-check-inline" if bootstrap_options.inline?
65
- classes << "mb-3"
67
+ classes << "mb-3" unless (bootstrap_options.layout_horizontal? || bootstrap_options.inline?)
68
+ classes.flatten.compact
69
+ end
70
+
71
+ def check_box_container_classes(bootstrap_options)
72
+ classes = Array(bootstrap_options.field_col_wrapper_class)
73
+ classes << field_offset_class(bootstrap_options.label_col_wrapper_class)
66
74
  classes.flatten.compact
67
75
  end
68
76
 
69
- private :check_box_label, :check_box_classes, :check_box_label_class, :check_box_wrapper_class
77
+ private :check_box_label, :check_box_classes, :check_box_label_class,
78
+ :check_box_wrapper_class, :check_box_container_classes
70
79
  end
71
80
  end
72
81
  end
@@ -21,7 +21,13 @@ module RailsBootstrapForm
21
21
  end
22
22
 
23
23
  def label_classes(attribute, bootstrap_options)
24
- classes = [bootstrap_options.label_class, bootstrap_options.additional_label_class]
24
+ classes = []
25
+ classes << if bootstrap_options.layout_horizontal?
26
+ [bootstrap_options.label_col_class, bootstrap_options.label_col_wrapper_class]
27
+ else
28
+ bootstrap_options.label_class
29
+ end
30
+ classes << bootstrap_options.additional_label_class
25
31
  classes << bootstrap_options.hide_class if bootstrap_options.hide_label
26
32
  classes << "required" if is_attribute_required?(attribute)
27
33
  classes << "is-invalid" if is_invalid?(attribute)
@@ -7,6 +7,8 @@ module RailsBootstrapForm
7
7
  module RadioButton
8
8
  extend ActiveSupport::Concern
9
9
 
10
+ include RailsBootstrapForm::Helpers
11
+
10
12
  def self.included(base_class)
11
13
  def radio_button_label(attribute, value, options, bootstrap_options)
12
14
  unless bootstrap_options.skip_label
@@ -58,11 +60,18 @@ module RailsBootstrapForm
58
60
  def radio_button_wrapper_class(bootstrap_options)
59
61
  classes = Array("form-check")
60
62
  classes << "form-check-inline" if bootstrap_options.inline?
61
- classes << "mb-3"
63
+ classes << "mb-3" unless (bootstrap_options.layout_horizontal? || bootstrap_options.inline?)
64
+ classes.flatten.compact
65
+ end
66
+
67
+ def radio_button_container_classes(bootstrap_options)
68
+ classes = Array(bootstrap_options.field_col_wrapper_class)
69
+ classes << field_offset_class(bootstrap_options.label_col_wrapper_class)
62
70
  classes.flatten.compact
63
71
  end
64
72
 
65
- private :radio_button_label, :radio_button_classes, :radio_button_label_class, :radio_button_wrapper_class
73
+ private :radio_button_label, :radio_button_classes, :radio_button_label_class,
74
+ :radio_button_wrapper_class, :radio_button_container_classes
66
75
  end
67
76
  end
68
77
  end
@@ -16,35 +16,49 @@ module RailsBootstrapForm
16
16
  label = draw_label(attribute, options, bootstrap_options)
17
17
  help_text = help_text(attribute, bootstrap_options)
18
18
 
19
- if bootstrap_options.floating
19
+ if bootstrap_options.layout_horizontal?
20
20
  tag.div(**field_wrapper_options(bootstrap_options)) do
21
- concat(input_group_wrapper(attribute, bootstrap_options) do
22
- tag.div(class: floating_label_classes(attribute)) do
23
- concat(capture(&block))
24
- concat(label)
25
- end
21
+ concat(label)
22
+ concat(tag.div(class: bootstrap_options.field_col_wrapper_class) do
23
+ concat(input_group_wrapper(attribute, bootstrap_options) do
24
+ capture(&block)
25
+ end)
26
+ concat(help_text)
26
27
  end)
27
- concat(help_text)
28
28
  end
29
29
  else
30
- tag.div(**field_wrapper_options(bootstrap_options)) do
31
- concat(label)
32
- concat(input_group_wrapper(attribute, bootstrap_options) do
33
- capture(&block)
34
- end)
35
- concat(help_text)
30
+ if bootstrap_options.floating
31
+ tag.div(**field_wrapper_options(bootstrap_options)) do
32
+ concat(input_group_wrapper(attribute, bootstrap_options) do
33
+ tag.div(class: floating_label_classes(attribute)) do
34
+ concat(capture(&block))
35
+ concat(label)
36
+ end
37
+ end)
38
+ concat(help_text)
39
+ end
40
+ else
41
+ tag.div(**field_wrapper_options(bootstrap_options)) do
42
+ concat(label)
43
+ concat(input_group_wrapper(attribute, bootstrap_options) do
44
+ capture(&block)
45
+ end)
46
+ concat(help_text)
47
+ end
36
48
  end
37
49
  end
38
50
  end
39
51
 
40
52
  def field_wrapper_options(bootstrap_options)
41
53
  {}.tap do |option|
42
- option[:class] = field_wrapper_classes
54
+ option[:class] = field_wrapper_classes(bootstrap_options)
43
55
  end.merge(bootstrap_options.wrapper_options)
44
56
  end
45
57
 
46
- def field_wrapper_classes
47
- classes = [form_wrapper_default_class]
58
+ def field_wrapper_classes(bootstrap_options)
59
+ classes = []
60
+ classes << "row" if bootstrap_options.layout_horizontal?
61
+ classes << form_wrapper_default_class
48
62
  classes.flatten.compact
49
63
  end
50
64
 
@@ -68,7 +82,7 @@ module RailsBootstrapForm
68
82
  css_options[:class] = field_classes.flatten.compact
69
83
  css_options.merge!(required_field_options(attribute, options))
70
84
 
71
- if bootstrap_options.floating
85
+ if (bootstrap_options.floating && !bootstrap_options.layout_horizontal?)
72
86
  css_options[:placeholder] ||= label_text(attribute, bootstrap_options)
73
87
  end
74
88
 
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # -*- frozen_string_literal: true -*-
3
+ # -*- warn_indent: true -*-
4
+
5
+ module RailsBootstrapForm
6
+ module Helpers
7
+ extend ActiveSupport::Concern
8
+
9
+ def self.included(base_class)
10
+ def collection_input_checked?(checked, obj, input_value)
11
+ checked == input_value || Array(checked).try(:include?, input_value) ||
12
+ checked == obj || Array(checked).try(:include?, obj)
13
+ end
14
+
15
+ def control_specific_class(field_tag_name)
16
+ "rails-bootstrap-forms-#{field_tag_name.to_s.tr("_", "-")}"
17
+ end
18
+
19
+ def is_size_valid?(bootstrap_options)
20
+ bootstrap_options.size && %i(sm lg).include?(bootstrap_options.size)
21
+ end
22
+
23
+ def field_offset_class(label_col_wrapper_class)
24
+ label_col_wrapper_class.gsub(/\bcol-(\w+)-(\d)\b/, 'offset-\1-\2')
25
+ end
26
+
27
+ private :collection_input_checked?, :control_specific_class, :is_size_valid?
28
+ end
29
+ end
30
+ end
@@ -3,14 +3,9 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  module RailsBootstrapForm
6
- module Inputs
7
-
8
- extend ActiveSupport::Autoload
9
-
10
- autoload :Base
11
-
12
- include Base
6
+ include Helpers
13
7
 
8
+ module Inputs
14
9
  FIELD_HELPERS = %i[
15
10
  text_field
16
11
  url_field
@@ -141,10 +136,22 @@ module RailsBootstrapForm
141
136
  concat(check_box_field)
142
137
  concat(check_box_label)
143
138
  concat(check_box_help_text) unless bootstrap_options.inline?
144
- concat(generate_error(attribute)) if is_invalid?(attribute) && !bootstrap_options.inline?
139
+ concat(generate_error(attribute)) if (is_invalid?(attribute) && !bootstrap_options.inline?)
145
140
  end
146
141
 
147
- check_box_html
142
+ if bootstrap_options.inline?
143
+ check_box_html
144
+ else
145
+ if bootstrap_options.layout_horizontal?
146
+ tag.div(class: field_wrapper_classes(bootstrap_options)) do
147
+ tag.div(class: check_box_container_classes(bootstrap_options)) do
148
+ check_box_html
149
+ end
150
+ end
151
+ else
152
+ check_box_html
153
+ end
154
+ end
148
155
  end
149
156
 
150
157
  def radio_button(attribute, value, options = {})
@@ -161,10 +168,22 @@ module RailsBootstrapForm
161
168
  concat(radio_button_field)
162
169
  concat(radio_button_label)
163
170
  concat(radio_button_help_text) unless bootstrap_options.inline?
164
- concat(generate_error(attribute)) if is_invalid?(attribute) && !bootstrap_options.inline?
171
+ concat(generate_error(attribute)) if (is_invalid?(attribute) && !bootstrap_options.inline?)
165
172
  end
166
173
 
167
- radio_button_html
174
+ if bootstrap_options.inline?
175
+ radio_button_html
176
+ else
177
+ if bootstrap_options.layout_horizontal?
178
+ tag.div(class: field_wrapper_classes(bootstrap_options)) do
179
+ tag.div(class: radio_button_container_classes(bootstrap_options)) do
180
+ radio_button_html
181
+ end
182
+ end
183
+ else
184
+ radio_button_html
185
+ end
186
+ end
168
187
  end
169
188
 
170
189
  def collection_check_boxes(attribute, collection, value_method, text_method, options = {}, html_options = {}, &block)
@@ -176,7 +195,8 @@ module RailsBootstrapForm
176
195
  input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method)
177
196
  input_options = {
178
197
  bootstrap_form: {
179
- label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method)
198
+ label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method),
199
+ inline: true
180
200
  }
181
201
  }.deep_merge!(options)
182
202
 
@@ -184,7 +204,7 @@ module RailsBootstrapForm
184
204
  end
185
205
 
186
206
  if options.delete(:include_hidden) { true }
187
- inputs.prepend hidden_field(attribute, value: "", multiple: true)
207
+ inputs.prepend(hidden_field(attribute, value: "", multiple: options[:multiple]))
188
208
  end
189
209
 
190
210
  field_wrapper_builder(attribute, options, html_options) do
@@ -201,7 +221,8 @@ module RailsBootstrapForm
201
221
  input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method)
202
222
  input_options = {
203
223
  bootstrap_form: {
204
- label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method)
224
+ label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method),
225
+ inline: true
205
226
  }
206
227
  }.deep_merge!(options)
207
228
 
@@ -3,6 +3,6 @@
3
3
  # -*- warn_indent: true -*-
4
4
 
5
5
  module RailsBootstrapForm
6
- VERSION = "0.5.3".freeze
6
+ VERSION = "0.6.0".freeze
7
7
  REQUIRED_RAILS_VERSION = "~> 7.0".freeze
8
8
  end
@@ -17,6 +17,7 @@ module RailsBootstrapForm
17
17
  autoload :FieldWrapperBuilder
18
18
  autoload :InputGroupBuilder
19
19
  autoload :Inputs
20
+ autoload :Helpers
20
21
  end
21
22
 
22
23
  class << self
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_bootstrap_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harshal LADHE (shivam091)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-21 00:00:00.000000000 Z
11
+ date: 2023-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: generator_spec
@@ -65,6 +65,7 @@ files:
65
65
  - demo/app/views/layouts/application.html.erb
66
66
  - demo/app/views/users/_form.html.erb
67
67
  - demo/app/views/users/_form_without_bootstrap_helpers.html.erb
68
+ - demo/app/views/users/_horizontal_form.html.erb
68
69
  - demo/app/views/users/_vertical_form.html.erb
69
70
  - demo/app/views/users/edit.html.erb
70
71
  - demo/app/views/users/index.html.erb
@@ -120,9 +121,9 @@ files:
120
121
  - lib/rails_bootstrap_form/configuration.rb
121
122
  - lib/rails_bootstrap_form/engine.rb
122
123
  - lib/rails_bootstrap_form/field_wrapper_builder.rb
124
+ - lib/rails_bootstrap_form/helpers.rb
123
125
  - lib/rails_bootstrap_form/input_group_builder.rb
124
126
  - lib/rails_bootstrap_form/inputs.rb
125
- - lib/rails_bootstrap_form/inputs/base.rb
126
127
  - lib/rails_bootstrap_form/version.rb
127
128
  - sig/rails_bootstrap_form.rbs
128
129
  homepage: https://github.com/shivam091/rails_bootstrap_form
@@ -1,28 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- # -*- frozen_string_literal: true -*-
3
- # -*- warn_indent: true -*-
4
-
5
- module RailsBootstrapForm
6
- module Inputs
7
- module Base
8
- extend ActiveSupport::Concern
9
-
10
- def self.included(base_class)
11
- def collection_input_checked?(checked, obj, input_value)
12
- checked == input_value || Array(checked).try(:include?, input_value) ||
13
- checked == obj || Array(checked).try(:include?, obj)
14
- end
15
-
16
- def control_specific_class(field_tag_name)
17
- "rails-bootstrap-forms-#{field_tag_name.to_s.tr("_", "-")}"
18
- end
19
-
20
- def is_size_valid?(bootstrap_options)
21
- bootstrap_options.size && %i(sm lg).include?(bootstrap_options.size)
22
- end
23
-
24
- private :collection_input_checked?, :control_specific_class, :is_size_valid?
25
- end
26
- end
27
- end
28
- end