diff options
| author | alpadev <[email protected]> | 2021-05-22 09:58:52 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-05-22 10:58:52 +0300 |
| commit | b39b665072a2d36914e741b2c11620323924be89 (patch) | |
| tree | caaf6f2f815901efff78bdca9796fb7a46d5f785 /js/src | |
| parent | 803397554836dcba736eb50020ed3cea07b3a3ea (diff) | |
| download | bootstrap-b39b665072a2d36914e741b2c11620323924be89.tar.xz bootstrap-b39b665072a2d36914e741b2c11620323924be89.zip | |
Automatically select an item in the dropdown when using arrow keys (#34052)
Diffstat (limited to 'js/src')
| -rw-r--r-- | js/src/dropdown.js | 21 | ||||
| -rw-r--r-- | js/src/util/index.js | 4 |
2 files changed, 12 insertions, 13 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js index cab2d018b..34beb6512 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -354,18 +354,16 @@ class Dropdown extends BaseComponent { } } - _selectMenuItem(event) { - if (![ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) { - return - } - + _selectMenuItem({ key, target }) { const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible) if (!items.length) { return } - getNextActiveElement(items, event.target, event.key === ARROW_DOWN_KEY, false).focus() + // if target isn't included in items (e.g. when expanding the dropdown) + // allow cycling to get the last item in case key equals ARROW_UP_KEY + getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus() } // Static @@ -480,17 +478,18 @@ class Dropdown extends BaseComponent { return } - if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) { - getToggleButton().click() + if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) { + if (!isActive) { + getToggleButton().click() + } + + Dropdown.getInstance(getToggleButton())._selectMenuItem(event) return } if (!isActive || event.key === SPACE_KEY) { Dropdown.clearMenus() - return } - - Dropdown.getInstance(getToggleButton())._selectMenuItem(event) } } diff --git a/js/src/util/index.js b/js/src/util/index.js index 77bdc072f..4d077b21f 100644 --- a/js/src/util/index.js +++ b/js/src/util/index.js @@ -264,9 +264,9 @@ const execute = callback => { const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { let index = list.indexOf(activeElement) - // if the element does not exist in the list initialize it as the first element + // if the element does not exist in the list return an element depending on the direction and if cycle is allowed if (index === -1) { - return list[0] + return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0] } const listLength = list.length |
