tom-select-rails 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -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
|
|
@@ -193,24 +193,20 @@
|
|
193
193
|
};
|
194
194
|
}
|
195
195
|
|
196
|
+
// @ts-ignore TS2691 "An import path cannot end with a '.ts' extension"
|
196
197
|
// https://github.com/andrewrk/node-diacritics/blob/master/index.js
|
197
198
|
var latin_pat;
|
198
199
|
const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}]'; // \u{2bc}
|
199
200
|
|
200
|
-
const accent_reg = new RegExp(accent_pat, '
|
201
|
+
const accent_reg = new RegExp(accent_pat, 'gu');
|
201
202
|
var diacritic_patterns;
|
202
203
|
const latin_convert = {
|
203
204
|
'æ': 'ae',
|
204
205
|
'ⱥ': 'a',
|
205
206
|
'ø': 'o'
|
206
207
|
};
|
207
|
-
const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), '
|
208
|
-
|
209
|
-
* code points generated from toCodePoints();
|
210
|
-
* removed 65339 to 65345
|
211
|
-
*/
|
212
|
-
|
213
|
-
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]];
|
208
|
+
const convert_pat = new RegExp(Object.keys(latin_convert).join('|'), 'gu');
|
209
|
+
const code_points = [[0, 65535]];
|
214
210
|
/**
|
215
211
|
* Remove accents
|
216
212
|
* via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703
|
@@ -229,7 +225,6 @@
|
|
229
225
|
*
|
230
226
|
*/
|
231
227
|
|
232
|
-
|
233
228
|
const arrayToPattern = (chars, glue = '|') => {
|
234
229
|
if (chars.length == 1) {
|
235
230
|
return chars[0];
|
@@ -246,6 +241,10 @@
|
|
246
241
|
|
247
242
|
return '(?:' + chars.join(glue) + ')';
|
248
243
|
};
|
244
|
+
const escapeToPattern = chars => {
|
245
|
+
const escaped = chars.map(diacritic => escape_regex(diacritic));
|
246
|
+
return arrayToPattern(escaped);
|
247
|
+
};
|
249
248
|
/**
|
250
249
|
* Get all possible combinations of substrings that add up to the given string
|
251
250
|
* https://stackoverflow.com/questions/30169587/find-all-the-combination-of-substrings-that-add-up-to-the-given-string
|
@@ -270,7 +269,7 @@
|
|
270
269
|
*
|
271
270
|
*/
|
272
271
|
|
273
|
-
const generateDiacritics =
|
272
|
+
const generateDiacritics = code_points => {
|
274
273
|
var diacritics = {};
|
275
274
|
code_points.forEach(code_range => {
|
276
275
|
for (let i = code_range[0]; i <= code_range[1]; i++) {
|
@@ -279,13 +278,22 @@
|
|
279
278
|
|
280
279
|
if (latin == diacritic.toLowerCase()) {
|
281
280
|
continue;
|
281
|
+
} // skip when latin is a string longer than 3 characters long
|
282
|
+
// bc the resulting regex patterns will be long
|
283
|
+
// eg:
|
284
|
+
// latin صلى الله عليه وسلم length 18 code point 65018
|
285
|
+
// latin جل جلاله length 8 code point 65019
|
286
|
+
|
287
|
+
|
288
|
+
if (latin.length > 3) {
|
289
|
+
continue;
|
282
290
|
}
|
283
291
|
|
284
292
|
if (!(latin in diacritics)) {
|
285
293
|
diacritics[latin] = [latin];
|
286
294
|
}
|
287
295
|
|
288
|
-
var patt = new RegExp(
|
296
|
+
var patt = new RegExp(escapeToPattern(diacritics[latin]), 'iu');
|
289
297
|
|
290
298
|
if (diacritic.match(patt)) {
|
291
299
|
continue;
|
@@ -293,13 +301,23 @@
|
|
293
301
|
|
294
302
|
diacritics[latin].push(diacritic);
|
295
303
|
}
|
296
|
-
});
|
297
|
-
|
304
|
+
}); // filter out if there's only one character in the list
|
305
|
+
|
306
|
+
let latin_chars = Object.keys(diacritics);
|
307
|
+
|
308
|
+
for (let i = 0; i < latin_chars.length; i++) {
|
309
|
+
const latin = latin_chars[i];
|
310
|
+
|
311
|
+
if (diacritics[latin].length < 2) {
|
312
|
+
delete diacritics[latin];
|
313
|
+
}
|
314
|
+
} // latin character pattern
|
298
315
|
// match longer substrings first
|
299
316
|
|
300
|
-
|
301
|
-
|
302
|
-
//
|
317
|
+
|
318
|
+
latin_chars = Object.keys(diacritics).sort((a, b) => b.length - a.length);
|
319
|
+
latin_pat = new RegExp('(' + escapeToPattern(latin_chars) + accent_pat + '*)', 'gu'); // build diacritic patterns
|
320
|
+
// ae needs:
|
303
321
|
// (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))
|
304
322
|
|
305
323
|
var diacritic_patterns = {};
|
@@ -308,7 +326,7 @@
|
|
308
326
|
var pattern = substrings.map(sub_pat => {
|
309
327
|
sub_pat = sub_pat.map(l => {
|
310
328
|
if (diacritics.hasOwnProperty(l)) {
|
311
|
-
return
|
329
|
+
return escapeToPattern(diacritics[l]);
|
312
330
|
}
|
313
331
|
|
314
332
|
return l;
|
@@ -327,27 +345,20 @@
|
|
327
345
|
|
328
346
|
const diacriticRegexPoints = regex => {
|
329
347
|
if (diacritic_patterns === undefined) {
|
330
|
-
diacritic_patterns = generateDiacritics();
|
348
|
+
diacritic_patterns = generateDiacritics(code_points);
|
331
349
|
}
|
332
350
|
|
333
351
|
const decomposed = regex.normalize('NFKD').toLowerCase();
|
334
352
|
return decomposed.split(latin_pat).map(part => {
|
335
|
-
|
336
|
-
return '';
|
337
|
-
} // "ffl" or "ffl"
|
338
|
-
|
339
|
-
|
353
|
+
// "ffl" or "ffl"
|
340
354
|
const no_accent = asciifold(part);
|
341
355
|
|
356
|
+
if (no_accent == '') {
|
357
|
+
return '';
|
358
|
+
}
|
359
|
+
|
342
360
|
if (diacritic_patterns.hasOwnProperty(no_accent)) {
|
343
361
|
return diacritic_patterns[no_accent];
|
344
|
-
} // 'أهلا' (\u{623}\u{647}\u{644}\u{627}) or 'أهلا' (\u{627}\u{654}\u{647}\u{644}\u{627})
|
345
|
-
|
346
|
-
|
347
|
-
const composed_part = part.normalize('NFC');
|
348
|
-
|
349
|
-
if (composed_part != part) {
|
350
|
-
return arrayToPattern([part, composed_part]);
|
351
362
|
}
|
352
363
|
|
353
364
|
return part;
|
@@ -513,10 +524,10 @@
|
|
513
524
|
}
|
514
525
|
|
515
526
|
if (word.length > 0) {
|
516
|
-
regex = escape_regex(word);
|
517
|
-
|
518
527
|
if (this.settings.diacritics) {
|
519
|
-
regex = diacriticRegexPoints(
|
528
|
+
regex = diacriticRegexPoints(word);
|
529
|
+
} else {
|
530
|
+
regex = escape_regex(word);
|
520
531
|
}
|
521
532
|
|
522
533
|
if (respect_word_boundaries) regex = "\\b" + regex;
|
@@ -1532,6 +1543,7 @@
|
|
1532
1543
|
this.isInputHidden = false;
|
1533
1544
|
this.isSetup = false;
|
1534
1545
|
this.ignoreFocus = false;
|
1546
|
+
this.ignoreHover = false;
|
1535
1547
|
this.hasOptions = false;
|
1536
1548
|
this.currentResults = void 0;
|
1537
1549
|
this.lastValue = '';
|
@@ -1730,7 +1742,13 @@
|
|
1730
1742
|
settings.load = loadDebounce(settings.load, settings.loadThrottle);
|
1731
1743
|
}
|
1732
1744
|
|
1733
|
-
self.control_input.type = input.type;
|
1745
|
+
self.control_input.type = input.type;
|
1746
|
+
addEvent(dropdown, 'mouseenter', e => {
|
1747
|
+
var target_match = parentMatch(e.target, '[data-selectable]', dropdown);
|
1748
|
+
if (target_match) self.onOptionHover(e, target_match);
|
1749
|
+
}, {
|
1750
|
+
capture: true
|
1751
|
+
}); // clicking on an option should select it
|
1734
1752
|
|
1735
1753
|
addEvent(dropdown, 'click', evt => {
|
1736
1754
|
const option = parentMatch(evt.target, '[data-selectable]');
|
@@ -1764,7 +1782,7 @@
|
|
1764
1782
|
addEvent(focus_node, 'resize', () => self.positionDropdown(), passive_event);
|
1765
1783
|
addEvent(focus_node, 'blur', e => self.onBlur(e));
|
1766
1784
|
addEvent(focus_node, 'focus', e => self.onFocus(e));
|
1767
|
-
addEvent(
|
1785
|
+
addEvent(control_input, 'paste', e => self.onPaste(e));
|
1768
1786
|
|
1769
1787
|
const doc_mousedown = evt => {
|
1770
1788
|
// blur if target is outside of this instance
|
@@ -1791,18 +1809,24 @@
|
|
1791
1809
|
}
|
1792
1810
|
};
|
1793
1811
|
|
1794
|
-
|
1812
|
+
const win_scroll = () => {
|
1795
1813
|
if (self.isOpen) {
|
1796
1814
|
self.positionDropdown();
|
1797
1815
|
}
|
1798
1816
|
};
|
1799
1817
|
|
1818
|
+
const win_hover = () => {
|
1819
|
+
self.ignoreHover = false;
|
1820
|
+
};
|
1821
|
+
|
1800
1822
|
addEvent(document, 'mousedown', doc_mousedown);
|
1801
1823
|
addEvent(window, 'scroll', win_scroll, passive_event);
|
1802
1824
|
addEvent(window, 'resize', win_scroll, passive_event);
|
1825
|
+
addEvent(window, 'mousemove', win_hover, passive_event);
|
1803
1826
|
|
1804
1827
|
this._destroy = () => {
|
1805
1828
|
document.removeEventListener('mousedown', doc_mousedown);
|
1829
|
+
window.removeEventListener('mousemove', win_hover);
|
1806
1830
|
window.removeEventListener('scroll', win_scroll);
|
1807
1831
|
window.removeEventListener('resize', win_scroll);
|
1808
1832
|
if (label) label.removeEventListener('click', label_click);
|
@@ -2008,21 +2032,29 @@
|
|
2008
2032
|
// input and create Items for each separate value
|
2009
2033
|
|
2010
2034
|
|
2011
|
-
if (self.settings.splitOn) {
|
2012
|
-
|
2013
|
-
|
2014
|
-
var pastedText = self.inputValue();
|
2035
|
+
if (!self.settings.splitOn) {
|
2036
|
+
return;
|
2037
|
+
} // Wait for pasted text to be recognized in value
|
2015
2038
|
|
2016
|
-
if (!pastedText.match(self.settings.splitOn)) {
|
2017
|
-
return;
|
2018
|
-
}
|
2019
2039
|
|
2020
|
-
|
2021
|
-
|
2040
|
+
setTimeout(() => {
|
2041
|
+
var pastedText = self.inputValue();
|
2042
|
+
|
2043
|
+
if (!pastedText.match(self.settings.splitOn)) {
|
2044
|
+
return;
|
2045
|
+
}
|
2046
|
+
|
2047
|
+
var splitInput = pastedText.trim().split(self.settings.splitOn);
|
2048
|
+
iterate(splitInput, piece => {
|
2049
|
+
piece = hash_key(piece);
|
2050
|
+
|
2051
|
+
if (this.options[piece]) {
|
2052
|
+
self.addItem(piece);
|
2053
|
+
} else {
|
2022
2054
|
self.createItem(piece);
|
2023
|
-
}
|
2024
|
-
}
|
2025
|
-
}
|
2055
|
+
}
|
2056
|
+
});
|
2057
|
+
}, 0);
|
2026
2058
|
}
|
2027
2059
|
/**
|
2028
2060
|
* Triggered on <input> keypress.
|
@@ -2054,6 +2086,7 @@
|
|
2054
2086
|
|
2055
2087
|
onKeyDown(e) {
|
2056
2088
|
var self = this;
|
2089
|
+
self.ignoreHover = true;
|
2057
2090
|
|
2058
2091
|
if (self.isLocked) {
|
2059
2092
|
if (e.keyCode !== KEY_TAB) {
|
@@ -2114,6 +2147,8 @@
|
|
2114
2147
|
self.onOptionSelect(e, self.activeOption);
|
2115
2148
|
preventDefault(e); // if the option_create=null, the dropdown might be closed
|
2116
2149
|
} else if (self.settings.create && self.createItem()) {
|
2150
|
+
preventDefault(e); // don't submit form when searching for a value
|
2151
|
+
} else if (document.activeElement == self.control_input && self.isOpen) {
|
2117
2152
|
preventDefault(e);
|
2118
2153
|
}
|
2119
2154
|
|
@@ -2184,6 +2219,17 @@
|
|
2184
2219
|
self.trigger('type', value);
|
2185
2220
|
}
|
2186
2221
|
}
|
2222
|
+
/**
|
2223
|
+
* Triggered when the user rolls over
|
2224
|
+
* an option in the autocomplete dropdown menu.
|
2225
|
+
*
|
2226
|
+
*/
|
2227
|
+
|
2228
|
+
|
2229
|
+
onOptionHover(evt, option) {
|
2230
|
+
if (this.ignoreHover) return;
|
2231
|
+
this.setActiveOption(option, false);
|
2232
|
+
}
|
2187
2233
|
/**
|
2188
2234
|
* Triggered on <input> focus.
|
2189
2235
|
*
|
@@ -2538,7 +2584,7 @@
|
|
2538
2584
|
*/
|
2539
2585
|
|
2540
2586
|
|
2541
|
-
setActiveOption(option) {
|
2587
|
+
setActiveOption(option, scroll = true) {
|
2542
2588
|
if (option === this.activeOption) {
|
2543
2589
|
return;
|
2544
2590
|
}
|
@@ -2553,7 +2599,7 @@
|
|
2553
2599
|
'aria-selected': 'true'
|
2554
2600
|
});
|
2555
2601
|
addClasses(option, 'active');
|
2556
|
-
this.scrollToOption(option);
|
2602
|
+
if (scroll) this.scrollToOption(option);
|
2557
2603
|
}
|
2558
2604
|
/**
|
2559
2605
|
* Sets the dropdown_content scrollTop to display the option
|
@@ -3186,13 +3232,14 @@
|
|
3186
3232
|
*/
|
3187
3233
|
|
3188
3234
|
|
3189
|
-
clearOptions() {
|
3235
|
+
clearOptions(filter) {
|
3236
|
+
const boundFilter = (filter || this.clearFilter).bind(this);
|
3190
3237
|
this.loadedSearches = {};
|
3191
3238
|
this.userOptions = {};
|
3192
3239
|
this.clearCache();
|
3193
|
-
|
3240
|
+
const selected = {};
|
3194
3241
|
iterate(this.options, (option, key) => {
|
3195
|
-
if (
|
3242
|
+
if (boundFilter(option, key)) {
|
3196
3243
|
selected[key] = this.options[key];
|
3197
3244
|
}
|
3198
3245
|
});
|
@@ -3200,6 +3247,20 @@
|
|
3200
3247
|
this.lastQuery = null;
|
3201
3248
|
this.trigger('option_clear');
|
3202
3249
|
}
|
3250
|
+
/**
|
3251
|
+
* Used by clearOptions() to decide whether or not an option should be removed
|
3252
|
+
* Return true to keep an option, false to remove
|
3253
|
+
*
|
3254
|
+
*/
|
3255
|
+
|
3256
|
+
|
3257
|
+
clearFilter(option, value) {
|
3258
|
+
if (this.items.indexOf(value) >= 0) {
|
3259
|
+
return true;
|
3260
|
+
}
|
3261
|
+
|
3262
|
+
return false;
|
3263
|
+
}
|
3203
3264
|
/**
|
3204
3265
|
* Returns the dom element of the option
|
3205
3266
|
* matching the given value.
|
@@ -3519,11 +3580,11 @@
|
|
3519
3580
|
refreshValidityState() {
|
3520
3581
|
var self = this;
|
3521
3582
|
|
3522
|
-
if (!self.input.
|
3583
|
+
if (!self.input.validity) {
|
3523
3584
|
return;
|
3524
3585
|
}
|
3525
3586
|
|
3526
|
-
self.isValid = self.input.
|
3587
|
+
self.isValid = self.input.validity.valid;
|
3527
3588
|
self.isInvalid = !self.isValid;
|
3528
3589
|
}
|
3529
3590
|
/**
|
@@ -3750,9 +3811,7 @@
|
|
3750
3811
|
}
|
3751
3812
|
}
|
3752
3813
|
|
3753
|
-
|
3754
|
-
|
3755
|
-
if (!values.length || typeof self.settings.onDelete === 'function' && self.settings.onDelete.call(self, values, e) === false) {
|
3814
|
+
if (!self.shouldDelete(rm_items, e)) {
|
3756
3815
|
return false;
|
3757
3816
|
}
|
3758
3817
|
|
@@ -3771,6 +3830,20 @@
|
|
3771
3830
|
self.refreshOptions(false);
|
3772
3831
|
return true;
|
3773
3832
|
}
|
3833
|
+
/**
|
3834
|
+
* Return true if the items should be deleted
|
3835
|
+
*/
|
3836
|
+
|
3837
|
+
|
3838
|
+
shouldDelete(items, evt) {
|
3839
|
+
const values = items.map(item => item.dataset.value); // allow the callback to abort
|
3840
|
+
|
3841
|
+
if (!values.length || typeof this.settings.onDelete === 'function' && this.settings.onDelete(values, evt) === false) {
|
3842
|
+
return false;
|
3843
|
+
}
|
3844
|
+
|
3845
|
+
return true;
|
3846
|
+
}
|
3774
3847
|
/**
|
3775
3848
|
* Selects the previous / next item (depending on the `direction` argument).
|
3776
3849
|
*
|
@@ -4212,7 +4285,9 @@
|
|
4212
4285
|
|
4213
4286
|
self.hook('before', 'close', () => {
|
4214
4287
|
if (!self.isOpen) return;
|
4215
|
-
self.focus_node.focus(
|
4288
|
+
self.focus_node.focus({
|
4289
|
+
preventScroll: true
|
4290
|
+
});
|
4216
4291
|
});
|
4217
4292
|
});
|
4218
4293
|
}
|
@@ -4275,9 +4350,9 @@
|
|
4275
4350
|
var orig_render_item = self.settings.render.item;
|
4276
4351
|
|
4277
4352
|
self.settings.render.item = (data, escape) => {
|
4278
|
-
var
|
4353
|
+
var item = getDom(orig_render_item.call(self, data, escape));
|
4279
4354
|
var close_button = getDom(html);
|
4280
|
-
|
4355
|
+
item.appendChild(close_button);
|
4281
4356
|
addEvent(close_button, 'mousedown', evt => {
|
4282
4357
|
preventDefault(evt, true);
|
4283
4358
|
});
|
@@ -4285,12 +4360,12 @@
|
|
4285
4360
|
// propagating will trigger the dropdown to show for single mode
|
4286
4361
|
preventDefault(evt, true);
|
4287
4362
|
if (self.isLocked) return;
|
4288
|
-
|
4289
|
-
self.removeItem(
|
4363
|
+
if (!self.shouldDelete([item], evt)) return;
|
4364
|
+
self.removeItem(item);
|
4290
4365
|
self.refreshOptions(false);
|
4291
4366
|
self.inputState();
|
4292
4367
|
});
|
4293
|
-
return
|
4368
|
+
return item;
|
4294
4369
|
};
|
4295
4370
|
});
|
4296
4371
|
}
|