Skip to content

Commit

Permalink
Add scrollAfterSelect as a configurable option for multiselect dropdo…
Browse files Browse the repository at this point in the history
…wns to allow toggling of highlightFirstItem() behaviour (select2#5150)

* Add scrollOnSelect as a configurable option

* default scrollOnSelect to true to avoid modifying existing behaviour

* added tests and default option for scrollAfterSelect
  • Loading branch information
boweihan authored and jseekamp committed Dec 12, 2018
1 parent 60ee4a1 commit 782caae
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/js/select2/defaults.js
Expand Up @@ -365,6 +365,7 @@ define([
maximumSelectionLength: 0,
minimumResultsForSearch: 0,
selectOnClose: false,
scrollAfterSelect: true,
sorter: function (data) {
return data;
},
Expand Down
10 changes: 8 additions & 2 deletions src/js/select2/results.js
Expand Up @@ -276,7 +276,10 @@ define([
}

self.setClasses();
self.highlightFirstItem();

if (self.options.get('scrollAfterSelect')) {
self.highlightFirstItem();
}
});

container.on('unselect', function () {
Expand All @@ -285,7 +288,10 @@ define([
}

self.setClasses();
self.highlightFirstItem();

if (self.options.get('scrollAfterSelect')) {
self.highlightFirstItem();
}
});

container.on('open', function () {
Expand Down
103 changes: 103 additions & 0 deletions tests/results/focusing-tests.js
Expand Up @@ -135,4 +135,107 @@ test('results:append does not trigger results:focus', function (assert) {
]
}
});
});

test('scrollAfterSelect triggers results:focus by default', function (assert) {
assert.expect(3);

var $ = require('jquery');

var $select = $('<select></select>');
var $parent = $('<div></div>');

var $container = $('<span></span>');
var container = new MockContainer();

$parent.appendTo($('#qunit-fixture'));
$select.appendTo($parent);

var Utils = require('select2/utils');
var Options = require('select2/options');

var Results = require('select2/results');

var options = new Options({});
var results = new Results($select, options);

// Fake the data adapter for the `setClasses` method
results.data = {};
results.data.current = function (callback) {
callback([{ id: 'test' }]);
};

results.render();

results.bind(container, $container);

// check that default for scrollAfterSelect is true
assert.equal(options.get('scrollAfterSelect'), true);

results.append({
results: [
{
id: 'test',
text: 'Test'
}
]
});

results.on('results:focus', function (params) {
assert.equal(params.data.id, 'test');
assert.equal(params.data.text, 'Test');
});

container.trigger('select', {});
});

test('!scrollAfterSelect does not trigger results:focus', function (assert) {
assert.expect(1);

var $ = require('jquery');

var $select = $('<select></select>');
var $parent = $('<div></div>');

var $container = $('<span></span>');
var container = new MockContainer();

$parent.appendTo($('#qunit-fixture'));
$select.appendTo($parent);

var Utils = require('select2/utils');
var Options = require('select2/options');

var Results = require('select2/results');

var options = new Options({ scrollAfterSelect: false });
var results = new Results($select, options);

// Fake the data adapter for the `setClasses` method
results.data = {};
results.data.current = function (callback) {
callback([{ id: 'test' }]);
};

results.render();

results.bind(container, $container);

// check that default for scrollAfterSelect is false
assert.equal(options.get('scrollAfterSelect'), false);

results.append({
results: [
{
id: 'test',
text: 'Test'
}
]
});

results.on('results:focus', function () {
assert.ok(false, 'The results:focus event was triggered');
});

container.trigger('select', {});
});

0 comments on commit 782caae

Please sign in to comment.