Forums › Forums › Search & Filter Pro › Select2 dropdown position, how to force below?
- This topic has 3 replies, 2 voices, and was last updated 4 years, 6 months ago by
Trevor.
Viewing 3 posts - 1 through 3 (of 3 total)
-
Trevor(Private) December 18, 2020 at 5:00 pm #270311
We use the standard Select2 library, so you may be able to use some custom JavaScript to change this behaviour, but that is not something I have done before, and you would need to code this yourself. If you alter any core files, you need to keep copies, as any update will overwrite them.
Anonymous(Private) December 18, 2020 at 5:26 pm #270335OK I figured it out.
(function($) { var Defaults = $.fn.select2.amd.require('select2/defaults'); $.extend(Defaults.defaults, { dropdownPosition: 'auto' }); var AttachBody = $.fn.select2.amd.require('select2/dropdown/attachBody'); var _positionDropdown = AttachBody.prototype._positionDropdown; AttachBody.prototype._positionDropdown = function() { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calciulating the offset var $offsetParent = this.$dropdownParent; // For statically positoned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = $offsetParent.offset(); css.top -= parentOffset.top css.left -= parentOffset.left; var dropdownPositionOption = this.options.get('dropdownPosition'); if (dropdownPositionOption === 'above' || dropdownPositionOption === 'below') { newDirection = dropdownPositionOption; } else { if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; })(window.jQuery); jQuery(document).ready(function() { jQuery(".sf-input-select").select2({ dropdownPosition: 'below' }); });
-
AuthorPosts
Viewing 3 posts - 1 through 3 (of 3 total)