Browse Source

#1380 #1138 Adds better event binding to dimmer for multiple open modals

pull/1407/head
jlukic 9 years ago
parent
commit
6e0fa165e4
2 changed files with 45 additions and 27 deletions
  1. 70
      src/definitions/modules/modal.js
  2. 2
      src/themes/default/modules/modal.variables

70
src/definitions/modules/modal.js

@ -65,6 +65,9 @@ $.fn.modal = function(parameters) {
element = this, element = this,
instance = $module.data(moduleNamespace), instance = $module.data(moduleNamespace),
elementNamespace,
id,
observer, observer,
module module
; ;
@ -78,6 +81,9 @@ $.fn.modal = function(parameters) {
return; return;
} }
id = module.get.uniqueID();
elementNamespace = '.' + id;
$dimmable = $context $dimmable = $context
.dimmer({ .dimmer({
debug : settings.debug, debug : settings.debug,
@ -95,8 +101,7 @@ $.fn.modal = function(parameters) {
} }
$dimmer = $dimmable.dimmer('get dimmer'); $dimmer = $dimmable.dimmer('get dimmer');
$otherModals = $module.siblings(selector.modal);
$allModals = $otherModals.add($module);
module.refreshModals();
module.verbose('Attaching close events', $close); module.verbose('Attaching close events', $close);
module.bind.events(); module.bind.events();
@ -119,6 +124,7 @@ $.fn.modal = function(parameters) {
.removeData(moduleNamespace) .removeData(moduleNamespace)
.off(eventNamespace) .off(eventNamespace)
; ;
$window.off(elementNamespace);
$close.off(eventNamespace); $close.off(eventNamespace);
$context.dimmer('destroy'); $context.dimmer('destroy');
}, },
@ -145,6 +151,11 @@ $.fn.modal = function(parameters) {
module.set.position(); module.set.position();
}, },
refreshModals: function() {
$otherModals = $module.siblings(selector.modal);
$allModals = $otherModals.add($module);
},
attachEvents: function(selector, event) { attachEvents: function(selector, event) {
var var
$toggle = $(selector) $toggle = $(selector)
@ -171,11 +182,17 @@ $.fn.modal = function(parameters) {
.on('click' + eventNamespace, module.event.close) .on('click' + eventNamespace, module.event.close)
; ;
$window $window
.on('resize' + eventNamespace, module.event.resize)
.on('resize' + elementNamespace, module.event.resize)
; ;
} }
}, },
get: {
uniqueID: function() {
return (Math.random().toString(16) + '000000000').substr(2,8);
}
},
event: { event: {
close: function() { close: function() {
module.verbose('Closing element pressed'); module.verbose('Closing element pressed');
@ -202,13 +219,13 @@ $.fn.modal = function(parameters) {
click: function(event) { click: function(event) {
if( $(event.target).closest(selector.modal).size() === 0 ) { if( $(event.target).closest(selector.modal).size() === 0 ) {
module.debug('Dimmer clicked, hiding all modals'); module.debug('Dimmer clicked, hiding all modals');
module.remove.clickaway();
if(settings.allowMultiple) { if(settings.allowMultiple) {
module.hide(); module.hide();
} }
else { else {
module.hideAll(); module.hideAll();
} }
event.stopImmediatePropagation();
} }
}, },
debounce: function(method, delay) { debounce: function(method, delay) {
@ -252,10 +269,23 @@ $.fn.modal = function(parameters) {
? callback ? callback
: function(){} : function(){}
; ;
module.refreshModals();
module.showDimmer(); module.showDimmer();
module.showModal(callback); module.showModal(callback);
}, },
hide: function(callback) {
callback = $.isFunction(callback)
? callback
: function(){}
;
module.refreshModals();
if( !module.othersActive() ) {
module.hideDimmer();
}
module.hideModal(callback);
},
showModal: function(callback) { showModal: function(callback) {
callback = $.isFunction(callback) callback = $.isFunction(callback)
? callback ? callback
@ -263,7 +293,7 @@ $.fn.modal = function(parameters) {
; ;
if( !module.is.active() ) { if( !module.is.active() ) {
if( $otherModals.filter(':visible').size() > 0 && !settings.allowMultiple) {
if( !settings.allowMultiple && $otherModals.filter(':visible').size() > 0) {
module.debug('Other modals visible, queueing show animation'); module.debug('Other modals visible, queueing show animation');
module.hideOthers(module.showModal); module.hideOthers(module.showModal);
} }
@ -275,15 +305,13 @@ $.fn.modal = function(parameters) {
module.set.position(); module.set.position();
module.set.screenHeight(); module.set.screenHeight();
module.set.type(); module.set.type();
module.set.clickaway();
$module $module
.transition({ .transition({
debug : settings.debug, debug : settings.debug,
animation : settings.transition + ' in', animation : settings.transition + ' in',
queue : false, queue : false,
duration : settings.duration, duration : settings.duration,
onStart : function() {
module.set.clickaway();
},
onComplete : function() { onComplete : function() {
$.proxy(settings.onVisible, element)(); $.proxy(settings.onVisible, element)();
module.add.keyboardShortcuts(); module.add.keyboardShortcuts();
@ -324,29 +352,16 @@ $.fn.modal = function(parameters) {
} }
}, },
hide: function(callback) {
callback = $.isFunction(callback)
? callback
: function(){}
;
if($allModals.filter(':visible').size() <= 1) {
module.hideDimmer();
}
module.hideModal(callback);
},
hideDimmer: function() { hideDimmer: function() {
if( !($dimmable.dimmer('is active') || $dimmable.dimmer('is animating')) ) { if( !($dimmable.dimmer('is active') || $dimmable.dimmer('is animating')) ) {
module.debug('Dimmer is not visible cannot hide'); module.debug('Dimmer is not visible cannot hide');
return; return;
} }
module.debug('Hiding dimmer'); module.debug('Hiding dimmer');
module.remove.clickaway();
$dimmable.dimmer('hide', function() { $dimmable.dimmer('hide', function() {
if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) { if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
module.remove.screenHeight(); module.remove.screenHeight();
} }
module.remove.active();
}); });
}, },
@ -358,6 +373,7 @@ $.fn.modal = function(parameters) {
module.debug('Hiding modal'); module.debug('Hiding modal');
$.proxy(settings.onHide, element)(); $.proxy(settings.onHide, element)();
if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) { if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
module.remove.active();
$module $module
.transition({ .transition({
debug : settings.debug, debug : settings.debug,
@ -369,7 +385,6 @@ $.fn.modal = function(parameters) {
}, },
onComplete : function() { onComplete : function() {
$.proxy(settings.onHidden, element)(); $.proxy(settings.onHidden, element)();
module.remove.active();
module.restore.focus(); module.restore.focus();
callback(); callback();
} }
@ -377,11 +392,11 @@ $.fn.modal = function(parameters) {
; ;
} }
else { else {
module.remove.active();
module.remove.keyboardShortcuts(); module.remove.keyboardShortcuts();
$module $module
.fadeOut(settings.duration, settings.easing, function() { .fadeOut(settings.duration, settings.easing, function() {
$.proxy(settings.onHidden, element)(); $.proxy(settings.onHidden, element)();
module.remove.active();
module.restore.focus(); module.restore.focus();
callback(); callback();
}) })
@ -418,6 +433,10 @@ $.fn.modal = function(parameters) {
} }
}, },
othersActive: function() {
return ($otherModals.filter('.' + className.active).size() > 0);
},
add: { add: {
keyboardShortcuts: function() { keyboardShortcuts: function() {
module.verbose('Adding keyboard shortcuts'); module.verbose('Adding keyboard shortcuts');
@ -448,7 +467,7 @@ $.fn.modal = function(parameters) {
clickaway: function() { clickaway: function() {
if(settings.closable) { if(settings.closable) {
$dimmer $dimmer
.off('click' + eventNamespace)
.off('click' + elementNamespace)
; ;
} }
}, },
@ -526,8 +545,7 @@ $.fn.modal = function(parameters) {
clickaway: function() { clickaway: function() {
if(settings.closable) { if(settings.closable) {
$dimmer $dimmer
.off('click' + eventNamespace)
.on('click' + eventNamespace, module.event.click)
.on('click' + elementNamespace, module.event.click)
; ;
} }
}, },

2
src/themes/default/modules/modal.variables

@ -7,7 +7,7 @@
@width: 90%; @width: 90%;
@xOffset: -(@width / 2); @xOffset: -(@width / 2);
@borderRadius: @defaultBorderRadius; @borderRadius: @defaultBorderRadius;
@boxShadow: 0px 0px 8px rgba(0, 0, 0, 0.8);
@boxShadow: 0 1px 4px 1px rgba(0, 0, 0, 0.3);
/* Close Icon */ /* Close Icon */
@closeOpacity: 0.8; @closeOpacity: 0.8;

Loading…
Cancel
Save