bootstrap_form 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +102 -0
- data/.rubocop_todo.yml +104 -0
- data/.travis.yml +6 -3
- data/CHANGELOG.md +14 -1
- data/CODE_OF_CONDUCT.md +76 -0
- data/CONTRIBUTING.md +49 -20
- data/Dangerfile +5 -5
- data/Gemfile +1 -0
- data/README.md +52 -4
- data/Rakefile +7 -1
- data/bootstrap_form.gemspec +1 -1
- data/demo/app/controllers/bootstrap_controller.rb +2 -4
- data/demo/app/helpers/bootstrap_helper.rb +0 -2
- data/demo/app/models/address.rb +1 -1
- data/demo/app/models/faux_user.rb +1 -1
- data/demo/app/models/user.rb +2 -2
- data/demo/bin/bundle +2 -2
- data/demo/bin/rails +3 -3
- data/demo/bin/rake +2 -2
- data/demo/bin/setup +8 -8
- data/demo/bin/update +8 -8
- data/demo/bin/yarn +3 -3
- data/demo/config.ru +1 -1
- data/demo/config/application.rb +3 -5
- data/demo/config/environments/development.rb +3 -5
- data/demo/config/environments/test.rb +2 -4
- data/demo/config/initializers/assets.rb +2 -2
- data/lib/bootstrap_form.rb +2 -2
- data/lib/bootstrap_form/aliasing.rb +5 -5
- data/lib/bootstrap_form/form_builder.rb +106 -85
- data/lib/bootstrap_form/helper.rb +7 -8
- data/lib/bootstrap_form/helpers/bootstrap.rb +25 -27
- data/lib/bootstrap_form/version.rb +1 -1
- metadata +5 -2
data/Dangerfile
CHANGED
@@ -22,7 +22,7 @@ if has_lib_changes && !has_test_changes
|
|
22
22
|
warn("There are code changes, but no corresponding tests. "\
|
23
23
|
"Please include tests if this PR introduces any modifications in "\
|
24
24
|
"#{project_name}'s behavior.",
|
25
|
-
:
|
25
|
+
sticky: false)
|
26
26
|
end
|
27
27
|
|
28
28
|
# ------------------------------------------------------------------------------
|
@@ -35,10 +35,10 @@ Here's an example of a CHANGELOG.md entry (place it immediately under the `* You
|
|
35
35
|
```markdown
|
36
36
|
* [##{pr_number}](#{pr_url}): #{github.pr_title} - [@#{github.pr_author}](https://github.com/#{github.pr_author}).
|
37
37
|
```
|
38
|
-
MARKDOWN
|
38
|
+
MARKDOWN
|
39
39
|
warn("Please update CHANGELOG.md with a description of your changes. "\
|
40
40
|
"If this PR is not a user-facing change (e.g. just refactoring), "\
|
41
|
-
"you can disregard this.", :
|
41
|
+
"you can disregard this.", sticky: false)
|
42
42
|
end
|
43
43
|
|
44
44
|
# ------------------------------------------------------------------------------
|
@@ -46,9 +46,9 @@ end
|
|
46
46
|
# ------------------------------------------------------------------------------
|
47
47
|
if has_changelog_changes
|
48
48
|
if IO.read("CHANGELOG.md").scan(/^\s*[-\*] Your contribution here/i).count < 3
|
49
|
-
|
49
|
+
raise(
|
50
50
|
"Please put the `- Your contribution here!` line back into CHANGELOG.md.",
|
51
|
-
:
|
51
|
+
sticky: false
|
52
52
|
)
|
53
53
|
end
|
54
54
|
end
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -21,7 +21,7 @@ Bootstrap v4-style forms into your Rails application.
|
|
21
21
|
Add it to your Gemfile:
|
22
22
|
|
23
23
|
```ruby
|
24
|
-
gem "bootstrap_form", ">= 4.
|
24
|
+
gem "bootstrap_form", ">= 4.1.0"
|
25
25
|
```
|
26
26
|
|
27
27
|
Then:
|
@@ -213,10 +213,11 @@ validator with the associated model attribute. Presently this is one of:
|
|
213
213
|
ActiveRecord::Validations::PresenceValidator or
|
214
214
|
ActiveModel::Validations::PresenceValidator.
|
215
215
|
|
216
|
-
In cases where this behavior is undesirable, use the `
|
216
|
+
In cases where this behavior is undesirable, use the `required` option to force the class to be present or absent:
|
217
217
|
|
218
218
|
```erb
|
219
|
-
<%= f.password_field :
|
219
|
+
<%= f.password_field :login, label: "New Username", required: true %>
|
220
|
+
<%= f.password_field :password, label: "New Password", required: false %>
|
220
221
|
```
|
221
222
|
|
222
223
|
### Input Elements / Controls
|
@@ -302,12 +303,24 @@ Which produces the following output:
|
|
302
303
|
|
303
304
|
You still can use `wrapper_class` option to set only a css class. This is just a short form of `wrapper: { class: 'additional-class' }`.
|
304
305
|
|
306
|
+
### Suppressing the Form Group Altogether
|
307
|
+
|
308
|
+
You may have want to define your own form group div around a field. To do so, add the option `wrapper: false` to the input field. For example:
|
309
|
+
|
310
|
+
```
|
311
|
+
f.form_group :user do
|
312
|
+
f.email_field :email, wrapper: false
|
313
|
+
end
|
314
|
+
```
|
315
|
+
|
316
|
+
Note that Bootstrap relies on the form group div to correctly format most fields, so if you use the `wrapper: false` option, you should provide your own form group div around the input field. You can write your own HTML, or use the `form_group` helper.
|
317
|
+
|
305
318
|
### Selects
|
306
319
|
|
307
320
|
Our select helper accepts the same arguments as the [default Rails helper](http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select). Here's an example of how you pass both options and html_options hashes:
|
308
321
|
|
309
322
|
```erb
|
310
|
-
<%= f.select :product, [["Apple", 1], ["Grape", 2]], { label: "Choose your favorite fruit:"
|
323
|
+
<%= f.select :product, [["Apple", 1], ["Grape", 2]], { label: "Choose your favorite fruit:", wrapper: { class: 'has-warning', data: { foo: 'bar' } } }, { class: "selectpicker" } %>
|
311
324
|
```
|
312
325
|
|
313
326
|
### Checkboxes and Radios
|
@@ -353,6 +366,13 @@ Check boxes and radio buttons are wrapped in a `div.form-check`. You can add cla
|
|
353
366
|
```erb
|
354
367
|
<%= f.radio_button :skill_level, 0, label: "Novice", inline: true, wrapper_class: "w-auto" %>
|
355
368
|
```
|
369
|
+
#### Switches
|
370
|
+
|
371
|
+
To render checkboxes as switches with Bootstrap 4.2+, add the proper wrapper class:
|
372
|
+
|
373
|
+
```erb
|
374
|
+
<%= f.check_box :remember_me, custom: true, wrapper_class: 'custom-switch' %>
|
375
|
+
```
|
356
376
|
|
357
377
|
#### Collections
|
358
378
|
|
@@ -539,6 +559,34 @@ The `label_col` and `control_col` css classes can also be changed per control:
|
|
539
559
|
<% end %>
|
540
560
|
```
|
541
561
|
|
562
|
+
or default value can be changed in initializer:
|
563
|
+
|
564
|
+
```erb
|
565
|
+
# config/initializers/bootstrap_form.rb
|
566
|
+
module BootstrapForm
|
567
|
+
class FormBuilder
|
568
|
+
def default_label_col
|
569
|
+
'col-sm-4'
|
570
|
+
end
|
571
|
+
def default_control_col
|
572
|
+
'col-sm-8'
|
573
|
+
end
|
574
|
+
end
|
575
|
+
end
|
576
|
+
```
|
577
|
+
|
578
|
+
Control col wrapper class can be modified with `add_control_col_class`. This option will preserve column definition:
|
579
|
+
|
580
|
+
```erb
|
581
|
+
<%= bootstrap_form_for(@user, layout: :horizontal) do |f| %>
|
582
|
+
<%= f.email_field :email %>
|
583
|
+
<%= f.text_field :age, add_control_col_class: "additional-control-col-class" %>
|
584
|
+
<%= f.form_group do %>
|
585
|
+
<%= f.submit %>
|
586
|
+
<% end %>
|
587
|
+
<% end %>
|
588
|
+
```
|
589
|
+
|
542
590
|
### Custom Field Layout
|
543
591
|
|
544
592
|
The form-level `layout` can be overridden per field, unless the form-level layout was `inline`:
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
begin
|
2
2
|
require 'bundler/setup'
|
3
|
+
require 'rubocop/rake_task'
|
3
4
|
rescue LoadError
|
4
5
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
6
|
end
|
@@ -30,4 +31,9 @@ task "release:rubygem_push" do
|
|
30
31
|
Rake.application.invoke_task("chandler:push")
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
+
desc 'Run RuboCop checks -- see .rubocop_todo.yml for outstanding offenses'
|
35
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
36
|
+
task.options = %w[--config .rubocop_todo.yml]
|
37
|
+
end
|
38
|
+
|
39
|
+
task default: %i[test rubocop]
|
data/bootstrap_form.gemspec
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
class BootstrapController < ApplicationController
|
2
|
-
|
3
2
|
def form
|
4
3
|
@collection = [
|
5
|
-
Address.new(id: 1, street:
|
6
|
-
Address.new(id: 2, street:
|
4
|
+
Address.new(id: 1, street: "Foo"),
|
5
|
+
Address.new(id: 2, street: "Bar")
|
7
6
|
]
|
8
7
|
|
9
8
|
@user = User.new
|
@@ -12,5 +11,4 @@ class BootstrapController < ApplicationController
|
|
12
11
|
@user_with_error.errors.add(:email)
|
13
12
|
@user_with_error.errors.add(:misc)
|
14
13
|
end
|
15
|
-
|
16
14
|
end
|
data/demo/app/models/address.rb
CHANGED
data/demo/app/models/user.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
class User <
|
1
|
+
class User < ApplicationRecord
|
2
2
|
serialize :preferences
|
3
3
|
|
4
|
-
validates :email, presence: true, :
|
4
|
+
validates :email, presence: true, length: { minimum: 5 }
|
5
5
|
validates :terms, acceptance: { accept: true }
|
6
6
|
|
7
7
|
has_one :address
|
data/demo/bin/bundle
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
ENV[
|
3
|
-
load Gem.bin_path(
|
2
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
3
|
+
load Gem.bin_path("bundler", "bundle")
|
data/demo/bin/rails
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
APP_PATH = File.expand_path(
|
3
|
-
require_relative
|
4
|
-
require
|
2
|
+
APP_PATH = File.expand_path("../config/application", __dir__)
|
3
|
+
require_relative "../config/boot"
|
4
|
+
require "rails/commands"
|
data/demo/bin/rake
CHANGED
data/demo/bin/setup
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require
|
2
|
+
require "fileutils"
|
3
3
|
include FileUtils
|
4
4
|
|
5
5
|
# path to your application root.
|
6
|
-
APP_ROOT = File.expand_path(
|
6
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
7
7
|
|
8
8
|
def system!(*args)
|
9
9
|
system(*args) || abort("\n== Command #{args} failed ==")
|
@@ -13,9 +13,9 @@ chdir APP_ROOT do
|
|
13
13
|
# This script is a starting point to setup your application.
|
14
14
|
# Add necessary setup steps to this file.
|
15
15
|
|
16
|
-
puts
|
17
|
-
system!
|
18
|
-
system(
|
16
|
+
puts "== Installing dependencies =="
|
17
|
+
system! "gem install bundler --conservative"
|
18
|
+
system("bundle check") || system!("bundle install")
|
19
19
|
|
20
20
|
# Install JavaScript dependencies if using Yarn
|
21
21
|
# system('bin/yarn')
|
@@ -26,11 +26,11 @@ chdir APP_ROOT do
|
|
26
26
|
# end
|
27
27
|
|
28
28
|
puts "\n== Preparing database =="
|
29
|
-
system!
|
29
|
+
system! "bin/rails db:setup"
|
30
30
|
|
31
31
|
puts "\n== Removing old logs and tempfiles =="
|
32
|
-
system!
|
32
|
+
system! "bin/rails log:clear tmp:clear"
|
33
33
|
|
34
34
|
puts "\n== Restarting application server =="
|
35
|
-
system!
|
35
|
+
system! "bin/rails restart"
|
36
36
|
end
|
data/demo/bin/update
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require
|
2
|
+
require "fileutils"
|
3
3
|
include FileUtils
|
4
4
|
|
5
5
|
# path to your application root.
|
6
|
-
APP_ROOT = File.expand_path(
|
6
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
7
7
|
|
8
8
|
def system!(*args)
|
9
9
|
system(*args) || abort("\n== Command #{args} failed ==")
|
@@ -13,19 +13,19 @@ chdir APP_ROOT do
|
|
13
13
|
# This script is a way to update your development environment automatically.
|
14
14
|
# Add necessary update steps to this file.
|
15
15
|
|
16
|
-
puts
|
17
|
-
system!
|
18
|
-
system(
|
16
|
+
puts "== Installing dependencies =="
|
17
|
+
system! "gem install bundler --conservative"
|
18
|
+
system("bundle check") || system!("bundle install")
|
19
19
|
|
20
20
|
# Install JavaScript dependencies if using Yarn
|
21
21
|
# system('bin/yarn')
|
22
22
|
|
23
23
|
puts "\n== Updating database =="
|
24
|
-
system!
|
24
|
+
system! "bin/rails db:migrate"
|
25
25
|
|
26
26
|
puts "\n== Removing old logs and tempfiles =="
|
27
|
-
system!
|
27
|
+
system! "bin/rails log:clear tmp:clear"
|
28
28
|
|
29
29
|
puts "\n== Restarting application server =="
|
30
|
-
system!
|
30
|
+
system! "bin/rails restart"
|
31
31
|
end
|
data/demo/bin/yarn
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
APP_ROOT = File.expand_path(
|
2
|
+
APP_ROOT = File.expand_path("..", __dir__)
|
3
3
|
Dir.chdir(APP_ROOT) do
|
4
4
|
begin
|
5
5
|
exec "yarnpkg #{ARGV.join(' ')}"
|
6
6
|
rescue Errno::ENOENT
|
7
|
-
|
8
|
-
|
7
|
+
warn "Yarn executable was not detected in the system."
|
8
|
+
warn "Download Yarn at https://yarnpkg.com/en/docs/install"
|
9
9
|
exit 1
|
10
10
|
end
|
11
11
|
end
|
data/demo/config.ru
CHANGED
data/demo/config/application.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "boot"
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rails/all"
|
4
4
|
|
5
5
|
Bundler.require(*Rails.groups)
|
6
6
|
require "bootstrap_form"
|
@@ -13,9 +13,7 @@ module Dummy
|
|
13
13
|
config.load_defaults [Rails::VERSION::MAJOR, Rails::VERSION::MINOR].join(".")
|
14
14
|
end
|
15
15
|
|
16
|
-
if config.respond_to?(:secret_key_base)
|
17
|
-
config.secret_key_base = "ignore"
|
18
|
-
end
|
16
|
+
config.secret_key_base = "ignore" if config.respond_to?(:secret_key_base)
|
19
17
|
|
20
18
|
# Settings in config/environments/* take precedence over those specified here.
|
21
19
|
# Application configuration should go into files in config/initializers
|
@@ -14,12 +14,12 @@ Rails.application.configure do
|
|
14
14
|
|
15
15
|
# Enable/disable caching. By default caching is disabled.
|
16
16
|
# Run rails dev:cache to toggle caching.
|
17
|
-
if Rails.root.join(
|
17
|
+
if Rails.root.join("tmp/caching-dev.txt").exist?
|
18
18
|
config.action_controller.perform_caching = true
|
19
19
|
|
20
20
|
config.cache_store = :memory_store
|
21
21
|
config.public_file_server.headers = {
|
22
|
-
|
22
|
+
"Cache-Control" => "public, max-age=#{2.days.to_i}"
|
23
23
|
}
|
24
24
|
else
|
25
25
|
config.action_controller.perform_caching = false
|
@@ -28,9 +28,7 @@ Rails.application.configure do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
# Store uploaded files on the local file system (see config/storage.yml for options)
|
31
|
-
if config.respond_to?(:active_storage)
|
32
|
-
config.active_storage.service = :local
|
33
|
-
end
|
31
|
+
config.active_storage.service = :local if config.respond_to?(:active_storage)
|
34
32
|
|
35
33
|
# Don't care if the mailer can't send.
|
36
34
|
config.action_mailer.raise_delivery_errors = false
|
@@ -15,7 +15,7 @@ Rails.application.configure do
|
|
15
15
|
# Configure public file server for tests with Cache-Control for performance.
|
16
16
|
config.public_file_server.enabled = true
|
17
17
|
config.public_file_server.headers = {
|
18
|
-
|
18
|
+
"Cache-Control" => "public, max-age=#{1.hour.to_i}"
|
19
19
|
}
|
20
20
|
|
21
21
|
# Show full error reports and disable caching.
|
@@ -29,9 +29,7 @@ Rails.application.configure do
|
|
29
29
|
config.action_controller.allow_forgery_protection = false
|
30
30
|
|
31
31
|
# Store uploaded files on the local file system in a temporary directory
|
32
|
-
if config.respond_to?(:active_storage)
|
33
|
-
config.active_storage.service = :test
|
34
|
-
end
|
32
|
+
config.active_storage.service = :test if config.respond_to?(:active_storage)
|
35
33
|
|
36
34
|
config.action_mailer.perform_caching = false
|
37
35
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
2
2
|
|
3
3
|
# Version of your assets, change this if you want to expire all your assets.
|
4
|
-
Rails.application.config.assets.version =
|
4
|
+
Rails.application.config.assets.version = "1.0"
|
5
5
|
|
6
6
|
# Add additional assets to the asset load path.
|
7
7
|
# Rails.application.config.assets.paths << Emoji.images_path
|
8
8
|
# Add Yarn node_modules folder to the asset load path.
|
9
|
-
Rails.application.config.assets.paths << Rails.root.join(
|
9
|
+
Rails.application.config.assets.paths << Rails.root.join("node_modules")
|
10
10
|
|
11
11
|
# Precompile additional assets.
|
12
12
|
# application.js, application.css, and all non-JS/CSS in the app/assets
|
data/lib/bootstrap_form.rb
CHANGED
@@ -13,7 +13,8 @@ module BootstrapForm
|
|
13
13
|
|
14
14
|
# Strip out punctuation on predicates, bang or writer methods since
|
15
15
|
# e.g. target?_without_feature is not a valid method name.
|
16
|
-
aliased_target
|
16
|
+
aliased_target = target.to_s.sub(/([?!=])$/, "")
|
17
|
+
punctuation = Regexp.last_match(1)
|
17
18
|
yield(aliased_target, punctuation) if block_given?
|
18
19
|
|
19
20
|
with_method = "#{aliased_target}_with_#{feature}#{punctuation}"
|
@@ -22,12 +23,11 @@ module BootstrapForm
|
|
22
23
|
alias_method without_method, target
|
23
24
|
alias_method target, with_method
|
24
25
|
|
25
|
-
|
26
|
-
when public_method_defined?(without_method)
|
26
|
+
if public_method_defined?(without_method)
|
27
27
|
public target
|
28
|
-
|
28
|
+
elsif protected_method_defined?(without_method)
|
29
29
|
protected target
|
30
|
-
|
30
|
+
elsif private_method_defined?(without_method)
|
31
31
|
private target
|
32
32
|
end
|
33
33
|
end
|