1
0
mirror of synced 2024-11-22 04:56:08 +03:00

Reposition dropdown whenever items are selected (#5590)

* Reposition dropdown whenever items are selected

This fixes an old bug where if you had a multiple select with the
`closeOnSelect` option set to `false` and many options being
selected, the dropdown would not reposition itself if the selected
options expanded the container down another line. This was because
the dropdown was only being repositioned when it was opened, closed,
or if something around it was scrolled or resized. Unfortunately,
in most cases none of these happened and the dropdown would start
covering the selections.

This was fixed by telling Select2 to resize the dropdown when new
options are selected or existing options are unselected.

Fixes #4377

* Attach positioning handlers at bind time

The positioning handlers have been attached at the time that the
dropdown is opened since when they were first committed many years
ago. It's not actually clear why this was being done, since they
don't rely on anything involving the dropdown being open. This
removes the flag and process for setting these handlers only after
the dropdown was opened for the first time, and moves these handlers
to always be set at bind time.
This commit is contained in:
Kevin Brown 2019-07-28 14:49:25 -04:00 committed by GitHub
parent efbfd14414
commit 525f661915
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -11,16 +11,17 @@ define([
AttachBody.prototype.bind = function (decorated, container, $container) {
var self = this;
var setupResultsEvents = false;
decorated.call(this, container, $container);
container.on('open', function () {
self._showDropdown();
self._attachPositioningHandler(container);
});
if (!setupResultsEvents) {
setupResultsEvents = true;
container.on('close', function () {
self._hideDropdown();
self._detachPositioningHandler(container);
});
container.on('results:all', function () {
self._positionDropdown();
@ -31,12 +32,15 @@ define([
self._positionDropdown();
self._resizeDropdown();
});
}
container.on('select', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('close', function () {
self._hideDropdown();
self._detachPositioningHandler(container);
container.on('unselect', function () {
self._positionDropdown();
self._resizeDropdown();
});
this.$dropdownContainer.on('mousedown', function (evt) {