Skip to content

Commit a175d1c

Browse files
committed
aria-labelledby for errors
1 parent 4a4d1c6 commit a175d1c

File tree

8 files changed

+24
-23
lines changed

8 files changed

+24
-23
lines changed

.yarnrc

Lines changed: 0 additions & 5 deletions
This file was deleted.

README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,38 +1490,38 @@ Generated HTML:
14901490
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
14911491
<div class="mb-3">
14921492
<label class="form-label required" for="user_email">Email</label>
1493-
<input class="form-control is-invalid" id="user_email" name="user[email]" required="required" type="email" value="steve.example.com">
1494-
<div class="invalid-feedback">is invalid</div>
1493+
<input aria-labelledby="user_email_feedback" class="form-control is-invalid" id="user_email" name="user[email]" required="required" type="email" value="steve.example.com">
1494+
<div class="invalid-feedback" id="user_email_feedback">is invalid</div>
14951495
</div>
14961496
<div class="mb-3">
14971497
<label class="form-label" for="user_misc">Misc</label>
14981498
<div class="form-check">
1499-
<input checked class="form-check-input is-invalid" id="user_misc_1" name="user[misc]" type="radio" value="1">
1499+
<input aria-labelledby="user_misc_feedback" checked class="form-check-input is-invalid" id="user_misc_1" name="user[misc]" type="radio" value="1">
15001500
<label class="form-check-label" for="user_misc_1">Mind reading</label>
15011501
</div>
15021502
<div class="form-check">
1503-
<input class="form-check-input is-invalid" id="user_misc_2" name="user[misc]" type="radio" value="2">
1503+
<input aria-labelledby="user_misc_feedback" class="form-check-input is-invalid" id="user_misc_2" name="user[misc]" type="radio" value="2">
15041504
<label class="form-check-label" for="user_misc_2">Farming</label>
1505-
<div class="invalid-feedback">is invalid</div>
1505+
<div class="invalid-feedback" id="user_misc_feedback">is invalid</div>
15061506
</div>
15071507
</div>
15081508
<input id="user_preferences" name="user[preferences][]" type="hidden" value="">
15091509
<div class="mb-3">
15101510
<label class="form-label" for="user_preferences">Preferences</label>
15111511
<div class="form-check">
1512-
<input checked class="form-check-input is-invalid" id="user_preferences_1" name="user[preferences][]" type="checkbox" value="1">
1512+
<input aria-labelledby="user_preferences_feedback" checked class="form-check-input is-invalid" id="user_preferences_1" name="user[preferences][]" type="checkbox" value="1">
15131513
<label class="form-check-label" for="user_preferences_1">Good</label>
15141514
</div>
15151515
<div class="form-check">
1516-
<input class="form-check-input is-invalid" id="user_preferences_2" name="user[preferences][]" type="checkbox" value="2">
1516+
<input aria-labelledby="user_preferences_feedback" class="form-check-input is-invalid" id="user_preferences_2" name="user[preferences][]" type="checkbox" value="2">
15171517
<label class="form-check-label" for="user_preferences_2">Bad</label>
1518-
<div class="invalid-feedback">is invalid</div>
1518+
<div class="invalid-feedback" id="user_preferences_feedback">is invalid</div>
15191519
</div>
15201520
</div>
15211521
<div class="mb-3">
15221522
<label class="form-label" for="user_address_attributes_street">Street</label>
1523-
<input class="form-control is-invalid" id="user_address_attributes_street" name="user[address_attributes][street]" type="text" value="Bar">
1524-
<div class="invalid-feedback">is invalid</div>
1523+
<input aria-labelledby="user_address_attributes_street_feedback" class="form-control is-invalid" id="user_address_attributes_street" name="user[address_attributes][street]" type="text" value="Bar">
1524+
<div class="invalid-feedback" id="user_address_attributes_street_feedback">is invalid</div>
15251525
</div>
15261526
</form>
15271527
```
@@ -1551,8 +1551,8 @@ Generated HTML:
15511551
```html
15521552
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
15531553
<div class="mb-3">
1554-
<label class="form-label required text-danger" for="user_email">Email is invalid</label>
1555-
<input class="form-control is-invalid" id="user_email" name="user[email]" required="required" type="email" value="steve.example.com">
1554+
<label class="form-label required text-danger" for="user_email" id="user_email_feedback">Email is invalid</label>
1555+
<input aria-labelledby="user_email_feedback" class="form-control is-invalid" id="user_email" name="user[email]" required="required" type="email" value="steve.example.com">
15561556
</div>
15571557
</form>
15581558
```
@@ -1649,7 +1649,7 @@ Which outputs:
16491649
```html
16501650
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
16511651
<input autocomplete="off" class="is-invalid" disabled type="hidden">
1652-
<div class="invalid-feedback">Email is invalid</div>
1652+
<div class="invalid-feedback" id="user_email_feedback">Email is invalid</div>
16531653
</form>
16541654
```
16551655

@@ -1670,7 +1670,7 @@ Which outputs:
16701670
```html
16711671
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
16721672
<input autocomplete="off" class="is-invalid" disabled type="hidden">
1673-
<div class="invalid-feedback">is invalid</div>
1673+
<div class="invalid-feedback" id="user_email_feedback">is invalid</div>
16741674
</form>
16751675
```
16761676

@@ -1689,7 +1689,7 @@ Which outputs:
16891689
```html
16901690
<form accept-charset="UTF-8" action="/users" class="new_user" id="new_user" method="post">
16911691
<input autocomplete="off" class="is-invalid" disabled type="hidden">
1692-
<div class="custom-error">Email is invalid</div>
1692+
<div class="custom-error" id="user_email_feedback">Email is invalid</div>
16931693
</form>
16941694
```
16951695

lib/bootstrap_form/components/labels.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def generate_label(id, name, options, custom_label_col, group_layout)
1818

1919
options[:class] = label_classes(name, options, custom_label_col, group_layout)
2020
options.delete(:class) if options[:class].none?
21+
options[:id] = field_id(name, :feedback) if error?(name) && label_errors
2122

2223
label(name, label_text(name, options), options.except(:text))
2324
end

lib/bootstrap_form/components/validation.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def generate_error(name)
6868
help_klass = "invalid-feedback"
6969
help_tag = :div
7070

71-
content_tag(help_tag, help_text, class: help_klass)
71+
content_tag(help_tag, help_text, class: help_klass, id: field_id(name, :feedback))
7272
end
7373

7474
def get_error_messages(name)

lib/bootstrap_form/form_group_builder.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ def form_group_css_options(method, html_options, options)
9292
# Add control_class; allow it to be overridden by :control_class option
9393
control_classes = css_options.delete(:control_class) { control_class }
9494
css_options[:class] = safe_join([control_classes, css_options[:class]].compact, " ")
95-
css_options[:class] << " is-invalid" if error?(method)
95+
if error?(method)
96+
css_options[:class] << " is-invalid"
97+
css_options[:aria] = { labelledby: field_id(method, :feedback) }
98+
end
9699
css_options[:placeholder] = form_group_placeholder(options, method) if options[:label_as_placeholder]
97100
css_options
98101
end

lib/bootstrap_form/helpers/bootstrap.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def errors_on(name, options={})
3434
hide_attribute_name = options[:hide_attribute_name] || false
3535
custom_class = options[:custom_class] || false
3636

37-
tag.div class: custom_class || "invalid-feedback" do
37+
tag.div(class: custom_class || "invalid-feedback", id: field_id(name, :feedback)) do
3838
errors = if hide_attribute_name
3939
object.errors[name]
4040
else

lib/bootstrap_form/inputs/check_box.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def check_box_options(name, options)
4141
:inline, :label, :label_class, :label_col, :layout, :skip_label,
4242
:switch, :wrapper, :wrapper_class)
4343
check_box_options[:class] = check_box_classes(name, options)
44+
check_box_options[:aria] = { labelledby: field_id(name, :feedback) } if error?(name)
4445
check_box_options.merge!(required_field_options(options, name))
4546
end
4647

lib/bootstrap_form/inputs/radio_button.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def radio_button_options(name, options)
2828
radio_button_options = options.except(:class, :label, :label_class, :error_message, :help,
2929
:inline, :hide_label, :skip_label, :wrapper, :wrapper_class)
3030
radio_button_options[:class] = radio_button_classes(name, options)
31+
radio_button_options[:aria] = { labelledby: field_id(name, :feedback) } if error?(name)
3132
radio_button_options.merge!(required_field_options(options, name))
3233
end
3334

0 commit comments

Comments
 (0)