Skip to content

Commit

Permalink
fix(modal): change the order we return from show() method
Browse files Browse the repository at this point in the history
In case of a modal with fading enabled, a prevented show event can cause show to not showing the modal anymore.

See #34055
  • Loading branch information
alpadev committed May 22, 2021
1 parent c2f949c commit fa6c6bc
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 5 deletions.
10 changes: 5 additions & 5 deletions js/src/modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,22 +104,22 @@ class Modal {
return
}

if ($(this._element).hasClass(CLASS_NAME_FADE)) {
this._isTransitioning = true
}

const showEvent = $.Event(EVENT_SHOW, {
relatedTarget
})

$(this._element).trigger(showEvent)

if (this._isShown || showEvent.isDefaultPrevented()) {
if (showEvent.isDefaultPrevented()) {
return
}

this._isShown = true

if ($(this._element).hasClass(CLASS_NAME_FADE)) {
this._isTransitioning = true
}

this._checkScrollbar()
this._setScrollbar()

Expand Down
26 changes: 26 additions & 0 deletions js/tests/unit/modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,32 @@ $(function () {
.bootstrapModal('show')
})

QUnit.test('should be shown after the first call to show() has been prevented while fading is enabled', function (assert) {
assert.expect(2)
var done = assert.async()

var $el = $('<div class="modal fade"><div class="modal-dialog" style="transition-duration: 20ms;"/></div>').appendTo('#qunit-fixture')

var prevented = false
$el
.on('show.bs.modal', function (e) {
if (!prevented) {
e.preventDefault()
prevented = true

setTimeout(function () {
$el.bootstrapModal('show')
})
}
})
.on('shown.bs.modal', function () {
assert.ok(prevented, 'show prevented')
assert.ok($el.hasClass('fade'))
done()
})
.bootstrapModal('show')
})

QUnit.test('should hide modal when hide is called', function (assert) {
assert.expect(3)
var done = assert.async()
Expand Down

0 comments on commit fa6c6bc

Please sign in to comment.