Browse Source

Fixing many unexpected regressions #4506, release will wait till morning

pull/5359/merge
Jack 8 years ago
parent
commit
2c26746dce
1 changed files with 89 additions and 74 deletions
  1. 163
      src/definitions/modules/dropdown.js

163
src/definitions/modules/dropdown.js

@ -2368,29 +2368,33 @@ $.fn.dropdown = function(parameters) {
}, },
direction: function($menu) { direction: function($menu) {
if(settings.direction == 'auto') { if(settings.direction == 'auto') {
if(module.is.onScreen($menu)) {
// reset position
module.remove.upward();
module.remove.leftward();
if(module.can.openDownward($menu)) {
module.remove.upward($menu); module.remove.upward($menu);
} }
else { else {
module.set.upward($menu); module.set.upward($menu);
} }
if(module.can.openRightward($menu)) {
module.remove.leftward($menu);
}
else {
module.set.leftward($menu);
}
} }
else if(settings.direction == 'upward') { else if(settings.direction == 'upward') {
module.set.upward($menu); module.set.upward($menu);
} }
if(module.can.openRightward($menu)) {
module.remove.leftward($menu);
}
else {
module.set.leftward($menu);
}
}, },
upward: function($menu) {
var $element = $menu || $module;
upward: function($currentMenu) {
var $element = $currentMenu || $module;
$element.addClass(className.upward); $element.addClass(className.upward);
}, },
leftward: function($menu) {
var $element = $menu || $module;
leftward: function($currentMenu) {
var $element = $currentMenu || $menu;
$element.addClass(className.leftward); $element.addClass(className.leftward);
}, },
value: function(value, text, $selected) { value: function(value, text, $selected) {
@ -2740,12 +2744,12 @@ $.fn.dropdown = function(parameters) {
initialLoad: function() { initialLoad: function() {
initialLoad = false; initialLoad = false;
}, },
upward: function($menu) {
var $element = $menu || $module;
upward: function($currentMenu) {
var $element = $currentMenu || $module;
$element.removeClass(className.upward); $element.removeClass(className.upward);
}, },
leftward: function($menu) {
var $element = $menu || $module;
leftward: function($currentMenu) {
var $element = $currentMenu || $menu;
$element.removeClass(className.leftward); $element.removeClass(className.leftward);
}, },
visible: function() { visible: function() {
@ -3070,46 +3074,6 @@ $.fn.dropdown = function(parameters) {
initialLoad: function() { initialLoad: function() {
return initialLoad; return initialLoad;
}, },
onScreen: function($subMenu) {
var
$currentMenu = $subMenu || $menu,
canOpenDownward = true,
onScreen = {},
calculations
;
$currentMenu.addClass(className.loading);
calculations = {
context: {
scrollTop : $context.scrollTop(),
height : $context.outerHeight()
},
menu : {
offset: $currentMenu.offset(),
height: $currentMenu.outerHeight()
}
};
if(module.is.verticallyScrollableContext()) {
calculations.menu.offset.top += calculations.context.scrollTop;
}
onScreen = {
above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.menu.height,
below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top + calculations.menu.height
};
if(onScreen.below) {
module.verbose('Dropdown can fit in context downward', onScreen);
canOpenDownward = true;
}
else if(!onScreen.below && !onScreen.above) {
module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);
canOpenDownward = true;
}
else {
module.verbose('Dropdown cannot fit below, opening upward', onScreen);
canOpenDownward = false;
}
$currentMenu.removeClass(className.loading);
return canOpenDownward;
},
inObject: function(needle, object) { inObject: function(needle, object) {
var var
found = false found = false
@ -3172,6 +3136,14 @@ $.fn.dropdown = function(parameters) {
: false : false
; ;
return (overflowY == 'auto' || overflowY == 'scroll'); return (overflowY == 'auto' || overflowY == 'scroll');
},
horizontallyScrollableContext: function() {
var
overflowX = ($context.get(0) !== window)
? $context.css('overflow-X')
: false
;
return (overflowX == 'auto' || overflowX == 'scroll');
} }
}, },
@ -3188,26 +3160,77 @@ $.fn.dropdown = function(parameters) {
} }
return false; return false;
}, },
openRightward: function($menu) {
openDownward: function($subMenu) {
var
$currentMenu = $subMenu || $menu,
canOpenDownward = true,
onScreen = {},
calculations
;
$currentMenu
.addClass(className.loading)
;
calculations = {
context: {
scrollTop : $context.scrollTop(),
height : $context.outerHeight()
},
menu : {
offset: $currentMenu.offset(),
height: $currentMenu.outerHeight()
}
};
if(module.is.verticallyScrollableContext()) {
calculations.menu.offset.top += calculations.context.scrollTop;
}
onScreen = {
above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.menu.height,
below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top + calculations.menu.height
};
if(onScreen.below) {
module.verbose('Dropdown can fit in context downward', onScreen);
canOpenDownward = true;
}
else if(!onScreen.below && !onScreen.above) {
module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);
canOpenDownward = true;
}
else {
module.verbose('Dropdown cannot fit below, opening upward', onScreen);
canOpenDownward = false;
}
$currentMenu.removeClass(className.loading);
return canOpenDownward;
},
openRightward: function($subMenu) {
var var
$currentMenu = $subMenu || $menu,
canOpenRightward = true, canOpenRightward = true,
isOutsideScreen = false,
isOffscreenRight = false,
calculations calculations
; ;
$menu
$currentMenu
.addClass(className.loading) .addClass(className.loading)
; ;
calculations = { calculations = {
contextWidth : $context.outerWidth(),
menuOffset : $menu.offset().left,
menuWidth : $menu.outerWidth(),
context: {
scrollLeft : $context.scrollLeft(),
width : $context.outerWidth()
},
menu: {
offset : $currentMenu.offset(),
width : $currentMenu.outerWidth()
}
}; };
isOutsideScreen = (calculations.menuOffset + calculations.menuWidth > calculations.contextWidth) || (calculations.menuOffset - $menu.offset().left < 0);
if(isOutsideScreen) {
module.verbose('Dropdown cannot fit in context rightward', isOutsideScreen);
if(module.is.horizontallyScrollableContext()) {
calculations.menu.offset.left += calculations.context.scrollLeft;
}
isOffscreenRight = (calculations.menu.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width);
if(isOffscreenRight) {
module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);
canOpenRightward = false; canOpenRightward = false;
} }
$menu.removeClass(className.loading);
$currentMenu.removeClass(className.loading);
return canOpenRightward; return canOpenRightward;
}, },
click: function() { click: function() {
@ -3242,7 +3265,7 @@ $.fn.dropdown = function(parameters) {
: function(){} : function(){}
; ;
module.verbose('Doing menu show animation', $currentMenu); module.verbose('Doing menu show animation', $currentMenu);
module.set.direction($currentMenu);
module.set.direction($subMenu);
transition = module.get.transition($subMenu); transition = module.get.transition($subMenu);
if( module.is.selection() ) { if( module.is.selection() ) {
module.set.scrollPosition(module.get.selectedItem(), true); module.set.scrollPosition(module.get.selectedItem(), true);
@ -3311,14 +3334,6 @@ $.fn.dropdown = function(parameters) {
queue : true, queue : true,
onStart : start, onStart : start,
onComplete : function() { onComplete : function() {
if(settings.direction == 'auto') {
if($currentMenu.hasClass(className.leftward)) {
module.remove.leftward($currentMenu);
}
if($currentMenu.hasClass(className.upward)) {
module.remove.upward($currentMenu);
}
}
callback.call(element); callback.call(element);
} }
}) })

Loading…
Cancel
Save