Add required attribute to radio group and radio

pull/595/head
Jeremiah Hoyet 2021-11-22 12:33:39 -05:00
rodzic 8a766fe100
commit 0c6060eae7
3 zmienionych plików z 71 dodań i 0 usunięć

Wyświetl plik

@ -49,4 +49,48 @@ const App = () => (
</SlRadioGroup>
);
```
### Using the required attribute
Adding a `required` attribute to `sl-radio-group` will require at least one option to be selected.
```html preview
<sl-radio-group id="radio-group1" label="Select an option" fieldset required>
<sl-radio value="1" name="foo">Option 1</sl-radio>
<sl-radio value="2" name="foo">Option 2</sl-radio>
<sl-radio value="3" name="foo">Option 3</sl-radio>
</sl-radio-group>
<br />
<sl-button id="group1">Validate Group</sl-button>
<script>
const button = document.getElementById('group1');
const group = document.getElementById('radio-group1');
button.addEventListener('click', ()=> group.reportValidity())
</script>
```
Alternatively, if any of the `sl-radio` elements has a `required` attribute, `sl-radio-group` mimics the behaviour of the browser and will require at least one selection from the group.
```html preview
<sl-radio-group id="radio-group2" label="Select an option" fieldset>
<sl-radio value="1" name="foo" required>Option 1</sl-radio>
<sl-radio value="2" name="foo">Option 2</sl-radio>
<sl-radio value="3" name="foo">Option 3</sl-radio>
</sl-radio-group>
<br />
<sl-button id="group2">Validate Group</sl-button>
<script>
const button = document.getElementById('group2');
const group = document.getElementById('radio-group2');
button.addEventListener('click', ()=> group.reportValidity())
</script>
```
[component-metadata:sl-radio-group]

Wyświetl plik

@ -26,6 +26,9 @@ export default class SlRadioGroup extends LitElement {
/** Shows the fieldset and legend that surrounds the radio group. */
@property({ type: Boolean, attribute: 'fieldset' }) fieldset = false;
/** Indicates that a selection is required. */
@property({ type: Boolean, reflect: true }) required = false;
handleFocusIn() {
// When tabbing into the fieldset, make sure it lands on the checked radio
requestAnimationFrame(() => {
@ -39,6 +42,26 @@ export default class SlRadioGroup extends LitElement {
});
}
reportValidity() {
const radios = [...(this.defaultSlot.assignedElements({ flatten: true }) as SlRadio[])];
let isChecked = true;
// Set required to true if any of the radio elements are required
this.required = this.required || radios.some(el => el.required);
if (this.required && radios.length > 0) {
isChecked = radios.some(el => el.checked);
if (!isChecked) {
radios[0].required = true;
// Trigger validity message on first input
radios[0].reportValidity();
}
}
return isChecked;
}
render() {
return html`
<fieldset

Wyświetl plik

@ -47,6 +47,9 @@ export default class SlRadio extends LitElement {
/** Draws the radio in a checked state. */
@property({ type: Boolean, reflect: true }) checked = false;
/** Indicates that a selection is required. */
@property({ type: Boolean, reflect: true }) required = false;
/**
* This will be true when the control is in an invalid state. Validity in range inputs is determined by the message
* provided by the `setCustomValidity` method.
@ -161,6 +164,7 @@ export default class SlRadio extends LitElement {
type="radio"
name=${ifDefined(this.name)}
value=${ifDefined(this.value)}
?required=${this.required}
.checked=${live(this.checked)}
.disabled=${this.disabled}
aria-checked=${this.checked ? 'true' : 'false'}