]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Dropdown: support `.dropdown-item` wrapped in `<li>` tags (#33634)
authorCarson Sievert <cpsievert1@gmail.com>
Wed, 21 Apr 2021 05:30:19 +0000 (00:30 -0500)
committerGitHub <noreply@github.com>
Wed, 21 Apr 2021 05:30:19 +0000 (08:30 +0300)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
js/src/tab.js
js/tests/unit/tab.spec.js

index 4d823cc61c74a4bc16469842bc8a65c7cc5df1eb..7301779d650d0f7a001dfae32ee42157ea13fb0e 100644 (file)
@@ -161,7 +161,12 @@ class Tab extends BaseComponent {
       element.classList.add(CLASS_NAME_SHOW)
     }
 
-    if (element.parentNode && element.parentNode.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
+    let parent = element.parentNode
+    if (parent && parent.nodeName === 'LI') {
+      parent = parent.parentNode
+    }
+
+    if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
       const dropdownElement = element.closest(SELECTOR_DROPDOWN)
 
       if (dropdownElement) {
index 4741b495de839f712d3e85d0debabd1b2c1d8a76..c8e1475adbcfa3f73c98cea7a9175d80329cefb1 100644 (file)
@@ -515,6 +515,28 @@ describe('Tab', () => {
       expect(fixtureEl.querySelector('#nav2 .dropdown-item').classList.contains('active')).toEqual(false)
     })
 
+    it('should support li > .dropdown-item', () => {
+      fixtureEl.innerHTML = [
+        '<ul class="nav nav-tabs">',
+        '  <li class="nav-item"><a class="nav-link active" href="#home" data-bs-toggle="tab">Home</a></li>',
+        '  <li class="nav-item"><a class="nav-link" href="#profile" data-bs-toggle="tab">Profile</a></li>',
+        '  <li class="nav-item dropdown">',
+        '    <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">Dropdown</a>',
+        '    <ul class="dropdown-menu">',
+        '      <li><a class="dropdown-item" href="#dropdown1" id="dropdown1-tab" data-bs-toggle="tab">@fat</a></li>',
+        '      <li><a class="dropdown-item" href="#dropdown2" id="dropdown2-tab" data-bs-toggle="tab">@mdo</a></li>',
+        '    </ul>',
+        '  </li>',
+        '</ul>'
+      ].join('')
+
+      const firstDropItem = fixtureEl.querySelector('.dropdown-item')
+
+      firstDropItem.click()
+      expect(firstDropItem.classList.contains('active')).toEqual(true)
+      expect(fixtureEl.querySelector('.nav-link').classList.contains('active')).toEqual(false)
+    })
+
     it('should handle nested tabs', done => {
       fixtureEl.innerHTML = [
         '<nav class="nav nav-tabs" role="tablist">',