slim-select 2.8.2 → 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +1 -0
- package/.prettierrc +4 -3
- package/README.md +5 -2
- package/dist/classes.d.ts +43 -0
- package/dist/helpers.d.ts +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/render.d.ts +4 -44
- package/dist/select.d.ts +4 -2
- package/dist/settings.d.ts +2 -1
- package/dist/slimselect.cjs.js +248 -120
- package/dist/slimselect.css +1 -1
- package/dist/slimselect.css.map +1 -1
- package/dist/slimselect.es.js +248 -120
- package/dist/slimselect.global.js +248 -120
- package/dist/slimselect.js +248 -120
- package/dist/slimselect.min.js +1 -1
- package/dist/slimselect.umd.js +248 -120
- package/dist/slimselect.umd.min.js +1 -1
- package/dist/store.d.ts +4 -2
- package/index.html +1 -4
- package/jest.config.js +6 -0
- package/package.json +31 -40
- package/src/slim-select/classes.test.ts +72 -0
- package/src/slim-select/classes.ts +109 -0
- package/src/slim-select/helpers.test.ts +160 -0
- package/src/slim-select/helpers.ts +3 -12
- package/src/slim-select/index.test.ts +109 -16
- package/src/slim-select/index.ts +41 -12
- package/src/slim-select/render.test.ts +1169 -18
- package/src/slim-select/render.ts +78 -97
- package/src/slim-select/rollup.config.mjs +28 -28
- package/src/slim-select/select.test.ts +306 -156
- package/src/slim-select/select.ts +70 -21
- package/src/slim-select/settings.test.ts +272 -0
- package/src/slim-select/settings.ts +5 -1
- package/src/slim-select/slimselect.scss +7 -3
- package/src/slim-select/store.test.ts +986 -235
- package/src/slim-select/store.ts +70 -28
- package/src/{vue/slimselect.vue → slim-select/vue.vue} +19 -17
- package/tsconfig.json +2 -3
- package/{vite.config.ts → vite.config.mts} +11 -4
- package/src/react/.eslintignore +0 -2
- package/src/react/.eslintrc.cjs +0 -24
- package/src/react/index.html +0 -14
- package/src/react/jestconfig.json +0 -11
- package/src/react/package.json +0 -32
- package/src/react/src/frameworkpage.tsx +0 -133
- package/src/react/src/index.ts +0 -3
- package/src/react/src/slimselect.tsx +0 -148
- package/src/react/tests/slimselect.test.tsx +0 -52
- package/src/react/tsconfig.json +0 -37
- package/src/react/tsconfig.node.json +0 -10
- package/src/react/vite.config.ts +0 -55
- package/src/vue/README.md +0 -48
- package/src/vue/dist/slim-select/helpers.d.ts +0 -5
- package/src/vue/dist/slim-select/index.d.ts +0 -46
- package/src/vue/dist/slim-select/render.d.ts +0 -120
- package/src/vue/dist/slim-select/select.d.ts +0 -28
- package/src/vue/dist/slim-select/settings.d.ts +0 -34
- package/src/vue/dist/slim-select/store.d.ts +0 -80
- package/src/vue/dist/slimselectvue.es.js +0 -1978
- package/src/vue/dist/slimselectvue.global.js +0 -1981
- package/src/vue/dist/slimselectvue.ssr.js +0 -1980
- package/src/vue/dist/vue/hello.d.ts +0 -2
- package/src/vue/dist/vue/slimselect.vue.d.ts +0 -326
- package/src/vue/hello.ts +0 -5
- package/src/vue/package.json +0 -28
- package/src/vue/rollup.config.mjs +0 -44
- package/src/vue/tsconfig.json +0 -14
|
@@ -1,6 +1,54 @@
|
|
|
1
1
|
var SlimSelect = (function () {
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
+
class CssClasses {
|
|
5
|
+
constructor(classes) {
|
|
6
|
+
if (!classes) {
|
|
7
|
+
classes = {};
|
|
8
|
+
}
|
|
9
|
+
this.main = classes.main || 'ss-main';
|
|
10
|
+
this.placeholder = classes.placeholder || 'ss-placeholder';
|
|
11
|
+
this.values = classes.values || 'ss-values';
|
|
12
|
+
this.single = classes.single || 'ss-single';
|
|
13
|
+
this.max = classes.max || 'ss-max';
|
|
14
|
+
this.value = classes.value || 'ss-value';
|
|
15
|
+
this.valueText = classes.valueText || 'ss-value-text';
|
|
16
|
+
this.valueDelete = classes.valueDelete || 'ss-value-delete';
|
|
17
|
+
this.valueOut = classes.valueOut || 'ss-value-out';
|
|
18
|
+
this.deselect = classes.deselect || 'ss-deselect';
|
|
19
|
+
this.deselectPath = classes.deselectPath || 'M10,10 L90,90 M10,90 L90,10';
|
|
20
|
+
this.arrow = classes.arrow || 'ss-arrow';
|
|
21
|
+
this.arrowClose = classes.arrowClose || 'M10,30 L50,70 L90,30';
|
|
22
|
+
this.arrowOpen = classes.arrowOpen || 'M10,70 L50,30 L90,70';
|
|
23
|
+
this.content = classes.content || 'ss-content';
|
|
24
|
+
this.openAbove = classes.openAbove || 'ss-open-above';
|
|
25
|
+
this.openBelow = classes.openBelow || 'ss-open-below';
|
|
26
|
+
this.search = classes.search || 'ss-search';
|
|
27
|
+
this.searchHighlighter = classes.searchHighlighter || 'ss-search-highlight';
|
|
28
|
+
this.searching = classes.searching || 'ss-searching';
|
|
29
|
+
this.addable = classes.addable || 'ss-addable';
|
|
30
|
+
this.addablePath = classes.addablePath || 'M50,10 L50,90 M10,50 L90,50';
|
|
31
|
+
this.list = classes.list || 'ss-list';
|
|
32
|
+
this.optgroup = classes.optgroup || 'ss-optgroup';
|
|
33
|
+
this.optgroupLabel = classes.optgroupLabel || 'ss-optgroup-label';
|
|
34
|
+
this.optgroupLabelText = classes.optgroupLabelText || 'ss-optgroup-label-text';
|
|
35
|
+
this.optgroupActions = classes.optgroupActions || 'ss-optgroup-actions';
|
|
36
|
+
this.optgroupSelectAll = classes.optgroupSelectAll || 'ss-selectall';
|
|
37
|
+
this.optgroupSelectAllBox = classes.optgroupSelectAllBox || 'M60,10 L10,10 L10,90 L90,90 L90,50';
|
|
38
|
+
this.optgroupSelectAllCheck = classes.optgroupSelectAllCheck || 'M30,45 L50,70 L90,10';
|
|
39
|
+
this.optgroupClosable = classes.optgroupClosable || 'ss-closable';
|
|
40
|
+
this.option = classes.option || 'ss-option';
|
|
41
|
+
this.optionDelete = classes.optionDelete || 'M10,10 L90,90 M10,90 L90,10';
|
|
42
|
+
this.highlighted = classes.highlighted || 'ss-highlighted';
|
|
43
|
+
this.open = classes.open || 'ss-open';
|
|
44
|
+
this.close = classes.close || 'ss-close';
|
|
45
|
+
this.selected = classes.selected || 'ss-selected';
|
|
46
|
+
this.error = classes.error || 'ss-error';
|
|
47
|
+
this.disabled = classes.disabled || 'ss-disabled';
|
|
48
|
+
this.hide = classes.hide || 'ss-hide';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
4
52
|
function generateID() {
|
|
5
53
|
return Math.random().toString(36).substring(2, 10);
|
|
6
54
|
}
|
|
@@ -88,6 +136,7 @@ var SlimSelect = (function () {
|
|
|
88
136
|
constructor(type, data) {
|
|
89
137
|
this.selectType = 'single';
|
|
90
138
|
this.data = [];
|
|
139
|
+
this.selectedOrder = [];
|
|
91
140
|
this.selectType = type;
|
|
92
141
|
this.setData(data);
|
|
93
142
|
}
|
|
@@ -102,12 +151,18 @@ var SlimSelect = (function () {
|
|
|
102
151
|
}
|
|
103
152
|
if ('options' in dataObj && dataObj.options) {
|
|
104
153
|
for (let option of dataObj.options) {
|
|
105
|
-
|
|
154
|
+
const validationError = this.validateOption(option);
|
|
155
|
+
if (validationError) {
|
|
156
|
+
return validationError;
|
|
157
|
+
}
|
|
106
158
|
}
|
|
107
159
|
}
|
|
108
160
|
}
|
|
109
161
|
else if (dataObj instanceof Option || 'text' in dataObj) {
|
|
110
|
-
|
|
162
|
+
const validationError = this.validateOption(dataObj);
|
|
163
|
+
if (validationError) {
|
|
164
|
+
return validationError;
|
|
165
|
+
}
|
|
111
166
|
}
|
|
112
167
|
else {
|
|
113
168
|
return new Error('Data object must be a valid optgroup or option');
|
|
@@ -144,7 +199,7 @@ var SlimSelect = (function () {
|
|
|
144
199
|
setData(data) {
|
|
145
200
|
this.data = this.partialToFullData(data);
|
|
146
201
|
if (this.selectType === 'single') {
|
|
147
|
-
this.setSelectedBy('
|
|
202
|
+
this.setSelectedBy('id', this.getSelected());
|
|
148
203
|
}
|
|
149
204
|
}
|
|
150
205
|
getData() {
|
|
@@ -153,12 +208,19 @@ var SlimSelect = (function () {
|
|
|
153
208
|
getDataOptions() {
|
|
154
209
|
return this.filter(null, false);
|
|
155
210
|
}
|
|
156
|
-
addOption(option) {
|
|
157
|
-
|
|
211
|
+
addOption(option, addToStart = false) {
|
|
212
|
+
if (addToStart) {
|
|
213
|
+
let data = [new Option(option)];
|
|
214
|
+
this.setData(data.concat(this.getData()));
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
this.setData(this.getData().concat(new Option(option)));
|
|
218
|
+
}
|
|
158
219
|
}
|
|
159
220
|
setSelectedBy(selectedType, selectedValues) {
|
|
160
221
|
let firstOption = null;
|
|
161
222
|
let hasSelected = false;
|
|
223
|
+
const selectedObjects = [];
|
|
162
224
|
for (let dataObj of this.data) {
|
|
163
225
|
if (dataObj instanceof Optgroup) {
|
|
164
226
|
for (let option of dataObj.options) {
|
|
@@ -166,8 +228,11 @@ var SlimSelect = (function () {
|
|
|
166
228
|
firstOption = option;
|
|
167
229
|
}
|
|
168
230
|
option.selected = hasSelected ? false : selectedValues.includes(option[selectedType]);
|
|
169
|
-
if (option.selected
|
|
170
|
-
|
|
231
|
+
if (option.selected) {
|
|
232
|
+
selectedObjects.push(option);
|
|
233
|
+
if (this.selectType === 'single') {
|
|
234
|
+
hasSelected = true;
|
|
235
|
+
}
|
|
171
236
|
}
|
|
172
237
|
}
|
|
173
238
|
}
|
|
@@ -176,36 +241,35 @@ var SlimSelect = (function () {
|
|
|
176
241
|
firstOption = dataObj;
|
|
177
242
|
}
|
|
178
243
|
dataObj.selected = hasSelected ? false : selectedValues.includes(dataObj[selectedType]);
|
|
179
|
-
if (dataObj.selected
|
|
180
|
-
|
|
244
|
+
if (dataObj.selected) {
|
|
245
|
+
selectedObjects.push(dataObj);
|
|
246
|
+
if (this.selectType === 'single') {
|
|
247
|
+
hasSelected = true;
|
|
248
|
+
}
|
|
181
249
|
}
|
|
182
250
|
}
|
|
183
251
|
}
|
|
184
252
|
if (this.selectType === 'single' && firstOption && !hasSelected) {
|
|
185
253
|
firstOption.selected = true;
|
|
254
|
+
selectedObjects.push(firstOption);
|
|
186
255
|
}
|
|
256
|
+
const selectedIds = selectedValues.map((value) => {
|
|
257
|
+
var _a;
|
|
258
|
+
return ((_a = selectedObjects.find((option) => option[selectedType] === value)) === null || _a === void 0 ? void 0 : _a.id) || '';
|
|
259
|
+
});
|
|
260
|
+
this.selectedOrder = selectedIds;
|
|
187
261
|
}
|
|
188
262
|
getSelected() {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
});
|
|
194
|
-
return selectedValues;
|
|
263
|
+
return this.getSelectedOptions().map((option) => option.id);
|
|
264
|
+
}
|
|
265
|
+
getSelectedValues() {
|
|
266
|
+
return this.getSelectedOptions().map((option) => option.value);
|
|
195
267
|
}
|
|
196
268
|
getSelectedOptions() {
|
|
197
269
|
return this.filter((opt) => {
|
|
198
270
|
return opt.selected;
|
|
199
271
|
}, false);
|
|
200
272
|
}
|
|
201
|
-
getSelectedIDs() {
|
|
202
|
-
let selectedOptions = this.getSelectedOptions();
|
|
203
|
-
let selectedIDs = [];
|
|
204
|
-
selectedOptions.forEach((op) => {
|
|
205
|
-
selectedIDs.push(op.id);
|
|
206
|
-
});
|
|
207
|
-
return selectedIDs;
|
|
208
|
-
}
|
|
209
273
|
getOptgroupByID(id) {
|
|
210
274
|
for (let dataObj of this.data) {
|
|
211
275
|
if (dataObj instanceof Optgroup && dataObj.id === id) {
|
|
@@ -276,54 +340,35 @@ var SlimSelect = (function () {
|
|
|
276
340
|
});
|
|
277
341
|
return dataSearch;
|
|
278
342
|
}
|
|
343
|
+
selectedOrderOptions(options) {
|
|
344
|
+
const newOrder = [];
|
|
345
|
+
this.selectedOrder.forEach((id) => {
|
|
346
|
+
const option = options.find((opt) => opt.id === id);
|
|
347
|
+
if (option) {
|
|
348
|
+
newOrder.push(option);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
options.forEach((option) => {
|
|
352
|
+
let isIn = false;
|
|
353
|
+
newOrder.forEach((selectedOption) => {
|
|
354
|
+
if (option.id === selectedOption.id) {
|
|
355
|
+
isIn = true;
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
if (!isIn) {
|
|
360
|
+
newOrder.push(option);
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
return newOrder;
|
|
364
|
+
}
|
|
279
365
|
}
|
|
280
366
|
|
|
281
367
|
class Render {
|
|
282
|
-
constructor(settings, store, callbacks) {
|
|
283
|
-
this.classes = {
|
|
284
|
-
main: 'ss-main',
|
|
285
|
-
placeholder: 'ss-placeholder',
|
|
286
|
-
values: 'ss-values',
|
|
287
|
-
single: 'ss-single',
|
|
288
|
-
max: 'ss-max',
|
|
289
|
-
value: 'ss-value',
|
|
290
|
-
valueText: 'ss-value-text',
|
|
291
|
-
valueDelete: 'ss-value-delete',
|
|
292
|
-
valueOut: 'ss-value-out',
|
|
293
|
-
deselect: 'ss-deselect',
|
|
294
|
-
deselectPath: 'M10,10 L90,90 M10,90 L90,10',
|
|
295
|
-
arrow: 'ss-arrow',
|
|
296
|
-
arrowClose: 'M10,30 L50,70 L90,30',
|
|
297
|
-
arrowOpen: 'M10,70 L50,30 L90,70',
|
|
298
|
-
content: 'ss-content',
|
|
299
|
-
openAbove: 'ss-open-above',
|
|
300
|
-
openBelow: 'ss-open-below',
|
|
301
|
-
search: 'ss-search',
|
|
302
|
-
searchHighlighter: 'ss-search-highlight',
|
|
303
|
-
searching: 'ss-searching',
|
|
304
|
-
addable: 'ss-addable',
|
|
305
|
-
addablePath: 'M50,10 L50,90 M10,50 L90,50',
|
|
306
|
-
list: 'ss-list',
|
|
307
|
-
optgroup: 'ss-optgroup',
|
|
308
|
-
optgroupLabel: 'ss-optgroup-label',
|
|
309
|
-
optgroupLabelText: 'ss-optgroup-label-text',
|
|
310
|
-
optgroupActions: 'ss-optgroup-actions',
|
|
311
|
-
optgroupSelectAll: 'ss-selectall',
|
|
312
|
-
optgroupSelectAllBox: 'M60,10 L10,10 L10,90 L90,90 L90,50',
|
|
313
|
-
optgroupSelectAllCheck: 'M30,45 L50,70 L90,10',
|
|
314
|
-
optgroupClosable: 'ss-closable',
|
|
315
|
-
option: 'ss-option',
|
|
316
|
-
optionDelete: 'M10,10 L90,90 M10,90 L90,10',
|
|
317
|
-
highlighted: 'ss-highlighted',
|
|
318
|
-
open: 'ss-open',
|
|
319
|
-
close: 'ss-close',
|
|
320
|
-
selected: 'ss-selected',
|
|
321
|
-
error: 'ss-error',
|
|
322
|
-
disabled: 'ss-disabled',
|
|
323
|
-
hide: 'ss-hide',
|
|
324
|
-
};
|
|
368
|
+
constructor(settings, classes, store, callbacks) {
|
|
325
369
|
this.store = store;
|
|
326
370
|
this.settings = settings;
|
|
371
|
+
this.classes = classes;
|
|
327
372
|
this.callbacks = callbacks;
|
|
328
373
|
this.main = this.mainDiv();
|
|
329
374
|
this.content = this.contentDiv();
|
|
@@ -419,7 +464,7 @@ var SlimSelect = (function () {
|
|
|
419
464
|
this.callbacks.close();
|
|
420
465
|
return false;
|
|
421
466
|
}
|
|
422
|
-
return
|
|
467
|
+
return true;
|
|
423
468
|
};
|
|
424
469
|
main.onclick = (e) => {
|
|
425
470
|
if (this.settings.disabled) {
|
|
@@ -457,8 +502,8 @@ var SlimSelect = (function () {
|
|
|
457
502
|
}
|
|
458
503
|
else {
|
|
459
504
|
const firstOption = this.store.getFirstOption();
|
|
460
|
-
const
|
|
461
|
-
this.callbacks.setSelected(
|
|
505
|
+
const id = firstOption ? firstOption.id : '';
|
|
506
|
+
this.callbacks.setSelected(id, false);
|
|
462
507
|
}
|
|
463
508
|
if (this.settings.closeOnSelect) {
|
|
464
509
|
this.callbacks.close();
|
|
@@ -491,12 +536,12 @@ var SlimSelect = (function () {
|
|
|
491
536
|
deselect: {
|
|
492
537
|
main: deselect,
|
|
493
538
|
svg: deselectSvg,
|
|
494
|
-
path: deselectPath
|
|
539
|
+
path: deselectPath
|
|
495
540
|
},
|
|
496
541
|
arrow: {
|
|
497
542
|
main: arrow,
|
|
498
|
-
path: arrowPath
|
|
499
|
-
}
|
|
543
|
+
path: arrowPath
|
|
544
|
+
}
|
|
500
545
|
};
|
|
501
546
|
}
|
|
502
547
|
mainFocus(eventType) {
|
|
@@ -582,6 +627,9 @@ var SlimSelect = (function () {
|
|
|
582
627
|
maxValuesMessage.remove();
|
|
583
628
|
}
|
|
584
629
|
}
|
|
630
|
+
if (this.settings.keepOrder) {
|
|
631
|
+
selectedOptions = this.store.selectedOrderOptions(selectedOptions);
|
|
632
|
+
}
|
|
585
633
|
let removeNodes = [];
|
|
586
634
|
for (let i = 0; i < currentNodes.length; i++) {
|
|
587
635
|
const node = currentNodes[i];
|
|
@@ -635,7 +683,7 @@ var SlimSelect = (function () {
|
|
|
635
683
|
value.dataset.id = option.id;
|
|
636
684
|
const text = document.createElement('div');
|
|
637
685
|
text.classList.add(this.classes.valueText);
|
|
638
|
-
text.
|
|
686
|
+
text.textContent = option.text;
|
|
639
687
|
value.appendChild(text);
|
|
640
688
|
if (!option.mandatory) {
|
|
641
689
|
const deleteDiv = document.createElement('div');
|
|
@@ -658,18 +706,18 @@ var SlimSelect = (function () {
|
|
|
658
706
|
shouldDelete = this.callbacks.beforeChange(after, before) === true;
|
|
659
707
|
}
|
|
660
708
|
if (shouldDelete) {
|
|
661
|
-
let
|
|
709
|
+
let selectedIds = [];
|
|
662
710
|
for (const o of after) {
|
|
663
711
|
if (o instanceof Optgroup) {
|
|
664
712
|
for (const c of o.options) {
|
|
665
|
-
|
|
713
|
+
selectedIds.push(c.id);
|
|
666
714
|
}
|
|
667
715
|
}
|
|
668
716
|
if (o instanceof Option) {
|
|
669
|
-
|
|
717
|
+
selectedIds.push(o.id);
|
|
670
718
|
}
|
|
671
719
|
}
|
|
672
|
-
this.callbacks.setSelected(
|
|
720
|
+
this.callbacks.setSelected(selectedIds, false);
|
|
673
721
|
if (this.settings.closeOnSelect) {
|
|
674
722
|
this.callbacks.close();
|
|
675
723
|
}
|
|
@@ -699,7 +747,7 @@ var SlimSelect = (function () {
|
|
|
699
747
|
return {
|
|
700
748
|
main: main,
|
|
701
749
|
search: search,
|
|
702
|
-
list: list
|
|
750
|
+
list: list
|
|
703
751
|
};
|
|
704
752
|
}
|
|
705
753
|
moveContent() {
|
|
@@ -729,7 +777,7 @@ var SlimSelect = (function () {
|
|
|
729
777
|
main.classList.add(this.classes.search);
|
|
730
778
|
const searchReturn = {
|
|
731
779
|
main,
|
|
732
|
-
input
|
|
780
|
+
input
|
|
733
781
|
};
|
|
734
782
|
if (!this.settings.showSearch) {
|
|
735
783
|
main.classList.add(this.classes.hide);
|
|
@@ -757,9 +805,15 @@ var SlimSelect = (function () {
|
|
|
757
805
|
case 'Escape':
|
|
758
806
|
this.callbacks.close();
|
|
759
807
|
return false;
|
|
760
|
-
case 'Enter':
|
|
761
808
|
case ' ':
|
|
762
|
-
|
|
809
|
+
const highlighted = this.content.list.querySelector('.' + this.classes.highlighted);
|
|
810
|
+
if (highlighted) {
|
|
811
|
+
highlighted.click();
|
|
812
|
+
return false;
|
|
813
|
+
}
|
|
814
|
+
return true;
|
|
815
|
+
case 'Enter':
|
|
816
|
+
if (this.callbacks.addable) {
|
|
763
817
|
addable.click();
|
|
764
818
|
return false;
|
|
765
819
|
}
|
|
@@ -798,12 +852,12 @@ var SlimSelect = (function () {
|
|
|
798
852
|
let newOption = new Option(oo);
|
|
799
853
|
this.callbacks.addOption(newOption);
|
|
800
854
|
if (this.settings.isMultiple) {
|
|
801
|
-
let
|
|
802
|
-
|
|
803
|
-
this.callbacks.setSelected(
|
|
855
|
+
let ids = this.store.getSelected();
|
|
856
|
+
ids.push(newOption.id);
|
|
857
|
+
this.callbacks.setSelected(ids, true);
|
|
804
858
|
}
|
|
805
859
|
else {
|
|
806
|
-
this.callbacks.setSelected([newOption.
|
|
860
|
+
this.callbacks.setSelected([newOption.id], true);
|
|
807
861
|
}
|
|
808
862
|
this.callbacks.search('');
|
|
809
863
|
if (this.settings.closeOnSelect) {
|
|
@@ -821,9 +875,12 @@ var SlimSelect = (function () {
|
|
|
821
875
|
if (typeof value === 'string') {
|
|
822
876
|
runFinish({
|
|
823
877
|
text: value,
|
|
824
|
-
value: value
|
|
878
|
+
value: value
|
|
825
879
|
});
|
|
826
880
|
}
|
|
881
|
+
else if (addableValue instanceof Error) {
|
|
882
|
+
this.renderError(addableValue.message);
|
|
883
|
+
}
|
|
827
884
|
else {
|
|
828
885
|
runFinish(value);
|
|
829
886
|
}
|
|
@@ -832,9 +889,12 @@ var SlimSelect = (function () {
|
|
|
832
889
|
else if (typeof addableValue === 'string') {
|
|
833
890
|
runFinish({
|
|
834
891
|
text: addableValue,
|
|
835
|
-
value: addableValue
|
|
892
|
+
value: addableValue
|
|
836
893
|
});
|
|
837
894
|
}
|
|
895
|
+
else if (addableValue instanceof Error) {
|
|
896
|
+
this.renderError(addableValue.message);
|
|
897
|
+
}
|
|
838
898
|
else {
|
|
839
899
|
runFinish(addableValue);
|
|
840
900
|
}
|
|
@@ -844,7 +904,7 @@ var SlimSelect = (function () {
|
|
|
844
904
|
searchReturn.addable = {
|
|
845
905
|
main: addable,
|
|
846
906
|
svg: plus,
|
|
847
|
-
path: plusPath
|
|
907
|
+
path: plusPath
|
|
848
908
|
};
|
|
849
909
|
}
|
|
850
910
|
return searchReturn;
|
|
@@ -941,10 +1001,26 @@ var SlimSelect = (function () {
|
|
|
941
1001
|
if (data.length === 0) {
|
|
942
1002
|
const noResults = document.createElement('div');
|
|
943
1003
|
noResults.classList.add(this.classes.search);
|
|
944
|
-
|
|
1004
|
+
if (this.callbacks.addable) {
|
|
1005
|
+
noResults.innerHTML = this.settings.addableText.replace('{value}', this.content.search.input.value);
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
noResults.innerHTML = this.settings.searchText;
|
|
1009
|
+
}
|
|
945
1010
|
this.content.list.appendChild(noResults);
|
|
946
1011
|
return;
|
|
947
1012
|
}
|
|
1013
|
+
if (this.settings.allowDeselect && !this.settings.isMultiple) {
|
|
1014
|
+
const placeholderOption = this.store.filter((o) => o.placeholder, false);
|
|
1015
|
+
if (!placeholderOption.length) {
|
|
1016
|
+
this.store.addOption(new Option({
|
|
1017
|
+
text: '',
|
|
1018
|
+
value: '',
|
|
1019
|
+
selected: false,
|
|
1020
|
+
placeholder: true
|
|
1021
|
+
}), true);
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
948
1024
|
for (const d of data) {
|
|
949
1025
|
if (d instanceof Optgroup) {
|
|
950
1026
|
const optgroupEl = document.createElement('div');
|
|
@@ -991,7 +1067,7 @@ var SlimSelect = (function () {
|
|
|
991
1067
|
if (allSelected) {
|
|
992
1068
|
const newSelected = currentSelected.filter((s) => {
|
|
993
1069
|
for (const o of d.options) {
|
|
994
|
-
if (s === o.
|
|
1070
|
+
if (s === o.id) {
|
|
995
1071
|
return false;
|
|
996
1072
|
}
|
|
997
1073
|
}
|
|
@@ -1001,7 +1077,7 @@ var SlimSelect = (function () {
|
|
|
1001
1077
|
return;
|
|
1002
1078
|
}
|
|
1003
1079
|
else {
|
|
1004
|
-
const newSelected = currentSelected.concat(d.options.map((o) => o.
|
|
1080
|
+
const newSelected = currentSelected.concat(d.options.map((o) => o.id));
|
|
1005
1081
|
for (const o of d.options) {
|
|
1006
1082
|
if (!this.store.getOptionByID(o.id)) {
|
|
1007
1083
|
this.callbacks.addOption(o);
|
|
@@ -1158,7 +1234,7 @@ var SlimSelect = (function () {
|
|
|
1158
1234
|
if (!this.store.getOptionByID(elementID)) {
|
|
1159
1235
|
this.callbacks.addOption(option);
|
|
1160
1236
|
}
|
|
1161
|
-
this.callbacks.setSelected(after.map((o) => o.
|
|
1237
|
+
this.callbacks.setSelected(after.map((o) => o.id), false);
|
|
1162
1238
|
if (this.settings.closeOnSelect) {
|
|
1163
1239
|
this.callbacks.close();
|
|
1164
1240
|
}
|
|
@@ -1175,7 +1251,7 @@ var SlimSelect = (function () {
|
|
|
1175
1251
|
}
|
|
1176
1252
|
highlightText(str, search, className) {
|
|
1177
1253
|
let completedString = str;
|
|
1178
|
-
const regex = new RegExp('(' + search.trim() + ')(?![^<]*>[^<>]*</)', 'i');
|
|
1254
|
+
const regex = new RegExp('(?![^<]*>)(' + search.trim() + ')(?![^<]*>[^<>]*</)', 'i');
|
|
1179
1255
|
if (!str.match(regex)) {
|
|
1180
1256
|
return str;
|
|
1181
1257
|
}
|
|
@@ -1264,7 +1340,7 @@ var SlimSelect = (function () {
|
|
|
1264
1340
|
this.select = select;
|
|
1265
1341
|
this.valueChange = this.valueChange.bind(this);
|
|
1266
1342
|
this.select.addEventListener('change', this.valueChange, {
|
|
1267
|
-
passive: true
|
|
1343
|
+
passive: true
|
|
1268
1344
|
});
|
|
1269
1345
|
this.observer = new MutationObserver(this.observeCall.bind(this));
|
|
1270
1346
|
this.changeListen(true);
|
|
@@ -1292,7 +1368,7 @@ var SlimSelect = (function () {
|
|
|
1292
1368
|
this.observer.observe(this.select, {
|
|
1293
1369
|
subtree: true,
|
|
1294
1370
|
childList: true,
|
|
1295
|
-
attributes: true
|
|
1371
|
+
attributes: true
|
|
1296
1372
|
});
|
|
1297
1373
|
}
|
|
1298
1374
|
}
|
|
@@ -1304,7 +1380,7 @@ var SlimSelect = (function () {
|
|
|
1304
1380
|
}
|
|
1305
1381
|
valueChange(ev) {
|
|
1306
1382
|
if (this.listen && this.onValueChange) {
|
|
1307
|
-
this.onValueChange(this.
|
|
1383
|
+
this.onValueChange(this.getSelectedOptions());
|
|
1308
1384
|
}
|
|
1309
1385
|
return true;
|
|
1310
1386
|
}
|
|
@@ -1323,6 +1399,15 @@ var SlimSelect = (function () {
|
|
|
1323
1399
|
if (m.attributeName === 'class') {
|
|
1324
1400
|
classChanged = true;
|
|
1325
1401
|
}
|
|
1402
|
+
if (m.type === 'childList') {
|
|
1403
|
+
for (const n of m.addedNodes) {
|
|
1404
|
+
if (n.nodeName === 'OPTION' && n.value === this.select.value) {
|
|
1405
|
+
this.select.dispatchEvent(new Event('change'));
|
|
1406
|
+
break;
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
optgroupOptionChanged = true;
|
|
1410
|
+
}
|
|
1326
1411
|
}
|
|
1327
1412
|
if (m.target.nodeName === 'OPTGROUP' || m.target.nodeName === 'OPTION') {
|
|
1328
1413
|
optgroupOptionChanged = true;
|
|
@@ -1362,7 +1447,7 @@ var SlimSelect = (function () {
|
|
|
1362
1447
|
selectAll: optgroup.dataset ? optgroup.dataset.selectall === 'true' : false,
|
|
1363
1448
|
selectAllText: optgroup.dataset ? optgroup.dataset.selectalltext : 'Select all',
|
|
1364
1449
|
closable: optgroup.dataset ? optgroup.dataset.closable : 'off',
|
|
1365
|
-
options: []
|
|
1450
|
+
options: []
|
|
1366
1451
|
};
|
|
1367
1452
|
const options = optgroup.childNodes;
|
|
1368
1453
|
for (const o of options) {
|
|
@@ -1379,26 +1464,26 @@ var SlimSelect = (function () {
|
|
|
1379
1464
|
text: option.text,
|
|
1380
1465
|
html: option.dataset && option.dataset.html ? option.dataset.html : '',
|
|
1381
1466
|
selected: option.selected,
|
|
1382
|
-
display: option.style.display
|
|
1467
|
+
display: option.style.display !== 'none',
|
|
1383
1468
|
disabled: option.disabled,
|
|
1384
1469
|
mandatory: option.dataset ? option.dataset.mandatory === 'true' : false,
|
|
1385
1470
|
placeholder: option.dataset.placeholder === 'true',
|
|
1386
1471
|
class: option.className,
|
|
1387
1472
|
style: option.style.cssText,
|
|
1388
|
-
data: option.dataset
|
|
1473
|
+
data: option.dataset
|
|
1389
1474
|
};
|
|
1390
1475
|
}
|
|
1391
|
-
|
|
1392
|
-
let
|
|
1393
|
-
const
|
|
1394
|
-
for (const o of
|
|
1476
|
+
getSelectedOptions() {
|
|
1477
|
+
let options = [];
|
|
1478
|
+
const opts = this.select.childNodes;
|
|
1479
|
+
for (const o of opts) {
|
|
1395
1480
|
if (o.nodeName === 'OPTGROUP') {
|
|
1396
1481
|
const optgroupOptions = o.childNodes;
|
|
1397
1482
|
for (const oo of optgroupOptions) {
|
|
1398
1483
|
if (oo.nodeName === 'OPTION') {
|
|
1399
1484
|
const option = oo;
|
|
1400
1485
|
if (option.selected) {
|
|
1401
|
-
|
|
1486
|
+
options.push(this.getDataFromOption(option));
|
|
1402
1487
|
}
|
|
1403
1488
|
}
|
|
1404
1489
|
}
|
|
@@ -1406,13 +1491,16 @@ var SlimSelect = (function () {
|
|
|
1406
1491
|
if (o.nodeName === 'OPTION') {
|
|
1407
1492
|
const option = o;
|
|
1408
1493
|
if (option.selected) {
|
|
1409
|
-
|
|
1494
|
+
options.push(this.getDataFromOption(option));
|
|
1410
1495
|
}
|
|
1411
1496
|
}
|
|
1412
1497
|
}
|
|
1413
|
-
return
|
|
1498
|
+
return options;
|
|
1414
1499
|
}
|
|
1415
|
-
|
|
1500
|
+
getSelectedValues() {
|
|
1501
|
+
return this.getSelectedOptions().map((option) => option.value);
|
|
1502
|
+
}
|
|
1503
|
+
setSelected(ids) {
|
|
1416
1504
|
this.changeListen(false);
|
|
1417
1505
|
const options = this.select.childNodes;
|
|
1418
1506
|
for (const o of options) {
|
|
@@ -1422,13 +1510,34 @@ var SlimSelect = (function () {
|
|
|
1422
1510
|
for (const oo of optgroupOptions) {
|
|
1423
1511
|
if (oo.nodeName === 'OPTION') {
|
|
1424
1512
|
const option = oo;
|
|
1425
|
-
option.selected =
|
|
1513
|
+
option.selected = ids.includes(option.id);
|
|
1426
1514
|
}
|
|
1427
1515
|
}
|
|
1428
1516
|
}
|
|
1429
1517
|
if (o.nodeName === 'OPTION') {
|
|
1430
1518
|
const option = o;
|
|
1431
|
-
option.selected =
|
|
1519
|
+
option.selected = ids.includes(option.id);
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
this.changeListen(true);
|
|
1523
|
+
}
|
|
1524
|
+
setSelectedByValue(values) {
|
|
1525
|
+
this.changeListen(false);
|
|
1526
|
+
const options = this.select.childNodes;
|
|
1527
|
+
for (const o of options) {
|
|
1528
|
+
if (o.nodeName === 'OPTGROUP') {
|
|
1529
|
+
const optgroup = o;
|
|
1530
|
+
const optgroupOptions = optgroup.childNodes;
|
|
1531
|
+
for (const oo of optgroupOptions) {
|
|
1532
|
+
if (oo.nodeName === 'OPTION') {
|
|
1533
|
+
const option = oo;
|
|
1534
|
+
option.selected = values.includes(option.value);
|
|
1535
|
+
}
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
if (o.nodeName === 'OPTION') {
|
|
1539
|
+
const option = o;
|
|
1540
|
+
option.selected = values.includes(option.value);
|
|
1432
1541
|
}
|
|
1433
1542
|
}
|
|
1434
1543
|
this.changeListen(true);
|
|
@@ -1462,7 +1571,7 @@ var SlimSelect = (function () {
|
|
|
1462
1571
|
this.select.appendChild(this.createOption(d));
|
|
1463
1572
|
}
|
|
1464
1573
|
}
|
|
1465
|
-
this.select.dispatchEvent(new Event('change'));
|
|
1574
|
+
this.select.dispatchEvent(new Event('change', { bubbles: true }));
|
|
1466
1575
|
this.changeListen(true);
|
|
1467
1576
|
}
|
|
1468
1577
|
createOptgroup(optgroup) {
|
|
@@ -1496,7 +1605,7 @@ var SlimSelect = (function () {
|
|
|
1496
1605
|
if (info.disabled) {
|
|
1497
1606
|
optionEl.disabled = true;
|
|
1498
1607
|
}
|
|
1499
|
-
if (info.display
|
|
1608
|
+
if (!info.display) {
|
|
1500
1609
|
optionEl.style.display = 'none';
|
|
1501
1610
|
}
|
|
1502
1611
|
if (info.placeholder) {
|
|
@@ -1547,6 +1656,7 @@ var SlimSelect = (function () {
|
|
|
1547
1656
|
this.disabled = settings.disabled !== undefined ? settings.disabled : false;
|
|
1548
1657
|
this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false;
|
|
1549
1658
|
this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true;
|
|
1659
|
+
this.focusSearch = settings.focusSearch !== undefined ? settings.focusSearch : true;
|
|
1550
1660
|
this.ariaLabel = settings.ariaLabel || 'Combobox';
|
|
1551
1661
|
this.searchPlaceholder = settings.searchPlaceholder || 'Search';
|
|
1552
1662
|
this.searchText = settings.searchText || 'No Results';
|
|
@@ -1566,6 +1676,7 @@ var SlimSelect = (function () {
|
|
|
1566
1676
|
this.timeoutDelay = settings.timeoutDelay || 200;
|
|
1567
1677
|
this.maxValuesShown = settings.maxValuesShown || 20;
|
|
1568
1678
|
this.maxValuesMessage = settings.maxValuesMessage || '{number} selected';
|
|
1679
|
+
this.addableText = settings.addableText || 'Press "Enter" to add {value}';
|
|
1569
1680
|
}
|
|
1570
1681
|
}
|
|
1571
1682
|
|
|
@@ -1583,7 +1694,7 @@ var SlimSelect = (function () {
|
|
|
1583
1694
|
beforeOpen: undefined,
|
|
1584
1695
|
afterOpen: undefined,
|
|
1585
1696
|
beforeClose: undefined,
|
|
1586
|
-
afterClose: undefined
|
|
1697
|
+
afterClose: undefined
|
|
1587
1698
|
};
|
|
1588
1699
|
this.windowResize = debounce(() => {
|
|
1589
1700
|
if (!this.settings.isOpen && !this.settings.isFullOpen) {
|
|
@@ -1627,6 +1738,7 @@ var SlimSelect = (function () {
|
|
|
1627
1738
|
this.destroy();
|
|
1628
1739
|
}
|
|
1629
1740
|
this.settings = new Settings(config.settings);
|
|
1741
|
+
this.cssClasses = new CssClasses(config.cssClasses);
|
|
1630
1742
|
const debounceEvents = ['afterChange', 'beforeOpen', 'afterOpen', 'beforeClose', 'afterClose'];
|
|
1631
1743
|
for (const key in config.events) {
|
|
1632
1744
|
if (!config.events.hasOwnProperty(key)) {
|
|
@@ -1646,8 +1758,8 @@ var SlimSelect = (function () {
|
|
|
1646
1758
|
this.select = new Select(this.selectEl);
|
|
1647
1759
|
this.select.updateSelect(this.settings.id, this.settings.style, this.settings.class);
|
|
1648
1760
|
this.select.hideUI();
|
|
1649
|
-
this.select.onValueChange = (
|
|
1650
|
-
this.setSelected(
|
|
1761
|
+
this.select.onValueChange = (options) => {
|
|
1762
|
+
this.setSelected(options.map((option) => option.id));
|
|
1651
1763
|
};
|
|
1652
1764
|
this.select.onClassChange = (classes) => {
|
|
1653
1765
|
this.settings.class = classes;
|
|
@@ -1676,9 +1788,9 @@ var SlimSelect = (function () {
|
|
|
1676
1788
|
addOption: this.addOption.bind(this),
|
|
1677
1789
|
search: this.search.bind(this),
|
|
1678
1790
|
beforeChange: this.events.beforeChange,
|
|
1679
|
-
afterChange: this.events.afterChange
|
|
1791
|
+
afterChange: this.events.afterChange
|
|
1680
1792
|
};
|
|
1681
|
-
this.render = new Render(this.settings, this.store, renderCallbacks);
|
|
1793
|
+
this.render = new Render(this.settings, this.cssClasses, this.store, renderCallbacks);
|
|
1682
1794
|
this.render.renderValues();
|
|
1683
1795
|
this.render.renderOptions(this.store.getData());
|
|
1684
1796
|
const selectAriaLabel = this.selectEl.getAttribute('aria-label');
|
|
@@ -1737,11 +1849,27 @@ var SlimSelect = (function () {
|
|
|
1737
1849
|
}
|
|
1738
1850
|
}
|
|
1739
1851
|
getSelected() {
|
|
1740
|
-
|
|
1852
|
+
let options = this.store.getSelectedOptions();
|
|
1853
|
+
if (this.settings.keepOrder) {
|
|
1854
|
+
options = this.store.selectedOrderOptions(options);
|
|
1855
|
+
}
|
|
1856
|
+
return options.map((option) => option.value);
|
|
1741
1857
|
}
|
|
1742
|
-
setSelected(
|
|
1858
|
+
setSelected(values, runAfterChange = true) {
|
|
1743
1859
|
const selected = this.store.getSelected();
|
|
1744
|
-
this.store.
|
|
1860
|
+
const options = this.store.getDataOptions();
|
|
1861
|
+
values = Array.isArray(values) ? values : [values];
|
|
1862
|
+
const ids = [];
|
|
1863
|
+
for (const value of values) {
|
|
1864
|
+
if (options.find((option) => option.id == value)) {
|
|
1865
|
+
ids.push(value);
|
|
1866
|
+
continue;
|
|
1867
|
+
}
|
|
1868
|
+
for (const option of options.filter((option) => option.value == value)) {
|
|
1869
|
+
ids.push(option.id);
|
|
1870
|
+
}
|
|
1871
|
+
}
|
|
1872
|
+
this.store.setSelectedBy('id', ids);
|
|
1745
1873
|
const data = this.store.getData();
|
|
1746
1874
|
this.select.updateOptions(data);
|
|
1747
1875
|
this.render.renderValues();
|
|
@@ -1776,7 +1904,7 @@ var SlimSelect = (function () {
|
|
|
1776
1904
|
this.events.beforeOpen();
|
|
1777
1905
|
}
|
|
1778
1906
|
this.render.open();
|
|
1779
|
-
if (this.settings.showSearch) {
|
|
1907
|
+
if (this.settings.showSearch && this.settings.focusSearch) {
|
|
1780
1908
|
this.render.searchFocus();
|
|
1781
1909
|
}
|
|
1782
1910
|
this.settings.isOpen = true;
|