Skip to content
This repository was archived by the owner on Oct 2, 2019. It is now read-only.

Commit 02bebc0

Browse files
committed
Support changing the direction of the dropdown if there isn't enough space to render it.
1 parent b7199e3 commit 02bebc0

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/uiSelectDirective.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,48 @@ uis.directive('uiSelect',
248248
element[0].style.top = '';
249249
element[0].style.width = originalWidth;
250250
}
251+
252+
// Hold on to a reference to the .ui-select-dropdown element for direction support.
253+
var dropdown = null,
254+
directionUpClassName = 'direction-up';
255+
256+
// Support changing the direction of the dropdown if there isn't enough space to render it.
257+
scope.$watch('$select.open', function(isOpen) {
258+
if (isOpen) {
259+
dropdown = angular.element(element).querySelectorAll('.ui-select-dropdown');
260+
if (dropdown === null) {
261+
return;
262+
}
263+
264+
// Hide the dropdown so there is no flicker until $timeout is done executing.
265+
dropdown[0].style.visibility = 'hidden';
266+
267+
// Delay positioning the dropdown until all choices have been added so its height is correct.
268+
$timeout(function(){
269+
var offset = uisOffset(element);
270+
var offsetDropdown = uisOffset(dropdown);
271+
272+
// Determine if the direction of the dropdown needs to be changed.
273+
if (offset.top + offset.height + offsetDropdown.height > $document[0].documentElement.scrollTop + $document[0].documentElement.clientHeight) {
274+
dropdown[0].style.position = 'absolute';
275+
dropdown[0].style.top = (offsetDropdown.height * -1) + 'px';
276+
element.addClass(directionUpClassName);
277+
}
278+
279+
// Display the dropdown once it has been positioned.
280+
dropdown[0].style.visibility = '';
281+
});
282+
} else {
283+
if (dropdown === null) {
284+
return;
285+
}
286+
287+
// Reset the position of the dropdown.
288+
dropdown[0].style.position = '';
289+
dropdown[0].style.top = '';
290+
element.removeClass(directionUpClassName);
291+
}
292+
});
251293
};
252294
}
253295
};

0 commit comments

Comments
 (0)