aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorSiju Samson <[email protected]>2021-02-04 01:33:21 +0530
committerGitHub <[email protected]>2021-02-03 22:03:21 +0200
commitb376a3d80d3ce7a9106bf42b890167ecc992f912 (patch)
tree8cd16f05fd2c33a955f9c1298fdbfb9d6237d42f /js
parent2a9d72133d52af1ca72944f1d19474957b54d618 (diff)
downloadbootstrap-b376a3d80d3ce7a9106bf42b890167ecc992f912.tar.xz
bootstrap-b376a3d80d3ce7a9106bf42b890167ecc992f912.zip
Fix dropdown keys to open menu (#32750)
Co-authored-by: XhmikosR <[email protected]>
Diffstat (limited to 'js')
-rw-r--r--js/src/dropdown.js6
-rw-r--r--js/tests/unit/dropdown.spec.js48
2 files changed, 54 insertions, 0 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index 69b99e628..3667fa111 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -468,6 +468,12 @@ class Dropdown extends BaseComponent {
return
}
+ if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
+ const button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]
+ button.click()
+ return
+ }
+
if (!isActive || event.key === SPACE_KEY) {
Dropdown.clearMenus()
return
diff --git a/js/tests/unit/dropdown.spec.js b/js/tests/unit/dropdown.spec.js
index bb137efed..47775678f 100644
--- a/js/tests/unit/dropdown.spec.js
+++ b/js/tests/unit/dropdown.spec.js
@@ -1626,4 +1626,52 @@ describe('Dropdown', () => {
expect(Dropdown.getInstance(div)).toEqual(null)
})
})
+
+ it('should open dropdown when pressing keydown or keyup', done => {
+ fixtureEl.innerHTML = [
+ '<div class="dropdown">',
+ ' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>',
+ ' <div class="dropdown-menu">',
+ ' <a class="dropdown-item disabled" href="#sub1">Submenu 1</a>',
+ ' <button class="dropdown-item" type="button" disabled>Disabled button</button>',
+ ' <a id="item1" class="dropdown-item" href="#">Another link</a>',
+ ' </div>',
+ '</div>'
+ ].join('')
+
+ const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
+ const dropdown = fixtureEl.querySelector('.dropdown')
+
+ const keydown = createEvent('keydown')
+ keydown.key = 'ArrowDown'
+
+ const keyup = createEvent('keyup')
+ keyup.key = 'ArrowUp'
+
+ const handleArrowDown = () => {
+ expect(triggerDropdown.classList.contains('show')).toEqual(true)
+ expect(triggerDropdown.getAttribute('aria-expanded')).toEqual('true')
+ setTimeout(() => {
+ dropdown.hide()
+ keydown.key = 'ArrowUp'
+ triggerDropdown.dispatchEvent(keyup)
+ }, 20)
+ }
+
+ const handleArrowUp = () => {
+ expect(triggerDropdown.classList.contains('show')).toEqual(true)
+ expect(triggerDropdown.getAttribute('aria-expanded')).toEqual('true')
+ done()
+ }
+
+ dropdown.addEventListener('shown.bs.dropdown', event => {
+ if (event.target.key === 'ArrowDown') {
+ handleArrowDown()
+ } else {
+ handleArrowUp()
+ }
+ })
+
+ triggerDropdown.dispatchEvent(keydown)
+ })
})