fix(field): allow html inside labels
This commit is contained in:
parent
30a8197f18
commit
c2c5e7c299
3 changed files with 64 additions and 15 deletions
|
|
@ -53,6 +53,34 @@ export const FormControlMixin = dedupeMixin(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get label() {
|
||||||
|
return (
|
||||||
|
(this.querySelector('[slot="label"]') &&
|
||||||
|
this.querySelector('[slot="label"]').textContent) ||
|
||||||
|
this.__label
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
set label(newValue) {
|
||||||
|
const oldValue = this.label;
|
||||||
|
this.__label = newValue;
|
||||||
|
this.requestUpdate('label', oldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
get helpText() {
|
||||||
|
return (
|
||||||
|
(this.querySelector('[slot="help-text"]') &&
|
||||||
|
this.querySelector('[slot="help-text"]').textContent) ||
|
||||||
|
this.__helpText
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
set helpText(newValue) {
|
||||||
|
const oldValue = this.helpText;
|
||||||
|
this.__helpText = newValue;
|
||||||
|
this.requestUpdate('helpText', oldValue);
|
||||||
|
}
|
||||||
|
|
||||||
get slots() {
|
get slots() {
|
||||||
return {
|
return {
|
||||||
...super.slots,
|
...super.slots,
|
||||||
|
|
|
||||||
|
|
@ -230,9 +230,6 @@ export class LionField extends FormControlMixin(
|
||||||
}
|
}
|
||||||
|
|
||||||
get fieldName() {
|
get fieldName() {
|
||||||
const label =
|
return this.__fieldName || this.label || this.name;
|
||||||
this.label ||
|
|
||||||
(this.querySelector('[slot=label]') && this.querySelector('[slot=label]').textContent);
|
|
||||||
return this.__fieldName || label || this.name;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,22 +23,46 @@ describe('FormControlMixin', () => {
|
||||||
tag = unsafeStatic(elem);
|
tag = unsafeStatic(elem);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('has the capability to override the help text', async () => {
|
it('has a label', async () => {
|
||||||
const lionFieldAttr = await fixture(html`
|
const elAttr = await fixture(html`
|
||||||
<${tag} help-text="This email address is already taken">${inputSlot}</${tag}>
|
<${tag} label="Email address">${inputSlot}</${tag}>
|
||||||
`);
|
`);
|
||||||
expect(
|
expect(elAttr.label).to.equal('Email address', 'as an attribute');
|
||||||
Array.from(lionFieldAttr.children).find(child => child.slot === 'help-text').textContent,
|
|
||||||
).to.contain('This email address is already taken');
|
const elProp = await fixture(html`
|
||||||
const lionFieldProp = await fixture(html`
|
|
||||||
<${tag}
|
<${tag}
|
||||||
.helpText=${'This email address is already taken'}
|
.label=${'Email address'}
|
||||||
>${inputSlot}
|
>${inputSlot}
|
||||||
</${tag}>`);
|
</${tag}>`);
|
||||||
|
expect(elProp.label).to.equal('Email address', 'as a property');
|
||||||
|
|
||||||
expect(
|
const elElem = await fixture(html`
|
||||||
Array.from(lionFieldProp.children).find(child => child.slot === 'help-text').textContent,
|
<${tag}>
|
||||||
).to.contain('This email address is already taken');
|
<label slot="label">Email <span>address</span></label>
|
||||||
|
${inputSlot}
|
||||||
|
</${tag}>`);
|
||||||
|
expect(elElem.label).to.equal('Email address', 'as an element');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can have a help-text', async () => {
|
||||||
|
const elAttr = await fixture(html`
|
||||||
|
<${tag} help-text="We will not send you any spam">${inputSlot}</${tag}>
|
||||||
|
`);
|
||||||
|
expect(elAttr.helpText).to.equal('We will not send you any spam', 'as an attribute');
|
||||||
|
|
||||||
|
const elProp = await fixture(html`
|
||||||
|
<${tag}
|
||||||
|
.helpText=${'We will not send you any spam'}
|
||||||
|
>${inputSlot}
|
||||||
|
</${tag}>`);
|
||||||
|
expect(elProp.helpText).to.equal('We will not send you any spam', 'as a property');
|
||||||
|
|
||||||
|
const elElem = await fixture(html`
|
||||||
|
<${tag}>
|
||||||
|
<label slot="help-text">We will not send you any <span>spam</span></label>
|
||||||
|
${inputSlot}
|
||||||
|
</${tag}>`);
|
||||||
|
expect(elElem.helpText).to.equal('We will not send you any spam', 'as an element');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not duplicate aria-describedby and aria-labelledby ids', async () => {
|
it('does not duplicate aria-describedby and aria-labelledby ids', async () => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue