return
}
- const isActive = this._menu.classList.contains(CLASS_NAME_SHOW)
+ const isActive = this._element.classList.contains(CLASS_NAME_SHOW)
Dropdown.clearMenus()
relatedTarget: this._element
}
- const showEvent = EventHandler.trigger(parent, EVENT_SHOW, relatedTarget)
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)
if (showEvent.defaultPrevented) {
return
this._element.setAttribute('aria-expanded', true)
Manipulator.toggleClass(this._menu, CLASS_NAME_SHOW)
- Manipulator.toggleClass(parent, CLASS_NAME_SHOW)
+ Manipulator.toggleClass(this._element, CLASS_NAME_SHOW)
EventHandler.trigger(parent, EVENT_SHOWN, relatedTarget)
}
}
Manipulator.toggleClass(this._menu, CLASS_NAME_SHOW)
- Manipulator.toggleClass(parent, CLASS_NAME_SHOW)
+ Manipulator.toggleClass(this._element, CLASS_NAME_SHOW)
EventHandler.trigger(parent, EVENT_HIDDEN, relatedTarget)
}
}
_getMenuElement() {
- const parent = Dropdown.getParentFromElement(this._element)
-
- return SelectorEngine.findOne(SELECTOR_MENU, parent)
+ return SelectorEngine.next(this._element, SELECTOR_MENU)[0]
}
_getPlacement() {
}
const dropdownMenu = context._menu
- if (!parent.classList.contains(CLASS_NAME_SHOW)) {
+ if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
continue
}
if (event && ((event.type === 'click' &&
/input|textarea/i.test(event.target.tagName)) ||
(event.type === 'keyup' && event.which === TAB_KEYCODE)) &&
- parent.contains(event.target)) {
+ dropdownMenu.contains(event.target)) {
continue
}
}
dropdownMenu.classList.remove(CLASS_NAME_SHOW)
- parent.classList.remove(CLASS_NAME_SHOW)
+ toggles[i].classList.remove(CLASS_NAME_SHOW)
EventHandler.trigger(parent, EVENT_HIDDEN, relatedTarget)
}
}
}
const parent = Dropdown.getParentFromElement(this)
- const isActive = parent.classList.contains(CLASS_NAME_SHOW)
+ const isActive = this.classList.contains(CLASS_NAME_SHOW)
- if (!isActive || (isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE))) {
- if (event.which === ESCAPE_KEYCODE) {
- SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, parent).focus()
- }
+ if (event.which === ESCAPE_KEYCODE) {
+ const button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0]
+ button.focus()
+ Dropdown.clearMenus()
+ return
+ }
+ if (!isActive || event.which === SPACE_KEYCODE) {
Dropdown.clearMenus()
return
}
return
}
- let index = items.indexOf(event.target)
+ let index = items.indexOf(event.target) || 0
if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up
index--
index++
}
- if (index < 0) {
- index = 0
- }
-
items[index].focus()
}
const dropdown = new Dropdown(btnDropdown)
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
const dropdown2 = new Dropdown(btnDropdown2)
firstDropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(firstDropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown1.classList.contains('show')).toEqual(true)
spyOn(dropdown1._popper, 'destroy')
dropdown2.toggle()
})
spyOn(EventHandler, 'off')
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
expect(EventHandler.on).toHaveBeenCalled()
})
dropdownEl.addEventListener('hidden.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(false)
+ expect(btnDropdown.classList.contains('show')).toEqual(false)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('false')
expect(EventHandler.off).toHaveBeenCalled()
const dropdown = new Dropdown(btnDropdown)
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
const dropdown = new Dropdown(btnDropdown)
dropupEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropupEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
const dropdown = new Dropdown(btnDropdown)
dropupEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropupEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
const dropdown = new Dropdown(btnDropdown)
droprightEl.addEventListener('shown.bs.dropdown', () => {
- expect(droprightEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
const dropdown = new Dropdown(btnDropdown)
dropleftEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropleftEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
})
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
})
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
})
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
})
const dropdown = new Dropdown(btnDropdown)
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
done()
})
})
dropdownEl.addEventListener('shown.bs.dropdown', e => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
expect(showEventTriggered).toEqual(true)
expect(e.relatedTarget).toEqual(btnDropdown)
})
dropdownEl.addEventListener('hidden.bs.dropdown', e => {
- expect(dropdownEl.classList.contains('show')).toEqual(false)
+ expect(btnDropdown.classList.contains('show')).toEqual(false)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('false')
expect(hideEventTriggered).toEqual(true)
expect(e.relatedTarget).toEqual(btnDropdown)
const dropdownEl = fixtureEl.querySelector('.dropdown')
dropdownEl.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(true)
+ expect(btnDropdown.classList.contains('show')).toEqual(true)
const keyUp = createEvent('keyup')
})
dropdownEl.addEventListener('hidden.bs.dropdown', () => {
- expect(dropdownEl.classList.contains('show')).toEqual(false)
+ expect(btnDropdown.classList.contains('show')).toEqual(false)
done()
})
const btnGroup = last.parentNode
dropdownTestMenu.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownTestMenu.classList.contains('show')).toEqual(true)
+ expect(first.classList.contains('show')).toEqual(true)
expect(fixtureEl.querySelectorAll('.dropdown-menu.show').length).toEqual(1)
document.body.click()
})
})
btnGroup.addEventListener('shown.bs.dropdown', () => {
- expect(btnGroup.classList.contains('show')).toEqual(true)
+ expect(last.classList.contains('show')).toEqual(true)
expect(fixtureEl.querySelectorAll('.dropdown-menu.show').length).toEqual(1)
document.body.click()
})
const btnGroup = last.parentNode
dropdownTestMenu.addEventListener('shown.bs.dropdown', () => {
- expect(dropdownTestMenu.classList.contains('show')).toEqual(true, '"show" class added on click')
+ expect(first.classList.contains('show')).toEqual(true, '"show" class added on click')
expect(fixtureEl.querySelectorAll('.dropdown-menu.show').length).toEqual(1, 'only one dropdown is shown')
const keyUp = createEvent('keyup')
})
btnGroup.addEventListener('shown.bs.dropdown', () => {
- expect(btnGroup.classList.contains('show')).toEqual(true, '"show" class added on click')
+ expect(last.classList.contains('show')).toEqual(true, '"show" class added on click')
expect(fixtureEl.querySelectorAll('.dropdown-menu.show').length).toEqual(1, 'only one dropdown is shown')
const keyUp = createEvent('keyup')
const input = fixtureEl.querySelector('input')
input.addEventListener('click', () => {
- expect(dropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
+ expect(triggerDropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
done()
})
dropdown.addEventListener('shown.bs.dropdown', () => {
- expect(dropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
+ expect(triggerDropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
input.dispatchEvent(createEvent('click'))
})
const textarea = fixtureEl.querySelector('textarea')
textarea.addEventListener('click', () => {
- expect(dropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
+ expect(triggerDropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
done()
})
dropdown.addEventListener('shown.bs.dropdown', () => {
- expect(dropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
+ expect(triggerDropdown.classList.contains('show')).toEqual(true, 'dropdown menu is shown')
textarea.dispatchEvent(createEvent('click'))
})
input.focus()
input.dispatchEvent(keyDownEscape)
- expect(dropdown.classList.contains('show')).toEqual(false, 'dropdown menu is not shown')
+ expect(triggerDropdown.classList.contains('show')).toEqual(false, 'dropdown menu is not shown')
done()
})
setTimeout(() => {
expect(dropdown.toggle).not.toHaveBeenCalled()
- expect(triggerDropdown.parentNode.classList.contains('show')).toEqual(false)
+ expect(triggerDropdown.classList.contains('show')).toEqual(false)
done()
}, 20)
})