From c7de897b895635b13a8f5d171b2acbb2a6e2ddcd Mon Sep 17 00:00:00 2001 From: metonym Date: Sat, 12 Feb 2022 15:43:45 -0800 Subject: [PATCH] fix(overflow-menu): keyboard navigation should skip disabled items (#1096) --- src/OverflowMenu/OverflowMenu.svelte | 19 ++++++++++++++++--- src/OverflowMenu/OverflowMenuItem.svelte | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/OverflowMenu/OverflowMenu.svelte b/src/OverflowMenu/OverflowMenu.svelte index 6d76eef6..e4fbf7db 100644 --- a/src/OverflowMenu/OverflowMenu.svelte +++ b/src/OverflowMenu/OverflowMenu.svelte @@ -80,20 +80,19 @@ setContext("OverflowMenu", { focusedId, - add: ({ id, text, primaryFocus }) => { + add: ({ id, text, primaryFocus, disabled }) => { items.update((_) => { if (primaryFocus) { currentIndex.set(_.length); } - return [..._, { id, text, primaryFocus, index: _.length }]; + return [..._, { id, text, primaryFocus, disabled, index: _.length }]; }); }, update: (id) => { currentId.set(id); }, change: (direction) => { - // TODO: skip disabled let index = $currentIndex + direction; if (index < 0) { @@ -102,6 +101,20 @@ index = 0; } + let disabled = $items[index].disabled; + + while (disabled) { + index = index + direction; + + if (index < 0) { + index = $items.length - 1; + } else if (index >= $items.length) { + index = 0; + } + + disabled = $items[index].disabled; + } + currentIndex.set(index); }, }); diff --git a/src/OverflowMenu/OverflowMenuItem.svelte b/src/OverflowMenu/OverflowMenuItem.svelte index de4e1386..813fac70 100644 --- a/src/OverflowMenu/OverflowMenuItem.svelte +++ b/src/OverflowMenu/OverflowMenuItem.svelte @@ -33,7 +33,7 @@ const { focusedId, add, update, change } = getContext("OverflowMenu"); - add({ id, text, primaryFocus }); + add({ id, text, primaryFocus, disabled }); afterUpdate(() => { if (ref && primaryFocus) {