]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
allow dynamic modal body for scrollable modals
authorJohann-S <johann.servoire@gmail.com>
Sun, 28 Jul 2019 09:49:44 +0000 (11:49 +0200)
committerJohann-S <johann.servoire@gmail.com>
Sun, 28 Jul 2019 10:11:10 +0000 (12:11 +0200)
js/src/modal/modal.js
js/src/modal/modal.spec.js

index a0e460f228de0e4a78a6fa612d86ff224ccb8f07..5d742493747bdb1a7e6272792304c7038fc7961c 100644 (file)
@@ -243,6 +243,7 @@ class Modal {
 
   _showElement(relatedTarget) {
     const transition = this._element.classList.contains(ClassName.FADE)
+    const modalBody = SelectorEngine.findOne(Selector.MODAL_BODY, this._dialog)
 
     if (!this._element.parentNode ||
         this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
@@ -254,8 +255,8 @@ class Modal {
     this._element.removeAttribute('aria-hidden')
     this._element.setAttribute('aria-modal', true)
 
-    if (this._dialog.classList.contains(ClassName.SCROLLABLE)) {
-      SelectorEngine.findOne(Selector.MODAL_BODY, this._dialog).scrollTop = 0
+    if (this._dialog.classList.contains(ClassName.SCROLLABLE) && modalBody) {
+      modalBody.scrollTop = 0
     } else {
       this._element.scrollTop = 0
     }
index ed881f1682bb27822963e77eb0702dec7f182e46..5111f00a9a8cc6407a3d6f71d13d837f9c5cf0bd 100644 (file)
@@ -396,8 +396,6 @@ describe('Modal', () => {
       const modalBody = modalEl.querySelector('.modal-body')
       const modal = new Modal(modalEl)
 
-      spyOn(modal, 'hide').and.callThrough()
-
       modalEl.addEventListener('shown.bs.modal', () => {
         expect(modalBody.scrollTop).toEqual(0)
         done()
@@ -406,6 +404,25 @@ describe('Modal', () => {
       modal.show()
     })
 
+    it('should set .modal\'s scroll top to 0 if .modal-dialog-scrollable and modal body do not exists', done => {
+      fixtureEl.innerHTML = [
+        '<div class="modal fade">',
+        '  <div class="modal-dialog modal-dialog-scrollable">',
+        '  </div>',
+        '</div>'
+      ].join('')
+
+      const modalEl = fixtureEl.querySelector('.modal')
+      const modal = new Modal(modalEl)
+
+      modalEl.addEventListener('shown.bs.modal', () => {
+        expect(modalEl.scrollTop).toEqual(0)
+        done()
+      })
+
+      modal.show()
+    })
+
     it('should not enforce focus if focus equal to false', done => {
       fixtureEl.innerHTML = '<div class="modal fade"><div class="modal-dialog" /></div>'