select2-rails 4.0.0 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +18 -2
- data/lib/select2-rails/source_file.rb +10 -8
- data/lib/select2-rails/version.rb +1 -1
- data/select2-rails.gemspec +1 -1
- data/vendor/assets/javascripts/select2-full.js +6457 -0
- data/vendor/assets/javascripts/select2.js +546 -203
- data/vendor/assets/javascripts/select2_locale_ar.js +3 -0
- 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 +2 -2
- data/vendor/assets/javascripts/select2_locale_de.js +2 -2
- 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 +2 -2
- data/vendor/assets/javascripts/select2_locale_fr.js +2 -2
- data/vendor/assets/javascripts/select2_locale_gl.js +2 -2
- data/vendor/assets/javascripts/select2_locale_he.js +2 -2
- data/vendor/assets/javascripts/select2_locale_hi.js +1 -1
- data/vendor/assets/javascripts/select2_locale_hr.js +2 -2
- data/vendor/assets/javascripts/select2_locale_hu.js +2 -2
- data/vendor/assets/javascripts/select2_locale_hy.js +3 -0
- data/vendor/assets/javascripts/select2_locale_id.js +2 -2
- 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 +3 -0
- 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 +3 -0
- data/vendor/assets/javascripts/select2_locale_nb.js +2 -2
- data/vendor/assets/javascripts/select2_locale_nl.js +2 -2
- data/vendor/assets/javascripts/select2_locale_pl.js +2 -2
- data/vendor/assets/javascripts/select2_locale_pt-BR.js +1 -1
- data/vendor/assets/javascripts/select2_locale_pt.js +2 -2
- data/vendor/assets/javascripts/select2_locale_ro.js +2 -2
- 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_sl.js +3 -0
- data/vendor/assets/javascripts/select2_locale_sr-Cyrl.js +3 -0
- data/vendor/assets/javascripts/select2_locale_sr.js +2 -2
- data/vendor/assets/javascripts/select2_locale_sv.js +1 -1
- data/vendor/assets/javascripts/select2_locale_th.js +2 -2
- data/vendor/assets/javascripts/select2_locale_tr.js +2 -2
- 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 +90 -44
- data/vendor/assets/stylesheets/select2.css +79 -26
- metadata +15 -7
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Select2 4.0.
|
2
|
+
* Select2 4.0.4
|
3
3
|
* https://select2.github.io
|
4
4
|
*
|
5
5
|
* Released under the MIT license
|
@@ -9,19 +9,33 @@
|
|
9
9
|
if (typeof define === 'function' && define.amd) {
|
10
10
|
// AMD. Register as an anonymous module.
|
11
11
|
define(['jquery'], factory);
|
12
|
-
} else if (typeof
|
12
|
+
} else if (typeof module === 'object' && module.exports) {
|
13
13
|
// Node/CommonJS
|
14
|
-
|
14
|
+
module.exports = function (root, jQuery) {
|
15
|
+
if (jQuery === undefined) {
|
16
|
+
// require('jQuery') returns a factory that requires window to
|
17
|
+
// build a jQuery instance, we normalize how we use modules
|
18
|
+
// that require this pattern but the window provided is a noop
|
19
|
+
// if it's defined (how jquery works)
|
20
|
+
if (typeof window !== 'undefined') {
|
21
|
+
jQuery = require('jquery');
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
jQuery = require('jquery')(root);
|
25
|
+
}
|
26
|
+
}
|
27
|
+
factory(jQuery);
|
28
|
+
return jQuery;
|
29
|
+
};
|
15
30
|
} else {
|
16
31
|
// Browser globals
|
17
32
|
factory(jQuery);
|
18
33
|
}
|
19
|
-
}(function (jQuery) {
|
34
|
+
} (function (jQuery) {
|
20
35
|
// This is needed so we can catch the AMD loader configuration and use it
|
21
36
|
// The inner file should be wrapped (by `banner.start.js`) in a function that
|
22
37
|
// returns the AMD loader references.
|
23
|
-
var S2 =
|
24
|
-
(function () {
|
38
|
+
var S2 =(function () {
|
25
39
|
// Restore the Select2 AMD loader so it can be used
|
26
40
|
// Needed mostly in the language files, where the loader is not inserted
|
27
41
|
if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
|
@@ -30,13 +44,11 @@
|
|
30
44
|
var S2;(function () { if (!S2 || !S2.requirejs) {
|
31
45
|
if (!S2) { S2 = {}; } else { require = S2; }
|
32
46
|
/**
|
33
|
-
* @license almond 0.
|
34
|
-
*
|
35
|
-
* see: http://github.com/jrburke/almond for details
|
47
|
+
* @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
|
48
|
+
* Released under MIT license, http://github.com/requirejs/almond/LICENSE
|
36
49
|
*/
|
37
50
|
//Going sloppy to avoid 'use strict' string cost, but strict practices should
|
38
51
|
//be followed.
|
39
|
-
/*jslint sloppy: true */
|
40
52
|
/*global setTimeout: false */
|
41
53
|
|
42
54
|
var requirejs, require, define;
|
@@ -64,62 +76,58 @@ var requirejs, require, define;
|
|
64
76
|
*/
|
65
77
|
function normalize(name, baseName) {
|
66
78
|
var nameParts, nameSegment, mapValue, foundMap, lastIndex,
|
67
|
-
foundI, foundStarMap, starI, i, j, part,
|
79
|
+
foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,
|
68
80
|
baseParts = baseName && baseName.split("/"),
|
69
81
|
map = config.map,
|
70
82
|
starMap = (map && map['*']) || {};
|
71
83
|
|
72
84
|
//Adjust any relative paths.
|
73
|
-
if (name
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
85
|
+
if (name) {
|
86
|
+
name = name.split('/');
|
87
|
+
lastIndex = name.length - 1;
|
88
|
+
|
89
|
+
// If wanting node ID compatibility, strip .js from end
|
90
|
+
// of IDs. Have to do this here, and not in nameToUrl
|
91
|
+
// because node allows either .js or non .js to map
|
92
|
+
// to same file.
|
93
|
+
if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
|
94
|
+
name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
|
95
|
+
}
|
96
|
+
|
97
|
+
// Starts with a '.' so need the baseName
|
98
|
+
if (name[0].charAt(0) === '.' && baseParts) {
|
78
99
|
//Convert baseName to array, and lop off the last part,
|
79
|
-
//so that . matches that
|
80
|
-
//module. For instance, baseName of
|
81
|
-
//
|
100
|
+
//so that . matches that 'directory' and not name of the baseName's
|
101
|
+
//module. For instance, baseName of 'one/two/three', maps to
|
102
|
+
//'one/two/three.js', but we want the directory, 'one/two' for
|
82
103
|
//this normalization.
|
83
|
-
|
84
|
-
name =
|
85
|
-
|
86
|
-
|
87
|
-
// Node .js allowance:
|
88
|
-
if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
|
89
|
-
name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
|
90
|
-
}
|
104
|
+
normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
|
105
|
+
name = normalizedBaseParts.concat(name);
|
106
|
+
}
|
91
107
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
} else if (i > 0) {
|
110
|
-
name.splice(i - 1, 2);
|
111
|
-
i -= 2;
|
112
|
-
}
|
108
|
+
//start trimDots
|
109
|
+
for (i = 0; i < name.length; i++) {
|
110
|
+
part = name[i];
|
111
|
+
if (part === '.') {
|
112
|
+
name.splice(i, 1);
|
113
|
+
i -= 1;
|
114
|
+
} else if (part === '..') {
|
115
|
+
// If at the start, or previous value is still ..,
|
116
|
+
// keep them so that when converted to a path it may
|
117
|
+
// still work when converted to a path, even though
|
118
|
+
// as an ID it is less than ideal. In larger point
|
119
|
+
// releases, may be better to just kick out an error.
|
120
|
+
if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {
|
121
|
+
continue;
|
122
|
+
} else if (i > 0) {
|
123
|
+
name.splice(i - 1, 2);
|
124
|
+
i -= 2;
|
113
125
|
}
|
114
126
|
}
|
115
|
-
//end trimDots
|
116
|
-
|
117
|
-
name = name.join("/");
|
118
|
-
} else if (name.indexOf('./') === 0) {
|
119
|
-
// No baseName, so this is ID is resolved relative
|
120
|
-
// to baseUrl, pull off the leading dot.
|
121
|
-
name = name.substring(2);
|
122
127
|
}
|
128
|
+
//end trimDots
|
129
|
+
|
130
|
+
name = name.join('/');
|
123
131
|
}
|
124
132
|
|
125
133
|
//Apply map config if available.
|
@@ -181,7 +189,15 @@ var requirejs, require, define;
|
|
181
189
|
//A version of a require function that passes a moduleName
|
182
190
|
//value for items that may need to
|
183
191
|
//look up paths relative to the moduleName
|
184
|
-
|
192
|
+
var args = aps.call(arguments, 0);
|
193
|
+
|
194
|
+
//If first arg is not require('string'), and there is only
|
195
|
+
//one arg, it is the array form without a callback. Insert
|
196
|
+
//a null so that the following concat is correct.
|
197
|
+
if (typeof args[0] !== 'string' && args.length === 1) {
|
198
|
+
args.push(null);
|
199
|
+
}
|
200
|
+
return req.apply(undef, args.concat([relName, forceSync]));
|
185
201
|
};
|
186
202
|
}
|
187
203
|
|
@@ -224,32 +240,39 @@ var requirejs, require, define;
|
|
224
240
|
return [prefix, name];
|
225
241
|
}
|
226
242
|
|
243
|
+
//Creates a parts array for a relName where first part is plugin ID,
|
244
|
+
//second part is resource ID. Assumes relName has already been normalized.
|
245
|
+
function makeRelParts(relName) {
|
246
|
+
return relName ? splitPrefix(relName) : [];
|
247
|
+
}
|
248
|
+
|
227
249
|
/**
|
228
250
|
* Makes a name map, normalizing the name, and using a plugin
|
229
251
|
* for normalization if necessary. Grabs a ref to plugin
|
230
252
|
* too, as an optimization.
|
231
253
|
*/
|
232
|
-
makeMap = function (name,
|
254
|
+
makeMap = function (name, relParts) {
|
233
255
|
var plugin,
|
234
256
|
parts = splitPrefix(name),
|
235
|
-
prefix = parts[0]
|
257
|
+
prefix = parts[0],
|
258
|
+
relResourceName = relParts[1];
|
236
259
|
|
237
260
|
name = parts[1];
|
238
261
|
|
239
262
|
if (prefix) {
|
240
|
-
prefix = normalize(prefix,
|
263
|
+
prefix = normalize(prefix, relResourceName);
|
241
264
|
plugin = callDep(prefix);
|
242
265
|
}
|
243
266
|
|
244
267
|
//Normalize according
|
245
268
|
if (prefix) {
|
246
269
|
if (plugin && plugin.normalize) {
|
247
|
-
name = plugin.normalize(name, makeNormalize(
|
270
|
+
name = plugin.normalize(name, makeNormalize(relResourceName));
|
248
271
|
} else {
|
249
|
-
name = normalize(name,
|
272
|
+
name = normalize(name, relResourceName);
|
250
273
|
}
|
251
274
|
} else {
|
252
|
-
name = normalize(name,
|
275
|
+
name = normalize(name, relResourceName);
|
253
276
|
parts = splitPrefix(name);
|
254
277
|
prefix = parts[0];
|
255
278
|
name = parts[1];
|
@@ -296,13 +319,14 @@ var requirejs, require, define;
|
|
296
319
|
};
|
297
320
|
|
298
321
|
main = function (name, deps, callback, relName) {
|
299
|
-
var cjsModule, depName, ret, map, i,
|
322
|
+
var cjsModule, depName, ret, map, i, relParts,
|
300
323
|
args = [],
|
301
324
|
callbackType = typeof callback,
|
302
325
|
usingExports;
|
303
326
|
|
304
327
|
//Use name if no relName
|
305
328
|
relName = relName || name;
|
329
|
+
relParts = makeRelParts(relName);
|
306
330
|
|
307
331
|
//Call the callback to define the module, if necessary.
|
308
332
|
if (callbackType === 'undefined' || callbackType === 'function') {
|
@@ -311,7 +335,7 @@ var requirejs, require, define;
|
|
311
335
|
//Default to [require, exports, module] if no deps
|
312
336
|
deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
|
313
337
|
for (i = 0; i < deps.length; i += 1) {
|
314
|
-
map = makeMap(deps[i],
|
338
|
+
map = makeMap(deps[i], relParts);
|
315
339
|
depName = map.f;
|
316
340
|
|
317
341
|
//Fast path CommonJS standard dependencies.
|
@@ -367,7 +391,7 @@ var requirejs, require, define;
|
|
367
391
|
//deps arg is the module name, and second arg (if passed)
|
368
392
|
//is just the relName.
|
369
393
|
//Normalize module name, if it contains . or ..
|
370
|
-
return callDep(makeMap(deps, callback).f);
|
394
|
+
return callDep(makeMap(deps, makeRelParts(callback)).f);
|
371
395
|
} else if (!deps.splice) {
|
372
396
|
//deps is a config object, not an array.
|
373
397
|
config = deps;
|
@@ -431,6 +455,9 @@ var requirejs, require, define;
|
|
431
455
|
requirejs._defined = defined;
|
432
456
|
|
433
457
|
define = function (name, deps, callback) {
|
458
|
+
if (typeof name !== 'string') {
|
459
|
+
throw new Error('See almond README: incorrect module build, no module name');
|
460
|
+
}
|
434
461
|
|
435
462
|
//This module may not have dependencies
|
436
463
|
if (!deps.splice) {
|
@@ -597,9 +624,23 @@ S2.define('select2/utils',[
|
|
597
624
|
|
598
625
|
Observable.prototype.trigger = function (event) {
|
599
626
|
var slice = Array.prototype.slice;
|
627
|
+
var params = slice.call(arguments, 1);
|
600
628
|
|
601
629
|
this.listeners = this.listeners || {};
|
602
630
|
|
631
|
+
// Params should always come in as an array
|
632
|
+
if (params == null) {
|
633
|
+
params = [];
|
634
|
+
}
|
635
|
+
|
636
|
+
// If there are no arguments to the event, use a temporary object
|
637
|
+
if (params.length === 0) {
|
638
|
+
params.push({});
|
639
|
+
}
|
640
|
+
|
641
|
+
// Set the `_type` of the first object to the event
|
642
|
+
params[0]._type = event;
|
643
|
+
|
603
644
|
if (event in this.listeners) {
|
604
645
|
this.invoke(this.listeners[event], slice.call(arguments, 1));
|
605
646
|
}
|
@@ -773,7 +814,8 @@ S2.define('select2/results',[
|
|
773
814
|
this.hideLoading();
|
774
815
|
|
775
816
|
var $message = $(
|
776
|
-
'<li role="treeitem"
|
817
|
+
'<li role="treeitem" aria-live="assertive"' +
|
818
|
+
' class="select2-results__option"></li>'
|
777
819
|
);
|
778
820
|
|
779
821
|
var message = this.options.get('translations').get(params.message);
|
@@ -784,9 +826,15 @@ S2.define('select2/results',[
|
|
784
826
|
)
|
785
827
|
);
|
786
828
|
|
829
|
+
$message[0].className += ' select2-results__message';
|
830
|
+
|
787
831
|
this.$results.append($message);
|
788
832
|
};
|
789
833
|
|
834
|
+
Results.prototype.hideMessages = function () {
|
835
|
+
this.$results.find('.select2-results__message').remove();
|
836
|
+
};
|
837
|
+
|
790
838
|
Results.prototype.append = function (data) {
|
791
839
|
this.hideLoading();
|
792
840
|
|
@@ -826,6 +874,25 @@ S2.define('select2/results',[
|
|
826
874
|
return sorter(data);
|
827
875
|
};
|
828
876
|
|
877
|
+
Results.prototype.highlightFirstItem = function () {
|
878
|
+
var $options = this.$results
|
879
|
+
.find('.select2-results__option[aria-selected]');
|
880
|
+
|
881
|
+
var $selected = $options.filter('[aria-selected=true]');
|
882
|
+
|
883
|
+
// Check if there are any selected options
|
884
|
+
if ($selected.length > 0) {
|
885
|
+
// If there are selected options, highlight the first
|
886
|
+
$selected.first().trigger('mouseenter');
|
887
|
+
} else {
|
888
|
+
// If there are no selected options, highlight the first option
|
889
|
+
// in the dropdown
|
890
|
+
$options.first().trigger('mouseenter');
|
891
|
+
}
|
892
|
+
|
893
|
+
this.ensureHighlightVisible();
|
894
|
+
};
|
895
|
+
|
829
896
|
Results.prototype.setClasses = function () {
|
830
897
|
var self = this;
|
831
898
|
|
@@ -853,17 +920,6 @@ S2.define('select2/results',[
|
|
853
920
|
}
|
854
921
|
});
|
855
922
|
|
856
|
-
var $selected = $options.filter('[aria-selected=true]');
|
857
|
-
|
858
|
-
// Check if there are any selected options
|
859
|
-
if ($selected.length > 0) {
|
860
|
-
// If there are selected options, highlight the first
|
861
|
-
$selected.first().trigger('mouseenter');
|
862
|
-
} else {
|
863
|
-
// If there are no selected options, highlight the first option
|
864
|
-
// in the dropdown
|
865
|
-
$options.first().trigger('mouseenter');
|
866
|
-
}
|
867
923
|
});
|
868
924
|
};
|
869
925
|
|
@@ -974,6 +1030,7 @@ S2.define('select2/results',[
|
|
974
1030
|
|
975
1031
|
if (container.isOpen()) {
|
976
1032
|
self.setClasses();
|
1033
|
+
self.highlightFirstItem();
|
977
1034
|
}
|
978
1035
|
});
|
979
1036
|
|
@@ -986,6 +1043,7 @@ S2.define('select2/results',[
|
|
986
1043
|
});
|
987
1044
|
|
988
1045
|
container.on('query', function (params) {
|
1046
|
+
self.hideMessages();
|
989
1047
|
self.showLoading(params);
|
990
1048
|
});
|
991
1049
|
|
@@ -995,6 +1053,7 @@ S2.define('select2/results',[
|
|
995
1053
|
}
|
996
1054
|
|
997
1055
|
self.setClasses();
|
1056
|
+
self.highlightFirstItem();
|
998
1057
|
});
|
999
1058
|
|
1000
1059
|
container.on('unselect', function () {
|
@@ -1003,6 +1062,7 @@ S2.define('select2/results',[
|
|
1003
1062
|
}
|
1004
1063
|
|
1005
1064
|
self.setClasses();
|
1065
|
+
self.highlightFirstItem();
|
1006
1066
|
});
|
1007
1067
|
|
1008
1068
|
container.on('open', function () {
|
@@ -1041,7 +1101,7 @@ S2.define('select2/results',[
|
|
1041
1101
|
var data = $highlighted.data('data');
|
1042
1102
|
|
1043
1103
|
if ($highlighted.attr('aria-selected') == 'true') {
|
1044
|
-
self.trigger('close');
|
1104
|
+
self.trigger('close', {});
|
1045
1105
|
} else {
|
1046
1106
|
self.trigger('select', {
|
1047
1107
|
data: data
|
@@ -1125,11 +1185,7 @@ S2.define('select2/results',[
|
|
1125
1185
|
this.$results.on('mousewheel', function (e) {
|
1126
1186
|
var top = self.$results.scrollTop();
|
1127
1187
|
|
1128
|
-
var bottom = (
|
1129
|
-
self.$results.get(0).scrollHeight -
|
1130
|
-
self.$results.scrollTop() +
|
1131
|
-
e.deltaY
|
1132
|
-
);
|
1188
|
+
var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
|
1133
1189
|
|
1134
1190
|
var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
|
1135
1191
|
var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
|
@@ -1163,7 +1219,7 @@ S2.define('select2/results',[
|
|
1163
1219
|
data: data
|
1164
1220
|
});
|
1165
1221
|
} else {
|
1166
|
-
self.trigger('close');
|
1222
|
+
self.trigger('close', {});
|
1167
1223
|
}
|
1168
1224
|
|
1169
1225
|
return;
|
@@ -1229,7 +1285,7 @@ S2.define('select2/results',[
|
|
1229
1285
|
var template = this.options.get('templateResult');
|
1230
1286
|
var escapeMarkup = this.options.get('escapeMarkup');
|
1231
1287
|
|
1232
|
-
var content = template(result);
|
1288
|
+
var content = template(result, container);
|
1233
1289
|
|
1234
1290
|
if (content == null) {
|
1235
1291
|
container.style.display = 'none';
|
@@ -1286,7 +1342,7 @@ S2.define('select2/selection/base',[
|
|
1286
1342
|
BaseSelection.prototype.render = function () {
|
1287
1343
|
var $selection = $(
|
1288
1344
|
'<span class="select2-selection" role="combobox" ' +
|
1289
|
-
'
|
1345
|
+
' aria-haspopup="true" aria-expanded="false">' +
|
1290
1346
|
'</span>'
|
1291
1347
|
);
|
1292
1348
|
|
@@ -1319,7 +1375,7 @@ S2.define('select2/selection/base',[
|
|
1319
1375
|
});
|
1320
1376
|
|
1321
1377
|
this.$selection.on('blur', function (evt) {
|
1322
|
-
self.
|
1378
|
+
self._handleBlur(evt);
|
1323
1379
|
});
|
1324
1380
|
|
1325
1381
|
this.$selection.on('keydown', function (evt) {
|
@@ -1366,6 +1422,24 @@ S2.define('select2/selection/base',[
|
|
1366
1422
|
});
|
1367
1423
|
};
|
1368
1424
|
|
1425
|
+
BaseSelection.prototype._handleBlur = function (evt) {
|
1426
|
+
var self = this;
|
1427
|
+
|
1428
|
+
// This needs to be delayed as the active element is the body when the tab
|
1429
|
+
// key is pressed, possibly along with others.
|
1430
|
+
window.setTimeout(function () {
|
1431
|
+
// Don't trigger `blur` if the focus is still in the selection
|
1432
|
+
if (
|
1433
|
+
(document.activeElement == self.$selection[0]) ||
|
1434
|
+
($.contains(self.$selection[0], document.activeElement))
|
1435
|
+
) {
|
1436
|
+
return;
|
1437
|
+
}
|
1438
|
+
|
1439
|
+
self.trigger('blur', evt);
|
1440
|
+
}, 1);
|
1441
|
+
};
|
1442
|
+
|
1369
1443
|
BaseSelection.prototype._attachCloseHandler = function (container) {
|
1370
1444
|
var self = this;
|
1371
1445
|
|
@@ -1466,6 +1540,12 @@ S2.define('select2/selection/single',[
|
|
1466
1540
|
// User exits the container
|
1467
1541
|
});
|
1468
1542
|
|
1543
|
+
container.on('focus', function (evt) {
|
1544
|
+
if (!container.isOpen()) {
|
1545
|
+
self.$selection.focus();
|
1546
|
+
}
|
1547
|
+
});
|
1548
|
+
|
1469
1549
|
container.on('selection:update', function (params) {
|
1470
1550
|
self.update(params.data);
|
1471
1551
|
});
|
@@ -1475,11 +1555,11 @@ S2.define('select2/selection/single',[
|
|
1475
1555
|
this.$selection.find('.select2-selection__rendered').empty();
|
1476
1556
|
};
|
1477
1557
|
|
1478
|
-
SingleSelection.prototype.display = function (data) {
|
1558
|
+
SingleSelection.prototype.display = function (data, container) {
|
1479
1559
|
var template = this.options.get('templateSelection');
|
1480
1560
|
var escapeMarkup = this.options.get('escapeMarkup');
|
1481
1561
|
|
1482
|
-
return escapeMarkup(template(data));
|
1562
|
+
return escapeMarkup(template(data, container));
|
1483
1563
|
};
|
1484
1564
|
|
1485
1565
|
SingleSelection.prototype.selectionContainer = function () {
|
@@ -1494,9 +1574,9 @@ S2.define('select2/selection/single',[
|
|
1494
1574
|
|
1495
1575
|
var selection = data[0];
|
1496
1576
|
|
1497
|
-
var formatted = this.display(selection);
|
1498
|
-
|
1499
1577
|
var $rendered = this.$selection.find('.select2-selection__rendered');
|
1578
|
+
var formatted = this.display(selection, $rendered);
|
1579
|
+
|
1500
1580
|
$rendered.empty().append(formatted);
|
1501
1581
|
$rendered.prop('title', selection.title || selection.text);
|
1502
1582
|
};
|
@@ -1538,29 +1618,37 @@ S2.define('select2/selection/multiple',[
|
|
1538
1618
|
});
|
1539
1619
|
});
|
1540
1620
|
|
1541
|
-
this.$selection.on(
|
1621
|
+
this.$selection.on(
|
1622
|
+
'click',
|
1623
|
+
'.select2-selection__choice__remove',
|
1542
1624
|
function (evt) {
|
1543
|
-
|
1544
|
-
|
1625
|
+
// Ignore the event if it is disabled
|
1626
|
+
if (self.options.get('disabled')) {
|
1627
|
+
return;
|
1628
|
+
}
|
1545
1629
|
|
1546
|
-
|
1630
|
+
var $remove = $(this);
|
1631
|
+
var $selection = $remove.parent();
|
1547
1632
|
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1633
|
+
var data = $selection.data('data');
|
1634
|
+
|
1635
|
+
self.trigger('unselect', {
|
1636
|
+
originalEvent: evt,
|
1637
|
+
data: data
|
1638
|
+
});
|
1639
|
+
}
|
1640
|
+
);
|
1553
1641
|
};
|
1554
1642
|
|
1555
1643
|
MultipleSelection.prototype.clear = function () {
|
1556
1644
|
this.$selection.find('.select2-selection__rendered').empty();
|
1557
1645
|
};
|
1558
1646
|
|
1559
|
-
MultipleSelection.prototype.display = function (data) {
|
1647
|
+
MultipleSelection.prototype.display = function (data, container) {
|
1560
1648
|
var template = this.options.get('templateSelection');
|
1561
1649
|
var escapeMarkup = this.options.get('escapeMarkup');
|
1562
1650
|
|
1563
|
-
return escapeMarkup(template(data));
|
1651
|
+
return escapeMarkup(template(data, container));
|
1564
1652
|
};
|
1565
1653
|
|
1566
1654
|
MultipleSelection.prototype.selectionContainer = function () {
|
@@ -1587,8 +1675,8 @@ S2.define('select2/selection/multiple',[
|
|
1587
1675
|
for (var d = 0; d < data.length; d++) {
|
1588
1676
|
var selection = data[d];
|
1589
1677
|
|
1590
|
-
var formatted = this.display(selection);
|
1591
1678
|
var $selection = this.selectionContainer();
|
1679
|
+
var formatted = this.display(selection, $selection);
|
1592
1680
|
|
1593
1681
|
$selection.append(formatted);
|
1594
1682
|
$selection.prop('title', selection.title || selection.text);
|
@@ -1720,7 +1808,7 @@ S2.define('select2/selection/allowClear',[
|
|
1720
1808
|
|
1721
1809
|
this.$element.val(this.placeholder.id).trigger('change');
|
1722
1810
|
|
1723
|
-
this.trigger('toggle');
|
1811
|
+
this.trigger('toggle', {});
|
1724
1812
|
};
|
1725
1813
|
|
1726
1814
|
AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
|
@@ -1768,7 +1856,7 @@ S2.define('select2/selection/search',[
|
|
1768
1856
|
'<li class="select2-search select2-search--inline">' +
|
1769
1857
|
'<input class="select2-search__field" type="search" tabindex="-1"' +
|
1770
1858
|
' autocomplete="off" autocorrect="off" autocapitalize="off"' +
|
1771
|
-
' spellcheck="false" role="textbox" />' +
|
1859
|
+
' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
|
1772
1860
|
'</li>'
|
1773
1861
|
);
|
1774
1862
|
|
@@ -1777,6 +1865,8 @@ S2.define('select2/selection/search',[
|
|
1777
1865
|
|
1778
1866
|
var $rendered = decorated.call(this);
|
1779
1867
|
|
1868
|
+
this._transferTabIndex();
|
1869
|
+
|
1780
1870
|
return $rendered;
|
1781
1871
|
};
|
1782
1872
|
|
@@ -1786,32 +1876,39 @@ S2.define('select2/selection/search',[
|
|
1786
1876
|
decorated.call(this, container, $container);
|
1787
1877
|
|
1788
1878
|
container.on('open', function () {
|
1789
|
-
self.$search.
|
1790
|
-
|
1791
|
-
self.$search.focus();
|
1879
|
+
self.$search.trigger('focus');
|
1792
1880
|
});
|
1793
1881
|
|
1794
1882
|
container.on('close', function () {
|
1795
|
-
self.$search.attr('tabindex', -1);
|
1796
|
-
|
1797
1883
|
self.$search.val('');
|
1798
|
-
self.$search.
|
1884
|
+
self.$search.removeAttr('aria-activedescendant');
|
1885
|
+
self.$search.trigger('focus');
|
1799
1886
|
});
|
1800
1887
|
|
1801
1888
|
container.on('enable', function () {
|
1802
1889
|
self.$search.prop('disabled', false);
|
1890
|
+
|
1891
|
+
self._transferTabIndex();
|
1803
1892
|
});
|
1804
1893
|
|
1805
1894
|
container.on('disable', function () {
|
1806
1895
|
self.$search.prop('disabled', true);
|
1807
1896
|
});
|
1808
1897
|
|
1898
|
+
container.on('focus', function (evt) {
|
1899
|
+
self.$search.trigger('focus');
|
1900
|
+
});
|
1901
|
+
|
1902
|
+
container.on('results:focus', function (params) {
|
1903
|
+
self.$search.attr('aria-activedescendant', params.id);
|
1904
|
+
});
|
1905
|
+
|
1809
1906
|
this.$selection.on('focusin', '.select2-search--inline', function (evt) {
|
1810
1907
|
self.trigger('focus', evt);
|
1811
1908
|
});
|
1812
1909
|
|
1813
1910
|
this.$selection.on('focusout', '.select2-search--inline', function (evt) {
|
1814
|
-
self.
|
1911
|
+
self._handleBlur(evt);
|
1815
1912
|
});
|
1816
1913
|
|
1817
1914
|
this.$selection.on('keydown', '.select2-search--inline', function (evt) {
|
@@ -1837,18 +1934,73 @@ S2.define('select2/selection/search',[
|
|
1837
1934
|
}
|
1838
1935
|
});
|
1839
1936
|
|
1937
|
+
// Try to detect the IE version should the `documentMode` property that
|
1938
|
+
// is stored on the document. This is only implemented in IE and is
|
1939
|
+
// slightly cleaner than doing a user agent check.
|
1940
|
+
// This property is not available in Edge, but Edge also doesn't have
|
1941
|
+
// this bug.
|
1942
|
+
var msie = document.documentMode;
|
1943
|
+
var disableInputEvents = msie && msie <= 11;
|
1944
|
+
|
1840
1945
|
// Workaround for browsers which do not support the `input` event
|
1841
1946
|
// This will prevent double-triggering of events for browsers which support
|
1842
1947
|
// both the `keyup` and `input` events.
|
1843
|
-
this.$selection.on(
|
1844
|
-
|
1845
|
-
|
1846
|
-
|
1948
|
+
this.$selection.on(
|
1949
|
+
'input.searchcheck',
|
1950
|
+
'.select2-search--inline',
|
1951
|
+
function (evt) {
|
1952
|
+
// IE will trigger the `input` event when a placeholder is used on a
|
1953
|
+
// search box. To get around this issue, we are forced to ignore all
|
1954
|
+
// `input` events in IE and keep using `keyup`.
|
1955
|
+
if (disableInputEvents) {
|
1956
|
+
self.$selection.off('input.search input.searchcheck');
|
1957
|
+
return;
|
1958
|
+
}
|
1847
1959
|
|
1848
|
-
|
1849
|
-
|
1850
|
-
|
1851
|
-
|
1960
|
+
// Unbind the duplicated `keyup` event
|
1961
|
+
self.$selection.off('keyup.search');
|
1962
|
+
}
|
1963
|
+
);
|
1964
|
+
|
1965
|
+
this.$selection.on(
|
1966
|
+
'keyup.search input.search',
|
1967
|
+
'.select2-search--inline',
|
1968
|
+
function (evt) {
|
1969
|
+
// IE will trigger the `input` event when a placeholder is used on a
|
1970
|
+
// search box. To get around this issue, we are forced to ignore all
|
1971
|
+
// `input` events in IE and keep using `keyup`.
|
1972
|
+
if (disableInputEvents && evt.type === 'input') {
|
1973
|
+
self.$selection.off('input.search input.searchcheck');
|
1974
|
+
return;
|
1975
|
+
}
|
1976
|
+
|
1977
|
+
var key = evt.which;
|
1978
|
+
|
1979
|
+
// We can freely ignore events from modifier keys
|
1980
|
+
if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
|
1981
|
+
return;
|
1982
|
+
}
|
1983
|
+
|
1984
|
+
// Tabbing will be handled during the `keydown` phase
|
1985
|
+
if (key == KEYS.TAB) {
|
1986
|
+
return;
|
1987
|
+
}
|
1988
|
+
|
1989
|
+
self.handleSearch(evt);
|
1990
|
+
}
|
1991
|
+
);
|
1992
|
+
};
|
1993
|
+
|
1994
|
+
/**
|
1995
|
+
* This method will transfer the tabindex attribute from the rendered
|
1996
|
+
* selection to the search box. This allows for the search box to be used as
|
1997
|
+
* the primary focus instead of the selection container.
|
1998
|
+
*
|
1999
|
+
* @private
|
2000
|
+
*/
|
2001
|
+
Search.prototype._transferTabIndex = function (decorated) {
|
2002
|
+
this.$search.attr('tabindex', this.$selection.attr('tabindex'));
|
2003
|
+
this.$selection.attr('tabindex', '-1');
|
1852
2004
|
};
|
1853
2005
|
|
1854
2006
|
Search.prototype.createPlaceholder = function (decorated, placeholder) {
|
@@ -1856,6 +2008,8 @@ S2.define('select2/selection/search',[
|
|
1856
2008
|
};
|
1857
2009
|
|
1858
2010
|
Search.prototype.update = function (decorated, data) {
|
2011
|
+
var searchHadFocus = this.$search[0] == document.activeElement;
|
2012
|
+
|
1859
2013
|
this.$search.attr('placeholder', '');
|
1860
2014
|
|
1861
2015
|
decorated.call(this, data);
|
@@ -1864,6 +2018,9 @@ S2.define('select2/selection/search',[
|
|
1864
2018
|
.append(this.$searchContainer);
|
1865
2019
|
|
1866
2020
|
this.resizeSearch();
|
2021
|
+
if (searchHadFocus) {
|
2022
|
+
this.$search.focus();
|
2023
|
+
}
|
1867
2024
|
};
|
1868
2025
|
|
1869
2026
|
Search.prototype.handleSearch = function () {
|
@@ -1885,9 +2042,8 @@ S2.define('select2/selection/search',[
|
|
1885
2042
|
data: item
|
1886
2043
|
});
|
1887
2044
|
|
1888
|
-
this.
|
1889
|
-
|
1890
|
-
this.$search.val(item.text + ' ');
|
2045
|
+
this.$search.val(item.text);
|
2046
|
+
this.handleSearch();
|
1891
2047
|
};
|
1892
2048
|
|
1893
2049
|
Search.prototype.resizeSearch = function () {
|
@@ -3053,7 +3209,7 @@ S2.define('select2/data/select',[
|
|
3053
3209
|
}
|
3054
3210
|
}
|
3055
3211
|
|
3056
|
-
if (data.id) {
|
3212
|
+
if (data.id !== undefined) {
|
3057
3213
|
option.value = data.id;
|
3058
3214
|
}
|
3059
3215
|
|
@@ -3221,9 +3377,9 @@ S2.define('select2/data/array',[
|
|
3221
3377
|
var $existingOption = $existing.filter(onlyItem(item));
|
3222
3378
|
|
3223
3379
|
var existingData = this.item($existingOption);
|
3224
|
-
var newData = $.extend(true, {},
|
3380
|
+
var newData = $.extend(true, {}, item, existingData);
|
3225
3381
|
|
3226
|
-
var $newOption = this.option(
|
3382
|
+
var $newOption = this.option(newData);
|
3227
3383
|
|
3228
3384
|
$existingOption.replaceWith($newOption);
|
3229
3385
|
|
@@ -3259,7 +3415,7 @@ S2.define('select2/data/ajax',[
|
|
3259
3415
|
this.processResults = this.ajaxOptions.processResults;
|
3260
3416
|
}
|
3261
3417
|
|
3262
|
-
|
3418
|
+
AjaxAdapter.__super__.constructor.call(this, $element, options);
|
3263
3419
|
}
|
3264
3420
|
|
3265
3421
|
Utils.Extend(AjaxAdapter, ArrayAdapter);
|
@@ -3267,9 +3423,9 @@ S2.define('select2/data/ajax',[
|
|
3267
3423
|
AjaxAdapter.prototype._applyDefaults = function (options) {
|
3268
3424
|
var defaults = {
|
3269
3425
|
data: function (params) {
|
3270
|
-
return {
|
3426
|
+
return $.extend({}, params, {
|
3271
3427
|
q: params.term
|
3272
|
-
};
|
3428
|
+
});
|
3273
3429
|
},
|
3274
3430
|
transport: function (params, success, failure) {
|
3275
3431
|
var $request = $.ajax(params);
|
@@ -3306,11 +3462,11 @@ S2.define('select2/data/ajax',[
|
|
3306
3462
|
}, this.ajaxOptions);
|
3307
3463
|
|
3308
3464
|
if (typeof options.url === 'function') {
|
3309
|
-
options.url = options.url(params);
|
3465
|
+
options.url = options.url.call(this.$element, params);
|
3310
3466
|
}
|
3311
3467
|
|
3312
3468
|
if (typeof options.data === 'function') {
|
3313
|
-
options.data = options.data(params);
|
3469
|
+
options.data = options.data.call(this.$element, params);
|
3314
3470
|
}
|
3315
3471
|
|
3316
3472
|
function request () {
|
@@ -3329,13 +3485,21 @@ S2.define('select2/data/ajax',[
|
|
3329
3485
|
|
3330
3486
|
callback(results);
|
3331
3487
|
}, function () {
|
3332
|
-
//
|
3488
|
+
// Attempt to detect if a request was aborted
|
3489
|
+
// Only works if the transport exposes a status property
|
3490
|
+
if ($request.status && $request.status === '0') {
|
3491
|
+
return;
|
3492
|
+
}
|
3493
|
+
|
3494
|
+
self.trigger('results:message', {
|
3495
|
+
message: 'errorLoading'
|
3496
|
+
});
|
3333
3497
|
});
|
3334
3498
|
|
3335
3499
|
self._request = $request;
|
3336
3500
|
}
|
3337
3501
|
|
3338
|
-
if (this.ajaxOptions.delay && params.term
|
3502
|
+
if (this.ajaxOptions.delay && params.term != null) {
|
3339
3503
|
if (this._queryTimeout) {
|
3340
3504
|
window.clearTimeout(this._queryTimeout);
|
3341
3505
|
}
|
@@ -3361,6 +3525,12 @@ S2.define('select2/data/tags',[
|
|
3361
3525
|
this.createTag = createTag;
|
3362
3526
|
}
|
3363
3527
|
|
3528
|
+
var insertTag = options.get('insertTag');
|
3529
|
+
|
3530
|
+
if (insertTag !== undefined) {
|
3531
|
+
this.insertTag = insertTag;
|
3532
|
+
}
|
3533
|
+
|
3364
3534
|
decorated.call(this, $element, options);
|
3365
3535
|
|
3366
3536
|
if ($.isArray(tags)) {
|
@@ -3398,7 +3568,10 @@ S2.define('select2/data/tags',[
|
|
3398
3568
|
}, true)
|
3399
3569
|
);
|
3400
3570
|
|
3401
|
-
var
|
3571
|
+
var optionText = (option.text || '').toUpperCase();
|
3572
|
+
var paramsTerm = (params.term || '').toUpperCase();
|
3573
|
+
|
3574
|
+
var checkText = optionText === paramsTerm;
|
3402
3575
|
|
3403
3576
|
if (checkText || checkChildren) {
|
3404
3577
|
if (child) {
|
@@ -3492,13 +3665,38 @@ S2.define('select2/data/tokenizer',[
|
|
3492
3665
|
Tokenizer.prototype.query = function (decorated, params, callback) {
|
3493
3666
|
var self = this;
|
3494
3667
|
|
3668
|
+
function createAndSelect (data) {
|
3669
|
+
// Normalize the data object so we can use it for checks
|
3670
|
+
var item = self._normalizeItem(data);
|
3671
|
+
|
3672
|
+
// Check if the data object already exists as a tag
|
3673
|
+
// Select it if it doesn't
|
3674
|
+
var $existingOptions = self.$element.find('option').filter(function () {
|
3675
|
+
return $(this).val() === item.id;
|
3676
|
+
});
|
3677
|
+
|
3678
|
+
// If an existing option wasn't found for it, create the option
|
3679
|
+
if (!$existingOptions.length) {
|
3680
|
+
var $option = self.option(item);
|
3681
|
+
$option.attr('data-select2-tag', true);
|
3682
|
+
|
3683
|
+
self._removeOldTags();
|
3684
|
+
self.addOptions([$option]);
|
3685
|
+
}
|
3686
|
+
|
3687
|
+
// Select the item, now that we know there is an option for it
|
3688
|
+
select(item);
|
3689
|
+
}
|
3690
|
+
|
3495
3691
|
function select (data) {
|
3496
|
-
self.select
|
3692
|
+
self.trigger('select', {
|
3693
|
+
data: data
|
3694
|
+
});
|
3497
3695
|
}
|
3498
3696
|
|
3499
3697
|
params.term = params.term || '';
|
3500
3698
|
|
3501
|
-
var tokenData = this.tokenizer(params, this.options,
|
3699
|
+
var tokenData = this.tokenizer(params, this.options, createAndSelect);
|
3502
3700
|
|
3503
3701
|
if (tokenData.term !== params.term) {
|
3504
3702
|
// Replace the search term if we have the search box
|
@@ -3541,6 +3739,11 @@ S2.define('select2/data/tokenizer',[
|
|
3541
3739
|
|
3542
3740
|
var data = createTag(partParams);
|
3543
3741
|
|
3742
|
+
if (data == null) {
|
3743
|
+
i++;
|
3744
|
+
continue;
|
3745
|
+
}
|
3746
|
+
|
3544
3747
|
callback(data);
|
3545
3748
|
|
3546
3749
|
// Reset the term to not include the tokenized portion
|
@@ -3678,6 +3881,10 @@ S2.define('select2/dropdown',[
|
|
3678
3881
|
return $dropdown;
|
3679
3882
|
};
|
3680
3883
|
|
3884
|
+
Dropdown.prototype.bind = function () {
|
3885
|
+
// Should be implemented in subclasses
|
3886
|
+
};
|
3887
|
+
|
3681
3888
|
Dropdown.prototype.position = function ($dropdown, $container) {
|
3682
3889
|
// Should be implmented in subclasses
|
3683
3890
|
};
|
@@ -3754,6 +3961,12 @@ S2.define('select2/dropdown/search',[
|
|
3754
3961
|
self.$search.val('');
|
3755
3962
|
});
|
3756
3963
|
|
3964
|
+
container.on('focus', function () {
|
3965
|
+
if (!container.isOpen()) {
|
3966
|
+
self.$search.focus();
|
3967
|
+
}
|
3968
|
+
});
|
3969
|
+
|
3757
3970
|
container.on('results:all', function (params) {
|
3758
3971
|
if (params.query.term == null || params.query.term === '') {
|
3759
3972
|
var showSearch = self.showSearch(params);
|
@@ -3904,7 +4117,9 @@ S2.define('select2/dropdown/infiniteScroll',[
|
|
3904
4117
|
|
3905
4118
|
InfiniteScroll.prototype.createLoadingMore = function () {
|
3906
4119
|
var $option = $(
|
3907
|
-
'<li
|
4120
|
+
'<li ' +
|
4121
|
+
'class="select2-results__option select2-results__option--load-more"' +
|
4122
|
+
'role="treeitem" aria-disabled="true"></li>'
|
3908
4123
|
);
|
3909
4124
|
|
3910
4125
|
var message = this.options.get('translations').get('loadingMore');
|
@@ -3922,7 +4137,7 @@ S2.define('select2/dropdown/attachBody',[
|
|
3922
4137
|
'../utils'
|
3923
4138
|
], function ($, Utils) {
|
3924
4139
|
function AttachBody (decorated, $element, options) {
|
3925
|
-
this.$dropdownParent = options.get('dropdownParent') || document.body;
|
4140
|
+
this.$dropdownParent = options.get('dropdownParent') || $(document.body);
|
3926
4141
|
|
3927
4142
|
decorated.call(this, $element, options);
|
3928
4143
|
}
|
@@ -3963,6 +4178,12 @@ S2.define('select2/dropdown/attachBody',[
|
|
3963
4178
|
});
|
3964
4179
|
};
|
3965
4180
|
|
4181
|
+
AttachBody.prototype.destroy = function (decorated) {
|
4182
|
+
decorated.call(this);
|
4183
|
+
|
4184
|
+
this.$dropdownContainer.remove();
|
4185
|
+
};
|
4186
|
+
|
3966
4187
|
AttachBody.prototype.position = function (decorated, $dropdown, $container) {
|
3967
4188
|
// Clone all of the container classes
|
3968
4189
|
$dropdown.attr('class', $container.attr('class'));
|
@@ -3993,7 +4214,8 @@ S2.define('select2/dropdown/attachBody',[
|
|
3993
4214
|
this.$dropdownContainer.detach();
|
3994
4215
|
};
|
3995
4216
|
|
3996
|
-
AttachBody.prototype._attachPositioningHandler =
|
4217
|
+
AttachBody.prototype._attachPositioningHandler =
|
4218
|
+
function (decorated, container) {
|
3997
4219
|
var self = this;
|
3998
4220
|
|
3999
4221
|
var scrollEvent = 'scroll.select2.' + container.id;
|
@@ -4020,7 +4242,8 @@ S2.define('select2/dropdown/attachBody',[
|
|
4020
4242
|
});
|
4021
4243
|
};
|
4022
4244
|
|
4023
|
-
AttachBody.prototype._detachPositioningHandler =
|
4245
|
+
AttachBody.prototype._detachPositioningHandler =
|
4246
|
+
function (decorated, container) {
|
4024
4247
|
var scrollEvent = 'scroll.select2.' + container.id;
|
4025
4248
|
var resizeEvent = 'resize.select2.' + container.id;
|
4026
4249
|
var orientationEvent = 'orientationchange.select2.' + container.id;
|
@@ -4039,7 +4262,6 @@ S2.define('select2/dropdown/attachBody',[
|
|
4039
4262
|
|
4040
4263
|
var newDirection = null;
|
4041
4264
|
|
4042
|
-
var position = this.$container.position();
|
4043
4265
|
var offset = this.$container.offset();
|
4044
4266
|
|
4045
4267
|
offset.bottom = offset.top + this.$container.outerHeight(false);
|
@@ -4068,6 +4290,20 @@ S2.define('select2/dropdown/attachBody',[
|
|
4068
4290
|
top: container.bottom
|
4069
4291
|
};
|
4070
4292
|
|
4293
|
+
// Determine what the parent element is to use for calciulating the offset
|
4294
|
+
var $offsetParent = this.$dropdownParent;
|
4295
|
+
|
4296
|
+
// For statically positoned elements, we need to get the element
|
4297
|
+
// that is determining the offset
|
4298
|
+
if ($offsetParent.css('position') === 'static') {
|
4299
|
+
$offsetParent = $offsetParent.offsetParent();
|
4300
|
+
}
|
4301
|
+
|
4302
|
+
var parentOffset = $offsetParent.offset();
|
4303
|
+
|
4304
|
+
css.top -= parentOffset.top;
|
4305
|
+
css.left -= parentOffset.left;
|
4306
|
+
|
4071
4307
|
if (!isCurrentlyAbove && !isCurrentlyBelow) {
|
4072
4308
|
newDirection = 'below';
|
4073
4309
|
}
|
@@ -4080,7 +4316,7 @@ S2.define('select2/dropdown/attachBody',[
|
|
4080
4316
|
|
4081
4317
|
if (newDirection == 'above' ||
|
4082
4318
|
(isCurrentlyAbove && newDirection !== 'below')) {
|
4083
|
-
css.top = container.top - dropdown.height;
|
4319
|
+
css.top = container.top - parentOffset.top - dropdown.height;
|
4084
4320
|
}
|
4085
4321
|
|
4086
4322
|
if (newDirection != null) {
|
@@ -4096,14 +4332,13 @@ S2.define('select2/dropdown/attachBody',[
|
|
4096
4332
|
};
|
4097
4333
|
|
4098
4334
|
AttachBody.prototype._resizeDropdown = function () {
|
4099
|
-
this.$dropdownContainer.width();
|
4100
|
-
|
4101
4335
|
var css = {
|
4102
4336
|
width: this.$container.outerWidth(false) + 'px'
|
4103
4337
|
};
|
4104
4338
|
|
4105
4339
|
if (this.options.get('dropdownAutoWidth')) {
|
4106
4340
|
css.minWidth = css.width;
|
4341
|
+
css.position = 'relative';
|
4107
4342
|
css.width = 'auto';
|
4108
4343
|
}
|
4109
4344
|
|
@@ -4170,20 +4405,41 @@ S2.define('select2/dropdown/selectOnClose',[
|
|
4170
4405
|
|
4171
4406
|
decorated.call(this, container, $container);
|
4172
4407
|
|
4173
|
-
container.on('close', function () {
|
4174
|
-
self._handleSelectOnClose();
|
4408
|
+
container.on('close', function (params) {
|
4409
|
+
self._handleSelectOnClose(params);
|
4175
4410
|
});
|
4176
4411
|
};
|
4177
4412
|
|
4178
|
-
SelectOnClose.prototype._handleSelectOnClose = function () {
|
4413
|
+
SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
|
4414
|
+
if (params && params.originalSelect2Event != null) {
|
4415
|
+
var event = params.originalSelect2Event;
|
4416
|
+
|
4417
|
+
// Don't select an item if the close event was triggered from a select or
|
4418
|
+
// unselect event
|
4419
|
+
if (event._type === 'select' || event._type === 'unselect') {
|
4420
|
+
return;
|
4421
|
+
}
|
4422
|
+
}
|
4423
|
+
|
4179
4424
|
var $highlightedResults = this.getHighlightedResults();
|
4180
4425
|
|
4426
|
+
// Only select highlighted results
|
4181
4427
|
if ($highlightedResults.length < 1) {
|
4182
4428
|
return;
|
4183
4429
|
}
|
4184
4430
|
|
4431
|
+
var data = $highlightedResults.data('data');
|
4432
|
+
|
4433
|
+
// Don't re-select already selected resulte
|
4434
|
+
if (
|
4435
|
+
(data.element != null && data.element.selected) ||
|
4436
|
+
(data.element == null && data.selected)
|
4437
|
+
) {
|
4438
|
+
return;
|
4439
|
+
}
|
4440
|
+
|
4185
4441
|
this.trigger('select', {
|
4186
|
-
data:
|
4442
|
+
data: data
|
4187
4443
|
});
|
4188
4444
|
};
|
4189
4445
|
|
@@ -4217,7 +4473,10 @@ S2.define('select2/dropdown/closeOnSelect',[
|
|
4217
4473
|
return;
|
4218
4474
|
}
|
4219
4475
|
|
4220
|
-
this.trigger('close'
|
4476
|
+
this.trigger('close', {
|
4477
|
+
originalEvent: originalEvent,
|
4478
|
+
originalSelect2Event: evt
|
4479
|
+
});
|
4221
4480
|
};
|
4222
4481
|
|
4223
4482
|
return CloseOnSelect;
|
@@ -4325,7 +4584,7 @@ S2.define('select2/defaults',[
|
|
4325
4584
|
}
|
4326
4585
|
|
4327
4586
|
Defaults.prototype.apply = function (options) {
|
4328
|
-
options = $.extend({}, this.defaults, options);
|
4587
|
+
options = $.extend(true, {}, this.defaults, options);
|
4329
4588
|
|
4330
4589
|
if (options.dataAdapter == null) {
|
4331
4590
|
if (options.ajax != null) {
|
@@ -4868,8 +5127,8 @@ S2.define('select2/core',[
|
|
4868
5127
|
|
4869
5128
|
// Hide the original select
|
4870
5129
|
$element.addClass('select2-hidden-accessible');
|
4871
|
-
|
4872
|
-
|
5130
|
+
$element.attr('aria-hidden', 'true');
|
5131
|
+
|
4873
5132
|
// Synchronize any monitored attributes
|
4874
5133
|
this._syncAttributes();
|
4875
5134
|
|
@@ -4889,6 +5148,7 @@ S2.define('select2/core',[
|
|
4889
5148
|
id = Utils.generateChars(4);
|
4890
5149
|
}
|
4891
5150
|
|
5151
|
+
id = id.replace(/(:|\.|\[|\]|,)/g, '');
|
4892
5152
|
id = 'select2-' + id;
|
4893
5153
|
|
4894
5154
|
return id;
|
@@ -4970,10 +5230,15 @@ S2.define('select2/core',[
|
|
4970
5230
|
});
|
4971
5231
|
});
|
4972
5232
|
|
4973
|
-
this.
|
5233
|
+
this.$element.on('focus.select2', function (evt) {
|
5234
|
+
self.trigger('focus', evt);
|
5235
|
+
});
|
5236
|
+
|
5237
|
+
this._syncA = Utils.bind(this._syncAttributes, this);
|
5238
|
+
this._syncS = Utils.bind(this._syncSubtree, this);
|
4974
5239
|
|
4975
5240
|
if (this.$element[0].attachEvent) {
|
4976
|
-
this.$element[0].attachEvent('onpropertychange', this.
|
5241
|
+
this.$element[0].attachEvent('onpropertychange', this._syncA);
|
4977
5242
|
}
|
4978
5243
|
|
4979
5244
|
var observer = window.MutationObserver ||
|
@@ -4983,14 +5248,30 @@ S2.define('select2/core',[
|
|
4983
5248
|
|
4984
5249
|
if (observer != null) {
|
4985
5250
|
this._observer = new observer(function (mutations) {
|
4986
|
-
$.each(mutations, self.
|
5251
|
+
$.each(mutations, self._syncA);
|
5252
|
+
$.each(mutations, self._syncS);
|
4987
5253
|
});
|
4988
5254
|
this._observer.observe(this.$element[0], {
|
4989
5255
|
attributes: true,
|
5256
|
+
childList: true,
|
4990
5257
|
subtree: false
|
4991
5258
|
});
|
4992
5259
|
} else if (this.$element[0].addEventListener) {
|
4993
|
-
this.$element[0].addEventListener(
|
5260
|
+
this.$element[0].addEventListener(
|
5261
|
+
'DOMAttrModified',
|
5262
|
+
self._syncA,
|
5263
|
+
false
|
5264
|
+
);
|
5265
|
+
this.$element[0].addEventListener(
|
5266
|
+
'DOMNodeInserted',
|
5267
|
+
self._syncS,
|
5268
|
+
false
|
5269
|
+
);
|
5270
|
+
this.$element[0].addEventListener(
|
5271
|
+
'DOMNodeRemoved',
|
5272
|
+
self._syncS,
|
5273
|
+
false
|
5274
|
+
);
|
4994
5275
|
}
|
4995
5276
|
};
|
4996
5277
|
|
@@ -5004,12 +5285,16 @@ S2.define('select2/core',[
|
|
5004
5285
|
|
5005
5286
|
Select2.prototype._registerSelectionEvents = function () {
|
5006
5287
|
var self = this;
|
5007
|
-
var nonRelayEvents = ['toggle'];
|
5288
|
+
var nonRelayEvents = ['toggle', 'focus'];
|
5008
5289
|
|
5009
5290
|
this.selection.on('toggle', function () {
|
5010
5291
|
self.toggleDropdown();
|
5011
5292
|
});
|
5012
5293
|
|
5294
|
+
this.selection.on('focus', function (params) {
|
5295
|
+
self.focus(params);
|
5296
|
+
});
|
5297
|
+
|
5013
5298
|
this.selection.on('*', function (name, params) {
|
5014
5299
|
if ($.inArray(name, nonRelayEvents) !== -1) {
|
5015
5300
|
return;
|
@@ -5054,17 +5339,13 @@ S2.define('select2/core',[
|
|
5054
5339
|
self.$container.addClass('select2-container--disabled');
|
5055
5340
|
});
|
5056
5341
|
|
5057
|
-
this.on('focus', function () {
|
5058
|
-
self.$container.addClass('select2-container--focus');
|
5059
|
-
});
|
5060
|
-
|
5061
5342
|
this.on('blur', function () {
|
5062
5343
|
self.$container.removeClass('select2-container--focus');
|
5063
5344
|
});
|
5064
5345
|
|
5065
5346
|
this.on('query', function (params) {
|
5066
5347
|
if (!self.isOpen()) {
|
5067
|
-
self.trigger('open');
|
5348
|
+
self.trigger('open', {});
|
5068
5349
|
}
|
5069
5350
|
|
5070
5351
|
this.dataAdapter.query(params, function (data) {
|
@@ -5088,30 +5369,31 @@ S2.define('select2/core',[
|
|
5088
5369
|
var key = evt.which;
|
5089
5370
|
|
5090
5371
|
if (self.isOpen()) {
|
5091
|
-
if (key === KEYS.
|
5092
|
-
|
5372
|
+
if (key === KEYS.ESC || key === KEYS.TAB ||
|
5373
|
+
(key === KEYS.UP && evt.altKey)) {
|
5374
|
+
self.close();
|
5375
|
+
|
5376
|
+
evt.preventDefault();
|
5377
|
+
} else if (key === KEYS.ENTER) {
|
5378
|
+
self.trigger('results:select', {});
|
5093
5379
|
|
5094
5380
|
evt.preventDefault();
|
5095
5381
|
} else if ((key === KEYS.SPACE && evt.ctrlKey)) {
|
5096
|
-
self.trigger('results:toggle');
|
5382
|
+
self.trigger('results:toggle', {});
|
5097
5383
|
|
5098
5384
|
evt.preventDefault();
|
5099
5385
|
} else if (key === KEYS.UP) {
|
5100
|
-
self.trigger('results:previous');
|
5386
|
+
self.trigger('results:previous', {});
|
5101
5387
|
|
5102
5388
|
evt.preventDefault();
|
5103
5389
|
} else if (key === KEYS.DOWN) {
|
5104
|
-
self.trigger('results:next');
|
5105
|
-
|
5106
|
-
evt.preventDefault();
|
5107
|
-
} else if (key === KEYS.ESC || key === KEYS.TAB) {
|
5108
|
-
self.close();
|
5390
|
+
self.trigger('results:next', {});
|
5109
5391
|
|
5110
5392
|
evt.preventDefault();
|
5111
5393
|
}
|
5112
5394
|
} else {
|
5113
5395
|
if (key === KEYS.ENTER || key === KEYS.SPACE ||
|
5114
|
-
(
|
5396
|
+
(key === KEYS.DOWN && evt.altKey)) {
|
5115
5397
|
self.open();
|
5116
5398
|
|
5117
5399
|
evt.preventDefault();
|
@@ -5128,9 +5410,49 @@ S2.define('select2/core',[
|
|
5128
5410
|
this.close();
|
5129
5411
|
}
|
5130
5412
|
|
5131
|
-
this.trigger('disable');
|
5413
|
+
this.trigger('disable', {});
|
5132
5414
|
} else {
|
5133
|
-
this.trigger('enable');
|
5415
|
+
this.trigger('enable', {});
|
5416
|
+
}
|
5417
|
+
};
|
5418
|
+
|
5419
|
+
Select2.prototype._syncSubtree = function (evt, mutations) {
|
5420
|
+
var changed = false;
|
5421
|
+
var self = this;
|
5422
|
+
|
5423
|
+
// Ignore any mutation events raised for elements that aren't options or
|
5424
|
+
// optgroups. This handles the case when the select element is destroyed
|
5425
|
+
if (
|
5426
|
+
evt && evt.target && (
|
5427
|
+
evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
|
5428
|
+
)
|
5429
|
+
) {
|
5430
|
+
return;
|
5431
|
+
}
|
5432
|
+
|
5433
|
+
if (!mutations) {
|
5434
|
+
// If mutation events aren't supported, then we can only assume that the
|
5435
|
+
// change affected the selections
|
5436
|
+
changed = true;
|
5437
|
+
} else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
|
5438
|
+
for (var n = 0; n < mutations.addedNodes.length; n++) {
|
5439
|
+
var node = mutations.addedNodes[n];
|
5440
|
+
|
5441
|
+
if (node.selected) {
|
5442
|
+
changed = true;
|
5443
|
+
}
|
5444
|
+
}
|
5445
|
+
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
|
5446
|
+
changed = true;
|
5447
|
+
}
|
5448
|
+
|
5449
|
+
// Only re-pull the data if we think there is a change
|
5450
|
+
if (changed) {
|
5451
|
+
this.dataAdapter.current(function (currentData) {
|
5452
|
+
self.trigger('selection:update', {
|
5453
|
+
data: currentData
|
5454
|
+
});
|
5455
|
+
});
|
5134
5456
|
}
|
5135
5457
|
};
|
5136
5458
|
|
@@ -5147,6 +5469,10 @@ S2.define('select2/core',[
|
|
5147
5469
|
'unselect': 'unselecting'
|
5148
5470
|
};
|
5149
5471
|
|
5472
|
+
if (args === undefined) {
|
5473
|
+
args = {};
|
5474
|
+
}
|
5475
|
+
|
5150
5476
|
if (name in preTriggerMap) {
|
5151
5477
|
var preTriggerName = preTriggerMap[name];
|
5152
5478
|
var preTriggerArgs = {
|
@@ -5185,8 +5511,6 @@ S2.define('select2/core',[
|
|
5185
5511
|
}
|
5186
5512
|
|
5187
5513
|
this.trigger('query', {});
|
5188
|
-
|
5189
|
-
this.trigger('open');
|
5190
5514
|
};
|
5191
5515
|
|
5192
5516
|
Select2.prototype.close = function () {
|
@@ -5194,13 +5518,27 @@ S2.define('select2/core',[
|
|
5194
5518
|
return;
|
5195
5519
|
}
|
5196
5520
|
|
5197
|
-
this.trigger('close');
|
5521
|
+
this.trigger('close', {});
|
5198
5522
|
};
|
5199
5523
|
|
5200
5524
|
Select2.prototype.isOpen = function () {
|
5201
5525
|
return this.$container.hasClass('select2-container--open');
|
5202
5526
|
};
|
5203
5527
|
|
5528
|
+
Select2.prototype.hasFocus = function () {
|
5529
|
+
return this.$container.hasClass('select2-container--focus');
|
5530
|
+
};
|
5531
|
+
|
5532
|
+
Select2.prototype.focus = function (data) {
|
5533
|
+
// No need to re-trigger focus events if we are already focused
|
5534
|
+
if (this.hasFocus()) {
|
5535
|
+
return;
|
5536
|
+
}
|
5537
|
+
|
5538
|
+
this.$container.addClass('select2-container--focus');
|
5539
|
+
this.trigger('focus', {});
|
5540
|
+
};
|
5541
|
+
|
5204
5542
|
Select2.prototype.enable = function (args) {
|
5205
5543
|
if (this.options.get('debug') && window.console && console.warn) {
|
5206
5544
|
console.warn(
|
@@ -5264,7 +5602,7 @@ S2.define('select2/core',[
|
|
5264
5602
|
this.$container.remove();
|
5265
5603
|
|
5266
5604
|
if (this.$element[0].detachEvent) {
|
5267
|
-
this.$element[0].detachEvent('onpropertychange', this.
|
5605
|
+
this.$element[0].detachEvent('onpropertychange', this._syncA);
|
5268
5606
|
}
|
5269
5607
|
|
5270
5608
|
if (this._observer != null) {
|
@@ -5272,16 +5610,21 @@ S2.define('select2/core',[
|
|
5272
5610
|
this._observer = null;
|
5273
5611
|
} else if (this.$element[0].removeEventListener) {
|
5274
5612
|
this.$element[0]
|
5275
|
-
.removeEventListener('DOMAttrModified', this.
|
5613
|
+
.removeEventListener('DOMAttrModified', this._syncA, false);
|
5614
|
+
this.$element[0]
|
5615
|
+
.removeEventListener('DOMNodeInserted', this._syncS, false);
|
5616
|
+
this.$element[0]
|
5617
|
+
.removeEventListener('DOMNodeRemoved', this._syncS, false);
|
5276
5618
|
}
|
5277
5619
|
|
5278
|
-
this.
|
5620
|
+
this._syncA = null;
|
5621
|
+
this._syncS = null;
|
5279
5622
|
|
5280
5623
|
this.$element.off('.select2');
|
5281
5624
|
this.$element.attr('tabindex', this.$element.data('old-tabindex'));
|
5282
5625
|
|
5283
5626
|
this.$element.removeClass('select2-hidden-accessible');
|
5284
|
-
|
5627
|
+
this.$element.attr('aria-hidden', 'false');
|
5285
5628
|
this.$element.removeData('select2');
|
5286
5629
|
|
5287
5630
|
this.dataAdapter.destroy();
|
@@ -5317,16 +5660,20 @@ S2.define('select2/core',[
|
|
5317
5660
|
return Select2;
|
5318
5661
|
});
|
5319
5662
|
|
5663
|
+
S2.define('jquery-mousewheel',[
|
5664
|
+
'jquery'
|
5665
|
+
], function ($) {
|
5666
|
+
// Used to shim jQuery.mousewheel for non-full builds.
|
5667
|
+
return $;
|
5668
|
+
});
|
5669
|
+
|
5320
5670
|
S2.define('jquery.select2',[
|
5321
5671
|
'jquery',
|
5322
|
-
'
|
5672
|
+
'jquery-mousewheel',
|
5323
5673
|
|
5324
5674
|
'./select2/core',
|
5325
5675
|
'./select2/defaults'
|
5326
|
-
], function ($,
|
5327
|
-
// Force jQuery.mousewheel to be loaded if it hasn't already
|
5328
|
-
require('jquery.mousewheel');
|
5329
|
-
|
5676
|
+
], function ($, _, Select2, Defaults) {
|
5330
5677
|
if ($.fn.select2 == null) {
|
5331
5678
|
// All methods that should return the element
|
5332
5679
|
var thisMethods = ['open', 'close', 'destroy'];
|
@@ -5336,25 +5683,28 @@ S2.define('jquery.select2',[
|
|
5336
5683
|
|
5337
5684
|
if (typeof options === 'object') {
|
5338
5685
|
this.each(function () {
|
5339
|
-
var instanceOptions = $.extend({}, options
|
5686
|
+
var instanceOptions = $.extend(true, {}, options);
|
5340
5687
|
|
5341
5688
|
var instance = new Select2($(this), instanceOptions);
|
5342
5689
|
});
|
5343
5690
|
|
5344
5691
|
return this;
|
5345
5692
|
} else if (typeof options === 'string') {
|
5346
|
-
var
|
5693
|
+
var ret;
|
5694
|
+
var args = Array.prototype.slice.call(arguments, 1);
|
5347
5695
|
|
5348
|
-
|
5349
|
-
|
5350
|
-
'The select2(\'' + options + '\') method was called on an ' +
|
5351
|
-
'element that is not using Select2.'
|
5352
|
-
);
|
5353
|
-
}
|
5696
|
+
this.each(function () {
|
5697
|
+
var instance = $(this).data('select2');
|
5354
5698
|
|
5355
|
-
|
5699
|
+
if (instance == null && window.console && console.error) {
|
5700
|
+
console.error(
|
5701
|
+
'The select2(\'' + options + '\') method was called on an ' +
|
5702
|
+
'element that is not using Select2.'
|
5703
|
+
);
|
5704
|
+
}
|
5356
5705
|
|
5357
|
-
|
5706
|
+
ret = instance[options].apply(instance, args);
|
5707
|
+
});
|
5358
5708
|
|
5359
5709
|
// Check if we should be returning `this`
|
5360
5710
|
if ($.inArray(options, thisMethods) > -1) {
|
@@ -5375,13 +5725,6 @@ S2.define('jquery.select2',[
|
|
5375
5725
|
return Select2;
|
5376
5726
|
});
|
5377
5727
|
|
5378
|
-
S2.define('jquery.mousewheel',[
|
5379
|
-
'jquery'
|
5380
|
-
], function ($) {
|
5381
|
-
// Used to shim jQuery.mousewheel for non-full builds.
|
5382
|
-
return $;
|
5383
|
-
});
|
5384
|
-
|
5385
5728
|
// Return the AMD loader configuration so it can be used outside of this file
|
5386
5729
|
return {
|
5387
5730
|
define: S2.define,
|