fix(dropdown): only dispatch "select" on interaction, allow arrow keys to navigate menu (#1569)

Fixes #1475
This commit is contained in:
Enrico Sacchetti 2022-12-07 23:09:29 -05:00 committed by GitHub
commit fa5515ded0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -112,6 +112,12 @@
let highlightedIndex = -1; let highlightedIndex = -1;
$: inline = type === "inline";
$: selectedItem = items.find((item) => item.id === selectedId);
$: if (!open) {
highlightedIndex = -1;
}
function change(dir) { function change(dir) {
let index = highlightedIndex + dir; let index = highlightedIndex + dir;
@ -138,14 +144,9 @@
highlightedIndex = index; highlightedIndex = index;
} }
$: if (selectedId !== undefined) { const dispatchSelect = () => {
dispatch("select", { selectedId, selectedItem }); dispatch("select", { selectedId, selectedItem });
} };
$: inline = type === "inline";
$: selectedItem = items.find((item) => item.id === selectedId);
$: if (!open) {
highlightedIndex = -1;
}
</script> </script>
<svelte:window <svelte:window
@ -227,19 +228,40 @@
items[highlightedIndex].id !== selectedId items[highlightedIndex].id !== selectedId
) { ) {
selectedId = items[highlightedIndex].id; selectedId = items[highlightedIndex].id;
dispatchSelect();
open = false; open = false;
} }
} else if (key === 'Tab') { } else if (key === 'Tab') {
open = false; open = false;
ref.blur(); ref.blur();
} else if (key === 'ArrowDown') { } else if (key === 'ArrowDown') {
if (!open) open = true;
change(1); change(1);
} else if (key === 'ArrowUp') { } else if (key === 'ArrowUp') {
if (!open) open = true;
change(-1); change(-1);
} else if (key === 'Escape') { } else if (key === 'Escape') {
open = false; open = false;
} }
}}" }}"
on:keyup="{(e) => {
const { key } = e;
if ([' '].includes(key)) {
e.preventDefault();
} else {
return;
}
open = !open;
if (
highlightedIndex > -1 &&
items[highlightedIndex].id !== selectedId
) {
selectedId = items[highlightedIndex].id;
dispatchSelect();
open = false;
}
}}"
disabled="{disabled}" disabled="{disabled}"
translateWithId="{translateWithId}" translateWithId="{translateWithId}"
id="{id}" id="{id}"
@ -271,6 +293,7 @@
return; return;
} }
selectedId = item.id; selectedId = item.id;
dispatchSelect();
ref.focus(); ref.focus();
}}" }}"
on:mouseenter="{() => { on:mouseenter="{() => {