Merge pull request #1331 from ing-bank/fix/focusElementAfterHideWhenOwned
fix(overlays): only focus controlled elements after hide
This commit is contained in:
commit
a94fa77b62
6 changed files with 39 additions and 27 deletions
5
.changeset/lemon-shoes-doubt.md
Normal file
5
.changeset/lemon-shoes-doubt.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@lion/checkbox-group': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
recover possibility to registrer without []
|
||||||
5
.changeset/loud-rocks-teach.md
Normal file
5
.changeset/loud-rocks-teach.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@lion/overlays': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
only focus elements after hide when OverlayController has ownership
|
||||||
|
|
@ -9,12 +9,4 @@ export class LionCheckboxGroup extends ChoiceGroupMixin(FormGroupMixin(LitElemen
|
||||||
super();
|
super();
|
||||||
this.multipleChoice = true;
|
this.multipleChoice = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {import('@lion/core').PropertyValues } changedProperties */
|
|
||||||
updated(changedProperties) {
|
|
||||||
super.updated(changedProperties);
|
|
||||||
if (changedProperties.has('name') && !String(this.name).match(/\[\]$/)) {
|
|
||||||
throw new Error('Names should end in "[]".');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -104,17 +104,4 @@ describe('<lion-checkbox-group>', () => {
|
||||||
`);
|
`);
|
||||||
await expect(el).to.be.accessible();
|
await expect(el).to.be.accessible();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should throw exception if name doesn't end in []", async () => {
|
|
||||||
const el = await fixture(html`<lion-checkbox-group name="woof[]"></lion-checkbox-group>`);
|
|
||||||
el.name = 'woof';
|
|
||||||
let err;
|
|
||||||
try {
|
|
||||||
await el.updateComplete;
|
|
||||||
} catch (e) {
|
|
||||||
err = e;
|
|
||||||
}
|
|
||||||
expect(err).to.be.an.instanceof(Error);
|
|
||||||
expect(err.message).to.equal('Names should end in "[]".');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -907,15 +907,19 @@ export class OverlayController extends EventTargetShim {
|
||||||
|
|
||||||
/** @protected */
|
/** @protected */
|
||||||
_restoreFocus() {
|
_restoreFocus() {
|
||||||
|
const { activeElement } = /** @type {* & ShadowRoot} */ (this
|
||||||
|
.__contentWrapperNode).getRootNode();
|
||||||
// We only are allowed to move focus if we (still) 'own' it.
|
// We only are allowed to move focus if we (still) 'own' it.
|
||||||
// Otherwise we assume the 'outside world' has, purposefully, taken over
|
// Otherwise we assume the 'outside world' has, purposefully, taken over
|
||||||
|
if (
|
||||||
|
activeElement &&
|
||||||
|
/** @type {HTMLElement} */ (this.__contentWrapperNode).contains(activeElement)
|
||||||
|
) {
|
||||||
if (this.elementToFocusAfterHide) {
|
if (this.elementToFocusAfterHide) {
|
||||||
this.elementToFocusAfterHide.focus();
|
this.elementToFocusAfterHide.focus();
|
||||||
} else if (
|
} else {
|
||||||
document.activeElement &&
|
activeElement.blur();
|
||||||
this.__contentWrapperNode?.contains(document.activeElement)
|
}
|
||||||
) {
|
|
||||||
/** @type {HTMLElement} */ (document.activeElement).blur();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -741,6 +741,25 @@ describe('OverlayController', () => {
|
||||||
expect(document.activeElement).to.equal(input);
|
expect(document.activeElement).to.equal(input);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it(`only sets focus when outside world didn't take over already`, async () => {
|
||||||
|
const input = /** @type {HTMLElement} */ (await fixture('<input />'));
|
||||||
|
const outsideButton = /** @type {HTMLButtonElement} */ (await fixture('<button></button>'));
|
||||||
|
const contentNode = /** @type {HTMLElement} */ (await fixture('<div>/div>'));
|
||||||
|
const ctrl = new OverlayController({
|
||||||
|
...withGlobalTestConfig(),
|
||||||
|
elementToFocusAfterHide: input,
|
||||||
|
contentNode,
|
||||||
|
});
|
||||||
|
|
||||||
|
await ctrl.show();
|
||||||
|
// an outside element has taken over focus
|
||||||
|
outsideButton.focus();
|
||||||
|
expect(document.activeElement).to.equal(outsideButton);
|
||||||
|
|
||||||
|
await ctrl.hide();
|
||||||
|
expect(document.activeElement).to.equal(outsideButton);
|
||||||
|
});
|
||||||
|
|
||||||
it('allows to set elementToFocusAfterHide on show', async () => {
|
it('allows to set elementToFocusAfterHide on show', async () => {
|
||||||
const input = /** @type {HTMLElement} */ (await fixture('<input />'));
|
const input = /** @type {HTMLElement} */ (await fixture('<input />'));
|
||||||
const contentNode = /** @type {HTMLElement} */ (await fixture(
|
const contentNode = /** @type {HTMLElement} */ (await fixture(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue