Skip to content

Commit

Permalink
chore(merge main) patched commit → dc09509 (#1080)
Browse files Browse the repository at this point in the history
  • Loading branch information
julien-deramond authored Feb 3, 2022
1 parent ae33812 commit 34c4936
Show file tree
Hide file tree
Showing 7 changed files with 213 additions and 444 deletions.
18 changes: 4 additions & 14 deletions js/src/dom/event-handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,22 +118,12 @@ function bootstrapDelegationHandler(element, selector, fn) {
return fn.apply(target, [event])
}
}

// To please ESLint
return null
}
}

function findHandler(events, handler, delegationSelector = null) {
for (const uidEvent of Object.keys(events)) {
const event = events[uidEvent]

if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
return event
}
}

return null
return Object.values(events)
.find(event => event.originalHandler === handler && event.delegationSelector === delegationSelector)
}

function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
Expand Down Expand Up @@ -284,7 +274,7 @@ const EventHandler = {
const typeEvent = getTypeEvent(event)
const inNamespace = event !== typeEvent

let jQueryEvent
let jQueryEvent = null
let bubbles = true
let nativeDispatch = true
let defaultPrevented = false
Expand Down Expand Up @@ -319,7 +309,7 @@ const EventHandler = {
element.dispatchEvent(evt)
}

if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
if (evt.defaultPrevented && jQueryEvent) {
jQueryEvent.preventDefault()
}

Expand Down
16 changes: 8 additions & 8 deletions js/src/dropdown.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import * as Popper from '@popperjs/core'
import {
defineJQueryPlugin,
getElement,
getElementFromSelector,
getNextActiveElement,
isDisabled,
isElement,
Expand Down Expand Up @@ -90,7 +89,7 @@ class Dropdown extends BaseComponent {
super(element, config)

this._popper = null
this._parent = getElementFromSelector(this._element) || this._element.parentNode // dropdown wrapper
this._parent = this._element.parentNode // dropdown wrapper
this._menu = SelectorEngine.findOne(SELECTOR_MENU, this._parent)
this._inNavbar = this._detectNavbar()
}
Expand Down Expand Up @@ -386,22 +385,23 @@ class Dropdown extends BaseComponent {
// - If key is not UP or DOWN => not a dropdown command
// - If trigger inside the menu => not a dropdown command

const isInput = /input|textarea/i.test(event.target.tagName)
const isEscapeEvent = event.key === ESCAPE_KEY
const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)
const { target, key, delegateTarget } = event
const isInput = /input|textarea/i.test(target.tagName)
const isEscapeEvent = key === ESCAPE_KEY
const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(key)

if (!isInput && !(isUpOrDownEvent || isEscapeEvent)) {
return
}

if (isInput && !isEscapeEvent) {
// eslint-disable-next-line unicorn/no-lonely-if
if (!isUpOrDownEvent || event.target.closest(SELECTOR_MENU)) {
if (!isUpOrDownEvent || target.closest(SELECTOR_MENU)) {
return
}
}

const isActive = this.classList.contains(CLASS_NAME_SHOW)
const isActive = delegateTarget.classList.contains(CLASS_NAME_SHOW)

if (!isActive && isEscapeEvent) {
return
Expand All @@ -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, delegateTarget.parentNode)
const instance = Dropdown.getOrCreateInstance(getToggleButton)

if (isEscapeEvent) {
Expand Down
20 changes: 20 additions & 0 deletions js/tests/unit/dropdown.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand Down
19 changes: 7 additions & 12 deletions js/tests/unit/popover.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,21 +166,16 @@ describe('Popover', () => {
})

it('should NOT show a popover without `title` and `content`', () => {
return new Promise(resolve => {
fixtureEl.innerHTML = '<a href="#" data-bs-content="" title="">Nice link</a>'
fixtureEl.innerHTML = '<a href="#" data-bs-content="" title="">Nice link</a>'

const popoverEl = fixtureEl.querySelector('a')
const popover = new Popover(popoverEl, { animation: false })
spyOn(EventHandler, 'trigger').and.callThrough()
const popoverEl = fixtureEl.querySelector('a')
const popover = new Popover(popoverEl, { animation: false })
spyOn(EventHandler, 'trigger').and.callThrough()

setTimeout(() => {
expect(EventHandler.trigger).not.toHaveBeenCalled()
expect(document.querySelector('.popover')).toBeNull()
resolve()
})
popover.show()

popover.show()
})
expect(EventHandler.trigger).not.toHaveBeenCalledWith(popoverEl, Popover.Event.SHOW)
expect(document.querySelector('.popover')).toBeNull()
})

it('"setContent" should keep the initial template', () => {
Expand Down
Loading

0 comments on commit 34c4936

Please sign in to comment.