Skip to content

Commit

Permalink
Set required and aria on input when input is required
Browse files Browse the repository at this point in the history
fixes #604
  • Loading branch information
Charlotte Hanekamp committed Nov 1, 2021
1 parent dd64827 commit 9564f23
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 64 deletions.
9 changes: 9 additions & 0 deletions demo/app/assets/stylesheets/actiontext.scss
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,12 @@
}
}
}
label.required {
&:after {
color: red;
content: '*';
}
}
input[required="required"]{
border: 1px solid red;
}
15 changes: 15 additions & 0 deletions demo/app/views/bootstrap/form.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
<h3>Horizontal Form</h3>

<%= form_with_source do %>
<%= bootstrap_form_with model: @user, layout: :horizontal, local: true do |form| %>
<%= form.text_field :email, placeholder: "Enter Email", label: "Email address", help: "Email pressence true" %>
<%= form.text_field :email, placeholder: "Enter Email", label: "Email address", help: "Email pressence true with required false", required: false %>
<%= form.text_field :email, placeholder: "Enter Email", label: "Email address", help: "Email pressence true with skip required false", skip_required: false %>
<%= form.text_field :email, placeholder: "Enter Email", label: "Email address", help: "Email pressence true with skip required true", skip_required: true %>
<%= form.text_field :misc, placeholder: "Enter Misc", label: "Misc", help: "Misc not required by model" %>
<%= form.text_field :misc, placeholder: "Enter Misc", label: "Misc", help: "Misc not required by model with required true", required: true %>
<%= form.text_field :misc, placeholder: "Enter Misc", label: "Misc", help: "Misc not required by model with required false", required: false %>
<%= form.text_field :comments, required: true %>
<%= form.check_box :misc, switch: true %>
<%= form.submit %>
<% end %>
<% end %>
<%= form_with_source do %>
<%= bootstrap_form_with model: @user, layout: :horizontal, local: true do |form| %>
<%= form.email_field :email, placeholder: "Enter Email", label: "Email address", help: "We'll never share your email with anyone else" %>
Expand Down
17 changes: 11 additions & 6 deletions lib/bootstrap_form/form_group_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ def form_group_builder(method, options, html_options=nil, &block)
def form_group_builder_options(options, method)
options.symbolize_keys!
options = convert_form_tag_options(method, options) if acts_like_form_tag
options[:required] = form_group_required(options) if !options[:skip_label] && options.key?(:skip_required)
options[:required] = form_group_required(options, method)
options[:aria] = { required: true } if options[:required]
options
end

Expand Down Expand Up @@ -77,11 +78,15 @@ def form_group_label_class(options)
classes
end

def form_group_required(options)
return unless options.key?(:skip_required)

warn "`:skip_required` is deprecated, use `:required: false` instead"
options[:skip_required] ? false : :default
def form_group_required(options, method)
if options[:skip_required]
warn "`:skip_required` is deprecated, use `:required: false` instead"
false
elsif options.key?(:required)
options[:required]
else
required_attribute?(object, method)
end
end

def form_group_css_options(method, html_options, options)
Expand Down
13 changes: 9 additions & 4 deletions lib/bootstrap_form/inputs/check_box.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@ module CheckBox
included do
def check_box_with_bootstrap(name, options={}, checked_value="1", unchecked_value="0", &block)
options = options.symbolize_keys!
check_box_options = options.except(:class, :label, :label_class, :error_message, :help,
:inline, :hide_label, :skip_label, :wrapper_class, :switch)
check_box_options[:class] = check_box_classes(name, options)

tag.div(class: check_box_wrapper_class(options)) do
html = check_box_without_bootstrap(name, check_box_options, checked_value, unchecked_value)
html = check_box_without_bootstrap(name, check_box_options(name, options), checked_value, unchecked_value)
html.concat(check_box_label(name, options, checked_value, &block)) unless options[:skip_label]
html.concat(generate_error(name)) if options[:error_message]
html
Expand All @@ -26,6 +23,14 @@ def check_box_with_bootstrap(name, options={}, checked_value="1", unchecked_valu

private

def check_box_options(name, options)
check_box_options = options.except(:class, :label, :label_class, :error_message, :help,
:inline, :hide_label, :skip_label, :wrapper_class, :switch)
check_box_options[:class] = check_box_classes(name, options)
check_box_options[:aria] = { required: true } if options[:required]
check_box_options
end

def check_box_label(name, options, checked_value, &block)
label_name = if options[:multiple]
check_box_value(name, checked_value)
Expand Down
4 changes: 2 additions & 2 deletions test/bootstrap_checkbox_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -510,11 +510,11 @@ class BootstrapCheckboxTest < ActionView::TestCase
<label class="form-label" for="user_misc">Misc</label>
<div class="form-check">
<input class="form-check-input is-invalid" id="user_misc_1" name="user[misc][]" type="checkbox" value="1" />
<label class="form-check-label" for="user_misc_1">Foo</label>
<label class="form-check-label" for="user_misc_1"> Foo</label>
</div>
<div class="form-check">
<input class="form-check-input is-invalid" id="user_misc_2" name="user[misc][]" type="checkbox" value="2" />
<label class="form-check-label" for="user_misc_2">Bar</label>
<label class="form-check-label" for="user_misc_2"> Bar</label>
<div class="invalid-feedback">a box must be checked</div>
</div>
</div>
Expand Down
8 changes: 4 additions & 4 deletions test/bootstrap_fields_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ class BootstrapFieldsTest < ActionView::TestCase
expected = <<~HTML
<div class="mb-3">
<label class="form-label required" for="user_email">Email</label>
<input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" />
<input aria-required="true" required="required" class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" />
</div>
HTML
assert_equivalent_xml expected, @builder.text_field(:email)
Expand All @@ -218,7 +218,7 @@ class BootstrapFieldsTest < ActionView::TestCase
<div class="mb-3 g-3">
<label class="form-label col-form-label col-sm-2 required" for="user_email">Email</label>
<div class="col-sm-10">
<input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" />
<input aria-required="true" required="required" class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" />
</div>
</div>
HTML
Expand All @@ -230,7 +230,7 @@ class BootstrapFieldsTest < ActionView::TestCase
expected = <<~HTML
<div class="mb-3">
<label class="form-label required" for="custom_id">Email</label>
<input class="form-control" id="custom_id" name="user[email]" type="text" value="steve@example.com" />
<input aria-required="true" required="required" class="form-control" id="custom_id" name="user[email]" type="text" value="steve@example.com" />
</div>
HTML
assert_equivalent_xml expected, @builder.text_field(:email, id: :custom_id)
Expand Down Expand Up @@ -420,7 +420,7 @@ class BootstrapFieldsTest < ActionView::TestCase
test "can have a floating label" do
expected = <<~HTML
<div class="mb-3 form-floating">
<input class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" placeholder="Email" />
<input aria-required="true" required="required" class="form-control" id="user_email" name="user[email]" type="text" value="steve@example.com" placeholder="Email" />
<label class="form-label required" for="user_email">Email</label>
</div>
HTML
Expand Down
Loading

0 comments on commit 9564f23

Please sign in to comment.