select2-rails 4.0.2 → 4.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/select2-rails/version.rb +1 -1
- data/vendor/assets/javascripts/select2-full.js +173 -28
- data/vendor/assets/javascripts/select2.js +173 -28
- data/vendor/assets/javascripts/select2_locale_ar.js +1 -1
- data/vendor/assets/javascripts/select2_locale_az.js +1 -1
- data/vendor/assets/javascripts/select2_locale_bg.js +1 -1
- data/vendor/assets/javascripts/select2_locale_ca.js +1 -1
- data/vendor/assets/javascripts/select2_locale_cs.js +1 -1
- data/vendor/assets/javascripts/select2_locale_da.js +1 -1
- data/vendor/assets/javascripts/select2_locale_de.js +1 -1
- data/vendor/assets/javascripts/select2_locale_el.js +3 -0
- data/vendor/assets/javascripts/select2_locale_en.js +1 -1
- data/vendor/assets/javascripts/select2_locale_es.js +1 -1
- data/vendor/assets/javascripts/select2_locale_et.js +1 -1
- data/vendor/assets/javascripts/select2_locale_eu.js +1 -1
- data/vendor/assets/javascripts/select2_locale_fa.js +1 -1
- data/vendor/assets/javascripts/select2_locale_fi.js +1 -1
- data/vendor/assets/javascripts/select2_locale_fr.js +2 -2
- data/vendor/assets/javascripts/select2_locale_gl.js +1 -1
- data/vendor/assets/javascripts/select2_locale_he.js +1 -1
- data/vendor/assets/javascripts/select2_locale_hi.js +1 -1
- data/vendor/assets/javascripts/select2_locale_hr.js +1 -1
- data/vendor/assets/javascripts/select2_locale_hu.js +1 -1
- data/vendor/assets/javascripts/select2_locale_id.js +1 -1
- data/vendor/assets/javascripts/select2_locale_is.js +1 -1
- data/vendor/assets/javascripts/select2_locale_it.js +1 -1
- data/vendor/assets/javascripts/select2_locale_ja.js +1 -1
- data/vendor/assets/javascripts/select2_locale_km.js +3 -0
- data/vendor/assets/javascripts/select2_locale_ko.js +1 -1
- data/vendor/assets/javascripts/select2_locale_lt.js +2 -2
- data/vendor/assets/javascripts/select2_locale_lv.js +1 -1
- data/vendor/assets/javascripts/select2_locale_mk.js +1 -1
- data/vendor/assets/javascripts/select2_locale_ms.js +1 -1
- data/vendor/assets/javascripts/select2_locale_nb.js +2 -2
- data/vendor/assets/javascripts/select2_locale_nl.js +1 -1
- data/vendor/assets/javascripts/select2_locale_pl.js +1 -1
- data/vendor/assets/javascripts/select2_locale_pt-BR.js +1 -1
- data/vendor/assets/javascripts/select2_locale_pt.js +1 -1
- data/vendor/assets/javascripts/select2_locale_ro.js +1 -1
- data/vendor/assets/javascripts/select2_locale_ru.js +1 -1
- data/vendor/assets/javascripts/select2_locale_sk.js +1 -1
- data/vendor/assets/javascripts/select2_locale_sr-Cyrl.js +1 -1
- data/vendor/assets/javascripts/select2_locale_sr.js +1 -1
- data/vendor/assets/javascripts/select2_locale_sv.js +1 -1
- data/vendor/assets/javascripts/select2_locale_th.js +1 -1
- data/vendor/assets/javascripts/select2_locale_tr.js +1 -1
- data/vendor/assets/javascripts/select2_locale_uk.js +1 -1
- data/vendor/assets/javascripts/select2_locale_vi.js +1 -1
- data/vendor/assets/javascripts/select2_locale_zh-CN.js +1 -1
- data/vendor/assets/javascripts/select2_locale_zh-TW.js +1 -1
- data/vendor/assets/stylesheets/select2-bootstrap.css +38 -26
- data/vendor/assets/stylesheets/select2.css +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d128112240be89bfb1d73d73f957f94d983edb61
|
4
|
+
data.tar.gz: dfdda950dd61f0fa042db94f1ab74914e7fc5b29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee533ad76c7a28de7f3365beba124c8d1810b7be557a2ffc5ac2474bbf262f1dead42b3f36cbeb5b09c597873f4def72e6a17a6b50cf8ebfb13244ebed0669ef
|
7
|
+
data.tar.gz: 76db3585d883fce0d6d0047ce8aa32b48766fb4f0dea49dd21de862f3759939f054ec10c06dcfee7fe2ce1b1eda3188c2e24ebd26739be7088f0528a8598ab4d
|
data/README.md
CHANGED
@@ -50,7 +50,7 @@ Add the following to your `app/assets/javascripts/application.js`:
|
|
50
50
|
|
51
51
|
Possible languages:
|
52
52
|
|
53
|
-
ar, az, bg, ca, cs, da, de, en, es, et, eu, fa, fi, fr, gl, he, hi, hr, hu, id, is, it, ja, ko, lt, lv, mk, ms, nb, nl, pl, pt, pt-BR, ro, ru, sk, sr, sr-Cyrl, sv, th, tr, uk, vi, zh-CN, zh-TW
|
53
|
+
ar, az, bg, ca, cs, da, de, el, en, es, et, eu, fa, fi, fr, gl, he, hi, hr, hu, id, is, it, ja, km, ko, lt, lv, mk, ms, nb, nl, pl, pt, pt-BR, ro, ru, sk, sr, sr-Cyrl, sv, th, tr, uk, vi, zh-CN, zh-TW
|
54
54
|
|
55
55
|
## Example
|
56
56
|
Code [here](https://github.com/argerim/select_2_example)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Select2 4.0.
|
2
|
+
* Select2 4.0.3
|
3
3
|
* https://select2.github.io
|
4
4
|
*
|
5
5
|
* Released under the MIT license
|
@@ -606,9 +606,23 @@ S2.define('select2/utils',[
|
|
606
606
|
|
607
607
|
Observable.prototype.trigger = function (event) {
|
608
608
|
var slice = Array.prototype.slice;
|
609
|
+
var params = slice.call(arguments, 1);
|
609
610
|
|
610
611
|
this.listeners = this.listeners || {};
|
611
612
|
|
613
|
+
// Params should always come in as an array
|
614
|
+
if (params == null) {
|
615
|
+
params = [];
|
616
|
+
}
|
617
|
+
|
618
|
+
// If there are no arguments to the event, use a temporary object
|
619
|
+
if (params.length === 0) {
|
620
|
+
params.push({});
|
621
|
+
}
|
622
|
+
|
623
|
+
// Set the `_type` of the first object to the event
|
624
|
+
params[0]._type = event;
|
625
|
+
|
612
626
|
if (event in this.listeners) {
|
613
627
|
this.invoke(this.listeners[event], slice.call(arguments, 1));
|
614
628
|
}
|
@@ -842,6 +856,25 @@ S2.define('select2/results',[
|
|
842
856
|
return sorter(data);
|
843
857
|
};
|
844
858
|
|
859
|
+
Results.prototype.highlightFirstItem = function () {
|
860
|
+
var $options = this.$results
|
861
|
+
.find('.select2-results__option[aria-selected]');
|
862
|
+
|
863
|
+
var $selected = $options.filter('[aria-selected=true]');
|
864
|
+
|
865
|
+
// Check if there are any selected options
|
866
|
+
if ($selected.length > 0) {
|
867
|
+
// If there are selected options, highlight the first
|
868
|
+
$selected.first().trigger('mouseenter');
|
869
|
+
} else {
|
870
|
+
// If there are no selected options, highlight the first option
|
871
|
+
// in the dropdown
|
872
|
+
$options.first().trigger('mouseenter');
|
873
|
+
}
|
874
|
+
|
875
|
+
this.ensureHighlightVisible();
|
876
|
+
};
|
877
|
+
|
845
878
|
Results.prototype.setClasses = function () {
|
846
879
|
var self = this;
|
847
880
|
|
@@ -869,17 +902,6 @@ S2.define('select2/results',[
|
|
869
902
|
}
|
870
903
|
});
|
871
904
|
|
872
|
-
var $selected = $options.filter('[aria-selected=true]');
|
873
|
-
|
874
|
-
// Check if there are any selected options
|
875
|
-
if ($selected.length > 0) {
|
876
|
-
// If there are selected options, highlight the first
|
877
|
-
$selected.first().trigger('mouseenter');
|
878
|
-
} else {
|
879
|
-
// If there are no selected options, highlight the first option
|
880
|
-
// in the dropdown
|
881
|
-
$options.first().trigger('mouseenter');
|
882
|
-
}
|
883
905
|
});
|
884
906
|
};
|
885
907
|
|
@@ -990,6 +1012,7 @@ S2.define('select2/results',[
|
|
990
1012
|
|
991
1013
|
if (container.isOpen()) {
|
992
1014
|
self.setClasses();
|
1015
|
+
self.highlightFirstItem();
|
993
1016
|
}
|
994
1017
|
});
|
995
1018
|
|
@@ -1012,6 +1035,7 @@ S2.define('select2/results',[
|
|
1012
1035
|
}
|
1013
1036
|
|
1014
1037
|
self.setClasses();
|
1038
|
+
self.highlightFirstItem();
|
1015
1039
|
});
|
1016
1040
|
|
1017
1041
|
container.on('unselect', function () {
|
@@ -1020,6 +1044,7 @@ S2.define('select2/results',[
|
|
1020
1044
|
}
|
1021
1045
|
|
1022
1046
|
self.setClasses();
|
1047
|
+
self.highlightFirstItem();
|
1023
1048
|
});
|
1024
1049
|
|
1025
1050
|
container.on('open', function () {
|
@@ -1497,6 +1522,12 @@ S2.define('select2/selection/single',[
|
|
1497
1522
|
// User exits the container
|
1498
1523
|
});
|
1499
1524
|
|
1525
|
+
container.on('focus', function (evt) {
|
1526
|
+
if (!container.isOpen()) {
|
1527
|
+
self.$selection.focus();
|
1528
|
+
}
|
1529
|
+
});
|
1530
|
+
|
1500
1531
|
container.on('selection:update', function (params) {
|
1501
1532
|
self.update(params.data);
|
1502
1533
|
});
|
@@ -3436,6 +3467,12 @@ S2.define('select2/data/ajax',[
|
|
3436
3467
|
|
3437
3468
|
callback(results);
|
3438
3469
|
}, function () {
|
3470
|
+
// Attempt to detect if a request was aborted
|
3471
|
+
// Only works if the transport exposes a status property
|
3472
|
+
if ($request.status && $request.status === '0') {
|
3473
|
+
return;
|
3474
|
+
}
|
3475
|
+
|
3439
3476
|
self.trigger('results:message', {
|
3440
3477
|
message: 'errorLoading'
|
3441
3478
|
});
|
@@ -3444,7 +3481,7 @@ S2.define('select2/data/ajax',[
|
|
3444
3481
|
self._request = $request;
|
3445
3482
|
}
|
3446
3483
|
|
3447
|
-
if (this.ajaxOptions.delay && params.term
|
3484
|
+
if (this.ajaxOptions.delay && params.term != null) {
|
3448
3485
|
if (this._queryTimeout) {
|
3449
3486
|
window.clearTimeout(this._queryTimeout);
|
3450
3487
|
}
|
@@ -3607,6 +3644,29 @@ S2.define('select2/data/tokenizer',[
|
|
3607
3644
|
Tokenizer.prototype.query = function (decorated, params, callback) {
|
3608
3645
|
var self = this;
|
3609
3646
|
|
3647
|
+
function createAndSelect (data) {
|
3648
|
+
// Normalize the data object so we can use it for checks
|
3649
|
+
var item = self._normalizeItem(data);
|
3650
|
+
|
3651
|
+
// Check if the data object already exists as a tag
|
3652
|
+
// Select it if it doesn't
|
3653
|
+
var $existingOptions = self.$element.find('option').filter(function () {
|
3654
|
+
return $(this).val() === item.id;
|
3655
|
+
});
|
3656
|
+
|
3657
|
+
// If an existing option wasn't found for it, create the option
|
3658
|
+
if (!$existingOptions.length) {
|
3659
|
+
var $option = self.option(item);
|
3660
|
+
$option.attr('data-select2-tag', true);
|
3661
|
+
|
3662
|
+
self._removeOldTags();
|
3663
|
+
self.addOptions([$option]);
|
3664
|
+
}
|
3665
|
+
|
3666
|
+
// Select the item, now that we know there is an option for it
|
3667
|
+
select(item);
|
3668
|
+
}
|
3669
|
+
|
3610
3670
|
function select (data) {
|
3611
3671
|
self.trigger('select', {
|
3612
3672
|
data: data
|
@@ -3615,7 +3675,7 @@ S2.define('select2/data/tokenizer',[
|
|
3615
3675
|
|
3616
3676
|
params.term = params.term || '';
|
3617
3677
|
|
3618
|
-
var tokenData = this.tokenizer(params, this.options,
|
3678
|
+
var tokenData = this.tokenizer(params, this.options, createAndSelect);
|
3619
3679
|
|
3620
3680
|
if (tokenData.term !== params.term) {
|
3621
3681
|
// Replace the search term if we have the search box
|
@@ -3880,6 +3940,12 @@ S2.define('select2/dropdown/search',[
|
|
3880
3940
|
self.$search.val('');
|
3881
3941
|
});
|
3882
3942
|
|
3943
|
+
container.on('focus', function () {
|
3944
|
+
if (container.isOpen()) {
|
3945
|
+
self.$search.focus();
|
3946
|
+
}
|
3947
|
+
});
|
3948
|
+
|
3883
3949
|
container.on('results:all', function (params) {
|
3884
3950
|
if (params.query.term == null || params.query.term === '') {
|
3885
3951
|
var showSearch = self.showSearch(params);
|
@@ -4229,7 +4295,7 @@ S2.define('select2/dropdown/attachBody',[
|
|
4229
4295
|
|
4230
4296
|
if (newDirection == 'above' ||
|
4231
4297
|
(isCurrentlyAbove && newDirection !== 'below')) {
|
4232
|
-
css.top = container.top - dropdown.height;
|
4298
|
+
css.top = container.top - parentOffset.top - dropdown.height;
|
4233
4299
|
}
|
4234
4300
|
|
4235
4301
|
if (newDirection != null) {
|
@@ -4251,6 +4317,7 @@ S2.define('select2/dropdown/attachBody',[
|
|
4251
4317
|
|
4252
4318
|
if (this.options.get('dropdownAutoWidth')) {
|
4253
4319
|
css.minWidth = css.width;
|
4320
|
+
css.position = 'relative';
|
4254
4321
|
css.width = 'auto';
|
4255
4322
|
}
|
4256
4323
|
|
@@ -4317,12 +4384,22 @@ S2.define('select2/dropdown/selectOnClose',[
|
|
4317
4384
|
|
4318
4385
|
decorated.call(this, container, $container);
|
4319
4386
|
|
4320
|
-
container.on('close', function () {
|
4321
|
-
self._handleSelectOnClose();
|
4387
|
+
container.on('close', function (params) {
|
4388
|
+
self._handleSelectOnClose(params);
|
4322
4389
|
});
|
4323
4390
|
};
|
4324
4391
|
|
4325
|
-
SelectOnClose.prototype._handleSelectOnClose = function () {
|
4392
|
+
SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
|
4393
|
+
if (params && params.originalSelect2Event != null) {
|
4394
|
+
var event = params.originalSelect2Event;
|
4395
|
+
|
4396
|
+
// Don't select an item if the close event was triggered from a select or
|
4397
|
+
// unselect event
|
4398
|
+
if (event._type === 'select' || event._type === 'unselect') {
|
4399
|
+
return;
|
4400
|
+
}
|
4401
|
+
}
|
4402
|
+
|
4326
4403
|
var $highlightedResults = this.getHighlightedResults();
|
4327
4404
|
|
4328
4405
|
// Only select highlighted results
|
@@ -4375,7 +4452,10 @@ S2.define('select2/dropdown/closeOnSelect',[
|
|
4375
4452
|
return;
|
4376
4453
|
}
|
4377
4454
|
|
4378
|
-
this.trigger('close', {
|
4455
|
+
this.trigger('close', {
|
4456
|
+
originalEvent: originalEvent,
|
4457
|
+
originalSelect2Event: evt
|
4458
|
+
});
|
4379
4459
|
};
|
4380
4460
|
|
4381
4461
|
return CloseOnSelect;
|
@@ -5129,10 +5209,15 @@ S2.define('select2/core',[
|
|
5129
5209
|
});
|
5130
5210
|
});
|
5131
5211
|
|
5132
|
-
this.
|
5212
|
+
this.$element.on('focus.select2', function (evt) {
|
5213
|
+
self.trigger('focus', evt);
|
5214
|
+
});
|
5215
|
+
|
5216
|
+
this._syncA = Utils.bind(this._syncAttributes, this);
|
5217
|
+
this._syncS = Utils.bind(this._syncSubtree, this);
|
5133
5218
|
|
5134
5219
|
if (this.$element[0].attachEvent) {
|
5135
|
-
this.$element[0].attachEvent('onpropertychange', this.
|
5220
|
+
this.$element[0].attachEvent('onpropertychange', this._syncA);
|
5136
5221
|
}
|
5137
5222
|
|
5138
5223
|
var observer = window.MutationObserver ||
|
@@ -5142,14 +5227,30 @@ S2.define('select2/core',[
|
|
5142
5227
|
|
5143
5228
|
if (observer != null) {
|
5144
5229
|
this._observer = new observer(function (mutations) {
|
5145
|
-
$.each(mutations, self.
|
5230
|
+
$.each(mutations, self._syncA);
|
5231
|
+
$.each(mutations, self._syncS);
|
5146
5232
|
});
|
5147
5233
|
this._observer.observe(this.$element[0], {
|
5148
5234
|
attributes: true,
|
5235
|
+
childList: true,
|
5149
5236
|
subtree: false
|
5150
5237
|
});
|
5151
5238
|
} else if (this.$element[0].addEventListener) {
|
5152
|
-
this.$element[0].addEventListener(
|
5239
|
+
this.$element[0].addEventListener(
|
5240
|
+
'DOMAttrModified',
|
5241
|
+
self._syncA,
|
5242
|
+
false
|
5243
|
+
);
|
5244
|
+
this.$element[0].addEventListener(
|
5245
|
+
'DOMNodeInserted',
|
5246
|
+
self._syncS,
|
5247
|
+
false
|
5248
|
+
);
|
5249
|
+
this.$element[0].addEventListener(
|
5250
|
+
'DOMNodeRemoved',
|
5251
|
+
self._syncS,
|
5252
|
+
false
|
5253
|
+
);
|
5153
5254
|
}
|
5154
5255
|
};
|
5155
5256
|
|
@@ -5294,6 +5395,46 @@ S2.define('select2/core',[
|
|
5294
5395
|
}
|
5295
5396
|
};
|
5296
5397
|
|
5398
|
+
Select2.prototype._syncSubtree = function (evt, mutations) {
|
5399
|
+
var changed = false;
|
5400
|
+
var self = this;
|
5401
|
+
|
5402
|
+
// Ignore any mutation events raised for elements that aren't options or
|
5403
|
+
// optgroups. This handles the case when the select element is destroyed
|
5404
|
+
if (
|
5405
|
+
evt && evt.target && (
|
5406
|
+
evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
|
5407
|
+
)
|
5408
|
+
) {
|
5409
|
+
return;
|
5410
|
+
}
|
5411
|
+
|
5412
|
+
if (!mutations) {
|
5413
|
+
// If mutation events aren't supported, then we can only assume that the
|
5414
|
+
// change affected the selections
|
5415
|
+
changed = true;
|
5416
|
+
} else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
|
5417
|
+
for (var n = 0; n < mutations.addedNodes.length; n++) {
|
5418
|
+
var node = mutations.addedNodes[n];
|
5419
|
+
|
5420
|
+
if (node.selected) {
|
5421
|
+
changed = true;
|
5422
|
+
}
|
5423
|
+
}
|
5424
|
+
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
5425
|
+
changed = true;
|
5426
|
+
}
|
5427
|
+
|
5428
|
+
// Only re-pull the data if we think there is a change
|
5429
|
+
if (changed) {
|
5430
|
+
this.dataAdapter.current(function (currentData) {
|
5431
|
+
self.trigger('selection:update', {
|
5432
|
+
data: currentData
|
5433
|
+
});
|
5434
|
+
});
|
5435
|
+
}
|
5436
|
+
};
|
5437
|
+
|
5297
5438
|
/**
|
5298
5439
|
* Override the trigger method to automatically trigger pre-events when
|
5299
5440
|
* there are events that can be prevented.
|
@@ -5440,7 +5581,7 @@ S2.define('select2/core',[
|
|
5440
5581
|
this.$container.remove();
|
5441
5582
|
|
5442
5583
|
if (this.$element[0].detachEvent) {
|
5443
|
-
this.$element[0].detachEvent('onpropertychange', this.
|
5584
|
+
this.$element[0].detachEvent('onpropertychange', this._syncA);
|
5444
5585
|
}
|
5445
5586
|
|
5446
5587
|
if (this._observer != null) {
|
@@ -5448,10 +5589,15 @@ S2.define('select2/core',[
|
|
5448
5589
|
this._observer = null;
|
5449
5590
|
} else if (this.$element[0].removeEventListener) {
|
5450
5591
|
this.$element[0]
|
5451
|
-
.removeEventListener('DOMAttrModified', this.
|
5592
|
+
.removeEventListener('DOMAttrModified', this._syncA, false);
|
5593
|
+
this.$element[0]
|
5594
|
+
.removeEventListener('DOMNodeInserted', this._syncS, false);
|
5595
|
+
this.$element[0]
|
5596
|
+
.removeEventListener('DOMNodeRemoved', this._syncS, false);
|
5452
5597
|
}
|
5453
5598
|
|
5454
|
-
this.
|
5599
|
+
this._syncA = null;
|
5600
|
+
this._syncS = null;
|
5455
5601
|
|
5456
5602
|
this.$element.off('.select2');
|
5457
5603
|
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
|
@@ -6235,6 +6381,7 @@ S2.define('jquery.select2',[
|
|
6235
6381
|
return this;
|
6236
6382
|
} else if (typeof options === 'string') {
|
6237
6383
|
var ret;
|
6384
|
+
var args = Array.prototype.slice.call(arguments, 1);
|
6238
6385
|
|
6239
6386
|
this.each(function () {
|
6240
6387
|
var instance = $(this).data('select2');
|
@@ -6246,8 +6393,6 @@ S2.define('jquery.select2',[
|
|
6246
6393
|
);
|
6247
6394
|
}
|
6248
6395
|
|
6249
|
-
var args = Array.prototype.slice.call(arguments, 1);
|
6250
|
-
|
6251
6396
|
ret = instance[options].apply(instance, args);
|
6252
6397
|
});
|
6253
6398
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Select2 4.0.
|
2
|
+
* Select2 4.0.3
|
3
3
|
* https://select2.github.io
|
4
4
|
*
|
5
5
|
* Released under the MIT license
|
@@ -606,9 +606,23 @@ S2.define('select2/utils',[
|
|
606
606
|
|
607
607
|
Observable.prototype.trigger = function (event) {
|
608
608
|
var slice = Array.prototype.slice;
|
609
|
+
var params = slice.call(arguments, 1);
|
609
610
|
|
610
611
|
this.listeners = this.listeners || {};
|
611
612
|
|
613
|
+
// Params should always come in as an array
|
614
|
+
if (params == null) {
|
615
|
+
params = [];
|
616
|
+
}
|
617
|
+
|
618
|
+
// If there are no arguments to the event, use a temporary object
|
619
|
+
if (params.length === 0) {
|
620
|
+
params.push({});
|
621
|
+
}
|
622
|
+
|
623
|
+
// Set the `_type` of the first object to the event
|
624
|
+
params[0]._type = event;
|
625
|
+
|
612
626
|
if (event in this.listeners) {
|
613
627
|
this.invoke(this.listeners[event], slice.call(arguments, 1));
|
614
628
|
}
|
@@ -842,6 +856,25 @@ S2.define('select2/results',[
|
|
842
856
|
return sorter(data);
|
843
857
|
};
|
844
858
|
|
859
|
+
Results.prototype.highlightFirstItem = function () {
|
860
|
+
var $options = this.$results
|
861
|
+
.find('.select2-results__option[aria-selected]');
|
862
|
+
|
863
|
+
var $selected = $options.filter('[aria-selected=true]');
|
864
|
+
|
865
|
+
// Check if there are any selected options
|
866
|
+
if ($selected.length > 0) {
|
867
|
+
// If there are selected options, highlight the first
|
868
|
+
$selected.first().trigger('mouseenter');
|
869
|
+
} else {
|
870
|
+
// If there are no selected options, highlight the first option
|
871
|
+
// in the dropdown
|
872
|
+
$options.first().trigger('mouseenter');
|
873
|
+
}
|
874
|
+
|
875
|
+
this.ensureHighlightVisible();
|
876
|
+
};
|
877
|
+
|
845
878
|
Results.prototype.setClasses = function () {
|
846
879
|
var self = this;
|
847
880
|
|
@@ -869,17 +902,6 @@ S2.define('select2/results',[
|
|
869
902
|
}
|
870
903
|
});
|
871
904
|
|
872
|
-
var $selected = $options.filter('[aria-selected=true]');
|
873
|
-
|
874
|
-
// Check if there are any selected options
|
875
|
-
if ($selected.length > 0) {
|
876
|
-
// If there are selected options, highlight the first
|
877
|
-
$selected.first().trigger('mouseenter');
|
878
|
-
} else {
|
879
|
-
// If there are no selected options, highlight the first option
|
880
|
-
// in the dropdown
|
881
|
-
$options.first().trigger('mouseenter');
|
882
|
-
}
|
883
905
|
});
|
884
906
|
};
|
885
907
|
|
@@ -990,6 +1012,7 @@ S2.define('select2/results',[
|
|
990
1012
|
|
991
1013
|
if (container.isOpen()) {
|
992
1014
|
self.setClasses();
|
1015
|
+
self.highlightFirstItem();
|
993
1016
|
}
|
994
1017
|
});
|
995
1018
|
|
@@ -1012,6 +1035,7 @@ S2.define('select2/results',[
|
|
1012
1035
|
}
|
1013
1036
|
|
1014
1037
|
self.setClasses();
|
1038
|
+
self.highlightFirstItem();
|
1015
1039
|
});
|
1016
1040
|
|
1017
1041
|
container.on('unselect', function () {
|
@@ -1020,6 +1044,7 @@ S2.define('select2/results',[
|
|
1020
1044
|
}
|
1021
1045
|
|
1022
1046
|
self.setClasses();
|
1047
|
+
self.highlightFirstItem();
|
1023
1048
|
});
|
1024
1049
|
|
1025
1050
|
container.on('open', function () {
|
@@ -1497,6 +1522,12 @@ S2.define('select2/selection/single',[
|
|
1497
1522
|
// User exits the container
|
1498
1523
|
});
|
1499
1524
|
|
1525
|
+
container.on('focus', function (evt) {
|
1526
|
+
if (!container.isOpen()) {
|
1527
|
+
self.$selection.focus();
|
1528
|
+
}
|
1529
|
+
});
|
1530
|
+
|
1500
1531
|
container.on('selection:update', function (params) {
|
1501
1532
|
self.update(params.data);
|
1502
1533
|
});
|
@@ -3436,6 +3467,12 @@ S2.define('select2/data/ajax',[
|
|
3436
3467
|
|
3437
3468
|
callback(results);
|
3438
3469
|
}, function () {
|
3470
|
+
// Attempt to detect if a request was aborted
|
3471
|
+
// Only works if the transport exposes a status property
|
3472
|
+
if ($request.status && $request.status === '0') {
|
3473
|
+
return;
|
3474
|
+
}
|
3475
|
+
|
3439
3476
|
self.trigger('results:message', {
|
3440
3477
|
message: 'errorLoading'
|
3441
3478
|
});
|
@@ -3444,7 +3481,7 @@ S2.define('select2/data/ajax',[
|
|
3444
3481
|
self._request = $request;
|
3445
3482
|
}
|
3446
3483
|
|
3447
|
-
if (this.ajaxOptions.delay && params.term
|
3484
|
+
if (this.ajaxOptions.delay && params.term != null) {
|
3448
3485
|
if (this._queryTimeout) {
|
3449
3486
|
window.clearTimeout(this._queryTimeout);
|
3450
3487
|
}
|
@@ -3607,6 +3644,29 @@ S2.define('select2/data/tokenizer',[
|
|
3607
3644
|
Tokenizer.prototype.query = function (decorated, params, callback) {
|
3608
3645
|
var self = this;
|
3609
3646
|
|
3647
|
+
function createAndSelect (data) {
|
3648
|
+
// Normalize the data object so we can use it for checks
|
3649
|
+
var item = self._normalizeItem(data);
|
3650
|
+
|
3651
|
+
// Check if the data object already exists as a tag
|
3652
|
+
// Select it if it doesn't
|
3653
|
+
var $existingOptions = self.$element.find('option').filter(function () {
|
3654
|
+
return $(this).val() === item.id;
|
3655
|
+
});
|
3656
|
+
|
3657
|
+
// If an existing option wasn't found for it, create the option
|
3658
|
+
if (!$existingOptions.length) {
|
3659
|
+
var $option = self.option(item);
|
3660
|
+
$option.attr('data-select2-tag', true);
|
3661
|
+
|
3662
|
+
self._removeOldTags();
|
3663
|
+
self.addOptions([$option]);
|
3664
|
+
}
|
3665
|
+
|
3666
|
+
// Select the item, now that we know there is an option for it
|
3667
|
+
select(item);
|
3668
|
+
}
|
3669
|
+
|
3610
3670
|
function select (data) {
|
3611
3671
|
self.trigger('select', {
|
3612
3672
|
data: data
|
@@ -3615,7 +3675,7 @@ S2.define('select2/data/tokenizer',[
|
|
3615
3675
|
|
3616
3676
|
params.term = params.term || '';
|
3617
3677
|
|
3618
|
-
var tokenData = this.tokenizer(params, this.options,
|
3678
|
+
var tokenData = this.tokenizer(params, this.options, createAndSelect);
|
3619
3679
|
|
3620
3680
|
if (tokenData.term !== params.term) {
|
3621
3681
|
// Replace the search term if we have the search box
|
@@ -3880,6 +3940,12 @@ S2.define('select2/dropdown/search',[
|
|
3880
3940
|
self.$search.val('');
|
3881
3941
|
});
|
3882
3942
|
|
3943
|
+
container.on('focus', function () {
|
3944
|
+
if (container.isOpen()) {
|
3945
|
+
self.$search.focus();
|
3946
|
+
}
|
3947
|
+
});
|
3948
|
+
|
3883
3949
|
container.on('results:all', function (params) {
|
3884
3950
|
if (params.query.term == null || params.query.term === '') {
|
3885
3951
|
var showSearch = self.showSearch(params);
|
@@ -4229,7 +4295,7 @@ S2.define('select2/dropdown/attachBody',[
|
|
4229
4295
|
|
4230
4296
|
if (newDirection == 'above' ||
|
4231
4297
|
(isCurrentlyAbove && newDirection !== 'below')) {
|
4232
|
-
css.top = container.top - dropdown.height;
|
4298
|
+
css.top = container.top - parentOffset.top - dropdown.height;
|
4233
4299
|
}
|
4234
4300
|
|
4235
4301
|
if (newDirection != null) {
|
@@ -4251,6 +4317,7 @@ S2.define('select2/dropdown/attachBody',[
|
|
4251
4317
|
|
4252
4318
|
if (this.options.get('dropdownAutoWidth')) {
|
4253
4319
|
css.minWidth = css.width;
|
4320
|
+
css.position = 'relative';
|
4254
4321
|
css.width = 'auto';
|
4255
4322
|
}
|
4256
4323
|
|
@@ -4317,12 +4384,22 @@ S2.define('select2/dropdown/selectOnClose',[
|
|
4317
4384
|
|
4318
4385
|
decorated.call(this, container, $container);
|
4319
4386
|
|
4320
|
-
container.on('close', function () {
|
4321
|
-
self._handleSelectOnClose();
|
4387
|
+
container.on('close', function (params) {
|
4388
|
+
self._handleSelectOnClose(params);
|
4322
4389
|
});
|
4323
4390
|
};
|
4324
4391
|
|
4325
|
-
SelectOnClose.prototype._handleSelectOnClose = function () {
|
4392
|
+
SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
|
4393
|
+
if (params && params.originalSelect2Event != null) {
|
4394
|
+
var event = params.originalSelect2Event;
|
4395
|
+
|
4396
|
+
// Don't select an item if the close event was triggered from a select or
|
4397
|
+
// unselect event
|
4398
|
+
if (event._type === 'select' || event._type === 'unselect') {
|
4399
|
+
return;
|
4400
|
+
}
|
4401
|
+
}
|
4402
|
+
|
4326
4403
|
var $highlightedResults = this.getHighlightedResults();
|
4327
4404
|
|
4328
4405
|
// Only select highlighted results
|
@@ -4375,7 +4452,10 @@ S2.define('select2/dropdown/closeOnSelect',[
|
|
4375
4452
|
return;
|
4376
4453
|
}
|
4377
4454
|
|
4378
|
-
this.trigger('close', {
|
4455
|
+
this.trigger('close', {
|
4456
|
+
originalEvent: originalEvent,
|
4457
|
+
originalSelect2Event: evt
|
4458
|
+
});
|
4379
4459
|
};
|
4380
4460
|
|
4381
4461
|
return CloseOnSelect;
|
@@ -5129,10 +5209,15 @@ S2.define('select2/core',[
|
|
5129
5209
|
});
|
5130
5210
|
});
|
5131
5211
|
|
5132
|
-
this.
|
5212
|
+
this.$element.on('focus.select2', function (evt) {
|
5213
|
+
self.trigger('focus', evt);
|
5214
|
+
});
|
5215
|
+
|
5216
|
+
this._syncA = Utils.bind(this._syncAttributes, this);
|
5217
|
+
this._syncS = Utils.bind(this._syncSubtree, this);
|
5133
5218
|
|
5134
5219
|
if (this.$element[0].attachEvent) {
|
5135
|
-
this.$element[0].attachEvent('onpropertychange', this.
|
5220
|
+
this.$element[0].attachEvent('onpropertychange', this._syncA);
|
5136
5221
|
}
|
5137
5222
|
|
5138
5223
|
var observer = window.MutationObserver ||
|
@@ -5142,14 +5227,30 @@ S2.define('select2/core',[
|
|
5142
5227
|
|
5143
5228
|
if (observer != null) {
|
5144
5229
|
this._observer = new observer(function (mutations) {
|
5145
|
-
$.each(mutations, self.
|
5230
|
+
$.each(mutations, self._syncA);
|
5231
|
+
$.each(mutations, self._syncS);
|
5146
5232
|
});
|
5147
5233
|
this._observer.observe(this.$element[0], {
|
5148
5234
|
attributes: true,
|
5235
|
+
childList: true,
|
5149
5236
|
subtree: false
|
5150
5237
|
});
|
5151
5238
|
} else if (this.$element[0].addEventListener) {
|
5152
|
-
this.$element[0].addEventListener(
|
5239
|
+
this.$element[0].addEventListener(
|
5240
|
+
'DOMAttrModified',
|
5241
|
+
self._syncA,
|
5242
|
+
false
|
5243
|
+
);
|
5244
|
+
this.$element[0].addEventListener(
|
5245
|
+
'DOMNodeInserted',
|
5246
|
+
self._syncS,
|
5247
|
+
false
|
5248
|
+
);
|
5249
|
+
this.$element[0].addEventListener(
|
5250
|
+
'DOMNodeRemoved',
|
5251
|
+
self._syncS,
|
5252
|
+
false
|
5253
|
+
);
|
5153
5254
|
}
|
5154
5255
|
};
|
5155
5256
|
|
@@ -5294,6 +5395,46 @@ S2.define('select2/core',[
|
|
5294
5395
|
}
|
5295
5396
|
};
|
5296
5397
|
|
5398
|
+
Select2.prototype._syncSubtree = function (evt, mutations) {
|
5399
|
+
var changed = false;
|
5400
|
+
var self = this;
|
5401
|
+
|
5402
|
+
// Ignore any mutation events raised for elements that aren't options or
|
5403
|
+
// optgroups. This handles the case when the select element is destroyed
|
5404
|
+
if (
|
5405
|
+
evt && evt.target && (
|
5406
|
+
evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
|
5407
|
+
)
|
5408
|
+
) {
|
5409
|
+
return;
|
5410
|
+
}
|
5411
|
+
|
5412
|
+
if (!mutations) {
|
5413
|
+
// If mutation events aren't supported, then we can only assume that the
|
5414
|
+
// change affected the selections
|
5415
|
+
changed = true;
|
5416
|
+
} else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
|
5417
|
+
for (var n = 0; n < mutations.addedNodes.length; n++) {
|
5418
|
+
var node = mutations.addedNodes[n];
|
5419
|
+
|
5420
|
+
if (node.selected) {
|
5421
|
+
changed = true;
|
5422
|
+
}
|
5423
|
+
}
|
5424
|
+
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
5425
|
+
changed = true;
|
5426
|
+
}
|
5427
|
+
|
5428
|
+
// Only re-pull the data if we think there is a change
|
5429
|
+
if (changed) {
|
5430
|
+
this.dataAdapter.current(function (currentData) {
|
5431
|
+
self.trigger('selection:update', {
|
5432
|
+
data: currentData
|
5433
|
+
});
|
5434
|
+
});
|
5435
|
+
}
|
5436
|
+
};
|
5437
|
+
|
5297
5438
|
/**
|
5298
5439
|
* Override the trigger method to automatically trigger pre-events when
|
5299
5440
|
* there are events that can be prevented.
|
@@ -5440,7 +5581,7 @@ S2.define('select2/core',[
|
|
5440
5581
|
this.$container.remove();
|
5441
5582
|
|
5442
5583
|
if (this.$element[0].detachEvent) {
|
5443
|
-
this.$element[0].detachEvent('onpropertychange', this.
|
5584
|
+
this.$element[0].detachEvent('onpropertychange', this._syncA);
|
5444
5585
|
}
|
5445
5586
|
|
5446
5587
|
if (this._observer != null) {
|
@@ -5448,10 +5589,15 @@ S2.define('select2/core',[
|
|
5448
5589
|
this._observer = null;
|
5449
5590
|
} else if (this.$element[0].removeEventListener) {
|
5450
5591
|
this.$element[0]
|
5451
|
-
.removeEventListener('DOMAttrModified', this.
|
5592
|
+
.removeEventListener('DOMAttrModified', this._syncA, false);
|
5593
|
+
this.$element[0]
|
5594
|
+
.removeEventListener('DOMNodeInserted', this._syncS, false);
|
5595
|
+
this.$element[0]
|
5596
|
+
.removeEventListener('DOMNodeRemoved', this._syncS, false);
|
5452
5597
|
}
|
5453
5598
|
|
5454
|
-
this.
|
5599
|
+
this._syncA = null;
|
5600
|
+
this._syncS = null;
|
5455
5601
|
|
5456
5602
|
this.$element.off('.select2');
|
5457
5603
|
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
|
@@ -5524,6 +5670,7 @@ S2.define('jquery.select2',[
|
|
5524
5670
|
return this;
|
5525
5671
|
} else if (typeof options === 'string') {
|
5526
5672
|
var ret;
|
5673
|
+
var args = Array.prototype.slice.call(arguments, 1);
|
5527
5674
|
|
5528
5675
|
this.each(function () {
|
5529
5676
|
var instance = $(this).data('select2');
|
@@ -5535,8 +5682,6 @@ S2.define('jquery.select2',[
|
|
5535
5682
|
);
|
5536
5683
|
}
|
5537
5684
|
|
5538
|
-
var args = Array.prototype.slice.call(arguments, 1);
|
5539
|
-
|
5540
5685
|
ret = instance[options].apply(instance, args);
|
5541
5686
|
});
|
5542
5687
|
|