From 9466d49bc9ee72e53cc52821f5c67330aa284005 Mon Sep 17 00:00:00 2001 From: Anton Korzunov Date: Fri, 25 Nov 2022 09:57:52 +1100 Subject: [PATCH] fix: correct behavior for focusable-less targets. Implements #41 --- .gitignore | 3 ++- __tests__/focusMerge.spec.ts | 10 ++++++++++ src/focusMerge.ts | 10 +++++++++- src/utils/auto-focus.ts | 2 +- src/utils/firstFocus.ts | 2 +- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 8b0c2ee..57f1362 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ npm-debug.log /dist/ -.DS_Store \ No newline at end of file +.DS_Store +coverage \ No newline at end of file diff --git a/__tests__/focusMerge.spec.ts b/__tests__/focusMerge.spec.ts index f5175f4..4b975ae 100644 --- a/__tests__/focusMerge.spec.ts +++ b/__tests__/focusMerge.spec.ts @@ -110,5 +110,15 @@ describe('FocusMerge', () => { expect(focusMerge(querySelector('#d1'), null)!.node.innerHTML).toBe('1'); }); + + it('autofocus - nothing to focus', () => { + document.body.innerHTML = ` +
+ +
+ `; + + expect(focusMerge(querySelector('#d1'), null)!).toBe(undefined); + }); }); }); diff --git a/src/focusMerge.ts b/src/focusMerge.ts index c9e1f31..51440d3 100644 --- a/src/focusMerge.ts +++ b/src/focusMerge.ts @@ -49,7 +49,15 @@ export const getFocusMerge = ( const newId = newFocus(innerNodes, outerNodes, activeElement, lastNode as HTMLElement); if (newId === NEW_FOCUS) { - return { node: pickAutofocus(anyFocusable, innerNodes, allParentAutofocusables(entries, visibilityCache)) }; + const focusNode = pickAutofocus(anyFocusable, innerNodes, allParentAutofocusables(entries, visibilityCache)); + + if (focusNode) { + return { node: focusNode }; + } else { + console.warn('focus-lock: cannot find any node to move focus into'); + + return undefined; + } } if (newId === undefined) { diff --git a/src/utils/auto-focus.ts b/src/utils/auto-focus.ts index 2a6698f..f4bf60e 100644 --- a/src/utils/auto-focus.ts +++ b/src/utils/auto-focus.ts @@ -22,7 +22,7 @@ export const pickAutofocus = ( nodesIndexes: NodeIndex[], orderedNodes: HTMLElement[], groups: Element[] -): HTMLElement => { +): HTMLElement | undefined => { const nodes = nodesIndexes.map(({ node }) => node); const autoFocusable = filterAutoFocusable(nodes.filter(findAutoFocused(groups))); diff --git a/src/utils/firstFocus.ts b/src/utils/firstFocus.ts index 82a54d7..388f46c 100644 --- a/src/utils/firstFocus.ts +++ b/src/utils/firstFocus.ts @@ -1,6 +1,6 @@ import { correctNode } from './correctFocus'; -export const pickFirstFocus = (nodes: HTMLElement[]): HTMLElement => { +export const pickFirstFocus = (nodes: HTMLElement[]): HTMLElement | undefined => { if (nodes[0] && nodes.length > 1) { return correctNode(nodes[0], nodes); }