rails_bootstrap_form 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/app/assets/stylesheets/rails_bootstrap_form.css +2 -2
- data/demo/app/models/address.rb +2 -0
- data/demo/app/models/user.rb +9 -1
- data/demo/app/views/users/_vertical_form.html.erb +3 -6
- data/demo/config/locales/en.rb +2 -1
- data/lib/rails_bootstrap_form/bootstrap_form_options.rb +6 -0
- data/lib/rails_bootstrap_form/components/check_box.rb +66 -0
- data/lib/rails_bootstrap_form/components/help_text.rb +1 -1
- data/lib/rails_bootstrap_form/components/labels.rb +3 -3
- data/lib/rails_bootstrap_form/components/radio_button.rb +62 -0
- data/lib/rails_bootstrap_form/components.rb +4 -0
- data/lib/rails_bootstrap_form/field_wrapper_builder.rb +1 -1
- data/lib/rails_bootstrap_form/inputs.rb +87 -0
- data/lib/rails_bootstrap_form/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6b50f9d02bd4dce2b18bcbf5ce63159d4b62ef9c9b28a4e6e696b9780721e5f
|
4
|
+
data.tar.gz: fdd32e9dff7e170d3a220f7ba06fb981e5fe1c24f7a292aa9f20133d624fc27f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e769de6bd7e33924dda68e244acc498b8586ff7eb23242abe228c959335290f1869142dbff651166c958e5f7aa863961b69e0c85ee35ce3b2c7fef94c76e573c
|
7
|
+
data.tar.gz: 9e2dc6b8c51126c2b05760752c656ce6098c4ac178e66c9d7fc44f2e9a0013391dd82b3c36efb07562a6473adfff1af318905e3eb3a392bd6cce2db2dc83431d
|
data/Gemfile.lock
CHANGED
data/demo/app/models/address.rb
CHANGED
data/demo/app/models/user.rb
CHANGED
@@ -4,7 +4,15 @@
|
|
4
4
|
|
5
5
|
class User < ApplicationRecord
|
6
6
|
validates :name, presence: true, length: {in: 2..50}
|
7
|
-
validates :
|
7
|
+
validates :terms, acceptance: true
|
8
|
+
validates :email,
|
9
|
+
:password,
|
10
|
+
:mobile_number,
|
11
|
+
:birth_date,
|
12
|
+
:favorite_color,
|
13
|
+
:fruit_id,
|
14
|
+
:skill_ids,
|
15
|
+
presence: true
|
8
16
|
|
9
17
|
has_one :address, dependent: :destroy
|
10
18
|
|
@@ -9,15 +9,12 @@
|
|
9
9
|
<%= form.text_field :password, autocomplete: "new-password" %>
|
10
10
|
<%= form.phone_field :mobile_number %>
|
11
11
|
<%= form.date_field :birth_date %>
|
12
|
-
<%= form.check_box :terms %>
|
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: {layout: :inline}, checked: form.object.fruit_id} %>
|
15
16
|
<%= form.color_field :favorite_color %>
|
16
|
-
<%= form.
|
17
|
-
{include_blank: "Select Favorite Fruit"} %>
|
18
|
-
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name do |b| %>
|
19
|
-
<%= b.check_box + b.text %>
|
20
|
-
<% end %>
|
17
|
+
<%= form.collection_check_boxes :skill_ids, ::Skill.all, :id, :name, {bootstrap_form: {layout: :inline}} %>
|
21
18
|
<%= form.fields_for :address, include_id: false do |address_form| %>
|
22
19
|
<%= address_form.text_area :street %>
|
23
20
|
<%= address_form.text_field :state %>
|
data/demo/config/locales/en.rb
CHANGED
@@ -86,6 +86,10 @@ module RailsBootstrapForm
|
|
86
86
|
# Default is `form-control-plaintext`.
|
87
87
|
attr_accessor :static_field_class
|
88
88
|
|
89
|
+
# Option to control whether the check box should look like bootstrap switches.
|
90
|
+
# Default is `false`.
|
91
|
+
attr_accessor :switch
|
92
|
+
|
89
93
|
def initialize(options = {})
|
90
94
|
set_defaults
|
91
95
|
set_bootstrap_form_options(options)
|
@@ -146,6 +150,8 @@ module RailsBootstrapForm
|
|
146
150
|
@floating = false
|
147
151
|
|
148
152
|
@static_field_class = "form-control-plaintext"
|
153
|
+
|
154
|
+
@switch = false
|
149
155
|
end
|
150
156
|
|
151
157
|
private :set_defaults
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# -*- frozen_string_literal: true -*-
|
3
|
+
# -*- warn_indent: true -*-
|
4
|
+
|
5
|
+
module RailsBootstrapForm
|
6
|
+
module Components
|
7
|
+
module CheckBox
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
def self.included(base_class)
|
11
|
+
def check_box_label(attribute, checked_value, options, bootstrap_options, &block)
|
12
|
+
unless bootstrap_options.skip_label
|
13
|
+
label_options = {
|
14
|
+
class: check_box_label_class(attribute, bootstrap_options, options)
|
15
|
+
}
|
16
|
+
label_options[:for] = options[:id] if options[:id].present?
|
17
|
+
|
18
|
+
label_name = if options[:multiple]
|
19
|
+
check_box_value(attribute, checked_value)
|
20
|
+
else
|
21
|
+
attribute
|
22
|
+
end
|
23
|
+
|
24
|
+
label_text = check_box_label_text(attribute, options, bootstrap_options, &block)
|
25
|
+
|
26
|
+
label(label_name, label_text, label_options)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_box_label_text(attribute, options, bootstrap_options, &block)
|
31
|
+
block ? capture(&block) : label_text(attribute, bootstrap_options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def check_box_value(attribute, value)
|
35
|
+
# label's `for` attribute needs to match checkbox tag's id,
|
36
|
+
# IE sanitized value, IE
|
37
|
+
# https://github.com/rails/rails/blob/5-0-stable/actionview/lib/action_view/helpers/tags/base.rb#L123-L125
|
38
|
+
"#{attribute}_#{value.to_s.gsub(/\s/, "_").gsub(/[^-[[:word:]]]/, "").mb_chars.downcase}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def check_box_classes(attribute, options)
|
42
|
+
classes = Array(options[:class]) << "form-check-input"
|
43
|
+
classes << "is-invalid" if is_invalid?(attribute)
|
44
|
+
classes.flatten.compact
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_box_label_class(attribute, bootstrap_options, options)
|
48
|
+
classes = Array("form-check-label") << bootstrap_options.additional_label_class
|
49
|
+
classes << "required" if is_field_required?(attribute, options)
|
50
|
+
classes << "is-invalid" if is_invalid?(attribute)
|
51
|
+
classes << bootstrap_options.hide_class if bootstrap_options.hide_label
|
52
|
+
classes.flatten.compact
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_box_wrapper_class(bootstrap_options)
|
56
|
+
classes = ["mb-3", "form-check"]
|
57
|
+
classes << "form-switch" if bootstrap_options.switch
|
58
|
+
classes << "form-check-inline" if bootstrap_options.inline?
|
59
|
+
classes.flatten.compact
|
60
|
+
end
|
61
|
+
|
62
|
+
private :check_box_label, :check_box_classes, :check_box_label_class, :check_box_wrapper_class
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -13,7 +13,7 @@ module RailsBootstrapForm
|
|
13
13
|
|
14
14
|
help_text = (bootstrap_options.help_text || scoped_help_text(attribute))
|
15
15
|
|
16
|
-
tag.
|
16
|
+
tag.div(help_text, class: "form-text text-muted") if help_text.present?
|
17
17
|
end
|
18
18
|
|
19
19
|
def object_class
|
@@ -8,12 +8,12 @@ module RailsBootstrapForm
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
def self.included(base_class)
|
11
|
-
def
|
11
|
+
def draw_label(attribute, bootstrap_options)
|
12
12
|
unless bootstrap_options.skip_label
|
13
13
|
label_class = label_classes(attribute, bootstrap_options)
|
14
14
|
label_text = label_text(attribute, bootstrap_options)
|
15
15
|
|
16
|
-
|
16
|
+
label(attribute, label_text, class: label_class)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -29,7 +29,7 @@ module RailsBootstrapForm
|
|
29
29
|
bootstrap_options.label_text || object&.class.try(:human_attribute_name, attribute)
|
30
30
|
end
|
31
31
|
|
32
|
-
private :
|
32
|
+
private :draw_label, :label_classes, :label_text
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# -*- frozen_string_literal: true -*-
|
3
|
+
# -*- warn_indent: true -*-
|
4
|
+
|
5
|
+
module RailsBootstrapForm
|
6
|
+
module Components
|
7
|
+
module RadioButton
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
def self.included(base_class)
|
11
|
+
def radio_button_label(attribute, value, options, bootstrap_options)
|
12
|
+
unless bootstrap_options.skip_label
|
13
|
+
label_options = {
|
14
|
+
value: value,
|
15
|
+
class: radio_button_label_class(attribute, bootstrap_options, options)
|
16
|
+
}
|
17
|
+
label_options[:for] = options[:id] if options[:id].present?
|
18
|
+
|
19
|
+
label_name = if options[:multiple]
|
20
|
+
radio_button_value(attribute, checked_value)
|
21
|
+
else
|
22
|
+
attribute
|
23
|
+
end
|
24
|
+
|
25
|
+
label_text = label_text(attribute, bootstrap_options)
|
26
|
+
|
27
|
+
label(label_name, label_text, label_options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def radio_button_value(attribute, value)
|
32
|
+
# label's `for` attribute needs to match checkbox tag's id,
|
33
|
+
# IE sanitized value, IE
|
34
|
+
# https://github.com/rails/rails/blob/5-0-stable/actionview/lib/action_view/helpers/tags/base.rb#L123-L125
|
35
|
+
"#{attribute}_#{value.to_s.gsub(/\s/, "_").gsub(/[^-[[:word:]]]/, "").mb_chars.downcase}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def radio_button_classes(attribute, options)
|
39
|
+
classes = Array(options[:class]) << "form-check-input"
|
40
|
+
classes << "is-invalid" if is_invalid?(attribute)
|
41
|
+
classes.flatten.compact
|
42
|
+
end
|
43
|
+
|
44
|
+
def radio_button_label_class(attribute, bootstrap_options, options)
|
45
|
+
classes = Array("form-check-label") << bootstrap_options.additional_label_class
|
46
|
+
classes << "required" if is_field_required?(attribute, options)
|
47
|
+
classes << "is-invalid" if is_invalid?(attribute)
|
48
|
+
classes << bootstrap_options.hide_class if bootstrap_options.hide_label
|
49
|
+
classes.flatten.compact
|
50
|
+
end
|
51
|
+
|
52
|
+
def radio_button_wrapper_class(bootstrap_options)
|
53
|
+
classes = ["mb-3", "form-check"]
|
54
|
+
classes << "form-check-inline" if bootstrap_options.inline?
|
55
|
+
classes.flatten.compact
|
56
|
+
end
|
57
|
+
|
58
|
+
private :radio_button_label, :radio_button_classes, :radio_button_label_class, :radio_button_wrapper_class
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -10,10 +10,14 @@ module RailsBootstrapForm
|
|
10
10
|
autoload :Labels
|
11
11
|
autoload :RequiredField
|
12
12
|
autoload :Errors
|
13
|
+
autoload :CheckBox
|
14
|
+
autoload :RadioButton
|
13
15
|
|
14
16
|
include HelpText
|
15
17
|
include Labels
|
16
18
|
include RequiredField
|
17
19
|
include Errors
|
20
|
+
include CheckBox
|
21
|
+
include RadioButton
|
18
22
|
end
|
19
23
|
end
|
@@ -13,7 +13,7 @@ module RailsBootstrapForm
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def field_wrapper(attribute, bootstrap_options, options, &block)
|
16
|
-
label =
|
16
|
+
label = draw_label(attribute, bootstrap_options)
|
17
17
|
help_text = help_text(attribute, bootstrap_options)
|
18
18
|
|
19
19
|
if bootstrap_options.floating
|
@@ -120,5 +120,92 @@ module RailsBootstrapForm
|
|
120
120
|
|
121
121
|
text_field(attribute, static_options)
|
122
122
|
end
|
123
|
+
|
124
|
+
def check_box(attribute, options = {}, checked_value = "1", unchecked_value = "0", &block)
|
125
|
+
bootstrap_options = bootstrap_form_options.scoped(options.delete(:bootstrap_form))
|
126
|
+
|
127
|
+
options[:class] = check_box_classes(attribute, options)
|
128
|
+
|
129
|
+
check_box_field = super(attribute, options, checked_value, unchecked_value)
|
130
|
+
check_box_help_text = help_text(attribute, bootstrap_options)
|
131
|
+
|
132
|
+
check_box_label = check_box_label(attribute, checked_value, options, bootstrap_options, &block)
|
133
|
+
|
134
|
+
check_box_html = tag.div(class: check_box_wrapper_class(bootstrap_options)) do
|
135
|
+
concat(check_box_field)
|
136
|
+
concat(check_box_label)
|
137
|
+
concat(check_box_help_text)
|
138
|
+
concat(generate_error(attribute)) if is_invalid?(attribute)
|
139
|
+
end
|
140
|
+
|
141
|
+
check_box_html
|
142
|
+
end
|
143
|
+
|
144
|
+
def radio_button(attribute, value, options = {})
|
145
|
+
bootstrap_options = bootstrap_form_options.scoped(options.delete(:bootstrap_form))
|
146
|
+
|
147
|
+
options[:class] = radio_button_classes(attribute, options)
|
148
|
+
|
149
|
+
radio_button_field = super(attribute, value, options)
|
150
|
+
radio_button_help_text = help_text(attribute, bootstrap_options)
|
151
|
+
|
152
|
+
radio_button_label = radio_button_label(attribute, value, options, bootstrap_options)
|
153
|
+
|
154
|
+
radio_button_html = tag.div(class: radio_button_wrapper_class(bootstrap_options)) do
|
155
|
+
concat(radio_button_field)
|
156
|
+
concat(radio_button_label)
|
157
|
+
concat(radio_button_help_text)
|
158
|
+
concat(generate_error(attribute)) if is_invalid?(attribute)
|
159
|
+
end
|
160
|
+
|
161
|
+
radio_button_html
|
162
|
+
end
|
163
|
+
|
164
|
+
def collection_check_boxes(attribute, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
165
|
+
options[:multiple] = true
|
166
|
+
|
167
|
+
inputs = ActiveSupport::SafeBuffer.new
|
168
|
+
|
169
|
+
collection.each do |object|
|
170
|
+
input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method)
|
171
|
+
input_options = {
|
172
|
+
bootstrap_form: {
|
173
|
+
label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method)
|
174
|
+
}
|
175
|
+
}.deep_merge!(options)
|
176
|
+
|
177
|
+
inputs << check_box(attribute, input_options, input_value, nil)
|
178
|
+
end
|
179
|
+
|
180
|
+
inputs
|
181
|
+
end
|
182
|
+
|
183
|
+
def collection_radio_buttons(attribute, collection, value_method, text_method, options = {}, html_options = {}, &block)
|
184
|
+
inputs = ActiveSupport::SafeBuffer.new
|
185
|
+
|
186
|
+
collection.each do |object|
|
187
|
+
input_value = value_method.respond_to?(:call) ? value_method.call(object) : object.send(value_method)
|
188
|
+
input_options = {
|
189
|
+
bootstrap_form: {
|
190
|
+
label_text: text_method.respond_to?(:call) ? text_method.call(object) : object.send(text_method)
|
191
|
+
}
|
192
|
+
}.deep_merge!(options)
|
193
|
+
|
194
|
+
if (checked = input_options[:checked])
|
195
|
+
input_options[:checked] = collection_input_checked?(checked, object, object.send(value_method))
|
196
|
+
end
|
197
|
+
|
198
|
+
inputs << radio_button(attribute, input_value, input_options)
|
199
|
+
end
|
200
|
+
|
201
|
+
inputs
|
202
|
+
end
|
203
|
+
|
204
|
+
def collection_input_checked?(checked, obj, input_value)
|
205
|
+
checked == input_value || Array(checked).try(:include?, input_value) ||
|
206
|
+
checked == obj || Array(checked).try(:include?, obj)
|
207
|
+
end
|
208
|
+
|
209
|
+
private :collection_input_checked?
|
123
210
|
end
|
124
211
|
end
|
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.
|
4
|
+
version: 0.5.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-
|
11
|
+
date: 2023-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: generator_spec
|
@@ -111,9 +111,11 @@ files:
|
|
111
111
|
- lib/rails_bootstrap_form/bootstrap_form_builder.rb
|
112
112
|
- lib/rails_bootstrap_form/bootstrap_form_options.rb
|
113
113
|
- lib/rails_bootstrap_form/components.rb
|
114
|
+
- lib/rails_bootstrap_form/components/check_box.rb
|
114
115
|
- lib/rails_bootstrap_form/components/errors.rb
|
115
116
|
- lib/rails_bootstrap_form/components/help_text.rb
|
116
117
|
- lib/rails_bootstrap_form/components/labels.rb
|
118
|
+
- lib/rails_bootstrap_form/components/radio_button.rb
|
117
119
|
- lib/rails_bootstrap_form/components/required_field.rb
|
118
120
|
- lib/rails_bootstrap_form/configuration.rb
|
119
121
|
- lib/rails_bootstrap_form/engine.rb
|