Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix generated options not receiving result IDs #5586

Merged
merged 1 commit into from Jul 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 7 additions & 3 deletions src/js/select2/data/array.js
Expand Up @@ -4,15 +4,19 @@ define([
'jquery'
], function (SelectAdapter, Utils, $) {
function ArrayAdapter ($element, options) {
var data = options.get('data') || [];
this._dataToConvert = options.get('data') || [];

ArrayAdapter.__super__.constructor.call(this, $element, options);

this.addOptions(this.convertToOptions(data));
}

Utils.Extend(ArrayAdapter, SelectAdapter);

ArrayAdapter.prototype.bind = function (container, $container) {
ArrayAdapter.__super__.bind.call(this, container, $container);

this.addOptions(this.convertToOptions(this._dataToConvert));
};

ArrayAdapter.prototype.select = function (data) {
var $option = this.$element.find('option').filter(function (i, elm) {
return elm.value == data.id.toString();
Expand Down
54 changes: 54 additions & 0 deletions tests/data/array-tests.js
Expand Up @@ -71,6 +71,9 @@ test('current gets default for single', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

data.current(function (val) {
assert.equal(
val.length,
Expand All @@ -93,6 +96,9 @@ test('current gets default for multiple', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

data.current(function (val) {
assert.equal(
val.length,
Expand All @@ -107,6 +113,9 @@ test('current works with existing selections', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

$select.val(['One']);

data.current(function (val) {
Expand Down Expand Up @@ -137,6 +146,9 @@ test('current works with selected data', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

data.select({
id: '2',
text: '2'
Expand Down Expand Up @@ -170,6 +182,9 @@ test('select works for single', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

assert.equal(
$select.val(),
'default',
Expand All @@ -193,6 +208,9 @@ test('multiple sets the value', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

assert.ok(
$select.val() == null || $select.val().length == 0,
'nothing should be selected'
Expand All @@ -211,6 +229,9 @@ test('multiple adds to the old value', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

$select.val(['One']);

assert.deepEqual($select.val(), ['One']);
Expand All @@ -228,18 +249,42 @@ test('option tags are automatically generated', function (assert) {

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

assert.equal(
$select.find('option').length,
4,
'An <option> element should be created for each object'
);
});

test('automatically generated option tags have a result id', function (assert) {
var $select = $('#qunit-fixture .single-empty');

var data = new ArrayData($select, arrayOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

data.select({
id: 'default'
});

assert.ok(
Utils.GetData($select.find(':selected')[0], 'data')._resultId,
'<option> default should have a result ID assigned'
);
});

test('option tags can receive new data', function(assert) {
var $select = $('#qunit-fixture .single');

var data = new ArrayData($select, extraOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

assert.equal(
$select.find('option').length,
2,
Expand Down Expand Up @@ -270,6 +315,9 @@ test('optgroup tags can also be generated', function (assert) {

var data = new ArrayData($select, nestedOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

assert.equal(
$select.find('option').length,
1,
Expand All @@ -288,6 +336,9 @@ test('optgroup tags have the right properties', function (assert) {

var data = new ArrayData($select, nestedOptions);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

var $group = $select.children('optgroup');

assert.equal(
Expand Down Expand Up @@ -328,5 +379,8 @@ test('existing selections are respected on initialization', function (assert) {

var data = new ArrayData($select, options);

var container = new MockContainer();
data.bind(container, $('<div></div>'));

assert.equal($select.val(), 'Second');
});
15 changes: 15 additions & 0 deletions tests/data/inputData-tests.js
Expand Up @@ -23,6 +23,9 @@ test('test that options can be selected', function (assert) {

var adapter = new InputAdapter($element, options);

var container = new MockContainer();
adapter.bind(container, $('<div></div>'));

adapter.select({
id: 'test'
});
Expand All @@ -48,6 +51,9 @@ test('unselect the single selected option clears the value', function (assert) {

var adapter = new InputAdapter($element, options);

var container = new MockContainer();
adapter.bind(container, $('<div></div>'));

adapter.unselect({
id: 'test'
});
Expand Down Expand Up @@ -81,6 +87,9 @@ test('options can be unselected individually', function (assert) {

var adapter = new InputAdapter($element, options);

var container = new MockContainer();
adapter.bind(container, $('<div></div>'));

adapter.unselect({
id: 'test2'
});
Expand All @@ -107,6 +116,9 @@ test('default values can be set', function (assert) {

var adapter = new InputAdapter($element, options);

var container = new MockContainer();
adapter.bind(container, $('<div></div>'));

adapter.current(function (data) {
assert.equal(
data.length,
Expand Down Expand Up @@ -142,6 +154,9 @@ test('no default value', function (assert) {

var adapter = new InputAdapter($element, options);

var container = new MockContainer();
adapter.bind(container, $('<div></div>'));

adapter.current(function (data) {
assert.equal(
data.length,
Expand Down