Skip to content
This repository was archived by the owner on May 29, 2019. It is now read-only.

Commit 29a2886

Browse files
committed
feat(modal): Adds defaultContainer to $modalProvider
1 parent feb8a86 commit 29a2886

File tree

2 files changed

+46
-14
lines changed

2 files changed

+46
-14
lines changed

Diff for: src/modal/modal.js

+12-10
Original file line numberDiff line numberDiff line change
@@ -215,22 +215,22 @@ angular.module('ui.bootstrap.modal', [])
215215

216216
function removeModalWindow(modalInstance, elementToReceiveFocus) {
217217

218-
var body = $document.find('body').eq(0);
219218
var modalWindow = openedWindows.get(modalInstance).value;
219+
var container = modalWindow.container;
220220

221221
//clean up the stack
222222
openedWindows.remove(modalInstance);
223223

224224
removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, function() {
225-
body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0);
225+
container.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0);
226226
checkRemoveBackdrop();
227227
});
228228

229-
//move focus to specified element if available, or else to body
229+
//move focus to specified element if available, or else to modal container
230230
if (elementToReceiveFocus && elementToReceiveFocus.focus) {
231231
elementToReceiveFocus.focus();
232232
} else {
233-
body.focus();
233+
container.focus();
234234
}
235235
}
236236

@@ -303,10 +303,11 @@ angular.module('ui.bootstrap.modal', [])
303303
renderDeferred: modal.renderDeferred,
304304
modalScope: modal.scope,
305305
backdrop: modal.backdrop,
306-
keyboard: modal.keyboard
306+
keyboard: modal.keyboard,
307+
container: modal.container
307308
});
308309

309-
var body = $document.find('body').eq(0),
310+
var container = modal.container,
310311
currBackdropIndex = backdropIndex();
311312

312313
if (currBackdropIndex >= 0 && !backdropDomEl) {
@@ -318,7 +319,7 @@ angular.module('ui.bootstrap.modal', [])
318319
angularBackgroundDomEl.attr('modal-animation', 'true');
319320
}
320321
backdropDomEl = $compile(angularBackgroundDomEl)(backdropScope);
321-
body.append(backdropDomEl);
322+
container.append(backdropDomEl);
322323
}
323324

324325
var angularDomEl = angular.element('<div modal-window="modal-window"></div>');
@@ -336,8 +337,8 @@ angular.module('ui.bootstrap.modal', [])
336337
var modalDomEl = $compile(angularDomEl)(modal.scope);
337338
openedWindows.top().value.modalDomEl = modalDomEl;
338339
openedWindows.top().value.modalOpener = modalOpener;
339-
body.append(modalDomEl);
340-
body.addClass(OPENED_MODAL_CLASS);
340+
container.append(modalDomEl);
341+
container.addClass(OPENED_MODAL_CLASS);
341342
};
342343

343344
function broadcastClosing(modalWindow, resultOrReason, closing) {
@@ -393,9 +394,9 @@ angular.module('ui.bootstrap.modal', [])
393394
backdrop: true, //can also be false or 'static'
394395
keyboard: true
395396
},
397+
defaultContainer: angular.element(document).find('body').eq(0),
396398
$get: ['$injector', '$rootScope', '$q', '$templateRequest', '$controller', '$modalStack',
397399
function ($injector, $rootScope, $q, $templateRequest, $controller, $modalStack) {
398-
399400
var $modal = {};
400401

401402
function getTemplatePromise(options) {
@@ -483,6 +484,7 @@ angular.module('ui.bootstrap.modal', [])
483484
backdropClass: modalOptions.backdropClass,
484485
windowClass: modalOptions.windowClass,
485486
windowTemplateUrl: modalOptions.windowTemplateUrl,
487+
container: $modalProvider.defaultContainer,
486488
size: modalOptions.size
487489
});
488490

Diff for: src/modal/test/modal.spec.js

+34-4
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ describe('$modal', function () {
7575
toHaveModalOpenWithContent: function(util, customEqualityTesters) {
7676
return {
7777
compare: function(actual, content, selector) {
78-
var contentToCompare, modalDomEls = actual.find('body > div.modal > div.modal-dialog > div.modal-content');
78+
var container = (actual === $document) ? actual.find('body') : actual;
7979

80-
contentToCompare = selector ? modalDomEls.find(selector) : modalDomEls;
80+
var modalDomEls = container.find('div.modal > div.modal-dialog > div.modal-content');
81+
82+
var contentToCompare = selector ? modalDomEls.find(selector) : modalDomEls;
8183

8284
var result = {
8385
pass: modalDomEls.css('display') === 'block' && contentToCompare.html() === content
@@ -96,7 +98,9 @@ describe('$modal', function () {
9698
toHaveModalsOpen: function(util, customEqualityTesters) {
9799
return {
98100
compare: function(actual, expected) {
99-
var modalDomEls = actual.find('body > div.modal');
101+
var container = (actual === $document) ? actual.find('body') : actual;
102+
103+
var modalDomEls = container.find('div.modal');
100104

101105
var result = {
102106
pass: util.equals(modalDomEls.length, expected, customEqualityTesters)
@@ -115,7 +119,9 @@ describe('$modal', function () {
115119
toHaveBackdrop: function(util, customEqualityTesters) {
116120
return {
117121
compare: function(actual, expected) {
118-
var backdropDomEls = actual.find('body > div.modal-backdrop');
122+
var container = (actual === $document) ? actual.find('body') : actual;
123+
124+
var backdropDomEls = container.find('div.modal-backdrop');
119125

120126
var result = {
121127
pass: util.equals(backdropDomEls.length, 1, customEqualityTesters)
@@ -369,6 +375,30 @@ describe('$modal', function () {
369375
});
370376
});
371377

378+
describe('defaultContainer can be changed in a provider', function () {
379+
it('should allow overriding defaultContainer in a provider', function () {
380+
var container = $modalProvider.defaultContainer = angular.element('<div>');
381+
382+
var modal = open({template: '<div>Content</div>'});
383+
expect(container).toHaveModalsOpen(1);
384+
expect(container).toHaveClass('modal-open');
385+
expect(container).toHaveBackdrop();
386+
387+
// Sanity checks
388+
var body = $document.find('body');
389+
expect(body).toHaveModalsOpen(0);
390+
expect(body).not.toHaveClass('modal-open');
391+
expect(body).not.toHaveBackdrop();
392+
393+
dismiss(modal, 'closing in test');
394+
$animate.triggerCallbacks();
395+
396+
expect(container).toHaveModalsOpen(0);
397+
expect(container).not.toHaveClass('modal-open');
398+
expect(container).not.toHaveBackdrop();
399+
});
400+
});
401+
372402
describe('option by option', function () {
373403

374404
describe('template and templateUrl', function () {

0 commit comments

Comments
 (0)