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.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tom-select-rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js +168 -84
  4. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.complete.js.map +1 -1
  5. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js +132 -59
  6. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.js.map +1 -1
  7. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js +140 -65
  8. data/vendor/assets/javascripts/tom-select-rails/cjs/tom-select.popular.js.map +1 -1
  9. data/vendor/assets/javascripts/tom-select-rails/cjs/utils.js +1 -1
  10. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js +3 -3
  11. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js.map +1 -1
  12. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.js +1 -1
  13. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js +9 -7
  14. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js.map +1 -1
  15. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js +3 -3
  16. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/clear_button/plugin.js.map +1 -1
  17. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.js +1 -1
  18. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js +3 -3
  19. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js.map +1 -1
  20. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js +6 -4
  21. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_input/plugin.js.map +1 -1
  22. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js +3 -7
  23. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/input_autogrow/plugin.js.map +1 -1
  24. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.js +1 -1
  25. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js +1 -1
  26. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js +4 -3
  27. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js.map +1 -1
  28. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js +8 -8
  29. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/remove_button/plugin.js.map +1 -1
  30. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.js +1 -1
  31. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js +22 -12
  32. data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js.map +1 -1
  33. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js +168 -84
  34. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.complete.js.map +1 -1
  35. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js +132 -59
  36. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.js.map +1 -1
  37. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js +140 -65
  38. data/vendor/assets/javascripts/tom-select-rails/esm/tom-select.popular.js.map +1 -1
  39. data/vendor/assets/javascripts/tom-select-rails/esm/utils.js +1 -1
  40. data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js +3 -3
  41. data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js.map +1 -1
  42. data/vendor/assets/javascripts/tom-select-rails/js/plugins/change_listener.js +1 -1
  43. data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js +9 -7
  44. data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js.map +1 -1
  45. data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js +3 -3
  46. data/vendor/assets/javascripts/tom-select-rails/js/plugins/clear_button.js.map +1 -1
  47. data/vendor/assets/javascripts/tom-select-rails/js/plugins/drag_drop.js +1 -1
  48. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js +3 -3
  49. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js.map +1 -1
  50. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js +6 -4
  51. data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_input.js.map +1 -1
  52. data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js +3 -7
  53. data/vendor/assets/javascripts/tom-select-rails/js/plugins/input_autogrow.js.map +1 -1
  54. data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_active_items.js +1 -1
  55. data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js +1 -1
  56. data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js +4 -3
  57. data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js.map +1 -1
  58. data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js +8 -8
  59. data/vendor/assets/javascripts/tom-select-rails/js/plugins/remove_button.js.map +1 -1
  60. data/vendor/assets/javascripts/tom-select-rails/js/plugins/restore_on_backspace.js +1 -1
  61. data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js +22 -12
  62. data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js.map +1 -1
  63. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js +132 -59
  64. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.js.map +1 -1
  65. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js +142 -142
  66. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.base.min.js.map +1 -1
  67. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js +168 -84
  68. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.js.map +1 -1
  69. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js +157 -156
  70. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.complete.min.js.map +1 -1
  71. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js +140 -65
  72. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.js.map +1 -1
  73. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js +142 -143
  74. data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js.map +1 -1
  75. data/vendor/assets/javascripts/tom-select-rails/types/tom-select.d.ts +20 -3
  76. data/vendor/assets/javascripts/tom-select-rails/types/types/core.d.ts +2 -1
  77. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css +3 -7
  78. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css.map +1 -1
  79. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css +1 -1
  80. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.min.css.map +1 -1
  81. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css +3 -7
  82. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.css.map +1 -1
  83. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css +1 -1
  84. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap5.min.css.map +1 -1
  85. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css +7 -11
  86. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.css.map +1 -1
  87. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css +3 -7
  88. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.css.map +1 -1
  89. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css +1 -1
  90. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.default.min.css.map +1 -1
  91. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css +1 -1
  92. data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.min.css.map +1 -1
  93. data/vendor/assets/stylesheets/tom-select-rails/scss/_dropdown.scss +0 -2
  94. data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.scss +4 -4
  95. metadata +3 -3
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Tom Select v2.0.3
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, 'g');
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('|'), 'g');
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(arrayToPattern(diacritics[latin]), 'iu');
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
- var latin_chars = Object.keys(diacritics); // latin character pattern
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
- latin_chars = latin_chars.sort((a, b) => b.length - a.length);
297
- latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns
298
- // ae needs:
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 arrayToPattern(diacritics[l]);
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
- if (part == '') {
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(regex);
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; // clicking on an option should select it
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(focus_node, 'paste', e => self.onPaste(e));
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
- var win_scroll = () => {
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
- // Wait for pasted text to be recognized in value
2009
- setTimeout(() => {
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
- var splitInput = pastedText.trim().split(self.settings.splitOn);
2017
- iterate(splitInput, piece => {
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
- }, 0);
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
- var selected = {};
3236
+ const selected = {};
3190
3237
  iterate(this.options, (option, key) => {
3191
- if (this.items.indexOf(key) >= 0) {
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.checkValidity) {
3579
+ if (!self.input.validity) {
3519
3580
  return;
3520
3581
  }
3521
3582
 
3522
- self.isValid = self.input.checkValidity();
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
- const values = rm_items.map(item => item.dataset.value); // allow the callback to abort
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
  *