diff --git a/dist/components/dropdown.js b/dist/components/dropdown.js index 6248a04ab..65132f029 100644 --- a/dist/components/dropdown.js +++ b/dist/components/dropdown.js @@ -2330,6 +2330,12 @@ $.fn.dropdown = function(parameters) { else { module.set.upward($menu); } + if(module.is.fitWidth($menu)) { + module.remove.leftward($menu); + } + else { + module.set.leftward($menu); + } } else if(settings.direction == 'upward') { module.set.upward($menu); @@ -2339,6 +2345,14 @@ $.fn.dropdown = function(parameters) { var $element = $menu || $module; $element.addClass(className.upward); }, + leftward: function($menu) { + var $element = $menu || $module; + var parentMenu = $element.parent().closest(selector.menu); + if (parentMenu.hasClass('transition')) { + $element = parentMenu; + } + $element.addClass(className.leftward); + }, value: function(value, text, $selected) { var escapedValue = module.escape.value(value), @@ -2691,6 +2705,14 @@ $.fn.dropdown = function(parameters) { var $element = $menu || $module; $element.removeClass(className.upward); }, + leftward: function($menu) { + var $element = $menu || $module; + var parentMenu = $element.parent().closest(selector.menu); + if (parentMenu.hasClass('transition')) { + $element = parentMenu; + } + $element.removeClass(className.leftward); + }, visible: function() { $module.removeClass(className.visible); }, @@ -3047,6 +3069,34 @@ $.fn.dropdown = function(parameters) { $currentMenu.removeClass(className.loading); return canOpenDownward; }, + fitWidth: function($subMenu) { + var + $currentMenu = $subMenu || $menu, + canOpenRightward = true, + isOutsideScreen = false, + calculations + ; + $currentMenu.addClass(className.loading); + calculations = { + childrenWidth: 0, + contextWidth: $context.outerWidth(), + menuOffset : $currentMenu.offset().left, + menuWidth : $currentMenu.outerWidth() + }; + $currentMenu.find(selector.menu).each(function() { + var child = $(this); + child.show(); + calculations.childrenWidth += child[0].offsetWidth; + }); + isOutsideScreen = ((calculations.contextWidth < calculations.menuOffset + calculations.menuWidth + calculations.childrenWidth) || (calculations.menuOffset - $menu.offset().left < 0)); + + if(isOutsideScreen) { + module.verbose('Dropdown cannot fit in context rightward', isOutsideScreen); + canOpenRightward = false; + } + $currentMenu.removeClass(className.loading); + return canOpenRightward; + }, inObject: function(needle, object) { var found = false @@ -3216,7 +3266,12 @@ $.fn.dropdown = function(parameters) { onStart : start, onComplete : function() { if(settings.direction == 'auto') { - module.remove.upward($subMenu); + if ($currentMenu.hasClass(className.leftward)) { + module.remove.leftward($subMenu); + } + else { + module.remove.upward($subMenu); + } } callback.call(element); } @@ -3644,6 +3699,7 @@ $.fn.dropdown.settings = { selected : 'selected', selection : 'selection', upward : 'upward', + leftward : 'left', visible : 'visible' } diff --git a/examples/components/menu.html b/examples/components/menu.html index 5c66e2ab9..dcfafcb0e 100644 --- a/examples/components/menu.html +++ b/examples/components/menu.html @@ -33,35 +33,35 @@
@@ -147,6 +147,32 @@ +