]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Dropdown: merge instance identification in `dataApiKeydownHandler`
authorGeoSot <geo.sotis@gmail.com>
Sun, 30 Jan 2022 21:50:22 +0000 (23:50 +0200)
committerXhmikosR <xhmikosr@gmail.com>
Tue, 1 Feb 2022 06:58:46 +0000 (08:58 +0200)
As we use the `dataApiKeydownHandler` only for events that are triggered on `[data-bs-toggle="dropdown"]` or on `.dropdown-menu`, we can ensure that their `parentNode` will ALWAYS be the `.dropdown` wrapper

js/src/dropdown.js
js/tests/unit/dropdown.spec.js

index f6363040958741a6edbbfa2c5efe4234fae99af9..779fe8f1932f5f6d09e799f21c0f185b616b9514 100644 (file)
@@ -414,7 +414,7 @@ class Dropdown extends BaseComponent {
       return
     }
 
-    const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]
+    const getToggleButton = SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode)
     const instance = Dropdown.getOrCreateInstance(getToggleButton)
 
     if (isEscapeEvent) {
index f24b59ed5c93bd026e8b89355cf641d9d5f28db1..194e00f537ab998b723d8a74341a4069d66ee319 100644 (file)
@@ -2023,6 +2023,26 @@ describe('Dropdown', () => {
         dropdownToggle.click()
       })
     })
+
+    it('should be able to identify clicked dropdown, no matter the markup order', () => {
+      fixtureEl.innerHTML = [
+        '<div class="dropdown">',
+        '  <div class="dropdown-menu">',
+        '    <a class="dropdown-item" href="#">Dropdown item</a>',
+        '  </div>',
+        '  <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown toggle</button>',
+        '</div>'
+      ].join('')
+
+      const dropdownToggle = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
+      const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')
+      const spy = spyOn(Dropdown, 'getOrCreateInstance').and.callThrough()
+
+      dropdownToggle.click()
+      expect(spy).toHaveBeenCalledWith(dropdownToggle)
+      dropdownMenu.click()
+      expect(spy).toHaveBeenCalledWith(dropdownToggle)
+    })
   })
 
   describe('jQueryInterface', () => {