From b8afaa653f37f086ef15b0ec11c94b7343c395dd Mon Sep 17 00:00:00 2001 From: bowei Date: Wed, 29 Nov 2017 15:34:37 -0500 Subject: [PATCH 1/3] Add scrollOnSelect as a configurable option --- src/js/select2/results.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/js/select2/results.js b/src/js/select2/results.js index a16b65fd0f..799162e43d 100644 --- a/src/js/select2/results.js +++ b/src/js/select2/results.js @@ -276,7 +276,10 @@ define([ } self.setClasses(); - self.highlightFirstItem(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } }); container.on('unselect', function () { @@ -285,7 +288,10 @@ define([ } self.setClasses(); - self.highlightFirstItem(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } }); container.on('open', function () { From b0ee5d5f3ba0595435912eccc239dca2f7247be2 Mon Sep 17 00:00:00 2001 From: bowei Date: Tue, 5 Dec 2017 14:19:32 -0500 Subject: [PATCH 2/3] default scrollOnSelect to true to avoid modifying existing behaviour --- src/js/select2/defaults.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/js/select2/defaults.js b/src/js/select2/defaults.js index ad4d224f84..b99d44f459 100644 --- a/src/js/select2/defaults.js +++ b/src/js/select2/defaults.js @@ -365,6 +365,7 @@ define([ maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, + scrollOnSelect: true, sorter: function (data) { return data; }, From 3e74040a98da154ee5a647c9891ccd4c2713a499 Mon Sep 17 00:00:00 2001 From: bowei Date: Wed, 6 Dec 2017 14:08:43 -0500 Subject: [PATCH 3/3] added tests and default option for scrollAfterSelect --- src/js/select2/defaults.js | 2 +- tests/results/focusing-tests.js | 103 ++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) diff --git a/src/js/select2/defaults.js b/src/js/select2/defaults.js index b99d44f459..8d83f3399b 100644 --- a/src/js/select2/defaults.js +++ b/src/js/select2/defaults.js @@ -365,7 +365,7 @@ define([ maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, - scrollOnSelect: true, + scrollAfterSelect: true, sorter: function (data) { return data; }, diff --git a/tests/results/focusing-tests.js b/tests/results/focusing-tests.js index 135d0016d1..35aa1247cb 100644 --- a/tests/results/focusing-tests.js +++ b/tests/results/focusing-tests.js @@ -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 = $(''); + var $parent = $('
'); + + var $container = $(''); + 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 = $(''); + var $parent = $('
'); + + var $container = $(''); + 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', {}); }); \ No newline at end of file