f14bdf6b7b
This fixes a bug with the search box where, when it had a placeholder, it would expand the width of the selection container because it was too large. This bug was specifically caused by the search box not factoring in the padding surrounding it when caclualting the width it needed to be, which resulted in the search box extending outside of the selection container. This bug was easy to notice if your Select2 was set to have 100% width and if the container it was held within was not a block element. This fixes the bug by switching to using `width()` for calculating the search width instead of using `innerWidth()`, which ignored the surrounding padding. Fixes #5517 Closes #5518
278 lines
7.5 KiB
JavaScript
278 lines
7.5 KiB
JavaScript
module('Selection containers - Inline search');
|
|
|
|
var MultipleSelection = require('select2/selection/multiple');
|
|
var InlineSearch = require('select2/selection/search');
|
|
|
|
var $ = require('jquery');
|
|
var Options = require('select2/options');
|
|
var Utils = require('select2/utils');
|
|
|
|
var options = new Options({});
|
|
|
|
test('backspace will remove a choice', function (assert) {
|
|
assert.expect(3);
|
|
|
|
var KEYS = require('select2/keys');
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// The unselect event should be triggered at some point
|
|
selection.on('unselect', function () {
|
|
assert.ok(true, 'A choice was unselected');
|
|
});
|
|
|
|
// Add some selections and render the search
|
|
selection.update([
|
|
{
|
|
id: '1',
|
|
text: 'One'
|
|
}
|
|
]);
|
|
|
|
var $search = $selection.find('input');
|
|
var $choices = $selection.find('.select2-selection__choice');
|
|
|
|
assert.equal($search.length, 1, 'The search was visible');
|
|
assert.equal($choices.length, 1, 'The choice was rendered');
|
|
|
|
// Trigger the backspace on the search
|
|
var backspace = $.Event('keydown', {
|
|
which: KEYS.BACKSPACE
|
|
});
|
|
$search.trigger(backspace);
|
|
});
|
|
|
|
test('backspace will set the search text', function (assert) {
|
|
assert.expect(3);
|
|
|
|
var KEYS = require('select2/keys');
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// Add some selections and render the search
|
|
selection.update([
|
|
{
|
|
id: '1',
|
|
text: 'One'
|
|
}
|
|
]);
|
|
|
|
var $search = $selection.find('input');
|
|
var $choices = $selection.find('.select2-selection__choice');
|
|
|
|
assert.equal($search.length, 1, 'The search was visible');
|
|
assert.equal($choices.length, 1, 'The choice was rendered');
|
|
|
|
// Trigger the backspace on the search
|
|
var backspace = $.Event('keydown', {
|
|
which: KEYS.BACKSPACE
|
|
});
|
|
$search.trigger(backspace);
|
|
|
|
assert.equal($search.val(), 'One', 'The search text was set');
|
|
});
|
|
|
|
test('updating selection does not shift the focus', function (assert) {
|
|
// Check for IE 8, which triggers a false negative during testing
|
|
if (window.attachEvent && !window.addEventListener) {
|
|
// We must expect 0 assertions or the test will fail
|
|
assert.expect(0);
|
|
return;
|
|
}
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// Update the selection so the search is rendered
|
|
selection.update([]);
|
|
|
|
// Make it visible so the browser can place focus on the search
|
|
$container.append($selection);
|
|
|
|
var $search = $selection.find('input');
|
|
$search.trigger('focus');
|
|
|
|
assert.equal($search.length, 1, 'The search was not visible');
|
|
|
|
assert.equal(
|
|
document.activeElement,
|
|
$search[0],
|
|
'The search did not have focus originally'
|
|
);
|
|
|
|
// Trigger an update, this should redraw the search box
|
|
selection.update([]);
|
|
|
|
assert.equal($search.length, 1, 'The search box disappeared');
|
|
|
|
assert.equal(
|
|
document.activeElement,
|
|
$search[0],
|
|
'The search did not have focus after the selection was updated'
|
|
);
|
|
});
|
|
|
|
test('the focus event shifts the focus', function (assert) {
|
|
// Check for IE 8, which triggers a false negative during testing
|
|
if (window.attachEvent && !window.addEventListener) {
|
|
// We must expect 0 assertions or the test will fail
|
|
assert.expect(0);
|
|
return;
|
|
}
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// Update the selection so the search is rendered
|
|
selection.update([]);
|
|
|
|
// Make it visible so the browser can place focus on the search
|
|
$container.append($selection);
|
|
|
|
// The search should not be automatically focused
|
|
|
|
var $search = $selection.find('input');
|
|
|
|
assert.notEqual(
|
|
document.activeElement,
|
|
$search[0],
|
|
'The search had focus originally'
|
|
);
|
|
|
|
assert.equal($search.length, 1, 'The search was not visible');
|
|
|
|
// Focus the container
|
|
|
|
container.trigger('focus');
|
|
|
|
// Make sure it focuses the search
|
|
|
|
assert.equal($search.length, 1, 'The search box disappeared');
|
|
|
|
assert.equal(
|
|
document.activeElement,
|
|
$search[0],
|
|
'The search did not have focus originally'
|
|
);
|
|
});
|
|
|
|
test('search box without text should propagate click', function (assert) {
|
|
assert.expect(1);
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// Update the selection so the search is rendered
|
|
selection.update([]);
|
|
|
|
// Make it visible so the browser can place focus on the search
|
|
$container.append($selection);
|
|
|
|
$selection.on('click', function () {
|
|
assert.ok(true, 'The click event should not have been trapped');
|
|
});
|
|
|
|
var $search = $selection.find('input');
|
|
$search.trigger('click');
|
|
});
|
|
|
|
test('search box with text should not propagate click', function (assert) {
|
|
assert.expect(0);
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// Update the selection so the search is rendered
|
|
selection.update([]);
|
|
|
|
// Make it visible so the browser can place focus on the search
|
|
$container.append($selection);
|
|
|
|
$selection.on('click', function () {
|
|
assert.ok(false, 'The click event should have been trapped');
|
|
});
|
|
|
|
var $search = $selection.find('input');
|
|
$search.val('test');
|
|
$search.trigger('click');
|
|
});
|
|
|
|
test('search box with text should not close dropdown', function (assert) {
|
|
assert.expect(0);
|
|
|
|
var $container = $('#qunit-fixture .event-container');
|
|
var container = new MockContainer();
|
|
|
|
var CustomSelection = Utils.Decorate(MultipleSelection, InlineSearch);
|
|
|
|
var $element = $('#qunit-fixture .multiple');
|
|
var selection = new CustomSelection($element, options);
|
|
|
|
var $selection = selection.render();
|
|
selection.bind(container, $container);
|
|
|
|
// Update the selection so the search is rendered
|
|
selection.update([]);
|
|
|
|
// Make it visible so the browser can place focus on the search
|
|
$container.append($selection);
|
|
|
|
container.on('close', function () {
|
|
assert.ok(false, 'The dropdown should not have closed');
|
|
});
|
|
|
|
var $search = $selection.find('input');
|
|
$search.val('test');
|
|
$search.trigger('click');
|
|
});
|