fix(form-core): prevent toggle of checked state when disabled
This commit is contained in:
parent
6aacbc4403
commit
857206548c
4 changed files with 32 additions and 0 deletions
7
.changeset/selfish-vans-sit.md
Normal file
7
.changeset/selfish-vans-sit.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
'@lion/form-core': patch
|
||||
'@lion/switch': patch
|
||||
---
|
||||
|
||||
- prevent toggle of checked state when disabled
|
||||
- dispatch checked-changed on label click
|
||||
|
|
@ -31,6 +31,13 @@ const ChoiceInputMixinImplementation = superclass =>
|
|||
type: Boolean,
|
||||
reflect: true,
|
||||
},
|
||||
/**
|
||||
* Boolean indicating whether or not this element is disabled.
|
||||
*/
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
reflect: true,
|
||||
},
|
||||
/**
|
||||
* Whereas 'normal' `.modelValue`s usually store a complex/typed version
|
||||
* of a view value, choice inputs have a slightly different approach.
|
||||
|
|
@ -108,6 +115,7 @@ const ChoiceInputMixinImplementation = superclass =>
|
|||
constructor() {
|
||||
super();
|
||||
this.modelValue = { value: '', checked: false };
|
||||
this.disabled = false;
|
||||
this.__toggleChecked = this.__toggleChecked.bind(this);
|
||||
}
|
||||
|
||||
|
|
@ -170,6 +178,9 @@ const ChoiceInputMixinImplementation = superclass =>
|
|||
}
|
||||
|
||||
__toggleChecked() {
|
||||
if (this.disabled) {
|
||||
return;
|
||||
}
|
||||
this.checked = !this.checked;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -131,6 +131,14 @@ describe('ChoiceInputMixin', () => {
|
|||
expect(el.checked).to.be.false;
|
||||
});
|
||||
|
||||
it('can not toggle the checked state when disabled via user interaction', async () => {
|
||||
const el = /** @type {ChoiceClass} */ (await fixture(
|
||||
html`<choice-input disabled></choice-input>`,
|
||||
));
|
||||
el._inputNode.dispatchEvent(new CustomEvent('change', { bubbles: true }));
|
||||
expect(el.checked).to.be.false;
|
||||
});
|
||||
|
||||
it('synchronizes modelValue to checked state and vice versa', async () => {
|
||||
const el = /** @type {ChoiceClass} */ (await fixture(
|
||||
html`<choice-input .choiceValue=${'foo'}></choice-input>`,
|
||||
|
|
|
|||
|
|
@ -16,6 +16,12 @@ describe('lion-switch', () => {
|
|||
expect(el.checked).to.be.false;
|
||||
});
|
||||
|
||||
it('clicking the label should not toggle the checked state when disabled', async () => {
|
||||
const el = await fixture(html`<lion-switch disabled label="Enable Setting"></lion-switch>`);
|
||||
el._labelNode.click();
|
||||
expect(el.checked).to.be.false;
|
||||
});
|
||||
|
||||
it('should sync its "disabled" state to child button', async () => {
|
||||
const el = await fixture(html`<lion-switch disabled></lion-switch>`);
|
||||
expect(el._inputNode.disabled).to.be.true;
|
||||
|
|
|
|||
Loading…
Reference in a new issue