tom-select-rails 0.1.0 → 0.2.0
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 +4 -4
- data/lib/tom-select-rails/version.rb +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js +168 -84
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js +132 -59
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js +140 -65
- data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/cjs/utils.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js +3 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js +9 -7
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js +3 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js +3 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js +6 -4
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js +3 -7
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js +4 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js +8 -8
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js +22 -12
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js +168 -84
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js +132 -59
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js +140 -65
- data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/utils.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js +3 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/change_listener.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js +9 -7
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js +3 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/drag_drop.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js +3 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js +6 -4
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js +3 -7
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_active_items.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js +4 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js +8 -8
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/restore_on_backspace.js +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js +22 -12
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js +132 -59
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js +142 -142
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js +168 -84
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js +157 -156
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js +140 -65
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js +142 -143
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/tom-select.d.ts +20 -3
- data/vendor/assets/javascripts/tom-select-rails/types/types/core.d.ts +2 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css +3 -7
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css +3 -7
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css +7 -11
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css +3 -7
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css.map +1 -1
- data/vendor/assets/stylesheets/tom-select-rails/scss/_dropdown.scss +0 -2
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.scss +4 -4
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1b3cc20dc49ea2de80dfdfe939c1b4b32aabf86d74fbd188907b0de731129a87
|
|
4
|
+
data.tar.gz: 7c7e09dfa447bec81857c137f3ba82084a94fc20c44e62bdae1cc5ad8ac44068
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c62aeb791ae593fa5428acd0a0b76587abd77c505b2c34110acbb3be9228b15ce61395e2e214e5da5a136f6d0d401a74c1b479787fc1c91a5b347ff30cc20741
|
|
7
|
+
data.tar.gz: 789659f7b13407003b2b99bf993b37017030278c87da2389455547d14d56c55b126a27f2ecc1177980e7d3a6f12ba77da2f9044ad0d9f707121edfa97fcf9f29
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tom Select v2.0
|
|
2
|
+
* Tom Select v2.1.0
|
|
3
3
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -189,24 +189,20 @@ function MicroPlugin(Interface) {
|
|
|
189
189
|
};
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
+
// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension"
|
|
192
193
|
// https://github.com/andrewrk/node-diacritics/blob/master/index.js
|
|
193
194
|
var latin_pat;
|
|
194
195
|
const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc}
|
|
195
196
|
|
|
196
|
-
const accent_reg = new RegExp(accent_pat, '
|
|
197
|
+
const accent_reg = new RegExp(accent_pat, 'gu');
|
|
197
198
|
var diacritic_patterns;
|
|
198
199
|
const latin_convert = {
|
|
199
200
|
'æ': 'ae',
|
|
200
201
|
'ⱥ': 'a',
|
|
201
202
|
'ø': 'o'
|
|
202
203
|
};
|
|
203
|
-
const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), '
|
|
204
|
-
|
|
205
|
-
* code points generated from toCodePoints();
|
|
206
|
-
* removed 65339 to 65345
|
|
207
|
-
*/
|
|
208
|
-
|
|
209
|
-
const code_points = [[67, 67], [160, 160], [192, 438], [452, 652], [961, 961], [1019, 1019], [1083, 1083], [1281, 1289], [1984, 1984], [5095, 5095], [7429, 7441], [7545, 7549], [7680, 7935], [8580, 8580], [9398, 9449], [11360, 11391], [42792, 42793], [42802, 42851], [42873, 42897], [42912, 42922], [64256, 64260], [65313, 65338], [65345, 65370]];
|
|
204
|
+
const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'gu');
|
|
205
|
+
const code_points = [[0, 65535]];
|
|
210
206
|
/**
|
|
211
207
|
* Remove accents
|
|
212
208
|
* via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703
|
|
@@ -225,7 +221,6 @@ const asciifold = str => {
|
|
|
225
221
|
*
|
|
226
222
|
*/
|
|
227
223
|
|
|
228
|
-
|
|
229
224
|
const arrayToPattern = (chars, glue = '|') => {
|
|
230
225
|
if (chars.length == 1) {
|
|
231
226
|
return chars[0];
|
|
@@ -242,6 +237,10 @@ const arrayToPattern = (chars, glue = '|') => {
|
|
|
242
237
|
|
|
243
238
|
return '(?:' + chars.join(glue) + ')';
|
|
244
239
|
};
|
|
240
|
+
const escapeToPattern = chars => {
|
|
241
|
+
const escaped = chars.map(diacritic => escape_regex(diacritic));
|
|
242
|
+
return arrayToPattern(escaped);
|
|
243
|
+
};
|
|
245
244
|
/**
|
|
246
245
|
* Get all possible combinations of substrings that add up to the given string
|
|
247
246
|
* https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string
|
|
@@ -266,7 +265,7 @@ const allSubstrings = input => {
|
|
|
266
265
|
*
|
|
267
266
|
*/
|
|
268
267
|
|
|
269
|
-
const generateDiacritics =
|
|
268
|
+
const generateDiacritics = code_points => {
|
|
270
269
|
var diacritics = {};
|
|
271
270
|
code_points.forEach(code_range => {
|
|
272
271
|
for (let i = code_range[0]; i <= code_range[1]; i++) {
|
|
@@ -275,13 +274,22 @@ const generateDiacritics = () => {
|
|
|
275
274
|
|
|
276
275
|
if (latin == diacritic.toLowerCase()) {
|
|
277
276
|
continue;
|
|
277
|
+
} // skip when latin is a string longer than 3 characters long
|
|
278
|
+
// bc the resulting regex patterns will be long
|
|
279
|
+
// eg:
|
|
280
|
+
// latin صلى الله عليه وسلم length 18 code point 65018
|
|
281
|
+
// latin جل جلاله length 8 code point 65019
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
if (latin.length > 3) {
|
|
285
|
+
continue;
|
|
278
286
|
}
|
|
279
287
|
|
|
280
288
|
if (!(latin in diacritics)) {
|
|
281
289
|
diacritics[latin] = [latin];
|
|
282
290
|
}
|
|
283
291
|
|
|
284
|
-
var patt = new RegExp(
|
|
292
|
+
var patt = new RegExp(escapeToPattern(diacritics[latin]), 'iu');
|
|
285
293
|
|
|
286
294
|
if (diacritic.match(patt)) {
|
|
287
295
|
continue;
|
|
@@ -289,13 +297,23 @@ const generateDiacritics = () => {
|
|
|
289
297
|
|
|
290
298
|
diacritics[latin].push(diacritic);
|
|
291
299
|
}
|
|
292
|
-
});
|
|
293
|
-
|
|
300
|
+
}); // filter out if there's only one character in the list
|
|
301
|
+
|
|
302
|
+
let latin_chars = Object.keys(diacritics);
|
|
303
|
+
|
|
304
|
+
for (let i = 0; i < latin_chars.length; i++) {
|
|
305
|
+
const latin = latin_chars[i];
|
|
306
|
+
|
|
307
|
+
if (diacritics[latin].length < 2) {
|
|
308
|
+
delete diacritics[latin];
|
|
309
|
+
}
|
|
310
|
+
} // latin character pattern
|
|
294
311
|
// match longer substrings first
|
|
295
312
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
//
|
|
313
|
+
|
|
314
|
+
latin_chars = Object.keys(diacritics).sort((a, b) => b.length - a.length);
|
|
315
|
+
latin_pat = new RegExp('(' + escapeToPattern(latin_chars) + accent_pat + '*)', 'gu'); // build diacritic patterns
|
|
316
|
+
// ae needs:
|
|
299
317
|
// (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))
|
|
300
318
|
|
|
301
319
|
var diacritic_patterns = {};
|
|
@@ -304,7 +322,7 @@ const generateDiacritics = () => {
|
|
|
304
322
|
var pattern = substrings.map(sub_pat => {
|
|
305
323
|
sub_pat = sub_pat.map(l => {
|
|
306
324
|
if (diacritics.hasOwnProperty(l)) {
|
|
307
|
-
return
|
|
325
|
+
return escapeToPattern(diacritics[l]);
|
|
308
326
|
}
|
|
309
327
|
|
|
310
328
|
return l;
|
|
@@ -323,27 +341,20 @@ const generateDiacritics = () => {
|
|
|
323
341
|
|
|
324
342
|
const diacriticRegexPoints = regex => {
|
|
325
343
|
if (diacritic_patterns === undefined) {
|
|
326
|
-
diacritic_patterns = generateDiacritics();
|
|
344
|
+
diacritic_patterns = generateDiacritics(code_points);
|
|
327
345
|
}
|
|
328
346
|
|
|
329
347
|
const decomposed = regex.normalize('NFKD').toLowerCase();
|
|
330
348
|
return decomposed.split(latin_pat).map(part => {
|
|
331
|
-
|
|
332
|
-
return '';
|
|
333
|
-
} // "ffl" or "ffl"
|
|
334
|
-
|
|
335
|
-
|
|
349
|
+
// "ffl" or "ffl"
|
|
336
350
|
const no_accent = asciifold(part);
|
|
337
351
|
|
|
352
|
+
if (no_accent == '') {
|
|
353
|
+
return '';
|
|
354
|
+
}
|
|
355
|
+
|
|
338
356
|
if (diacritic_patterns.hasOwnProperty(no_accent)) {
|
|
339
357
|
return diacritic_patterns[no_accent];
|
|
340
|
-
} // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627})
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
const composed_part = part.normalize('NFC');
|
|
344
|
-
|
|
345
|
-
if (composed_part != part) {
|
|
346
|
-
return arrayToPattern([part, composed_part]);
|
|
347
358
|
}
|
|
348
359
|
|
|
349
360
|
return part;
|
|
@@ -509,10 +520,10 @@ class Sifter {
|
|
|
509
520
|
}
|
|
510
521
|
|
|
511
522
|
if (word.length > 0) {
|
|
512
|
-
regex = escape_regex(word);
|
|
513
|
-
|
|
514
523
|
if (this.settings.diacritics) {
|
|
515
|
-
regex = diacriticRegexPoints(
|
|
524
|
+
regex = diacriticRegexPoints(word);
|
|
525
|
+
} else {
|
|
526
|
+
regex = escape_regex(word);
|
|
516
527
|
}
|
|
517
528
|
|
|
518
529
|
if (respect_word_boundaries) regex = "\\b" + regex;
|
|
@@ -1528,6 +1539,7 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
1528
1539
|
this.isInputHidden = false;
|
|
1529
1540
|
this.isSetup = false;
|
|
1530
1541
|
this.ignoreFocus = false;
|
|
1542
|
+
this.ignoreHover = false;
|
|
1531
1543
|
this.hasOptions = false;
|
|
1532
1544
|
this.currentResults = void 0;
|
|
1533
1545
|
this.lastValue = '';
|
|
@@ -1726,7 +1738,13 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
1726
1738
|
settings.load = loadDebounce(settings.load, settings.loadThrottle);
|
|
1727
1739
|
}
|
|
1728
1740
|
|
|
1729
|
-
self.control_input.type = input.type;
|
|
1741
|
+
self.control_input.type = input.type;
|
|
1742
|
+
addEvent(dropdown, 'mouseenter', e => {
|
|
1743
|
+
var target_match = parentMatch(e.target, '[data-selectable]', dropdown);
|
|
1744
|
+
if (target_match) self.onOptionHover(e, target_match);
|
|
1745
|
+
}, {
|
|
1746
|
+
capture: true
|
|
1747
|
+
}); // clicking on an option should select it
|
|
1730
1748
|
|
|
1731
1749
|
addEvent(dropdown, 'click', evt => {
|
|
1732
1750
|
const option = parentMatch(evt.target, '[data-selectable]');
|
|
@@ -1760,7 +1778,7 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
1760
1778
|
addEvent(focus_node, 'resize', () => self.positionDropdown(), passive_event);
|
|
1761
1779
|
addEvent(focus_node, 'blur', e => self.onBlur(e));
|
|
1762
1780
|
addEvent(focus_node, 'focus', e => self.onFocus(e));
|
|
1763
|
-
addEvent(
|
|
1781
|
+
addEvent(control_input, 'paste', e => self.onPaste(e));
|
|
1764
1782
|
|
|
1765
1783
|
const doc_mousedown = evt => {
|
|
1766
1784
|
// blur if target is outside of this instance
|
|
@@ -1787,18 +1805,24 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
1787
1805
|
}
|
|
1788
1806
|
};
|
|
1789
1807
|
|
|
1790
|
-
|
|
1808
|
+
const win_scroll = () => {
|
|
1791
1809
|
if (self.isOpen) {
|
|
1792
1810
|
self.positionDropdown();
|
|
1793
1811
|
}
|
|
1794
1812
|
};
|
|
1795
1813
|
|
|
1814
|
+
const win_hover = () => {
|
|
1815
|
+
self.ignoreHover = false;
|
|
1816
|
+
};
|
|
1817
|
+
|
|
1796
1818
|
addEvent(document, 'mousedown', doc_mousedown);
|
|
1797
1819
|
addEvent(window, 'scroll', win_scroll, passive_event);
|
|
1798
1820
|
addEvent(window, 'resize', win_scroll, passive_event);
|
|
1821
|
+
addEvent(window, 'mousemove', win_hover, passive_event);
|
|
1799
1822
|
|
|
1800
1823
|
this._destroy = () => {
|
|
1801
1824
|
document.removeEventListener('mousedown', doc_mousedown);
|
|
1825
|
+
window.removeEventListener('mousemove', win_hover);
|
|
1802
1826
|
window.removeEventListener('scroll', win_scroll);
|
|
1803
1827
|
window.removeEventListener('resize', win_scroll);
|
|
1804
1828
|
if (label) label.removeEventListener('click', label_click);
|
|
@@ -2004,21 +2028,29 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
2004
2028
|
// input and create Items for each separate value
|
|
2005
2029
|
|
|
2006
2030
|
|
|
2007
|
-
if (self.settings.splitOn) {
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
var pastedText = self.inputValue();
|
|
2031
|
+
if (!self.settings.splitOn) {
|
|
2032
|
+
return;
|
|
2033
|
+
} // Wait for pasted text to be recognized in value
|
|
2011
2034
|
|
|
2012
|
-
if (!pastedText.match(self.settings.splitOn)) {
|
|
2013
|
-
return;
|
|
2014
|
-
}
|
|
2015
2035
|
|
|
2016
|
-
|
|
2017
|
-
|
|
2036
|
+
setTimeout(() => {
|
|
2037
|
+
var pastedText = self.inputValue();
|
|
2038
|
+
|
|
2039
|
+
if (!pastedText.match(self.settings.splitOn)) {
|
|
2040
|
+
return;
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
var splitInput = pastedText.trim().split(self.settings.splitOn);
|
|
2044
|
+
iterate(splitInput, piece => {
|
|
2045
|
+
piece = hash_key(piece);
|
|
2046
|
+
|
|
2047
|
+
if (this.options[piece]) {
|
|
2048
|
+
self.addItem(piece);
|
|
2049
|
+
} else {
|
|
2018
2050
|
self.createItem(piece);
|
|
2019
|
-
}
|
|
2020
|
-
}
|
|
2021
|
-
}
|
|
2051
|
+
}
|
|
2052
|
+
});
|
|
2053
|
+
}, 0);
|
|
2022
2054
|
}
|
|
2023
2055
|
/**
|
|
2024
2056
|
* Triggered on <input> keypress.
|
|
@@ -2050,6 +2082,7 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
2050
2082
|
|
|
2051
2083
|
onKeyDown(e) {
|
|
2052
2084
|
var self = this;
|
|
2085
|
+
self.ignoreHover = true;
|
|
2053
2086
|
|
|
2054
2087
|
if (self.isLocked) {
|
|
2055
2088
|
if (e.keyCode !== KEY_TAB) {
|
|
@@ -2110,6 +2143,8 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
2110
2143
|
self.onOptionSelect(e, self.activeOption);
|
|
2111
2144
|
preventDefault(e); // if the option_create=null, the dropdown might be closed
|
|
2112
2145
|
} else if (self.settings.create && self.createItem()) {
|
|
2146
|
+
preventDefault(e); // don't submit form when searching for a value
|
|
2147
|
+
} else if (document.activeElement == self.control_input && self.isOpen) {
|
|
2113
2148
|
preventDefault(e);
|
|
2114
2149
|
}
|
|
2115
2150
|
|
|
@@ -2180,6 +2215,17 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
2180
2215
|
self.trigger('type', value);
|
|
2181
2216
|
}
|
|
2182
2217
|
}
|
|
2218
|
+
/**
|
|
2219
|
+
* Triggered when the user rolls over
|
|
2220
|
+
* an option in the autocomplete dropdown menu.
|
|
2221
|
+
*
|
|
2222
|
+
*/
|
|
2223
|
+
|
|
2224
|
+
|
|
2225
|
+
onOptionHover(evt, option) {
|
|
2226
|
+
if (this.ignoreHover) return;
|
|
2227
|
+
this.setActiveOption(option, false);
|
|
2228
|
+
}
|
|
2183
2229
|
/**
|
|
2184
2230
|
* Triggered on <input> focus.
|
|
2185
2231
|
*
|
|
@@ -2534,7 +2580,7 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
2534
2580
|
*/
|
|
2535
2581
|
|
|
2536
2582
|
|
|
2537
|
-
setActiveOption(option) {
|
|
2583
|
+
setActiveOption(option, scroll = true) {
|
|
2538
2584
|
if (option === this.activeOption) {
|
|
2539
2585
|
return;
|
|
2540
2586
|
}
|
|
@@ -2549,7 +2595,7 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
2549
2595
|
'aria-selected': 'true'
|
|
2550
2596
|
});
|
|
2551
2597
|
addClasses(option, 'active');
|
|
2552
|
-
this.scrollToOption(option);
|
|
2598
|
+
if (scroll) this.scrollToOption(option);
|
|
2553
2599
|
}
|
|
2554
2600
|
/**
|
|
2555
2601
|
* Sets the dropdown_content scrollTop to display the option
|
|
@@ -3182,13 +3228,14 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
3182
3228
|
*/
|
|
3183
3229
|
|
|
3184
3230
|
|
|
3185
|
-
clearOptions() {
|
|
3231
|
+
clearOptions(filter) {
|
|
3232
|
+
const boundFilter = (filter || this.clearFilter).bind(this);
|
|
3186
3233
|
this.loadedSearches = {};
|
|
3187
3234
|
this.userOptions = {};
|
|
3188
3235
|
this.clearCache();
|
|
3189
|
-
|
|
3236
|
+
const selected = {};
|
|
3190
3237
|
iterate(this.options, (option, key) => {
|
|
3191
|
-
if (
|
|
3238
|
+
if (boundFilter(option, key)) {
|
|
3192
3239
|
selected[key] = this.options[key];
|
|
3193
3240
|
}
|
|
3194
3241
|
});
|
|
@@ -3196,6 +3243,20 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
3196
3243
|
this.lastQuery = null;
|
|
3197
3244
|
this.trigger('option_clear');
|
|
3198
3245
|
}
|
|
3246
|
+
/**
|
|
3247
|
+
* Used by clearOptions() to decide whether or not an option should be removed
|
|
3248
|
+
* Return true to keep an option, false to remove
|
|
3249
|
+
*
|
|
3250
|
+
*/
|
|
3251
|
+
|
|
3252
|
+
|
|
3253
|
+
clearFilter(option, value) {
|
|
3254
|
+
if (this.items.indexOf(value) >= 0) {
|
|
3255
|
+
return true;
|
|
3256
|
+
}
|
|
3257
|
+
|
|
3258
|
+
return false;
|
|
3259
|
+
}
|
|
3199
3260
|
/**
|
|
3200
3261
|
* Returns the dom element of the option
|
|
3201
3262
|
* matching the given value.
|
|
@@ -3515,11 +3576,11 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
3515
3576
|
refreshValidityState() {
|
|
3516
3577
|
var self = this;
|
|
3517
3578
|
|
|
3518
|
-
if (!self.input.
|
|
3579
|
+
if (!self.input.validity) {
|
|
3519
3580
|
return;
|
|
3520
3581
|
}
|
|
3521
3582
|
|
|
3522
|
-
self.isValid = self.input.
|
|
3583
|
+
self.isValid = self.input.validity.valid;
|
|
3523
3584
|
self.isInvalid = !self.isValid;
|
|
3524
3585
|
}
|
|
3525
3586
|
/**
|
|
@@ -3746,9 +3807,7 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
3746
3807
|
}
|
|
3747
3808
|
}
|
|
3748
3809
|
|
|
3749
|
-
|
|
3750
|
-
|
|
3751
|
-
if (!values.length || typeof self.settings.onDelete === 'function' && self.settings.onDelete.call(self, values, e) === false) {
|
|
3810
|
+
if (!self.shouldDelete(rm_items, e)) {
|
|
3752
3811
|
return false;
|
|
3753
3812
|
}
|
|
3754
3813
|
|
|
@@ -3767,6 +3826,20 @@ class TomSelect extends MicroPlugin(MicroEvent) {
|
|
|
3767
3826
|
self.refreshOptions(false);
|
|
3768
3827
|
return true;
|
|
3769
3828
|
}
|
|
3829
|
+
/**
|
|
3830
|
+
* Return true if the items should be deleted
|
|
3831
|
+
*/
|
|
3832
|
+
|
|
3833
|
+
|
|
3834
|
+
shouldDelete(items, evt) {
|
|
3835
|
+
const values = items.map(item => item.dataset.value); // allow the callback to abort
|
|
3836
|
+
|
|
3837
|
+
if (!values.length || typeof this.settings.onDelete === 'function' && this.settings.onDelete(values, evt) === false) {
|
|
3838
|
+
return false;
|
|
3839
|
+
}
|
|
3840
|
+
|
|
3841
|
+
return true;
|
|
3842
|
+
}
|
|
3770
3843
|
/**
|
|
3771
3844
|
* Selects the previous / next item (depending on the `direction` argument).
|
|
3772
3845
|
*
|
|
@@ -4124,10 +4197,12 @@ function checkbox_options () {
|
|
|
4124
4197
|
setTimeout(() => {
|
|
4125
4198
|
var checkbox = option.querySelector('input');
|
|
4126
4199
|
|
|
4127
|
-
if (
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
|
|
4200
|
+
if (checkbox instanceof HTMLInputElement) {
|
|
4201
|
+
if (option.classList.contains('selected')) {
|
|
4202
|
+
checkbox.checked = true;
|
|
4203
|
+
} else {
|
|
4204
|
+
checkbox.checked = false;
|
|
4205
|
+
}
|
|
4131
4206
|
}
|
|
4132
4207
|
}, 1);
|
|
4133
4208
|
}; // add checkbox to option template
|
|
@@ -4454,7 +4529,9 @@ function dropdown_input () {
|
|
|
4454
4529
|
|
|
4455
4530
|
self.hook('before', 'close', () => {
|
|
4456
4531
|
if (!self.isOpen) return;
|
|
4457
|
-
self.focus_node.focus(
|
|
4532
|
+
self.focus_node.focus({
|
|
4533
|
+
preventScroll: true
|
|
4534
|
+
});
|
|
4458
4535
|
});
|
|
4459
4536
|
});
|
|
4460
4537
|
}
|
|
@@ -4492,12 +4569,8 @@ function input_autogrow () {
|
|
|
4492
4569
|
|
|
4493
4570
|
|
|
4494
4571
|
var resize = () => {
|
|
4495
|
-
|
|
4496
|
-
|
|
4497
|
-
control.style.width = test_input.clientWidth + 'px';
|
|
4498
|
-
} else {
|
|
4499
|
-
control.style.width = '';
|
|
4500
|
-
}
|
|
4572
|
+
test_input.textContent = control.value;
|
|
4573
|
+
control.style.width = test_input.clientWidth + 'px';
|
|
4501
4574
|
};
|
|
4502
4575
|
|
|
4503
4576
|
resize();
|
|
@@ -4576,6 +4649,7 @@ function optgroup_columns () {
|
|
|
4576
4649
|
return orig_keydown.call(self, evt);
|
|
4577
4650
|
}
|
|
4578
4651
|
|
|
4652
|
+
self.ignoreHover = true;
|
|
4579
4653
|
optgroup = parentMatch(self.activeOption, '[data-group]');
|
|
4580
4654
|
index = nodeIndex(self.activeOption, '[data-selectable]');
|
|
4581
4655
|
|
|
@@ -4635,9 +4709,9 @@ function remove_button (userOptions) {
|
|
|
4635
4709
|
var orig_render_item = self.settings.render.item;
|
|
4636
4710
|
|
|
4637
4711
|
self.settings.render.item = (data, escape) => {
|
|
4638
|
-
var
|
|
4712
|
+
var item = getDom(orig_render_item.call(self, data, escape));
|
|
4639
4713
|
var close_button = getDom(html);
|
|
4640
|
-
|
|
4714
|
+
item.appendChild(close_button);
|
|
4641
4715
|
addEvent(close_button, 'mousedown', evt => {
|
|
4642
4716
|
preventDefault(evt, true);
|
|
4643
4717
|
});
|
|
@@ -4645,12 +4719,12 @@ function remove_button (userOptions) {
|
|
|
4645
4719
|
// propagating will trigger the dropdown to show for single mode
|
|
4646
4720
|
preventDefault(evt, true);
|
|
4647
4721
|
if (self.isLocked) return;
|
|
4648
|
-
|
|
4649
|
-
self.removeItem(
|
|
4722
|
+
if (!self.shouldDelete([item], evt)) return;
|
|
4723
|
+
self.removeItem(item);
|
|
4650
4724
|
self.refreshOptions(false);
|
|
4651
4725
|
self.inputState();
|
|
4652
4726
|
});
|
|
4653
|
-
return
|
|
4727
|
+
return item;
|
|
4654
4728
|
};
|
|
4655
4729
|
});
|
|
4656
4730
|
}
|
|
@@ -4714,10 +4788,11 @@ function virtual_scroll () {
|
|
|
4714
4788
|
var dropdown_content;
|
|
4715
4789
|
var loading_more = false;
|
|
4716
4790
|
var load_more_opt;
|
|
4791
|
+
var default_values = [];
|
|
4717
4792
|
|
|
4718
4793
|
if (!self.settings.shouldLoadMore) {
|
|
4719
4794
|
// return true if additional results should be loaded
|
|
4720
|
-
self.settings.shouldLoadMore =
|
|
4795
|
+
self.settings.shouldLoadMore = () => {
|
|
4721
4796
|
const scroll_percent = dropdown_content.clientHeight / (dropdown_content.scrollHeight - dropdown_content.scrollTop);
|
|
4722
4797
|
|
|
4723
4798
|
if (scroll_percent > 0.9) {
|
|
@@ -4749,7 +4824,7 @@ function virtual_scroll () {
|
|
|
4749
4824
|
field: '$score'
|
|
4750
4825
|
}]; // can we load more results for given query?
|
|
4751
4826
|
|
|
4752
|
-
|
|
4827
|
+
const canLoadMore = query => {
|
|
4753
4828
|
if (typeof self.settings.maxOptions === 'number' && dropdown_content.children.length >= self.settings.maxOptions) {
|
|
4754
4829
|
return false;
|
|
4755
4830
|
}
|
|
@@ -4759,15 +4834,23 @@ function virtual_scroll () {
|
|
|
4759
4834
|
}
|
|
4760
4835
|
|
|
4761
4836
|
return false;
|
|
4762
|
-
}
|
|
4837
|
+
};
|
|
4838
|
+
|
|
4839
|
+
const clearFilter = (option, value) => {
|
|
4840
|
+
if (self.items.indexOf(value) >= 0 || default_values.indexOf(value) >= 0) {
|
|
4841
|
+
return true;
|
|
4842
|
+
}
|
|
4843
|
+
|
|
4844
|
+
return false;
|
|
4845
|
+
}; // set the next url that will be
|
|
4763
4846
|
|
|
4764
4847
|
|
|
4765
|
-
self.setNextUrl =
|
|
4848
|
+
self.setNextUrl = (value, next_url) => {
|
|
4766
4849
|
pagination[value] = next_url;
|
|
4767
4850
|
}; // getUrl() to be used in settings.load()
|
|
4768
4851
|
|
|
4769
4852
|
|
|
4770
|
-
self.getUrl =
|
|
4853
|
+
self.getUrl = query => {
|
|
4771
4854
|
if (query in pagination) {
|
|
4772
4855
|
const next_url = pagination[query];
|
|
4773
4856
|
pagination[query] = false;
|
|
@@ -4801,7 +4884,7 @@ function virtual_scroll () {
|
|
|
4801
4884
|
|
|
4802
4885
|
self.hook('instead', 'loadCallback', (options, optgroups) => {
|
|
4803
4886
|
if (!loading_more) {
|
|
4804
|
-
self.clearOptions();
|
|
4887
|
+
self.clearOptions(clearFilter);
|
|
4805
4888
|
} else if (load_more_opt && options.length > 0) {
|
|
4806
4889
|
load_more_opt.dataset.value = options[0][self.settings.valueField];
|
|
4807
4890
|
}
|
|
@@ -4839,18 +4922,19 @@ function virtual_scroll () {
|
|
|
4839
4922
|
}); // add scroll listener and default templates
|
|
4840
4923
|
|
|
4841
4924
|
self.on('initialize', () => {
|
|
4925
|
+
default_values = Object.keys(self.options);
|
|
4842
4926
|
dropdown_content = self.dropdown_content; // default templates
|
|
4843
4927
|
|
|
4844
4928
|
self.settings.render = Object.assign({}, {
|
|
4845
|
-
loading_more:
|
|
4929
|
+
loading_more: () => {
|
|
4846
4930
|
return `<div class="loading-more-results">Loading more results ... </div>`;
|
|
4847
4931
|
},
|
|
4848
|
-
no_more_results:
|
|
4932
|
+
no_more_results: () => {
|
|
4849
4933
|
return `<div class="no-more-results">No more results</div>`;
|
|
4850
4934
|
}
|
|
4851
4935
|
}, self.settings.render); // watch dropdown content scroll position
|
|
4852
4936
|
|
|
4853
|
-
dropdown_content.addEventListener('scroll',
|
|
4937
|
+
dropdown_content.addEventListener('scroll', () => {
|
|
4854
4938
|
if (!self.settings.shouldLoadMore.call(self)) {
|
|
4855
4939
|
return;
|
|
4856
4940
|
} // !important: this will get checked again in load() but we still need to check here otherwise loading_more will be set to true
|