bootstrap_form 4.2.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.editorconfig +13 -0
- data/.github/workflows/ruby.yml +46 -0
- data/.gitignore +16 -1
- data/.rubocop.yml +20 -17
- data/CHANGELOG.md +59 -1
- data/CONTRIBUTING.md +72 -6
- data/Dangerfile +5 -7
- data/Dockerfile +26 -0
- data/Gemfile +10 -13
- data/OLD-README.md +12 -1
- data/README.md +140 -60
- data/RELEASING.md +2 -2
- data/UPGRADE-4.0.md +1 -1
- data/UPGRADE-5.0.md +25 -0
- data/bootstrap_form.gemspec +9 -5
- data/demo/app/assets/config/manifest.js +1 -2
- data/demo/app/helpers/bootstrap_helper.rb +5 -5
- data/demo/app/views/bootstrap/form.html.erb +14 -1
- data/demo/app/views/layouts/application.html.erb +3 -3
- data/demo/config/environments/development.rb +1 -1
- data/demo/config/puma.rb +2 -2
- data/demo/db/schema.rb +2 -2
- data/docker-compose.yml +70 -0
- data/gemfiles/5.2.gemfile +4 -0
- data/gemfiles/6.0.gemfile +4 -0
- data/gemfiles/6.1.gemfile +4 -0
- data/gemfiles/edge.gemfile +4 -0
- data/lib/bootstrap_form/action_view_extensions/form_helper.rb +1 -15
- data/lib/bootstrap_form/components/labels.rb +1 -1
- data/lib/bootstrap_form/components/layout.rb +1 -1
- data/lib/bootstrap_form/components/validation.rb +1 -1
- data/lib/bootstrap_form/configuration.rb +22 -0
- data/lib/bootstrap_form/form_builder.rb +17 -2
- data/lib/bootstrap_form/form_group.rb +21 -10
- data/lib/bootstrap_form/form_group_builder.rb +6 -8
- data/lib/bootstrap_form/helpers/bootstrap.rb +16 -18
- data/lib/bootstrap_form/inputs/base.rb +5 -5
- data/lib/bootstrap_form/inputs/check_box.rb +9 -23
- data/lib/bootstrap_form/inputs/collection_select.rb +1 -0
- data/lib/bootstrap_form/inputs/file_field.rb +3 -15
- data/lib/bootstrap_form/inputs/grouped_collection_select.rb +1 -0
- data/lib/bootstrap_form/inputs/radio_button.rb +6 -24
- data/lib/bootstrap_form/inputs/select.rb +1 -0
- data/lib/bootstrap_form/inputs/time_zone_select.rb +1 -0
- data/lib/bootstrap_form/version.rb +1 -1
- data/lib/bootstrap_form.rb +17 -7
- metadata +33 -10
- data/.travis.yml +0 -38
data/docker-compose.yml
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
version: '2.4'
|
2
|
+
|
3
|
+
services:
|
4
|
+
app: &app
|
5
|
+
build:
|
6
|
+
context: .
|
7
|
+
args:
|
8
|
+
RUBY_VERSION: '2.7.1'
|
9
|
+
NODE_MAJOR: '12'
|
10
|
+
YARN_VERSION: '1.22.4'
|
11
|
+
BUNDLER_VERSION: '2.1.4'
|
12
|
+
image: bootstrap-form:0.0.1
|
13
|
+
tmpfs:
|
14
|
+
- /tmp
|
15
|
+
|
16
|
+
backend: &backend
|
17
|
+
<<: *app
|
18
|
+
stdin_open: true
|
19
|
+
tty: true
|
20
|
+
volumes:
|
21
|
+
- .:/app:cached
|
22
|
+
- rails_cache:/app/tmp/cache
|
23
|
+
- bundle:/usr/local/bundle
|
24
|
+
- node_modules:/app/node_modules
|
25
|
+
- packs:/app/public/packs
|
26
|
+
environment:
|
27
|
+
- NODE_ENV=development
|
28
|
+
- RAILS_ENV=${RAILS_ENV:-development}
|
29
|
+
- BOOTSNAP_CACHE_DIR=/usr/local/bundle/_bootsnap
|
30
|
+
- WEBPACKER_DEV_SERVER_HOST=webpacker
|
31
|
+
- WEB_CONCURRENCY=1
|
32
|
+
- HISTFILE=/app/.bash_history
|
33
|
+
- EDITOR=vi
|
34
|
+
|
35
|
+
shell:
|
36
|
+
<<: *backend
|
37
|
+
command: /bin/bash
|
38
|
+
ports:
|
39
|
+
- '3000:3000'
|
40
|
+
|
41
|
+
server:
|
42
|
+
<<: *backend
|
43
|
+
command: sh -c "cd demo/app && bundle exec rails server -b 0.0.0.0"
|
44
|
+
ports:
|
45
|
+
- '3000:3000'
|
46
|
+
|
47
|
+
test:
|
48
|
+
<<: *backend
|
49
|
+
command: rake test
|
50
|
+
|
51
|
+
webpacker:
|
52
|
+
<<: *app
|
53
|
+
command: ./bin/webpack-dev-server
|
54
|
+
ports:
|
55
|
+
- '3035:3035'
|
56
|
+
volumes:
|
57
|
+
- .:/app:cached
|
58
|
+
- bundle:/usr/local/bundle
|
59
|
+
- node_modules:/app/node_modules
|
60
|
+
- packs:/app/public/packs
|
61
|
+
environment:
|
62
|
+
- NODE_ENV=${NODE_ENV:-development}
|
63
|
+
- RAILS_ENV=${RAILS_ENV:-development}
|
64
|
+
- WEBPACKER_DEV_SERVER_HOST=0.0.0.0
|
65
|
+
|
66
|
+
volumes:
|
67
|
+
bundle:
|
68
|
+
node_modules:
|
69
|
+
rails_cache:
|
70
|
+
packs:
|
@@ -20,8 +20,6 @@ module BootstrapForm
|
|
20
20
|
def bootstrap_form_for(record, options={}, &block)
|
21
21
|
options.reverse_merge!(builder: BootstrapForm::FormBuilder)
|
22
22
|
|
23
|
-
options = process_options(options)
|
24
|
-
|
25
23
|
with_bootstrap_form_field_error_proc do
|
26
24
|
form_for(record, options, &block)
|
27
25
|
end
|
@@ -30,10 +28,8 @@ module BootstrapForm
|
|
30
28
|
def bootstrap_form_with(options={}, &block)
|
31
29
|
options.reverse_merge!(builder: BootstrapForm::FormBuilder)
|
32
30
|
|
33
|
-
options = process_options(options)
|
34
|
-
|
35
31
|
with_bootstrap_form_field_error_proc do
|
36
|
-
form_with(options, &block)
|
32
|
+
form_with(**options, &block)
|
37
33
|
end
|
38
34
|
end
|
39
35
|
|
@@ -45,16 +41,6 @@ module BootstrapForm
|
|
45
41
|
|
46
42
|
private
|
47
43
|
|
48
|
-
def process_options(options)
|
49
|
-
options[:html] ||= {}
|
50
|
-
options[:html][:role] ||= "form"
|
51
|
-
|
52
|
-
options[:layout] == :inline &&
|
53
|
-
options[:html][:class] = [options[:html][:class], "form-inline"].compact.join(" ")
|
54
|
-
|
55
|
-
options
|
56
|
-
end
|
57
|
-
|
58
44
|
def with_bootstrap_form_field_error_proc
|
59
45
|
original_proc = ActionView::Base.field_error_proc
|
60
46
|
ActionView::Base.field_error_proc = BootstrapForm.field_error_proc
|
@@ -23,7 +23,7 @@ module BootstrapForm
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def label_classes(name, options, custom_label_col, group_layout)
|
26
|
-
classes = [options[:class], label_layout_classes(custom_label_col, group_layout)]
|
26
|
+
classes = ["form-label", options[:class], label_layout_classes(custom_label_col, group_layout)]
|
27
27
|
|
28
28
|
case options.delete(:required)
|
29
29
|
when true
|
@@ -14,7 +14,7 @@ module BootstrapForm
|
|
14
14
|
def required_attribute?(obj, attribute)
|
15
15
|
return false unless obj && attribute
|
16
16
|
|
17
|
-
target = obj.
|
17
|
+
target = obj.instance_of?(Class) ? obj : obj.class
|
18
18
|
|
19
19
|
target_validators = if target.respond_to? :validators_on
|
20
20
|
target.validators_on(attribute).map(&:class)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BootstrapForm
|
4
|
+
class Configuration
|
5
|
+
def default_form_attributes=(attributes)
|
6
|
+
case attributes
|
7
|
+
when nil
|
8
|
+
@default_form_attributes = {}
|
9
|
+
when Hash
|
10
|
+
@default_form_attributes = attributes
|
11
|
+
else
|
12
|
+
raise ArgumentError, "Unsupported default_form_attributes #{attributes.inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def default_form_attributes
|
17
|
+
return @default_form_attributes if defined? @default_form_attributes
|
18
|
+
|
19
|
+
{}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -43,10 +43,10 @@ module BootstrapForm
|
|
43
43
|
include BootstrapForm::Inputs::UrlField
|
44
44
|
include BootstrapForm::Inputs::WeekField
|
45
45
|
|
46
|
-
delegate :content_tag, :capture, :concat, to: :@template
|
46
|
+
delegate :content_tag, :capture, :concat, :tag, to: :@template
|
47
47
|
|
48
48
|
def initialize(object_name, object, template, options)
|
49
|
-
@layout = options[:layout]
|
49
|
+
@layout = options[:layout] || default_layout
|
50
50
|
@label_col = options[:label_col] || default_label_col
|
51
51
|
@control_col = options[:control_col] || default_control_col
|
52
52
|
@label_errors = options[:label_errors] || false
|
@@ -57,9 +57,19 @@ module BootstrapForm
|
|
57
57
|
options[:inline_errors] != false
|
58
58
|
end
|
59
59
|
@acts_like_form_tag = options[:acts_like_form_tag]
|
60
|
+
add_default_form_attributes_and_form_inline options
|
60
61
|
super
|
61
62
|
end
|
62
63
|
|
64
|
+
def add_default_form_attributes_and_form_inline(options)
|
65
|
+
options[:html] ||= {}
|
66
|
+
options[:html].reverse_merge!(BootstrapForm.config.default_form_attributes)
|
67
|
+
|
68
|
+
return unless options[:layout] == :inline
|
69
|
+
|
70
|
+
options[:html][:class] = [options[:html][:class], "col-auto", "g-3"].compact.join(" ")
|
71
|
+
end
|
72
|
+
|
63
73
|
def fields_for_with_bootstrap(record_name, record_object=nil, fields_options={}, &block)
|
64
74
|
fields_options = fields_for_options(record_object, fields_options)
|
65
75
|
record_object.is_a?(Hash) && record_object.extractable_options? &&
|
@@ -86,6 +96,11 @@ module BootstrapForm
|
|
86
96
|
field_options
|
87
97
|
end
|
88
98
|
|
99
|
+
def default_layout
|
100
|
+
# :default, :horizontal or :inline
|
101
|
+
:default
|
102
|
+
end
|
103
|
+
|
89
104
|
def default_label_col
|
90
105
|
"col-sm-2"
|
91
106
|
end
|
@@ -10,9 +10,9 @@ module BootstrapForm
|
|
10
10
|
|
11
11
|
options[:class] = form_group_classes(options)
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
tag.div(**options.except(:append, :id, :label, :help, :icon,
|
14
|
+
:input_group_class, :label_col, :control_col,
|
15
|
+
:add_control_col_class, :layout, :prepend, :floating)) do
|
16
16
|
form_group_content(
|
17
17
|
generate_label(options[:id], name, options[:label], options[:label_col], options[:layout]),
|
18
18
|
generate_help(name, options[:help]), options, &block
|
@@ -24,8 +24,8 @@ module BootstrapForm
|
|
24
24
|
|
25
25
|
def form_group_content_tag(name, field_name, without_field_name, options, html_options)
|
26
26
|
html_class = control_specific_class(field_name)
|
27
|
-
html_class = "#{html_class}
|
28
|
-
|
27
|
+
html_class = "#{html_class} col-auto g-3" if @layout == :horizontal && options[:skip_inline].blank?
|
28
|
+
tag.div(class: html_class) do
|
29
29
|
input_with_error(name) do
|
30
30
|
send(without_field_name, name, options, html_options)
|
31
31
|
end
|
@@ -34,10 +34,12 @@ module BootstrapForm
|
|
34
34
|
|
35
35
|
def form_group_content(label, help_text, options, &block)
|
36
36
|
if group_layout_horizontal?(options[:layout])
|
37
|
-
concat(label).concat(
|
37
|
+
concat(label).concat(tag.div(capture(&block) + help_text, class: form_group_control_class(options)))
|
38
38
|
else
|
39
|
-
|
39
|
+
# Floating labels need to be rendered after the field
|
40
|
+
concat(label) unless options[:floating]
|
40
41
|
concat(capture(&block))
|
42
|
+
concat(label) if options[:floating]
|
41
43
|
concat(help_text) if help_text
|
42
44
|
end
|
43
45
|
end
|
@@ -50,15 +52,24 @@ module BootstrapForm
|
|
50
52
|
end
|
51
53
|
|
52
54
|
def form_group_classes(options)
|
53
|
-
classes = ["
|
54
|
-
classes << "row" if
|
55
|
-
classes << "
|
55
|
+
classes = ["mb-3", options[:class].try(:split)].flatten.compact
|
56
|
+
classes << "row" if horizontal_group_with_gutters?(options[:layout], classes)
|
57
|
+
classes << "col-auto g-3" if field_inline_override?(options[:layout])
|
56
58
|
classes << feedback_class if options[:icon]
|
59
|
+
classes << "form-floating" if options[:floating]
|
57
60
|
classes
|
58
61
|
end
|
59
62
|
|
63
|
+
def horizontal_group_with_gutters?(layout, classes)
|
64
|
+
group_layout_horizontal?(layout) && !classes_include_gutters?(classes)
|
65
|
+
end
|
66
|
+
|
60
67
|
def group_layout_horizontal?(layout)
|
61
68
|
get_group_layout(layout) == :horizontal
|
62
69
|
end
|
70
|
+
|
71
|
+
def classes_include_gutters?(classes)
|
72
|
+
classes.any? { |c| c =~ /^g-\d+$/ }
|
73
|
+
end
|
63
74
|
end
|
64
75
|
end
|
@@ -6,7 +6,7 @@ module BootstrapForm
|
|
6
6
|
|
7
7
|
private
|
8
8
|
|
9
|
-
def form_group_builder(method, options, html_options=nil)
|
9
|
+
def form_group_builder(method, options, html_options=nil, &block)
|
10
10
|
no_wrapper = options[:wrapper] == false
|
11
11
|
|
12
12
|
options = form_group_builder_options(options, method)
|
@@ -21,16 +21,14 @@ module BootstrapForm
|
|
21
21
|
if no_wrapper
|
22
22
|
yield
|
23
23
|
else
|
24
|
-
form_group(method, form_group_options)
|
24
|
+
form_group(method, form_group_options, &block)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
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
|
-
|
32
|
-
options[:required] = form_group_required(options) if options.key?(:skip_required)
|
33
|
-
end
|
31
|
+
options[:required] = form_group_required(options) if !options[:skip_label] && options.key?(:skip_required)
|
34
32
|
options
|
35
33
|
end
|
36
34
|
|
@@ -48,7 +46,8 @@ module BootstrapForm
|
|
48
46
|
id: options[:id], help: options[:help], icon: options[:icon],
|
49
47
|
label_col: options[:label_col], control_col: options[:control_col],
|
50
48
|
add_control_col_class: options[:add_control_col_class],
|
51
|
-
layout: get_group_layout(options[:layout]), class: options[:wrapper_class]
|
49
|
+
layout: get_group_layout(options[:layout]), class: options[:wrapper_class],
|
50
|
+
floating: options[:floating]
|
52
51
|
}
|
53
52
|
|
54
53
|
form_group_options.merge!(wrapper_options) if wrapper_options.is_a?(Hash)
|
@@ -57,12 +56,11 @@ module BootstrapForm
|
|
57
56
|
end
|
58
57
|
|
59
58
|
def form_group_label(options, css_options)
|
60
|
-
|
59
|
+
{
|
61
60
|
text: form_group_label_text(options[:label]),
|
62
61
|
class: form_group_label_class(options),
|
63
62
|
required: options[:required]
|
64
63
|
}.merge(css_options[:id].present? ? { for: css_options[:id] } : {})
|
65
|
-
hash
|
66
64
|
end
|
67
65
|
|
68
66
|
def form_group_label_text(label)
|
@@ -14,7 +14,7 @@ module BootstrapForm
|
|
14
14
|
def primary(name=nil, options={}, &block)
|
15
15
|
setup_css_class "btn btn-primary", options
|
16
16
|
|
17
|
-
if options[:render_as_button] ||
|
17
|
+
if options[:render_as_button] || block
|
18
18
|
options.except! :render_as_button
|
19
19
|
button(name, options, &block)
|
20
20
|
else
|
@@ -26,8 +26,8 @@ module BootstrapForm
|
|
26
26
|
css = options[:class] || "alert alert-danger"
|
27
27
|
return unless object.respond_to?(:errors) && object.errors.full_messages.any?
|
28
28
|
|
29
|
-
|
30
|
-
concat
|
29
|
+
tag.div class: css do
|
30
|
+
concat tag.p title
|
31
31
|
concat error_summary unless options[:error_summary] == false
|
32
32
|
end
|
33
33
|
end
|
@@ -35,9 +35,9 @@ module BootstrapForm
|
|
35
35
|
def error_summary
|
36
36
|
return unless object.errors.any?
|
37
37
|
|
38
|
-
|
38
|
+
tag.ul class: "rails-bootstrap-forms-error-summary" do
|
39
39
|
object.errors.full_messages.each do |error|
|
40
|
-
concat
|
40
|
+
concat tag.li(error)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -46,8 +46,9 @@ module BootstrapForm
|
|
46
46
|
return unless error?(name)
|
47
47
|
|
48
48
|
hide_attribute_name = options[:hide_attribute_name] || false
|
49
|
+
custom_class = options[:custom_class] || false
|
49
50
|
|
50
|
-
|
51
|
+
tag.div class: custom_class || "invalid-feedback" do
|
51
52
|
if hide_attribute_name
|
52
53
|
object.errors[name].join(", ")
|
53
54
|
else
|
@@ -82,10 +83,10 @@ module BootstrapForm
|
|
82
83
|
|
83
84
|
input = capture(&block) || ActiveSupport::SafeBuffer.new
|
84
85
|
|
85
|
-
input =
|
86
|
+
input = attach_input(options, :prepend) + input + attach_input(options, :append)
|
86
87
|
input += generate_error(name)
|
87
88
|
options.present? &&
|
88
|
-
input =
|
89
|
+
input = tag.div(input, class: ["input-group", options[:input_group_class]].compact)
|
89
90
|
input
|
90
91
|
end
|
91
92
|
|
@@ -95,9 +96,9 @@ module BootstrapForm
|
|
95
96
|
end
|
96
97
|
|
97
98
|
def input_group_content(content)
|
98
|
-
return content if
|
99
|
+
return content if /btn/.match?(content)
|
99
100
|
|
100
|
-
|
101
|
+
tag.span(content, class: "input-group-text")
|
101
102
|
end
|
102
103
|
|
103
104
|
def static_class
|
@@ -106,14 +107,11 @@ module BootstrapForm
|
|
106
107
|
|
107
108
|
private
|
108
109
|
|
109
|
-
def
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
def prepend_input(options)
|
115
|
-
html = content_tag(:div, input_group_content(options[:prepend]), class: "input-group-prepend") if options[:prepend]
|
116
|
-
html || ActiveSupport::SafeBuffer.new
|
110
|
+
def attach_input(options, key)
|
111
|
+
tags = [*options[key]].map do |item|
|
112
|
+
input_group_content(item)
|
113
|
+
end
|
114
|
+
ActiveSupport::SafeBuffer.new(tags.join)
|
117
115
|
end
|
118
116
|
|
119
117
|
def setup_css_class(the_class, options={})
|
@@ -10,7 +10,8 @@ module BootstrapForm
|
|
10
10
|
define_method "#{field_name}_with_bootstrap" do |name, options={}|
|
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]
|
14
|
+
send("#{field_name}_without_bootstrap".to_sym, name, options.except(:floating))
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -19,11 +20,10 @@ module BootstrapForm
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def bootstrap_select_group(field_name)
|
22
|
-
|
23
|
-
|
24
|
-
define_method(with_field_name) do |name, options={}, html_options={}|
|
23
|
+
define_method("#{field_name}_with_bootstrap") do |name, options={}, html_options={}|
|
24
|
+
html_options = html_options.reverse_merge(control_class: "form-select")
|
25
25
|
form_group_builder(name, options, html_options) do
|
26
|
-
form_group_content_tag(name, field_name,
|
26
|
+
form_group_content_tag(name, field_name, "#{field_name}_without_bootstrap", options, html_options)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -10,10 +10,10 @@ module BootstrapForm
|
|
10
10
|
def check_box_with_bootstrap(name, options={}, checked_value="1", unchecked_value="0", &block)
|
11
11
|
options = options.symbolize_keys!
|
12
12
|
check_box_options = options.except(:class, :label, :label_class, :error_message, :help,
|
13
|
-
:inline, :
|
13
|
+
:inline, :hide_label, :skip_label, :wrapper_class, :switch)
|
14
14
|
check_box_options[:class] = check_box_classes(name, options)
|
15
15
|
|
16
|
-
|
16
|
+
tag.div(class: check_box_wrapper_class(options)) do
|
17
17
|
html = check_box_without_bootstrap(name, check_box_options, checked_value, unchecked_value)
|
18
18
|
html.concat(check_box_label(name, options, checked_value, &block)) unless options[:skip_label]
|
19
19
|
html.concat(generate_error(name)) if options[:error_message]
|
@@ -38,8 +38,8 @@ module BootstrapForm
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def check_box_description(name, options, &block)
|
41
|
-
content =
|
42
|
-
content ||
|
41
|
+
content = block ? capture(&block) : options[:label]
|
42
|
+
content || object&.class&.human_attribute_name(name) || name.to_s.humanize
|
43
43
|
end
|
44
44
|
|
45
45
|
def check_box_value(name, value)
|
@@ -50,40 +50,26 @@ module BootstrapForm
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def check_box_classes(name, options)
|
53
|
-
classes =
|
54
|
-
classes << (options[:custom] ? "custom-control-input" : "form-check-input")
|
53
|
+
classes = Array(options[:class]) << "form-check-input"
|
55
54
|
classes << "is-invalid" if error?(name)
|
56
55
|
classes << "position-static" if options[:skip_label] || options[:hide_label]
|
57
56
|
classes.flatten.compact
|
58
57
|
end
|
59
58
|
|
60
59
|
def check_box_label_class(options)
|
61
|
-
classes = []
|
62
|
-
classes << (options[:custom] ? "custom-control-label" : "form-check-label")
|
60
|
+
classes = ["form-check-label"]
|
63
61
|
classes << options[:label_class]
|
64
62
|
classes << hide_class if options[:hide_label]
|
65
63
|
classes.flatten.compact
|
66
64
|
end
|
67
65
|
|
68
66
|
def check_box_wrapper_class(options)
|
69
|
-
classes = []
|
70
|
-
if options[:
|
71
|
-
|
72
|
-
else
|
73
|
-
classes << "form-check"
|
74
|
-
classes << "form-check-inline" if layout_inline?(options[:inline])
|
75
|
-
end
|
67
|
+
classes = ["form-check"]
|
68
|
+
classes << "form-check-inline" if layout_inline?(options[:inline])
|
69
|
+
classes << "form-switch" if options[:switch]
|
76
70
|
classes << options[:wrapper_class] if options[:wrapper_class].present?
|
77
71
|
classes.flatten.compact
|
78
72
|
end
|
79
|
-
|
80
|
-
def custom_check_box_wrapper_class(options)
|
81
|
-
classes = []
|
82
|
-
classes << "custom-control"
|
83
|
-
classes << (options[:custom] == :switch ? "custom-switch" : "custom-checkbox")
|
84
|
-
classes << "custom-control-inline" if layout_inline?(options[:inline])
|
85
|
-
classes
|
86
|
-
end
|
87
73
|
end
|
88
74
|
end
|
89
75
|
end
|
@@ -10,6 +10,7 @@ module BootstrapForm
|
|
10
10
|
# Disabling Metrics/ParameterLists because the upstream Rails method has the same parameters
|
11
11
|
# rubocop:disable Metrics/ParameterLists
|
12
12
|
def collection_select_with_bootstrap(method, collection, value_method, text_method, options={}, html_options={})
|
13
|
+
html_options = html_options.reverse_merge(control_class: "form-select")
|
13
14
|
form_group_builder(method, options, html_options) do
|
14
15
|
input_with_error(method) do
|
15
16
|
collection_select_without_bootstrap(method, collection, value_method, text_method, options, html_options)
|
@@ -8,28 +8,16 @@ module BootstrapForm
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
def file_field_with_bootstrap(name, options={})
|
11
|
-
options = options.reverse_merge(control_class: "
|
11
|
+
options = options.reverse_merge(control_class: "form-control")
|
12
12
|
form_group_builder(name, options) do
|
13
|
-
|
14
|
-
|
15
|
-
file_field_input(name, options)
|
16
|
-
end
|
13
|
+
input_with_error(name) do
|
14
|
+
file_field_without_bootstrap(name, options)
|
17
15
|
end
|
18
16
|
end
|
19
17
|
end
|
20
18
|
|
21
19
|
bootstrap_alias :file_field
|
22
20
|
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def file_field_input(name, options)
|
27
|
-
placeholder = options.delete(:placeholder) || "Choose file"
|
28
|
-
placeholder_opts = { class: "custom-file-label" }
|
29
|
-
placeholder_opts[:for] = options[:id] if options[:id].present?
|
30
|
-
|
31
|
-
file_field_without_bootstrap(name, options) + label(name, placeholder, placeholder_opts)
|
32
|
-
end
|
33
21
|
end
|
34
22
|
end
|
35
23
|
end
|
@@ -12,6 +12,7 @@ module BootstrapForm
|
|
12
12
|
def grouped_collection_select_with_bootstrap(method, collection, group_method,
|
13
13
|
group_label_method, option_key_method,
|
14
14
|
option_value_method, options={}, html_options={})
|
15
|
+
html_options = html_options.reverse_merge(control_class: "form-select")
|
15
16
|
form_group_builder(method, options, html_options) do
|
16
17
|
input_with_error(method) do
|
17
18
|
grouped_collection_select_without_bootstrap(method, collection, group_method,
|
@@ -10,11 +10,11 @@ module BootstrapForm
|
|
10
10
|
def radio_button_with_bootstrap(name, value, *args)
|
11
11
|
options = args.extract_options!.symbolize_keys!
|
12
12
|
radio_button_options = options.except(:class, :label, :label_class, :error_message, :help,
|
13
|
-
:inline, :
|
13
|
+
:inline, :hide_label, :skip_label, :wrapper_class)
|
14
14
|
|
15
15
|
radio_button_options[:class] = radio_button_classes(name, options)
|
16
16
|
|
17
|
-
|
17
|
+
tag.div(class: radio_button_wrapper_class(options)) do
|
18
18
|
html = radio_button_without_bootstrap(name, value, radio_button_options)
|
19
19
|
html.concat(radio_button_label(name, value, options)) unless options[:skip_label]
|
20
20
|
html.concat(generate_error(name)) if options[:error_message]
|
@@ -34,43 +34,25 @@ module BootstrapForm
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def radio_button_classes(name, options)
|
37
|
-
classes =
|
38
|
-
classes << (options[:custom] ? "custom-control-input" : "form-check-input")
|
37
|
+
classes = Array(options[:class]) << "form-check-input"
|
39
38
|
classes << "is-invalid" if error?(name)
|
40
39
|
classes << "position-static" if options[:skip_label] || options[:hide_label]
|
41
40
|
classes.flatten.compact
|
42
41
|
end
|
43
42
|
|
44
43
|
def radio_button_label_class(options)
|
45
|
-
classes = []
|
46
|
-
classes << (options[:custom] ? "custom-control-label" : "form-check-label")
|
44
|
+
classes = ["form-check-label"]
|
47
45
|
classes << options[:label_class]
|
48
46
|
classes << hide_class if options[:hide_label]
|
49
47
|
classes.flatten.compact
|
50
48
|
end
|
51
49
|
|
52
50
|
def radio_button_wrapper_class(options)
|
53
|
-
classes = []
|
54
|
-
classes << if options[:custom]
|
55
|
-
custom_radio_button_wrapper_class(options)
|
56
|
-
else
|
57
|
-
standard_radio_button_wrapper_class(options)
|
58
|
-
end
|
59
|
-
classes << options[:wrapper_class] if options[:wrapper_class].present?
|
60
|
-
classes.flatten.compact
|
61
|
-
end
|
62
|
-
|
63
|
-
def standard_radio_button_wrapper_class(options)
|
64
51
|
classes = ["form-check"]
|
65
52
|
classes << "form-check-inline" if layout_inline?(options[:inline])
|
66
53
|
classes << "disabled" if options[:disabled]
|
67
|
-
classes
|
68
|
-
|
69
|
-
|
70
|
-
def custom_radio_button_wrapper_class(options)
|
71
|
-
classes = ["custom-control", "custom-radio"]
|
72
|
-
classes << "custom-control-inline" if layout_inline?(options[:inline])
|
73
|
-
classes
|
54
|
+
classes << options[:wrapper_class] if options[:wrapper_class].present?
|
55
|
+
classes.flatten.compact
|
74
56
|
end
|
75
57
|
end
|
76
58
|
end
|
@@ -8,6 +8,7 @@ module BootstrapForm
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
def select_with_bootstrap(method, choices=nil, options={}, html_options={}, &block)
|
11
|
+
html_options = html_options.reverse_merge(control_class: "form-select")
|
11
12
|
form_group_builder(method, options, html_options) do
|
12
13
|
prepend_and_append_input(method, options) do
|
13
14
|
select_without_bootstrap(method, choices, options, html_options, &block)
|
@@ -8,6 +8,7 @@ module BootstrapForm
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
def time_zone_select_with_bootstrap(method, priority_zones=nil, options={}, html_options={})
|
11
|
+
html_options = html_options.reverse_merge(control_class: "form-select")
|
11
12
|
form_group_builder(method, options, html_options) do
|
12
13
|
input_with_error(method) do
|
13
14
|
time_zone_select_without_bootstrap(method, priority_zones, options, html_options)
|