Skip to content

Commit 9bc928f

Browse files
committed
fix(modal): do not click buttons underneath modal
1 parent 749cd38 commit 9bc928f

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

js/ext/angular/src/service/ionicModal.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ionic.serv
1212
var self = this;
1313
var element = angular.element(this.el);
1414

15+
document.body.classList.add('disable-pointer-events');
16+
this.el.classList.add('enable-pointer-events');
17+
1518
self._isShown = true;
1619

1720
if(!element.parent().length) {
@@ -46,7 +49,9 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ionic.serv
4649
hide: function() {
4750
this._isShown = false;
4851
var element = angular.element(this.el);
49-
$animate.removeClass(element, this.animation);
52+
$animate.removeClass(element, this.animation, function() {
53+
onHideModal(element[0]);
54+
});
5055

5156
ionic.views.Modal.prototype.hide.call(this);
5257

@@ -59,6 +64,7 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ionic.serv
5964
element = angular.element(this.el);
6065
this._isShown = false;
6166
$animate.leave(angular.element(this.el), function() {
67+
onHideModal(element[0]);
6268
self.scope.$parent.$broadcast('modal.removed', self);
6369
self.scope.$destroy();
6470
});
@@ -69,6 +75,11 @@ angular.module('ionic.service.modal', ['ionic.service.templateLoad', 'ionic.serv
6975
}
7076
});
7177

78+
function onHideModal(element) {
79+
document.body.classList.remove('disable-pointer-events');
80+
element.classList.remove('enable-pointer-events');
81+
}
82+
7283
var createModal = function(templateString, options) {
7384
// Create a new scope for the modal
7485
var scope = options.scope && options.scope.$new() || $rootScope.$new(true);

js/ext/angular/test/service/ionicModal.unit.js

+26
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,32 @@ describe('Ionic Modal', function() {
5353
expect(m.isShown()).toBe(false);
5454
});
5555

56+
it('show & remove should add {disable,enable}-pointer-events to body/modal', inject(function($animate) {
57+
var m = modal.fromTemplate('<div class="modal">hi</div>');
58+
m.show();
59+
expect(angular.element(m.el).hasClass('enable-pointer-events')).toBe(true);
60+
expect(angular.element(document.body).hasClass('disable-pointer-events')).toBe(true);
61+
spyOn($animate, 'leave').andCallFake(function(el, cb) {
62+
cb();
63+
});
64+
m.remove();
65+
expect(angular.element(m.el).hasClass('enable-pointer-events')).toBe(false);
66+
expect(angular.element(document.body).hasClass('disable-pointer-events')).toBe(false);
67+
}));
68+
69+
it('show & hide should add {disable,enable}-pointer-events to body/modal', inject(function($animate) {
70+
var m = modal.fromTemplate('<div class="modal">hi</div>');
71+
m.show();
72+
expect(angular.element(m.el).hasClass('enable-pointer-events')).toBe(true);
73+
expect(angular.element(document.body).hasClass('disable-pointer-events')).toBe(true);
74+
spyOn($animate, 'removeClass').andCallFake(function(el, cls, cb) {
75+
cb();
76+
});
77+
m.hide();
78+
expect(angular.element(m.el).hasClass('enable-pointer-events')).toBe(false);
79+
expect(angular.element(document.body).hasClass('disable-pointer-events')).toBe(false);
80+
}));
81+
5682
it('should animate leave and destroy scope on remove', inject(function($animate) {
5783
var m = modal.fromTemplate('<div class="modal"></div>');
5884
spyOn($animate, 'leave').andCallFake(function(el, cb) { cb(); });

0 commit comments

Comments
 (0)