tom-select-rails 2.2.1 → 2.3.1
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 +691 -859
- 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 +487 -723
- 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 +512 -743
- 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 +32 -28
- data/vendor/assets/javascripts/tom-select-rails/cjs/utils.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/caret_position/plugin.js +67 -23
- 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 +4 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/change_listener/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/checkbox_options/plugin.js +103 -41
- 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 +59 -20
- 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 +249 -29
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/drag_drop/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/dropdown_header/plugin.js +59 -18
- 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 +72 -32
- 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 +5 -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 +2 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_active_items/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js +2 -2
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/no_backspace_delete/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/optgroup_columns/plugin.js +59 -22
- 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 +68 -23
- 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 +2 -3
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/restore_on_backspace/plugin.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/esm/plugins/virtual_scroll/plugin.js +97 -57
- 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 +691 -859
- 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 +487 -723
- 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 +512 -743
- 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 +32 -27
- data/vendor/assets/javascripts/tom-select-rails/esm/utils.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/caret_position.js +67 -23
- 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 +4 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/change_listener.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/checkbox_options.js +103 -41
- 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 +59 -20
- 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 +249 -29
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/drag_drop.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/dropdown_header.js +59 -18
- 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 +72 -32
- 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 +5 -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 +2 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_active_items.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js +2 -2
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/no_backspace_delete.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/optgroup_columns.js +59 -22
- 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 +68 -23
- 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 +2 -3
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/restore_on_backspace.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/js/plugins/virtual_scroll.js +97 -57
- 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 +487 -723
- 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 +168 -160
- 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 +691 -859
- 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 +208 -190
- 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 +512 -743
- 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 +180 -172
- data/vendor/assets/javascripts/tom-select-rails/js/tom-select.popular.min.js.map +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/contrib/microevent.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/contrib/microplugin.d.ts +4 -4
- data/vendor/assets/javascripts/tom-select-rails/types/defaults.d.ts +1 -0
- data/vendor/assets/javascripts/tom-select-rails/types/getSettings.d.ts +2 -2
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/checkbox_options/plugin.d.ts +3 -2
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/checkbox_options/types.d.ts +14 -0
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/clear_button/types.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/dropdown_header/types.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/remove_button/types.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/plugins/restore_on_backspace/plugin.d.ts +1 -1
- data/vendor/assets/javascripts/tom-select-rails/types/tom-select.d.ts +12 -14
- data/vendor/assets/javascripts/tom-select-rails/types/types/core.d.ts +16 -12
- data/vendor/assets/javascripts/tom-select-rails/types/types/settings.d.ts +3 -2
- data/vendor/assets/javascripts/tom-select-rails/types/utils.d.ts +8 -1
- data/vendor/assets/stylesheets/tom-select-rails/css/tom-select.bootstrap4.css +224 -216
- 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 +245 -252
- 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 +213 -210
- 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 +223 -215
- 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 +7 -10
- data/vendor/assets/stylesheets/tom-select-rails/scss/_items.scss +2 -5
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/checkbox_options.scss +8 -2
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/clear_button.scss +16 -14
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/drag_drop.scss +6 -12
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/dropdown_header.scss +3 -2
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/dropdown_input.scss +7 -11
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/input_autogrow.scss +0 -3
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/optgroup_columns.scss +7 -5
- data/vendor/assets/stylesheets/tom-select-rails/scss/plugins/remove_button.scss +20 -20
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.bootstrap4.scss +33 -39
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.bootstrap5.scss +54 -80
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.default.scss +16 -14
- data/vendor/assets/stylesheets/tom-select-rails/scss/tom-select.scss +52 -57
- metadata +8 -7
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* Tom Select v2.
|
2
|
+
* Tom Select v2.3.1
|
3
3
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
*/
|
5
5
|
|
@@ -25,29 +25,38 @@ const get_hash = value => {
|
|
25
25
|
if (typeof value === 'boolean') return value ? '1' : '0';
|
26
26
|
return value + '';
|
27
27
|
};
|
28
|
+
|
28
29
|
/**
|
29
30
|
* Escapes a string for use within HTML.
|
30
31
|
*
|
31
32
|
*/
|
32
|
-
|
33
33
|
const escape_html = str => {
|
34
34
|
return (str + '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
35
35
|
};
|
36
|
+
|
37
|
+
/**
|
38
|
+
* use setTimeout if timeout > 0
|
39
|
+
*/
|
40
|
+
const timeout = (fn, timeout) => {
|
41
|
+
if (timeout > 0) {
|
42
|
+
return setTimeout(fn, timeout);
|
43
|
+
}
|
44
|
+
fn.call(null);
|
45
|
+
return null;
|
46
|
+
};
|
47
|
+
|
36
48
|
/**
|
37
49
|
* Debounce the user provided load function
|
38
50
|
*
|
39
51
|
*/
|
40
|
-
|
41
52
|
const loadDebounce = (fn, delay) => {
|
42
53
|
var timeout;
|
43
54
|
return function (value, callback) {
|
44
55
|
var self = this;
|
45
|
-
|
46
56
|
if (timeout) {
|
47
57
|
self.loading = Math.max(self.loading - 1, 0);
|
48
58
|
clearTimeout(timeout);
|
49
59
|
}
|
50
|
-
|
51
60
|
timeout = setTimeout(function () {
|
52
61
|
timeout = null;
|
53
62
|
self.loadedSearches[value] = true;
|
@@ -55,127 +64,123 @@ const loadDebounce = (fn, delay) => {
|
|
55
64
|
}, delay);
|
56
65
|
};
|
57
66
|
};
|
67
|
+
|
58
68
|
/**
|
59
69
|
* Debounce all fired events types listed in `types`
|
60
70
|
* while executing the provided `fn`.
|
61
71
|
*
|
62
72
|
*/
|
63
|
-
|
64
73
|
const debounce_events = (self, types, fn) => {
|
65
74
|
var type;
|
66
75
|
var trigger = self.trigger;
|
67
|
-
var event_args = {};
|
76
|
+
var event_args = {};
|
68
77
|
|
78
|
+
// override trigger method
|
69
79
|
self.trigger = function () {
|
70
80
|
var type = arguments[0];
|
71
|
-
|
72
81
|
if (types.indexOf(type) !== -1) {
|
73
82
|
event_args[type] = arguments;
|
74
83
|
} else {
|
75
84
|
return trigger.apply(self, arguments);
|
76
85
|
}
|
77
|
-
};
|
78
|
-
|
86
|
+
};
|
79
87
|
|
88
|
+
// invoke provided function
|
80
89
|
fn.apply(self, []);
|
81
|
-
self.trigger = trigger;
|
90
|
+
self.trigger = trigger;
|
82
91
|
|
92
|
+
// trigger queued events
|
83
93
|
for (type of types) {
|
84
94
|
if (type in event_args) {
|
85
95
|
trigger.apply(self, event_args[type]);
|
86
96
|
}
|
87
97
|
}
|
88
98
|
};
|
99
|
+
|
89
100
|
/**
|
90
101
|
* Determines the current selection within a text input control.
|
91
102
|
* Returns an object containing:
|
92
103
|
* - start
|
93
104
|
* - length
|
94
105
|
*
|
106
|
+
* Note: "selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password"
|
107
|
+
* - https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
|
95
108
|
*/
|
96
|
-
|
97
109
|
const getSelection = input => {
|
98
110
|
return {
|
99
111
|
start: input.selectionStart || 0,
|
100
112
|
length: (input.selectionEnd || 0) - (input.selectionStart || 0)
|
101
113
|
};
|
102
114
|
};
|
115
|
+
|
103
116
|
/**
|
104
117
|
* Prevent default
|
105
118
|
*
|
106
119
|
*/
|
107
|
-
|
108
120
|
const preventDefault = (evt, stop = false) => {
|
109
121
|
if (evt) {
|
110
122
|
evt.preventDefault();
|
111
|
-
|
112
123
|
if (stop) {
|
113
124
|
evt.stopPropagation();
|
114
125
|
}
|
115
126
|
}
|
116
127
|
};
|
128
|
+
|
117
129
|
/**
|
118
|
-
*
|
130
|
+
* Add event helper
|
119
131
|
*
|
120
132
|
*/
|
121
|
-
|
122
133
|
const addEvent = (target, type, callback, options) => {
|
123
134
|
target.addEventListener(type, callback, options);
|
124
135
|
};
|
136
|
+
|
125
137
|
/**
|
126
138
|
* Return true if the requested key is down
|
127
139
|
* Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )
|
128
140
|
* The current evt may not always set ( eg calling advanceSelection() )
|
129
141
|
*
|
130
142
|
*/
|
131
|
-
|
132
143
|
const isKeyDown = (key_name, evt) => {
|
133
144
|
if (!evt) {
|
134
145
|
return false;
|
135
146
|
}
|
136
|
-
|
137
147
|
if (!evt[key_name]) {
|
138
148
|
return false;
|
139
149
|
}
|
140
|
-
|
141
150
|
var count = (evt.altKey ? 1 : 0) + (evt.ctrlKey ? 1 : 0) + (evt.shiftKey ? 1 : 0) + (evt.metaKey ? 1 : 0);
|
142
|
-
|
143
151
|
if (count === 1) {
|
144
152
|
return true;
|
145
153
|
}
|
146
|
-
|
147
154
|
return false;
|
148
155
|
};
|
156
|
+
|
149
157
|
/**
|
150
158
|
* Get the id of an element
|
151
159
|
* If the id attribute is not set, set the attribute with the given id
|
152
160
|
*
|
153
161
|
*/
|
154
|
-
|
155
162
|
const getId = (el, id) => {
|
156
163
|
const existing_id = el.getAttribute('id');
|
157
|
-
|
158
164
|
if (existing_id) {
|
159
165
|
return existing_id;
|
160
166
|
}
|
161
|
-
|
162
167
|
el.setAttribute('id', id);
|
163
168
|
return id;
|
164
169
|
};
|
170
|
+
|
165
171
|
/**
|
166
172
|
* Returns a string with backslashes added before characters that need to be escaped.
|
167
173
|
*/
|
168
|
-
|
169
174
|
const addSlashes = str => {
|
170
175
|
return str.replace(/[\\"']/g, '\\$&');
|
171
176
|
};
|
177
|
+
|
172
178
|
/**
|
173
179
|
*
|
174
180
|
*/
|
175
|
-
|
176
181
|
const append = (parent, node) => {
|
177
182
|
if (node) parent.append(node);
|
178
183
|
};
|
179
184
|
|
180
|
-
export { addEvent, addSlashes, append, debounce_events, escape_html, getId, getSelection, get_hash, hash_key, isKeyDown, loadDebounce, preventDefault };
|
185
|
+
export { addEvent, addSlashes, append, debounce_events, escape_html, getId, getSelection, get_hash, hash_key, isKeyDown, loadDebounce, preventDefault, timeout };
|
181
186
|
//# sourceMappingURL=utils.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["\nimport TomSelect from './tom-select';\nimport { TomLoadCallback } from './types/index';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n * 'str' -> 'str'\n * null -> ''\n * undefined -> ''\n * true -> '1'\n * false -> '0'\n * 0 -> '0'\n * 1 -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"');\n};\n\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n * - start\n * - length\n *\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n *
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["\nimport TomSelect from './tom-select';\nimport { TomLoadCallback } from './types/index';\n\n\n/**\n * Converts a scalar to its best string representation\n * for hash keys and HTML attribute values.\n *\n * Transformations:\n * 'str' -> 'str'\n * null -> ''\n * undefined -> ''\n * true -> '1'\n * false -> '0'\n * 0 -> '0'\n * 1 -> '1'\n *\n */\nexport const hash_key = (value:undefined|null|boolean|string|number):string|null => {\n\tif (typeof value === 'undefined' || value === null) return null;\n\treturn get_hash(value);\n};\n\nexport const get_hash = (value:boolean|string|number):string => {\n\tif (typeof value === 'boolean') return value ? '1' : '0';\n\treturn value + '';\n};\n\n/**\n * Escapes a string for use within HTML.\n *\n */\nexport const escape_html = (str:string):string => {\n\treturn (str + '')\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"');\n};\n\n\n/**\n * use setTimeout if timeout > 0 \n */\nexport const timeout = (fn:()=>void,timeout:number) => {\n\tif( timeout > 0 ){\n\t\treturn setTimeout(fn,timeout);\n\t}\n\n\tfn.call(null);\n\treturn null;\n}\n\n/**\n * Debounce the user provided load function\n *\n */\nexport const loadDebounce = (fn:(value:string,callback:TomLoadCallback) => void,delay:number) => {\n\tvar timeout: null|ReturnType<typeof setTimeout>;\n\treturn function(this:TomSelect, value:string,callback:TomLoadCallback) {\n\t\tvar self = this;\n\n\t\tif( timeout ){\n\t\t\tself.loading = Math.max(self.loading - 1, 0);\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tself.loadedSearches[value] = true;\n\t\t\tfn.call(self, value, callback);\n\n\t\t}, delay);\n\t};\n};\n\n\n/**\n * Debounce all fired events types listed in `types`\n * while executing the provided `fn`.\n *\n */\nexport const debounce_events = ( self:TomSelect, types:string[], fn:() => void ) => {\n\tvar type:string;\n\tvar trigger = self.trigger;\n\tvar event_args:{ [key: string]: any } = {};\n\n\t// override trigger method\n\tself.trigger = function(){\n\t\tvar type = arguments[0];\n\t\tif (types.indexOf(type) !== -1) {\n\t\t\tevent_args[type] = arguments;\n\t\t} else {\n\t\t\treturn trigger.apply(self, arguments);\n\t\t}\n\t};\n\n\t// invoke provided function\n\tfn.apply(self, []);\n\tself.trigger = trigger;\n\n\t// trigger queued events\n\tfor( type of types ){\n\t\tif( type in event_args ){\n\t\t\ttrigger.apply(self, event_args[type]);\n\t\t}\n\t}\n};\n\n\n/**\n * Determines the current selection within a text input control.\n * Returns an object containing:\n * - start\n * - length\n *\n * Note: \"selectionStart, selectionEnd ... apply only to inputs of types text, search, URL, tel and password\"\n * \t- https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n */\nexport const getSelection = (input:HTMLInputElement):{ start: number; length: number } => {\n\treturn {\n\t\tstart\t: input.selectionStart || 0,\n\t\tlength\t: (input.selectionEnd||0) - (input.selectionStart||0),\n\t};\n};\n\n\n/**\n * Prevent default\n *\n */\nexport const preventDefault = (evt?:Event, stop:boolean=false):void => {\n\tif( evt ){\n\t\tevt.preventDefault();\n\t\tif( stop ){\n\t\t\tevt.stopPropagation();\n\t\t}\n\t}\n}\n\n\n/**\n * Add event helper\n *\n */\nexport const addEvent = (target:EventTarget, type:string, callback:EventListenerOrEventListenerObject, options?:object):void => {\n\ttarget.addEventListener(type,callback,options);\n};\n\n\n/**\n * Return true if the requested key is down\n * Will return false if more than one control character is pressed ( when [ctrl+shift+a] != [ctrl+a] )\n * The current evt may not always set ( eg calling advanceSelection() )\n *\n */\nexport const isKeyDown = ( key_name:keyof (KeyboardEvent|MouseEvent), evt?:KeyboardEvent|MouseEvent ) => {\n\n\tif( !evt ){\n\t\treturn false;\n\t}\n\n\tif( !evt[key_name] ){\n\t\treturn false;\n\t}\n\n\tvar count = (evt.altKey?1:0) + (evt.ctrlKey?1:0) + (evt.shiftKey?1:0) + (evt.metaKey?1:0);\n\n\tif( count === 1 ){\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/**\n * Get the id of an element\n * If the id attribute is not set, set the attribute with the given id\n *\n */\nexport const getId = (el:Element,id:string) => {\n\tconst existing_id = el.getAttribute('id');\n\tif( existing_id ){\n\t\treturn existing_id;\n\t}\n\n\tel.setAttribute('id',id);\n\treturn id;\n};\n\n\n/**\n * Returns a string with backslashes added before characters that need to be escaped.\n */\nexport const addSlashes = (str:string):string => {\n\treturn str.replace(/[\\\\\"']/g, '\\\\$&');\n};\n\n/**\n *\n */\nexport const append = ( parent:Element|DocumentFragment, node: string|Node|null|undefined ):void =>{\n\tif( node ) parent.append(node);\n};\n"],"names":["hash_key","value","get_hash","escape_html","str","replace","timeout","fn","setTimeout","call","loadDebounce","delay","callback","self","loading","Math","max","clearTimeout","loadedSearches","debounce_events","types","type","trigger","event_args","arguments","indexOf","apply","getSelection","input","start","selectionStart","length","selectionEnd","preventDefault","evt","stop","stopPropagation","addEvent","target","options","addEventListener","isKeyDown","key_name","count","altKey","ctrlKey","shiftKey","metaKey","getId","el","id","existing_id","getAttribute","setAttribute","addSlashes","append","parent","node"],"mappings":"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"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* Tom Select v2.
|
2
|
+
* Tom Select v2.3.1
|
3
3
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
*/
|
5
5
|
|
@@ -10,16 +10,65 @@
|
|
10
10
|
})(this, (function () { 'use strict';
|
11
11
|
|
12
12
|
/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */
|
13
|
-
const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}
|
13
|
+
const accent_pat = '[\u0300-\u036F\u{b7}\u{2be}\u{2bc}]';
|
14
14
|
/** @type {TUnicodeMap} */
|
15
15
|
|
16
|
-
const latin_convert = {
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
'
|
21
|
-
'
|
16
|
+
const latin_convert = {};
|
17
|
+
/** @type {TUnicodeMap} */
|
18
|
+
|
19
|
+
const latin_condensed = {
|
20
|
+
'/': '⁄∕',
|
21
|
+
'0': '߀',
|
22
|
+
"a": "ⱥɐɑ",
|
23
|
+
"aa": "ꜳ",
|
24
|
+
"ae": "æǽǣ",
|
25
|
+
"ao": "ꜵ",
|
26
|
+
"au": "ꜷ",
|
27
|
+
"av": "ꜹꜻ",
|
28
|
+
"ay": "ꜽ",
|
29
|
+
"b": "ƀɓƃ",
|
30
|
+
"c": "ꜿƈȼↄ",
|
31
|
+
"d": "đɗɖᴅƌꮷԁɦ",
|
32
|
+
"e": "ɛǝᴇɇ",
|
33
|
+
"f": "ꝼƒ",
|
34
|
+
"g": "ǥɠꞡᵹꝿɢ",
|
35
|
+
"h": "ħⱨⱶɥ",
|
36
|
+
"i": "ɨı",
|
37
|
+
"j": "ɉȷ",
|
38
|
+
"k": "ƙⱪꝁꝃꝅꞣ",
|
39
|
+
"l": "łƚɫⱡꝉꝇꞁɭ",
|
40
|
+
"m": "ɱɯϻ",
|
41
|
+
"n": "ꞥƞɲꞑᴎлԉ",
|
42
|
+
"o": "øǿɔɵꝋꝍᴑ",
|
43
|
+
"oe": "œ",
|
44
|
+
"oi": "ƣ",
|
45
|
+
"oo": "ꝏ",
|
46
|
+
"ou": "ȣ",
|
47
|
+
"p": "ƥᵽꝑꝓꝕρ",
|
48
|
+
"q": "ꝗꝙɋ",
|
49
|
+
"r": "ɍɽꝛꞧꞃ",
|
50
|
+
"s": "ßȿꞩꞅʂ",
|
51
|
+
"t": "ŧƭʈⱦꞇ",
|
52
|
+
"th": "þ",
|
53
|
+
"tz": "ꜩ",
|
54
|
+
"u": "ʉ",
|
55
|
+
"v": "ʋꝟʌ",
|
56
|
+
"vy": "ꝡ",
|
57
|
+
"w": "ⱳ",
|
58
|
+
"y": "ƴɏỿ",
|
59
|
+
"z": "ƶȥɀⱬꝣ",
|
60
|
+
"hv": "ƕ"
|
22
61
|
};
|
62
|
+
|
63
|
+
for (let latin in latin_condensed) {
|
64
|
+
let unicode = latin_condensed[latin] || '';
|
65
|
+
|
66
|
+
for (let i = 0; i < unicode.length; i++) {
|
67
|
+
let char = unicode.substring(i, i + 1);
|
68
|
+
latin_convert[char] = latin;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
23
72
|
new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');
|
24
73
|
|
25
74
|
/**
|
@@ -32,7 +81,6 @@
|
|
32
81
|
* ```
|
33
82
|
*
|
34
83
|
*/
|
35
|
-
|
36
84
|
const iterate = (object, callback) => {
|
37
85
|
if (Array.isArray(object)) {
|
38
86
|
object.forEach(callback);
|
@@ -49,7 +97,6 @@
|
|
49
97
|
* Remove css classes
|
50
98
|
*
|
51
99
|
*/
|
52
|
-
|
53
100
|
const removeClasses = (elmts, ...classes) => {
|
54
101
|
var norm_classes = classesArray(classes);
|
55
102
|
elmts = castAsArray(elmts);
|
@@ -59,52 +106,48 @@
|
|
59
106
|
});
|
60
107
|
});
|
61
108
|
};
|
109
|
+
|
62
110
|
/**
|
63
111
|
* Return arguments
|
64
112
|
*
|
65
113
|
*/
|
66
|
-
|
67
114
|
const classesArray = args => {
|
68
115
|
var classes = [];
|
69
116
|
iterate(args, _classes => {
|
70
117
|
if (typeof _classes === 'string') {
|
71
118
|
_classes = _classes.trim().split(/[\11\12\14\15\40]/);
|
72
119
|
}
|
73
|
-
|
74
120
|
if (Array.isArray(_classes)) {
|
75
121
|
classes = classes.concat(_classes);
|
76
122
|
}
|
77
123
|
});
|
78
124
|
return classes.filter(Boolean);
|
79
125
|
};
|
126
|
+
|
80
127
|
/**
|
81
128
|
* Create an array from arg if it's not already an array
|
82
129
|
*
|
83
130
|
*/
|
84
|
-
|
85
131
|
const castAsArray = arg => {
|
86
132
|
if (!Array.isArray(arg)) {
|
87
133
|
arg = [arg];
|
88
134
|
}
|
89
|
-
|
90
135
|
return arg;
|
91
136
|
};
|
137
|
+
|
92
138
|
/**
|
93
139
|
* Get the index of an element amongst sibling nodes of the same type
|
94
140
|
*
|
95
141
|
*/
|
96
|
-
|
97
142
|
const nodeIndex = (el, amongst) => {
|
98
143
|
if (!el) return -1;
|
99
144
|
amongst = amongst || el.nodeName;
|
100
145
|
var i = 0;
|
101
|
-
|
102
146
|
while (el = el.previousElementSibling) {
|
103
147
|
if (el.matches(amongst)) {
|
104
148
|
i++;
|
105
149
|
}
|
106
150
|
}
|
107
|
-
|
108
151
|
return i;
|
109
152
|
};
|
110
153
|
|
@@ -122,8 +165,10 @@
|
|
122
165
|
* governing permissions and limitations under the License.
|
123
166
|
*
|
124
167
|
*/
|
168
|
+
|
125
169
|
function plugin () {
|
126
170
|
var self = this;
|
171
|
+
|
127
172
|
/**
|
128
173
|
* Moves the caret to the specified index.
|
129
174
|
*
|
@@ -132,13 +177,11 @@
|
|
132
177
|
* on mobile webkit devices
|
133
178
|
*
|
134
179
|
*/
|
135
|
-
|
136
180
|
self.hook('instead', 'setCaret', new_pos => {
|
137
181
|
if (self.settings.mode === 'single' || !self.control.contains(self.control_input)) {
|
138
182
|
new_pos = self.items.length;
|
139
183
|
} else {
|
140
184
|
new_pos = Math.max(0, Math.min(self.items.length, new_pos));
|
141
|
-
|
142
185
|
if (new_pos != self.caretPos && !self.isPending) {
|
143
186
|
self.controlChildren().forEach((child, j) => {
|
144
187
|
if (j < new_pos) {
|
@@ -149,19 +192,20 @@
|
|
149
192
|
});
|
150
193
|
}
|
151
194
|
}
|
152
|
-
|
153
195
|
self.caretPos = new_pos;
|
154
196
|
});
|
155
197
|
self.hook('instead', 'moveCaret', direction => {
|
156
|
-
if (!self.isFocused) return;
|
198
|
+
if (!self.isFocused) return;
|
157
199
|
|
200
|
+
// move caret before or after selected items
|
158
201
|
const last_active = self.getLastActive(direction);
|
159
|
-
|
160
202
|
if (last_active) {
|
161
203
|
const idx = nodeIndex(last_active);
|
162
204
|
self.setCaret(direction > 0 ? idx + 1 : idx);
|
163
205
|
self.setActiveItem();
|
164
|
-
removeClasses(last_active, 'last-active');
|
206
|
+
removeClasses(last_active, 'last-active');
|
207
|
+
|
208
|
+
// move caret left or right of current position
|
165
209
|
} else {
|
166
210
|
self.setCaret(self.caretPos + direction);
|
167
211
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"caret_position.js","sources":["../../../node_modules/@orchidjs/unicode-variants/dist/esm/index.js","../../../node_modules/@orchidjs/sifter/lib/utils.ts","../../../src/vanilla.ts","../../../src/plugins/caret_position/plugin.ts"],"sourcesContent":["/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\nimport { toArray, setToPattern, escape_regex, arrayToPattern, sequencePattern } from './regex.js';\nexport { escape_regex } from './regex.js';\nimport { allSubstrings } from './strings.js';\n\n/**\n * @typedef {{[key:string]:string}} TUnicodeMap\n * @typedef {{[key:string]:Set<string>}} TUnicodeSets\n * @typedef {[[number,number]]} TCodePoints\n * @typedef {{folded:string,composed:string,code_point:number}} TCodePointObj\n * @typedef {{start:number,end:number,length:number,substr:string}} TSequencePart\n */\n/** @type {TCodePoints} */\n\nconst code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}]'; // \\u{2bc}\n\n/** @type {TUnicodeMap} */\n\nlet unicode_map;\n/** @type {RegExp} */\n\nlet multi_char_reg;\nconst max_char_length = 3;\n/** @type {TUnicodeMap} */\n\nconst latin_convert = {\n 'æ': 'ae',\n 'ⱥ': 'a',\n 'ø': 'o',\n '⁄': '/',\n '∕': '/'\n};\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n *\n * @param {TCodePoints=} _code_points\n */\n\nconst initialize = _code_points => {\n if (unicode_map !== undefined) return;\n unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n * @param {string} str\n * @param {string} form\n */\n\nconst normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Compatibility Decomposition without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * @param {string} str\n */\n\nconst decompose = str => {\n if (str.match(/[\\u0f71-\\u0f81]/)) {\n return toArray(str).reduce(\n /**\n * @param {string} result\n * @param {string} char\n */\n (result, char) => {\n return result + normalize(char);\n }, '');\n }\n\n return normalize(str);\n};\n/**\n * Remove accents\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n * @param {string} str\n * @return {string}\n */\n\nconst asciifold = str => {\n return decompose(str).toLowerCase().replace(convert_pat, (\n /** @type {string} */\n char) => {\n return latin_convert[char] || '';\n });\n};\n/**\n * Generate a list of unicode variants from the list of code points\n * @param {TCodePoints} code_points\n * @yield {TCodePointObj}\n */\n\nfunction* generator(code_points) {\n for (const [code_point_min, code_point_max] of code_points) {\n for (let i = code_point_min; i <= code_point_max; i++) {\n let composed = String.fromCharCode(i);\n let folded = asciifold(composed);\n\n if (folded == composed.toLowerCase()) {\n continue;\n } // skip when folded is a string longer than 3 characters long\n // bc the resulting regex patterns will be long\n // eg:\n // folded صلى الله عليه وسلم length 18 code point 65018\n // folded جل جلاله length 8 code point 65019\n\n\n if (folded.length > max_char_length) {\n continue;\n }\n\n if (folded.length == 0) {\n continue;\n }\n\n let decomposed = normalize(composed);\n let recomposed = normalize(decomposed, 'NFC');\n\n if (recomposed === composed && folded === decomposed) {\n continue;\n }\n\n yield {\n folded: folded,\n composed: composed,\n code_point: i\n };\n }\n }\n}\n/**\n * Generate a unicode map from the list of code points\n * @param {TCodePoints} code_points\n * @return {TUnicodeSets}\n */\n\nconst generateSets = code_points => {\n /** @type {{[key:string]:Set<string>}} */\n const unicode_sets = {};\n /**\n * @param {string} folded\n * @param {string} to_add\n */\n\n const addMatching = (folded, to_add) => {\n /** @type {Set<string>} */\n const folded_set = unicode_sets[folded] || new Set();\n const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n\n if (to_add.match(patt)) {\n return;\n }\n\n folded_set.add(escape_regex(to_add));\n unicode_sets[folded] = folded_set;\n };\n\n for (let value of generator(code_points)) {\n addMatching(value.folded, value.folded);\n addMatching(value.folded, value.composed);\n }\n\n return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n *\n * @param {TCodePoints} code_points\n * @return {TUnicodeMap}\n */\n\nconst generateMap = code_points => {\n /** @type {TUnicodeSets} */\n const unicode_sets = generateSets(code_points);\n /** @type {TUnicodeMap} */\n\n const unicode_map = {};\n /** @type {string[]} */\n\n let multi_char = [];\n\n for (let folded in unicode_sets) {\n let set = unicode_sets[folded];\n\n if (set) {\n unicode_map[folded] = setToPattern(set);\n }\n\n if (folded.length > 1) {\n multi_char.push(escape_regex(folded));\n }\n }\n\n multi_char.sort((a, b) => b.length - a.length);\n const multi_char_patt = arrayToPattern(multi_char);\n multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n return unicode_map;\n};\n/**\n * Map each element of an array from it's folded value to all possible unicode matches\n * @param {string[]} strings\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst mapSequence = (strings, min_replacement = 1) => {\n let chars_replaced = 0;\n strings = strings.map(str => {\n if (unicode_map[str]) {\n chars_replaced += str.length;\n }\n\n return unicode_map[str] || str;\n });\n\n if (chars_replaced >= min_replacement) {\n return sequencePattern(strings);\n }\n\n return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n *\n *\n * @param {string} str\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst substringsToPattern = (str, min_replacement = 1) => {\n min_replacement = Math.max(min_replacement, str.length - 1);\n return arrayToPattern(allSubstrings(str).map(sub_pat => {\n return mapSequence(sub_pat, min_replacement);\n }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n *\n * @param {Sequence[]} sequences\n * @param {boolean} all\n */\n\nconst sequencesToPattern = (sequences, all = true) => {\n let min_replacement = sequences.length > 1 ? 1 : 0;\n return arrayToPattern(sequences.map(sequence => {\n let seq = [];\n const len = all ? sequence.length() : sequence.length() - 1;\n\n for (let j = 0; j < len; j++) {\n seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n }\n\n return sequencePattern(seq);\n }));\n};\n/**\n * Return true if the sequence is already in the sequences\n * @param {Sequence} needle_seq\n * @param {Sequence[]} sequences\n */\n\n\nconst inSequences = (needle_seq, sequences) => {\n for (const seq of sequences) {\n if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n continue;\n }\n\n if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n continue;\n }\n\n let needle_parts = needle_seq.parts;\n /**\n * @param {TSequencePart} part\n */\n\n const filter = part => {\n for (const needle_part of needle_parts) {\n if (needle_part.start === part.start && needle_part.substr === part.substr) {\n return false;\n }\n\n if (part.length == 1 || needle_part.length == 1) {\n continue;\n } // check for overlapping parts\n // a = ['::=','==']\n // b = ['::','===']\n // a = ['r','sm']\n // b = ['rs','m']\n\n\n if (part.start < needle_part.start && part.end > needle_part.start) {\n return true;\n }\n\n if (needle_part.start < part.start && needle_part.end > part.start) {\n return true;\n }\n }\n\n return false;\n };\n\n let filtered = seq.parts.filter(filter);\n\n if (filtered.length > 0) {\n continue;\n }\n\n return true;\n }\n\n return false;\n};\n\nclass Sequence {\n constructor() {\n /** @type {TSequencePart[]} */\n this.parts = [];\n /** @type {string[]} */\n\n this.substrs = [];\n this.start = 0;\n this.end = 0;\n }\n /**\n * @param {TSequencePart|undefined} part\n */\n\n\n add(part) {\n if (part) {\n this.parts.push(part);\n this.substrs.push(part.substr);\n this.start = Math.min(part.start, this.start);\n this.end = Math.max(part.end, this.end);\n }\n }\n\n last() {\n return this.parts[this.parts.length - 1];\n }\n\n length() {\n return this.parts.length;\n }\n /**\n * @param {number} position\n * @param {TSequencePart} last_piece\n */\n\n\n clone(position, last_piece) {\n let clone = new Sequence();\n let parts = JSON.parse(JSON.stringify(this.parts));\n let last_part = parts.pop();\n\n for (const part of parts) {\n clone.add(part);\n }\n\n let last_substr = last_piece.substr.substring(0, position - last_part.start);\n let clone_last_len = last_substr.length;\n clone.add({\n start: last_part.start,\n end: last_part.start + clone_last_len,\n length: clone_last_len,\n substr: last_substr\n });\n return clone;\n }\n\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n * ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n *\n * @param {string} str\n * @return {string|undefined}\n */\n\n\nconst getPattern = str => {\n initialize();\n str = asciifold(str);\n let pattern = '';\n let sequences = [new Sequence()];\n\n for (let i = 0; i < str.length; i++) {\n let substr = str.substring(i);\n let match = substr.match(multi_char_reg);\n const char = str.substring(i, i + 1);\n const match_str = match ? match[0] : null; // loop through sequences\n // add either the char or multi_match\n\n let overlapping = [];\n let added_types = new Set();\n\n for (const sequence of sequences) {\n const last_piece = sequence.last();\n\n if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n // if we have a multi match\n if (match_str) {\n const len = match_str.length;\n sequence.add({\n start: i,\n end: i + len,\n length: len,\n substr: match_str\n });\n added_types.add('1');\n } else {\n sequence.add({\n start: i,\n end: i + 1,\n length: 1,\n substr: char\n });\n added_types.add('2');\n }\n } else if (match_str) {\n let clone = sequence.clone(i, last_piece);\n const len = match_str.length;\n clone.add({\n start: i,\n end: i + len,\n length: len,\n substr: match_str\n });\n overlapping.push(clone);\n } else {\n // don't add char\n // adding would create invalid patterns: 234 => [2,34,4]\n added_types.add('3');\n }\n } // if we have overlapping\n\n\n if (overlapping.length > 0) {\n // ['ii','iii'] before ['i','i','iii']\n overlapping = overlapping.sort((a, b) => {\n return a.length() - b.length();\n });\n\n for (let clone of overlapping) {\n // don't add if we already have an equivalent sequence\n if (inSequences(clone, sequences)) {\n continue;\n }\n\n sequences.push(clone);\n }\n\n continue;\n } // if we haven't done anything unique\n // clean up the patterns\n // helps keep patterns smaller\n // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n\n\n if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n pattern += sequencesToPattern(sequences, false);\n let new_seq = new Sequence();\n const old_seq = sequences[0];\n\n if (old_seq) {\n new_seq.add(old_seq.last());\n }\n\n sequences = [new_seq];\n }\n }\n\n pattern += sequencesToPattern(sequences, true);\n return pattern;\n};\n\nexport { asciifold, code_points, decompose, generateMap, generateSets, generator, getPattern, initialize, mapSequence, normalize, substringsToPattern, unicode_map };\n//# sourceMappingURL=index.js.map\n","\nimport { asciifold } from '@orchidjs/unicode-variants';\nimport * as T from './types';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tif( token.regex == null ) return 0;\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\n\tif( typeof value == 'function' ) return value;\n\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","\nimport { iterate } from '@orchidjs/sifter/lib/utils';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { nodeIndex, removeClasses } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n"],"names":["iterate","object","callback","Array","isArray","forEach","key","hasOwnProperty","removeClasses","elmts","classes","norm_classes","classesArray","castAsArray","map","el","cls","classList","remove","args","_classes","trim","split","concat","filter","Boolean","arg","nodeIndex","amongst","nodeName","i","previousElementSibling","matches","self","hook","new_pos","settings","mode","control","contains","control_input","items","length","Math","max","min","caretPos","isPending","controlChildren","child","j","insertAdjacentElement","appendChild","direction","isFocused","last_active","getLastActive","idx","setCaret","setActiveItem"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"caret_position.js","sources":["../../../node_modules/@orchidjs/unicode-variants/dist/esm/index.js","../../../node_modules/@orchidjs/sifter/lib/utils.ts","../../../src/vanilla.ts","../../../src/plugins/caret_position/plugin.ts"],"sourcesContent":["/*! @orchidjs/unicode-variants | https://github.com/orchidjs/unicode-variants | Apache License (v2) */\nimport { toArray, setToPattern, escape_regex, arrayToPattern, sequencePattern } from './regex.js';\nexport { escape_regex } from './regex.js';\nimport { allSubstrings } from './strings.js';\n\n/**\n * @typedef {{[key:string]:string}} TUnicodeMap\n * @typedef {{[key:string]:Set<string>}} TUnicodeSets\n * @typedef {[[number,number]]} TCodePoints\n * @typedef {{folded:string,composed:string,code_point:number}} TCodePointObj\n * @typedef {{start:number,end:number,length:number,substr:string}} TSequencePart\n */\n/** @type {TCodePoints} */\n\nconst code_points = [[0, 65535]];\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\n/** @type {TUnicodeMap} */\n\nlet unicode_map;\n/** @type {RegExp} */\n\nlet multi_char_reg;\nconst max_char_length = 3;\n/** @type {TUnicodeMap} */\n\nconst latin_convert = {};\n/** @type {TUnicodeMap} */\n\nconst latin_condensed = {\n '/': '⁄∕',\n '0': '߀',\n \"a\": \"ⱥɐɑ\",\n \"aa\": \"ꜳ\",\n \"ae\": \"æǽǣ\",\n \"ao\": \"ꜵ\",\n \"au\": \"ꜷ\",\n \"av\": \"ꜹꜻ\",\n \"ay\": \"ꜽ\",\n \"b\": \"ƀɓƃ\",\n \"c\": \"ꜿƈȼↄ\",\n \"d\": \"đɗɖᴅƌꮷԁɦ\",\n \"e\": \"ɛǝᴇɇ\",\n \"f\": \"ꝼƒ\",\n \"g\": \"ǥɠꞡᵹꝿɢ\",\n \"h\": \"ħⱨⱶɥ\",\n \"i\": \"ɨı\",\n \"j\": \"ɉȷ\",\n \"k\": \"ƙⱪꝁꝃꝅꞣ\",\n \"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n \"m\": \"ɱɯϻ\",\n \"n\": \"ꞥƞɲꞑᴎлԉ\",\n \"o\": \"øǿɔɵꝋꝍᴑ\",\n \"oe\": \"œ\",\n \"oi\": \"ƣ\",\n \"oo\": \"ꝏ\",\n \"ou\": \"ȣ\",\n \"p\": \"ƥᵽꝑꝓꝕρ\",\n \"q\": \"ꝗꝙɋ\",\n \"r\": \"ɍɽꝛꞧꞃ\",\n \"s\": \"ßȿꞩꞅʂ\",\n \"t\": \"ŧƭʈⱦꞇ\",\n \"th\": \"þ\",\n \"tz\": \"ꜩ\",\n \"u\": \"ʉ\",\n \"v\": \"ʋꝟʌ\",\n \"vy\": \"ꝡ\",\n \"w\": \"ⱳ\",\n \"y\": \"ƴɏỿ\",\n \"z\": \"ƶȥɀⱬꝣ\",\n \"hv\": \"ƕ\"\n};\n\nfor (let latin in latin_condensed) {\n let unicode = latin_condensed[latin] || '';\n\n for (let i = 0; i < unicode.length; i++) {\n let char = unicode.substring(i, i + 1);\n latin_convert[char] = latin;\n }\n}\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|') + '|' + accent_pat, 'gu');\n/**\n * Initialize the unicode_map from the give code point ranges\n *\n * @param {TCodePoints=} _code_points\n */\n\nconst initialize = _code_points => {\n if (unicode_map !== undefined) return;\n unicode_map = generateMap(_code_points || code_points);\n};\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n * @param {string} str\n * @param {string} form\n */\n\nconst normalize = (str, form = 'NFKD') => str.normalize(form);\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n * @param {string} str\n * @return {string}\n */\n\nconst asciifold = str => {\n return toArray(str).reduce(\n /**\n * @param {string} result\n * @param {string} char\n */\n (result, char) => {\n return result + _asciifold(char);\n }, '');\n};\n/**\n * @param {string} str\n * @return {string}\n */\n\nconst _asciifold = str => {\n str = normalize(str).toLowerCase().replace(convert_pat, (\n /** @type {string} */\n char) => {\n return latin_convert[char] || '';\n }); //return str;\n\n return normalize(str, 'NFC');\n};\n/**\n * Generate a list of unicode variants from the list of code points\n * @param {TCodePoints} code_points\n * @yield {TCodePointObj}\n */\n\nfunction* generator(code_points) {\n for (const [code_point_min, code_point_max] of code_points) {\n for (let i = code_point_min; i <= code_point_max; i++) {\n let composed = String.fromCharCode(i);\n let folded = asciifold(composed);\n\n if (folded == composed.toLowerCase()) {\n continue;\n } // skip when folded is a string longer than 3 characters long\n // bc the resulting regex patterns will be long\n // eg:\n // folded صلى الله عليه وسلم length 18 code point 65018\n // folded جل جلاله length 8 code point 65019\n\n\n if (folded.length > max_char_length) {\n continue;\n }\n\n if (folded.length == 0) {\n continue;\n }\n\n yield {\n folded: folded,\n composed: composed,\n code_point: i\n };\n }\n }\n}\n/**\n * Generate a unicode map from the list of code points\n * @param {TCodePoints} code_points\n * @return {TUnicodeSets}\n */\n\nconst generateSets = code_points => {\n /** @type {{[key:string]:Set<string>}} */\n const unicode_sets = {};\n /**\n * @param {string} folded\n * @param {string} to_add\n */\n\n const addMatching = (folded, to_add) => {\n /** @type {Set<string>} */\n const folded_set = unicode_sets[folded] || new Set();\n const patt = new RegExp('^' + setToPattern(folded_set) + '$', 'iu');\n\n if (to_add.match(patt)) {\n return;\n }\n\n folded_set.add(escape_regex(to_add));\n unicode_sets[folded] = folded_set;\n };\n\n for (let value of generator(code_points)) {\n addMatching(value.folded, value.folded);\n addMatching(value.folded, value.composed);\n }\n\n return unicode_sets;\n};\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n *\n * @param {TCodePoints} code_points\n * @return {TUnicodeMap}\n */\n\nconst generateMap = code_points => {\n /** @type {TUnicodeSets} */\n const unicode_sets = generateSets(code_points);\n /** @type {TUnicodeMap} */\n\n const unicode_map = {};\n /** @type {string[]} */\n\n let multi_char = [];\n\n for (let folded in unicode_sets) {\n let set = unicode_sets[folded];\n\n if (set) {\n unicode_map[folded] = setToPattern(set);\n }\n\n if (folded.length > 1) {\n multi_char.push(escape_regex(folded));\n }\n }\n\n multi_char.sort((a, b) => b.length - a.length);\n const multi_char_patt = arrayToPattern(multi_char);\n multi_char_reg = new RegExp('^' + multi_char_patt, 'u');\n return unicode_map;\n};\n/**\n * Map each element of an array from it's folded value to all possible unicode matches\n * @param {string[]} strings\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst mapSequence = (strings, min_replacement = 1) => {\n let chars_replaced = 0;\n strings = strings.map(str => {\n if (unicode_map[str]) {\n chars_replaced += str.length;\n }\n\n return unicode_map[str] || str;\n });\n\n if (chars_replaced >= min_replacement) {\n return sequencePattern(strings);\n }\n\n return '';\n};\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n *\n *\n * @param {string} str\n * @param {number} min_replacement\n * @return {string}\n */\n\nconst substringsToPattern = (str, min_replacement = 1) => {\n min_replacement = Math.max(min_replacement, str.length - 1);\n return arrayToPattern(allSubstrings(str).map(sub_pat => {\n return mapSequence(sub_pat, min_replacement);\n }));\n};\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n *\n * @param {Sequence[]} sequences\n * @param {boolean} all\n */\n\nconst sequencesToPattern = (sequences, all = true) => {\n let min_replacement = sequences.length > 1 ? 1 : 0;\n return arrayToPattern(sequences.map(sequence => {\n let seq = [];\n const len = all ? sequence.length() : sequence.length() - 1;\n\n for (let j = 0; j < len; j++) {\n seq.push(substringsToPattern(sequence.substrs[j] || '', min_replacement));\n }\n\n return sequencePattern(seq);\n }));\n};\n/**\n * Return true if the sequence is already in the sequences\n * @param {Sequence} needle_seq\n * @param {Sequence[]} sequences\n */\n\n\nconst inSequences = (needle_seq, sequences) => {\n for (const seq of sequences) {\n if (seq.start != needle_seq.start || seq.end != needle_seq.end) {\n continue;\n }\n\n if (seq.substrs.join('') !== needle_seq.substrs.join('')) {\n continue;\n }\n\n let needle_parts = needle_seq.parts;\n /**\n * @param {TSequencePart} part\n */\n\n const filter = part => {\n for (const needle_part of needle_parts) {\n if (needle_part.start === part.start && needle_part.substr === part.substr) {\n return false;\n }\n\n if (part.length == 1 || needle_part.length == 1) {\n continue;\n } // check for overlapping parts\n // a = ['::=','==']\n // b = ['::','===']\n // a = ['r','sm']\n // b = ['rs','m']\n\n\n if (part.start < needle_part.start && part.end > needle_part.start) {\n return true;\n }\n\n if (needle_part.start < part.start && needle_part.end > part.start) {\n return true;\n }\n }\n\n return false;\n };\n\n let filtered = seq.parts.filter(filter);\n\n if (filtered.length > 0) {\n continue;\n }\n\n return true;\n }\n\n return false;\n};\n\nclass Sequence {\n constructor() {\n /** @type {TSequencePart[]} */\n this.parts = [];\n /** @type {string[]} */\n\n this.substrs = [];\n this.start = 0;\n this.end = 0;\n }\n /**\n * @param {TSequencePart|undefined} part\n */\n\n\n add(part) {\n if (part) {\n this.parts.push(part);\n this.substrs.push(part.substr);\n this.start = Math.min(part.start, this.start);\n this.end = Math.max(part.end, this.end);\n }\n }\n\n last() {\n return this.parts[this.parts.length - 1];\n }\n\n length() {\n return this.parts.length;\n }\n /**\n * @param {number} position\n * @param {TSequencePart} last_piece\n */\n\n\n clone(position, last_piece) {\n let clone = new Sequence();\n let parts = JSON.parse(JSON.stringify(this.parts));\n let last_part = parts.pop();\n\n for (const part of parts) {\n clone.add(part);\n }\n\n let last_substr = last_piece.substr.substring(0, position - last_part.start);\n let clone_last_len = last_substr.length;\n clone.add({\n start: last_part.start,\n end: last_part.start + clone_last_len,\n length: clone_last_len,\n substr: last_substr\n });\n return clone;\n }\n\n}\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n * ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n *\n * @param {string} str\n * @return {string|undefined}\n */\n\n\nconst getPattern = str => {\n initialize();\n str = asciifold(str);\n let pattern = '';\n let sequences = [new Sequence()];\n\n for (let i = 0; i < str.length; i++) {\n let substr = str.substring(i);\n let match = substr.match(multi_char_reg);\n const char = str.substring(i, i + 1);\n const match_str = match ? match[0] : null; // loop through sequences\n // add either the char or multi_match\n\n let overlapping = [];\n let added_types = new Set();\n\n for (const sequence of sequences) {\n const last_piece = sequence.last();\n\n if (!last_piece || last_piece.length == 1 || last_piece.end <= i) {\n // if we have a multi match\n if (match_str) {\n const len = match_str.length;\n sequence.add({\n start: i,\n end: i + len,\n length: len,\n substr: match_str\n });\n added_types.add('1');\n } else {\n sequence.add({\n start: i,\n end: i + 1,\n length: 1,\n substr: char\n });\n added_types.add('2');\n }\n } else if (match_str) {\n let clone = sequence.clone(i, last_piece);\n const len = match_str.length;\n clone.add({\n start: i,\n end: i + len,\n length: len,\n substr: match_str\n });\n overlapping.push(clone);\n } else {\n // don't add char\n // adding would create invalid patterns: 234 => [2,34,4]\n added_types.add('3');\n }\n } // if we have overlapping\n\n\n if (overlapping.length > 0) {\n // ['ii','iii'] before ['i','i','iii']\n overlapping = overlapping.sort((a, b) => {\n return a.length() - b.length();\n });\n\n for (let clone of overlapping) {\n // don't add if we already have an equivalent sequence\n if (inSequences(clone, sequences)) {\n continue;\n }\n\n sequences.push(clone);\n }\n\n continue;\n } // if we haven't done anything unique\n // clean up the patterns\n // helps keep patterns smaller\n // if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n\n\n if (i > 0 && added_types.size == 1 && !added_types.has('3')) {\n pattern += sequencesToPattern(sequences, false);\n let new_seq = new Sequence();\n const old_seq = sequences[0];\n\n if (old_seq) {\n new_seq.add(old_seq.last());\n }\n\n sequences = [new_seq];\n }\n }\n\n pattern += sequencesToPattern(sequences, true);\n return pattern;\n};\n\nexport { _asciifold, asciifold, code_points, generateMap, generateSets, generator, getPattern, initialize, mapSequence, normalize, substringsToPattern, unicode_map };\n//# sourceMappingURL=index.js.map\n","\nimport { asciifold } from '@orchidjs/unicode-variants';\nimport * as T from './types';\n\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttr = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n return obj[name];\n};\n\n/**\n * A property getter resolving dot-notation\n * @param {Object} obj The root object to fetch property on\n * @param {String} name The optionally dotted property name to fetch\n * @return {Object} The resolved property value\n */\nexport const getAttrNesting = (obj:{[key:string]:any}, name:string ) => {\n if (!obj ) return;\n var part, names = name.split(\".\");\n\twhile( (part = names.shift()) && (obj = obj[part]));\n return obj;\n};\n\n/**\n * Calculates how close of a match the\n * given value is against a search token.\n *\n */\nexport const scoreValue = (value:string, token:T.Token, weight:number ):number => {\n\tvar score, pos;\n\n\tif (!value) return 0;\n\n\tvalue = value + '';\n\tif( token.regex == null ) return 0;\n\tpos = value.search(token.regex);\n\tif (pos === -1) return 0;\n\n\tscore = token.string.length / value.length;\n\tif (pos === 0) score += 0.5;\n\n\treturn score * weight;\n};\n\n\n/**\n * Cast object property to an array if it exists and has a value\n *\n */\nexport const propToArray = (obj:{[key:string]:any}, key:string) => {\n\tvar value = obj[key];\n\n\tif( typeof value == 'function' ) return value;\n\n\tif( value && !Array.isArray(value) ){\n\t\tobj[key] = [value];\n\t}\n}\n\n\n/**\n * Iterates over arrays and hashes.\n *\n * ```\n * iterate(this.items, function(item, id) {\n * // invoked for each item\n * });\n * ```\n *\n */\nexport const iterate = (object:[]|{[key:string]:any}, callback:(value:any,key:any)=>any) => {\n\n\tif ( Array.isArray(object)) {\n\t\tobject.forEach(callback);\n\n\t}else{\n\n\t\tfor (var key in object) {\n\t\t\tif (object.hasOwnProperty(key)) {\n\t\t\t\tcallback(object[key], key);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\nexport const cmp = (a:number|string, b:number|string) => {\n\tif (typeof a === 'number' && typeof b === 'number') {\n\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t}\n\ta = asciifold(a + '').toLowerCase();\n\tb = asciifold(b + '').toLowerCase();\n\tif (a > b) return 1;\n\tif (b > a) return -1;\n\treturn 0;\n};\n","\nimport { iterate } from '@orchidjs/sifter/lib/utils';\n\n/**\n * Return a dom element from either a dom query string, jQuery object, a dom element or html string\n * https://stackoverflow.com/questions/494143/creating-a-new-dom-element-from-an-html-string-using-built-in-dom-methods-or-pro/35385518#35385518\n *\n * param query should be {}\n */\nexport const getDom = ( query:any ):HTMLElement => {\n\n\tif( query.jquery ){\n\t\treturn query[0];\n\t}\n\n\tif( query instanceof HTMLElement ){\n\t\treturn query;\n\t}\n\n\tif( isHtmlString(query) ){\n\t\tvar tpl = document.createElement('template');\n\t\ttpl.innerHTML = query.trim(); // Never return a text node of whitespace as the result\n\t\treturn tpl.content.firstChild as HTMLElement;\n\t}\n\n\treturn document.querySelector(query);\n};\n\nexport const isHtmlString = (arg:any): boolean => {\n\tif( typeof arg === 'string' && arg.indexOf('<') > -1 ){\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nexport const escapeQuery = (query:string):string => {\n\treturn query.replace(/['\"\\\\]/g, '\\\\$&');\n}\n\n/**\n * Dispatch an event\n *\n */\nexport const triggerEvent = ( dom_el:HTMLElement, event_name:string ):void => {\n\tvar event = document.createEvent('HTMLEvents');\n\tevent.initEvent(event_name, true, false);\n\tdom_el.dispatchEvent(event)\n};\n\n/**\n * Apply CSS rules to a dom element\n *\n */\nexport const applyCSS = ( dom_el:HTMLElement, css:{ [key: string]: string|number }):void => {\n\tObject.assign(dom_el.style, css);\n}\n\n\n/**\n * Add css classes\n *\n */\nexport const addClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n\tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map( cls => {\n\t\t\tel.classList.add( cls );\n\t\t});\n\t});\n}\n\n/**\n * Remove css classes\n *\n */\n export const removeClasses = ( elmts:HTMLElement|HTMLElement[], ...classes:string[]|string[][] ) => {\n\n \tvar norm_classes \t= classesArray(classes);\n\telmts\t\t\t\t= castAsArray(elmts);\n\n\telmts.map( el => {\n\t\tnorm_classes.map(cls => {\n\t \t\tel.classList.remove( cls );\n\t\t});\n \t});\n }\n\n\n/**\n * Return arguments\n *\n */\nexport const classesArray = (args:string[]|string[][]):string[] => {\n\tvar classes:string[] = [];\n\titerate( args, (_classes) =>{\n\t\tif( typeof _classes === 'string' ){\n\t\t\t_classes = _classes.trim().split(/[\\11\\12\\14\\15\\40]/);\n\t\t}\n\t\tif( Array.isArray(_classes) ){\n\t\t\tclasses = classes.concat(_classes);\n\t\t}\n\t});\n\n\treturn classes.filter(Boolean);\n}\n\n\n/**\n * Create an array from arg if it's not already an array\n *\n */\nexport const castAsArray = (arg:any):Array<any> => {\n\tif( !Array.isArray(arg) ){\n \t\targ = [arg];\n \t}\n\treturn arg;\n}\n\n\n/**\n * Get the closest node to the evt.target matching the selector\n * Stops at wrapper\n *\n */\nexport const parentMatch = ( target:null|HTMLElement, selector:string, wrapper?:HTMLElement ):HTMLElement|void => {\n\n\tif( wrapper && !wrapper.contains(target) ){\n\t\treturn;\n\t}\n\n\twhile( target && target.matches ){\n\n\t\tif( target.matches(selector) ){\n\t\t\treturn target;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n}\n\n\n/**\n * Get the first or last item from an array\n *\n * > 0 - right (last)\n * <= 0 - left (first)\n *\n */\nexport const getTail = ( list:Array<any>|NodeList, direction:number=0 ):any => {\n\n\tif( direction > 0 ){\n\t\treturn list[list.length-1];\n\t}\n\n\treturn list[0];\n}\n\n/**\n * Return true if an object is empty\n *\n */\nexport const isEmptyObject = (obj:object):boolean => {\n\treturn (Object.keys(obj).length === 0);\n}\n\n\n/**\n * Get the index of an element amongst sibling nodes of the same type\n *\n */\nexport const nodeIndex = ( el:null|Element, amongst?:string ):number => {\n\tif (!el) return -1;\n\n\tamongst = amongst || el.nodeName;\n\n\tvar i = 0;\n\twhile( el = el.previousElementSibling ){\n\n\t\tif( el.matches(amongst) ){\n\t\t\ti++;\n\t\t}\n\t}\n\treturn i;\n}\n\n\n/**\n * Set attributes of an element\n *\n */\nexport const setAttr = (el:Element,attrs:{ [key: string]: null|string|number }) => {\n\titerate( attrs,(val,attr) => {\n\t\tif( val == null ){\n\t\t\tel.removeAttribute(attr as string);\n\t\t}else{\n\t\t\tel.setAttribute(attr as string, ''+val);\n\t\t}\n\t});\n}\n\n\n/**\n * Replace a node\n */\nexport const replaceNode = ( existing:Node, replacement:Node ) => {\n\tif( existing.parentNode ) existing.parentNode.replaceChild(replacement, existing);\n}\n","/**\n * Plugin: \"dropdown_input\" (Tom Select)\n * Copyright (c) contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy of the License at:\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n *\n */\n\nimport TomSelect from '../../tom-select';\nimport { nodeIndex, removeClasses } from '../../vanilla';\n\n\nexport default function(this:TomSelect) {\n\tvar self = this;\n\n\t/**\n\t * Moves the caret to the specified index.\n\t *\n\t * The input must be moved by leaving it in place and moving the\n\t * siblings, due to the fact that focus cannot be restored once lost\n\t * on mobile webkit devices\n\t *\n\t */\n\tself.hook('instead','setCaret',(new_pos:number) => {\n\n\t\tif( self.settings.mode === 'single' || !self.control.contains(self.control_input) ) {\n\t\t\tnew_pos = self.items.length;\n\t\t} else {\n\t\t\tnew_pos = Math.max(0, Math.min(self.items.length, new_pos));\n\n\t\t\tif( new_pos != self.caretPos && !self.isPending ){\n\n\t\t\t\tself.controlChildren().forEach((child,j) => {\n\t\t\t\t\tif( j < new_pos ){\n\t\t\t\t\t\tself.control_input.insertAdjacentElement('beforebegin', child );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.control.appendChild( child );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tself.caretPos = new_pos;\n\t});\n\n\tself.hook('instead','moveCaret',(direction:number) => {\n\n\t\tif( !self.isFocused ) return;\n\n\t\t// move caret before or after selected items\n\t\tconst last_active\t\t= self.getLastActive(direction);\n\t\tif( last_active ){\n\t\t\tconst idx = nodeIndex(last_active);\n\t\t\tself.setCaret(direction > 0 ? idx + 1: idx);\n\t\t\tself.setActiveItem();\n\t\t\tremoveClasses(last_active as HTMLElement,'last-active');\n\n\t\t// move caret left or right of current position\n\t\t}else{\n\t\t\tself.setCaret(self.caretPos + direction);\n\n\t\t}\n\n\t});\n\n};\n"],"names":["iterate","object","callback","Array","isArray","forEach","key","hasOwnProperty","removeClasses","elmts","classes","norm_classes","classesArray","castAsArray","map","el","cls","classList","remove","args","_classes","trim","split","concat","filter","Boolean","arg","nodeIndex","amongst","nodeName","i","previousElementSibling","matches","self","hook","new_pos","settings","mode","control","contains","control_input","items","length","Math","max","min","caretPos","isPending","controlChildren","child","j","insertAdjacentElement","appendChild","direction","isFocused","last_active","getLastActive","idx","setCaret","setActiveItem"],"mappings":";;;;;;;;;;;EAAA;EAeA,MAAM,UAAU,GAAG,qCAAqC,CAAC;EAQzD;AACA;EACA,MAAM,aAAa,GAAG,EAAE,CAAC;EACzB;AACA;EACA,MAAM,eAAe,GAAG;EACxB,EAAE,GAAG,EAAE,IAAI;EACX,EAAE,GAAG,EAAE,GAAG;EACV,EAAE,GAAG,EAAE,KAAK;EACZ,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,KAAK;EACb,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,IAAI;EACZ,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,GAAG,EAAE,KAAK;EACZ,EAAE,GAAG,EAAE,MAAM;EACb,EAAE,GAAG,EAAE,UAAU;EACjB,EAAE,GAAG,EAAE,MAAM;EACb,EAAE,GAAG,EAAE,IAAI;EACX,EAAE,GAAG,EAAE,QAAQ;EACf,EAAE,GAAG,EAAE,MAAM;EACb,EAAE,GAAG,EAAE,IAAI;EACX,EAAE,GAAG,EAAE,IAAI;EACX,EAAE,GAAG,EAAE,QAAQ;EACf,EAAE,GAAG,EAAE,UAAU;EACjB,EAAE,GAAG,EAAE,KAAK;EACZ,EAAE,GAAG,EAAE,SAAS;EAChB,EAAE,GAAG,EAAE,SAAS;EAChB,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,GAAG,EAAE,QAAQ;EACf,EAAE,GAAG,EAAE,KAAK;EACZ,EAAE,GAAG,EAAE,OAAO;EACd,EAAE,GAAG,EAAE,OAAO;EACd,EAAE,GAAG,EAAE,OAAO;EACd,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,GAAG,EAAE,GAAG;EACV,EAAE,GAAG,EAAE,KAAK;EACZ,EAAE,IAAI,EAAE,GAAG;EACX,EAAE,GAAG,EAAE,GAAG;EACV,EAAE,GAAG,EAAE,KAAK;EACZ,EAAE,GAAG,EAAE,OAAO;EACd,EAAE,IAAI,EAAE,GAAG;EACX,CAAC,CAAC;AACF;EACA,KAAK,IAAI,KAAK,IAAI,eAAe,EAAE;EACnC,EAAE,IAAI,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC7C;EACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EAC3C,IAAI,IAAI,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;EAC3C,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;EAChC,GAAG;EACH,CAAC;AACD;EACoB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,UAAU,EAAE,IAAI;;ECf5F;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACO,MAAMA,OAAO,GAAGA,CAACC,MAA4B,EAAEC,QAAiC,KAAK;EAE3F,EAAA,IAAKC,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,EAAE;EAC3BA,IAAAA,MAAM,CAACI,OAAO,CAACH,QAAQ,CAAC,CAAA;EAEzB,GAAC,MAAI;EAEJ,IAAA,KAAK,IAAII,GAAG,IAAIL,MAAM,EAAE;EACvB,MAAA,IAAIA,MAAM,CAACM,cAAc,CAACD,GAAG,CAAC,EAAE;EAC/BJ,QAAAA,QAAQ,CAACD,MAAM,CAACK,GAAG,CAAC,EAAEA,GAAG,CAAC,CAAA;EAC3B,OAAA;EACD,KAAA;EACD,GAAA;EACD,CAAC;;ECfD;EACA;EACA;EACA;EACQ,MAAME,aAAa,GAAGA,CAAEC,KAA+B,EAAE,GAAGC,OAA2B,KAAM;EAEnG,EAAA,IAAIC,YAAY,GAAIC,YAAY,CAACF,OAAO,CAAC,CAAA;EAC1CD,EAAAA,KAAK,GAAMI,WAAW,CAACJ,KAAK,CAAC,CAAA;EAE7BA,EAAAA,KAAK,CAACK,GAAG,CAAEC,EAAE,IAAI;EAChBJ,IAAAA,YAAY,CAACG,GAAG,CAACE,GAAG,IAAI;EACtBD,MAAAA,EAAE,CAACE,SAAS,CAACC,MAAM,CAAEF,GAAI,CAAC,CAAA;EAC5B,KAAC,CAAC,CAAA;EACF,GAAC,CAAC,CAAA;EACH,CAAC,CAAA;;EAGF;EACA;EACA;EACA;EACO,MAAMJ,YAAY,GAAIO,IAAwB,IAAc;IAClE,IAAIT,OAAgB,GAAG,EAAE,CAAA;EACzBV,EAAAA,OAAO,CAAEmB,IAAI,EAAGC,QAAQ,IAAI;EAC3B,IAAA,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;QACjCA,QAAQ,GAAGA,QAAQ,CAACC,IAAI,EAAE,CAACC,KAAK,CAAC,mBAAmB,CAAC,CAAA;EACtD,KAAA;EACA,IAAA,IAAInB,KAAK,CAACC,OAAO,CAACgB,QAAQ,CAAC,EAAE;EAC5BV,MAAAA,OAAO,GAAGA,OAAO,CAACa,MAAM,CAACH,QAAQ,CAAC,CAAA;EACnC,KAAA;EACD,GAAC,CAAC,CAAA;EAEF,EAAA,OAAOV,OAAO,CAACc,MAAM,CAACC,OAAO,CAAC,CAAA;EAC/B,CAAC,CAAA;;EAGD;EACA;EACA;EACA;EACO,MAAMZ,WAAW,GAAIa,GAAO,IAAgB;EAClD,EAAA,IAAI,CAACvB,KAAK,CAACC,OAAO,CAACsB,GAAG,CAAC,EAAE;MACvBA,GAAG,GAAG,CAACA,GAAG,CAAC,CAAA;EACZ,GAAA;EACD,EAAA,OAAOA,GAAG,CAAA;EACX,CAAC,CAAA;;EAkDD;EACA;EACA;EACA;EACO,MAAMC,SAAS,GAAGA,CAAEZ,EAAe,EAAEa,OAAe,KAAa;EACvE,EAAA,IAAI,CAACb,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;EAElBa,EAAAA,OAAO,GAAGA,OAAO,IAAIb,EAAE,CAACc,QAAQ,CAAA;IAEhC,IAAIC,CAAC,GAAG,CAAC,CAAA;EACT,EAAA,OAAOf,EAAE,GAAGA,EAAE,CAACgB,sBAAsB,EAAE;EAEtC,IAAA,IAAIhB,EAAE,CAACiB,OAAO,CAACJ,OAAO,CAAC,EAAE;EACxBE,MAAAA,CAAC,EAAE,CAAA;EACJ,KAAA;EACD,GAAA;EACA,EAAA,OAAOA,CAAC,CAAA;EACT,CAAC;;EC1LD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAMe,eAAyB,IAAA;IACvC,IAAIG,IAAI,GAAG,IAAI,CAAA;;EAEf;EACD;EACA;EACA;EACA;EACA;EACA;EACA;IACCA,IAAI,CAACC,IAAI,CAAC,SAAS,EAAC,UAAU,EAAEC,OAAc,IAAK;EAElD,IAAA,IAAIF,IAAI,CAACG,QAAQ,CAACC,IAAI,KAAK,QAAQ,IAAI,CAACJ,IAAI,CAACK,OAAO,CAACC,QAAQ,CAACN,IAAI,CAACO,aAAa,CAAC,EAAG;EACnFL,MAAAA,OAAO,GAAGF,IAAI,CAACQ,KAAK,CAACC,MAAM,CAAA;EAC5B,KAAC,MAAM;EACNP,MAAAA,OAAO,GAAGQ,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAACZ,IAAI,CAACQ,KAAK,CAACC,MAAM,EAAEP,OAAO,CAAC,CAAC,CAAA;QAE3D,IAAIA,OAAO,IAAIF,IAAI,CAACa,QAAQ,IAAI,CAACb,IAAI,CAACc,SAAS,EAAE;UAEhDd,IAAI,CAACe,eAAe,EAAE,CAAC3C,OAAO,CAAC,CAAC4C,KAAK,EAACC,CAAC,KAAK;YAC3C,IAAIA,CAAC,GAAGf,OAAO,EAAE;cAChBF,IAAI,CAACO,aAAa,CAACW,qBAAqB,CAAC,aAAa,EAAEF,KAAM,CAAC,CAAA;EAChE,WAAC,MAAM;EACNhB,YAAAA,IAAI,CAACK,OAAO,CAACc,WAAW,CAAEH,KAAM,CAAC,CAAA;EAClC,WAAA;EACD,SAAC,CAAC,CAAA;EACH,OAAA;EACD,KAAA;MAEAhB,IAAI,CAACa,QAAQ,GAAGX,OAAO,CAAA;EACxB,GAAC,CAAC,CAAA;IAEFF,IAAI,CAACC,IAAI,CAAC,SAAS,EAAC,WAAW,EAAEmB,SAAgB,IAAK;EAErD,IAAA,IAAI,CAACpB,IAAI,CAACqB,SAAS,EAAG,OAAA;;EAEtB;EACA,IAAA,MAAMC,WAAW,GAAItB,IAAI,CAACuB,aAAa,CAACH,SAAS,CAAC,CAAA;EAClD,IAAA,IAAIE,WAAW,EAAE;EAChB,MAAA,MAAME,GAAG,GAAG9B,SAAS,CAAC4B,WAAW,CAAC,CAAA;EAClCtB,MAAAA,IAAI,CAACyB,QAAQ,CAACL,SAAS,GAAG,CAAC,GAAGI,GAAG,GAAG,CAAC,GAAEA,GAAG,CAAC,CAAA;QAC3CxB,IAAI,CAAC0B,aAAa,EAAE,CAAA;EACpBnD,MAAAA,aAAa,CAAC+C,WAAW,EAAgB,aAAa,CAAC,CAAA;;EAExD;EACA,KAAC,MAAI;QACJtB,IAAI,CAACyB,QAAQ,CAACzB,IAAI,CAACa,QAAQ,GAAGO,SAAS,CAAC,CAAA;EAEzC,KAAA;EAED,GAAC,CAAC,CAAA;EAEH;;;;;;;;","x_google_ignoreList":[0,1]}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* Tom Select v2.
|
2
|
+
* Tom Select v2.3.1
|
3
3
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
*/
|
5
5
|
|
@@ -23,11 +23,11 @@
|
|
23
23
|
* 1 -> '1'
|
24
24
|
*
|
25
25
|
*/
|
26
|
+
|
26
27
|
/**
|
27
|
-
*
|
28
|
+
* Add event helper
|
28
29
|
*
|
29
30
|
*/
|
30
|
-
|
31
31
|
const addEvent = (target, type, callback, options) => {
|
32
32
|
target.addEventListener(type, callback, options);
|
33
33
|
};
|
@@ -46,6 +46,7 @@
|
|
46
46
|
* governing permissions and limitations under the License.
|
47
47
|
*
|
48
48
|
*/
|
49
|
+
|
49
50
|
function plugin () {
|
50
51
|
addEvent(this.input, 'change', () => {
|
51
52
|
this.sync();
|