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
 
@@ -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, 'g');
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('|'), 'g');
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(arrayToPattern(diacritics[latin]), 'iu');
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
- var latin_chars = Object.keys(diacritics); // latin character pattern
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
- latin_chars = latin_chars.sort((a, b) => b.length - a.length);
301
- latin_pat = new RegExp('(' + arrayToPattern(latin_chars) + accent_pat + '*)', 'g'); // build diacritic patterns
302
- // ae needs:
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 arrayToPattern(diacritics[l]);
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
- if (part == '') {
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(regex);
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; // clicking on an option should select it
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(focus_node, 'paste', e => self.onPaste(e));
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
- var win_scroll = () => {
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
- // Wait for pasted text to be recognized in value
2013
- setTimeout(() => {
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
- var splitInput = pastedText.trim().split(self.settings.splitOn);
2021
- iterate(splitInput, piece => {
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
- }, 0);
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
- var selected = {};
3240
+ const selected = {};
3194
3241
  iterate(this.options, (option, key) => {
3195
- if (this.items.indexOf(key) >= 0) {
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.checkValidity) {
3583
+ if (!self.input.validity) {
3523
3584
  return;
3524
3585
  }
3525
3586
 
3526
- self.isValid = self.input.checkValidity();
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
- const values = rm_items.map(item => item.dataset.value); // allow the callback to abort
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 rendered = getDom(orig_render_item.call(self, data, escape));
4353
+ var item = getDom(orig_render_item.call(self, data, escape));
4279
4354
  var close_button = getDom(html);
4280
- rendered.appendChild(close_button);
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
- var value = rendered.dataset.value;
4289
- self.removeItem(value);
4363
+ if (!self.shouldDelete([item], evt)) return;
4364
+ self.removeItem(item);
4290
4365
  self.refreshOptions(false);
4291
4366
  self.inputState();
4292
4367
  });
4293
- return rendered;
4368
+ return item;
4294
4369
  };
4295
4370
  });
4296
4371
  }