@@ -258,10 +258,38 @@ uis.directive('uiSelect',
258258
259259 // Support changing the direction of the dropdown if there isn't enough space to render it.
260260 scope . $watch ( '$select.open' , function ( ) {
261- scope . calculateDropdownPos ( ) ;
261+
262+ if ( $select . dropdownPosition === 'auto' || $select . dropdownPosition === 'up' ) {
263+ scope . calculateDropdownPos ( ) ;
264+ }
265+
262266 } ) ;
263267
268+ var setDropdownPosUp = function ( offset , offsetDropdown ) {
269+
270+ offset = offset || uisOffset ( element ) ;
271+ offsetDropdown = offsetDropdown || uisOffset ( dropdown ) ;
272+
273+ dropdown [ 0 ] . style . position = 'absolute' ;
274+ dropdown [ 0 ] . style . top = ( offsetDropdown . height * - 1 ) + 'px' ;
275+ element . addClass ( directionUpClassName ) ;
276+
277+ } ;
278+
279+ var setDropdownPosDown = function ( offset , offsetDropdown ) {
280+
281+ element . removeClass ( directionUpClassName ) ;
282+
283+ offset = offset || uisOffset ( element ) ;
284+ offsetDropdown = offsetDropdown || uisOffset ( dropdown ) ;
285+
286+ dropdown [ 0 ] . style . position = '' ;
287+ dropdown [ 0 ] . style . top = '' ;
288+
289+ } ;
290+
264291 scope . calculateDropdownPos = function ( ) {
292+
265293 if ( $select . open ) {
266294 dropdown = angular . element ( element ) . querySelectorAll ( '.ui-select-dropdown' ) ;
267295 if ( dropdown . length === 0 ) {
@@ -274,24 +302,29 @@ uis.directive('uiSelect',
274302 // Delay positioning the dropdown until all choices have been added so its height is correct.
275303 $timeout ( function ( ) {
276304
277- element . removeClass ( directionUpClassName ) ;
305+ if ( $select . dropdownPosition === 'up' ) {
306+ //Go UP
307+ setDropdownPosUp ( offset , offsetDropdown ) ;
308+
309+ } else { //AUTO
310+
311+ element . removeClass ( directionUpClassName ) ;
312+
313+ var offset = uisOffset ( element ) ;
314+ var offsetDropdown = uisOffset ( dropdown ) ;
315+
316+ //https://code.google.com/p/chromium/issues/detail?id=342307#c4
317+ var scrollTop = $document [ 0 ] . documentElement . scrollTop || $document [ 0 ] . body . scrollTop ; //To make it cross browser (blink, webkit, IE, Firefox).
318+
319+ // Determine if the direction of the dropdown needs to be changed.
320+ if ( offset . top + offset . height + offsetDropdown . height > scrollTop + $document [ 0 ] . documentElement . clientHeight ) {
321+ //Go UP
322+ setDropdownPosUp ( offset , offsetDropdown ) ;
323+ } else {
324+ //Go DOWN
325+ setDropdownPosDown ( offset , offsetDropdown ) ;
326+ }
278327
279- var offset = uisOffset ( element ) ;
280- var offsetDropdown = uisOffset ( dropdown ) ;
281-
282- //https://code.google.com/p/chromium/issues/detail?id=342307#c4
283- var scrollTop = $document [ 0 ] . documentElement . scrollTop || $document [ 0 ] . body . scrollTop ; //To make it cross browser (blink, webkit, IE, Firefox).
284-
285- // Determine if the direction of the dropdown needs to be changed.
286- if ( offset . top + offset . height + offsetDropdown . height > scrollTop + $document [ 0 ] . documentElement . clientHeight ) {
287- //Go UP
288- dropdown [ 0 ] . style . position = 'absolute' ;
289- dropdown [ 0 ] . style . top = ( offsetDropdown . height * - 1 ) + 'px' ;
290- element . addClass ( directionUpClassName ) ;
291- } else {
292- //Go DOWN
293- dropdown [ 0 ] . style . position = '' ;
294- dropdown [ 0 ] . style . top = '' ;
295328 }
296329
297330 // Display the dropdown once it has been positioned.
0 commit comments