From de81ef99af81e6da369bd5087b16d29856ad0192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Pat=C3=B3?= Date: Thu, 4 Aug 2022 18:58:32 +0200 Subject: [PATCH] fix(combo-box): correctly select item in a non-filterable `ComboBox` (#1419) Fixes #1222 A non-filterable ComboBox will select the item that matches the typed value when pressing "Enter." An unknown (unmatched) value will select the first item. --- src/ComboBox/ComboBox.svelte | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ComboBox/ComboBox.svelte b/src/ComboBox/ComboBox.svelte index 6a2e67d7..95a52fa5 100644 --- a/src/ComboBox/ComboBox.svelte +++ b/src/ComboBox/ComboBox.svelte @@ -287,7 +287,6 @@ on:keydown|stopPropagation="{({ key }) => { if (key === 'Enter') { open = !open; - if ( highlightedIndex > -1 && filteredItems[highlightedIndex]?.id !== selectedId @@ -299,11 +298,18 @@ selectedId = filteredItems[highlightedIndex].id; } } else { - open = false; - if (filteredItems[0]) { - value = itemToString(filteredItems[0]); - selectedItem = filteredItems[0]; - selectedId = filteredItems[0].id; + // searching typed value in text list with lowercase + const matchedItem = + filteredItems.find( + (e) => + e.text.toLowerCase() === value?.toLowerCase() && !e.disabled + ) ?? filteredItems.find((e) => !e.disabled); + if (matchedItem) { + // typed value has matched or fallback to first enabled item + open = false; + selectedItem = matchedItem; + value = itemToString(selectedItem); + selectedId = selectedItem.id; } } highlightedIndex = -1;