mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-15 02:11:05 +00:00
fix(dropdown): only dispatch "select" on interaction, allow arrow keys to navigate menu (#1569)
Fixes #1475
This commit is contained in:
parent
a0600e8bdb
commit
fa5515ded0
1 changed files with 30 additions and 7 deletions
|
@ -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="{() => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue