Skip to content

Commit e7c4089

Browse files
committed
Don't validate input[type="checkbox"]:disabled
When validating with `CheckboxValidator`, don't include `:disabled` checkboxes when determining group validity.
1 parent 963269a commit e7c4089

File tree

11 files changed

+34
-23
lines changed

11 files changed

+34
-23
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
* Add support for opting-into Checkbox group `[required]` validation
10+
11+
*Sean Doyle*
12+
913
* Ignore `[disabled]` fields while validating
1014

1115
*Sean Doyle*

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,8 @@ Then, render a group of `<input type="checkbox">` elements as `[required]`:
419419
</fieldset>
420420
```
421421

422+
Disabled form controls won't be validated.
423+
422424
#### How it works
423425

424426
To work-around the quirks of built-in support, `ConstraintValidations` monitors

app/assets/javascripts/constraint_validations.es.js

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/assets/javascripts/constraint_validations.es.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/assets/javascripts/constraint_validations.js

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/assets/javascripts/constraint_validations.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/javascript/constraint_validations/index.js

+1-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { readValidationMessages } from "./util"
1+
import { isFieldElement, readValidationMessages } from "./util"
22
import CheckboxValidator from "./validators/checkbox_validator"
33

44
const defaultOptions = {
@@ -188,7 +188,3 @@ function getValidationMessage(input) {
188188

189189
return validationMessage || input.validationMessage
190190
}
191-
192-
function isFieldElement(element) {
193-
return !element.disabled && "validity" in element && element.willValidate
194-
}

app/javascript/constraint_validations/util.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
export function isFieldElement(element) {
2+
return !element.disabled && "validity" in element && element.willValidate
3+
}
4+
15
export function readValidationMessages(input) {
26
try {
37
return JSON.parse(input.getAttribute("data-validation-messages")) || {}

app/javascript/constraint_validations/validators/checkbox_validator.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { readValidationMessages } from "../util"
1+
import { isFieldElement, readValidationMessages } from "../util"
22

33
export default class {
44
ignoringMutations = false
@@ -33,7 +33,7 @@ export default class {
3333
}
3434

3535
validate(target) {
36-
const checkboxesInGroup = checkboxGroup(target)
36+
const checkboxesInGroup = checkboxGroup(target).filter(isFieldElement)
3737
const allRequired = checkboxesInGroup.every((checkbox) => checkbox.getAttribute("aria-required") === "true")
3838
const someChecked = checkboxesInGroup.some((checkbox) => checkbox.checked)
3939

test/dummy/app/views/forms/new.html.erb

+3-2
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@
4343

4444
<%= form.collection_check_boxes :multiple_required_checkbox, [
4545
["1", "Multiple required checkbox #1"],
46-
["2", "Multiple required checkbox #2"]
46+
["2", "Multiple required checkbox #2"],
47+
["3", "Multiple required checkbox #3", disabled: true]
4748
], :first, :second do |builder| %>
48-
<%= builder.check_box %>
49+
<%= builder.check_box builder.object.third.to_h %>
4950
<%= builder.label %>
5051
<% end %>
5152
</fieldset>

test/system/validations_test.rb

+7-3
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,17 @@ class ValidationsTest < ApplicationSystemTestCase
289289
end
290290

291291
test "observes connection of multiple [required] checkboxes" do
292+
connected = proc do |input|
293+
input.assert_matches_selector :element, required: false, "aria-required": "true"
294+
end
295+
292296
visit new_form_path(hotwire_enabled: true, checkbox: true)
293297
click_button "Skip Validations"
294298

295299
within_fieldset "Multiple [required] checkboxes" do
296-
assert_unchecked_field "Multiple required checkbox", exact: false, valid: false, count: 2 do |input|
297-
input.assert_matches_selector :element, required: false, "aria-required": "true"
298-
end
300+
assert_unchecked_field "Multiple required checkbox #1", valid: false, &connected
301+
assert_unchecked_field "Multiple required checkbox #2", valid: false, &connected
302+
assert_unchecked_field "Multiple required checkbox #3", disabled: true, valid: true, &connected
299303
end
300304
end
301305

0 commit comments

Comments
 (0)