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.
Files changed (69) hide show
  1. package/.prettierignore +1 -0
  2. package/.prettierrc +4 -3
  3. package/README.md +5 -2
  4. package/dist/classes.d.ts +43 -0
  5. package/dist/helpers.d.ts +1 -1
  6. package/dist/index.d.ts +5 -2
  7. package/dist/render.d.ts +4 -44
  8. package/dist/select.d.ts +4 -2
  9. package/dist/settings.d.ts +2 -1
  10. package/dist/slimselect.cjs.js +248 -120
  11. package/dist/slimselect.css +1 -1
  12. package/dist/slimselect.css.map +1 -1
  13. package/dist/slimselect.es.js +248 -120
  14. package/dist/slimselect.global.js +248 -120
  15. package/dist/slimselect.js +248 -120
  16. package/dist/slimselect.min.js +1 -1
  17. package/dist/slimselect.umd.js +248 -120
  18. package/dist/slimselect.umd.min.js +1 -1
  19. package/dist/store.d.ts +4 -2
  20. package/index.html +1 -4
  21. package/jest.config.js +6 -0
  22. package/package.json +31 -40
  23. package/src/slim-select/classes.test.ts +72 -0
  24. package/src/slim-select/classes.ts +109 -0
  25. package/src/slim-select/helpers.test.ts +160 -0
  26. package/src/slim-select/helpers.ts +3 -12
  27. package/src/slim-select/index.test.ts +109 -16
  28. package/src/slim-select/index.ts +41 -12
  29. package/src/slim-select/render.test.ts +1169 -18
  30. package/src/slim-select/render.ts +78 -97
  31. package/src/slim-select/rollup.config.mjs +28 -28
  32. package/src/slim-select/select.test.ts +306 -156
  33. package/src/slim-select/select.ts +70 -21
  34. package/src/slim-select/settings.test.ts +272 -0
  35. package/src/slim-select/settings.ts +5 -1
  36. package/src/slim-select/slimselect.scss +7 -3
  37. package/src/slim-select/store.test.ts +986 -235
  38. package/src/slim-select/store.ts +70 -28
  39. package/src/{vue/slimselect.vue → slim-select/vue.vue} +19 -17
  40. package/tsconfig.json +2 -3
  41. package/{vite.config.ts → vite.config.mts} +11 -4
  42. package/src/react/.eslintignore +0 -2
  43. package/src/react/.eslintrc.cjs +0 -24
  44. package/src/react/index.html +0 -14
  45. package/src/react/jestconfig.json +0 -11
  46. package/src/react/package.json +0 -32
  47. package/src/react/src/frameworkpage.tsx +0 -133
  48. package/src/react/src/index.ts +0 -3
  49. package/src/react/src/slimselect.tsx +0 -148
  50. package/src/react/tests/slimselect.test.tsx +0 -52
  51. package/src/react/tsconfig.json +0 -37
  52. package/src/react/tsconfig.node.json +0 -10
  53. package/src/react/vite.config.ts +0 -55
  54. package/src/vue/README.md +0 -48
  55. package/src/vue/dist/slim-select/helpers.d.ts +0 -5
  56. package/src/vue/dist/slim-select/index.d.ts +0 -46
  57. package/src/vue/dist/slim-select/render.d.ts +0 -120
  58. package/src/vue/dist/slim-select/select.d.ts +0 -28
  59. package/src/vue/dist/slim-select/settings.d.ts +0 -34
  60. package/src/vue/dist/slim-select/store.d.ts +0 -80
  61. package/src/vue/dist/slimselectvue.es.js +0 -1978
  62. package/src/vue/dist/slimselectvue.global.js +0 -1981
  63. package/src/vue/dist/slimselectvue.ssr.js +0 -1980
  64. package/src/vue/dist/vue/hello.d.ts +0 -2
  65. package/src/vue/dist/vue/slimselect.vue.d.ts +0 -326
  66. package/src/vue/hello.ts +0 -5
  67. package/src/vue/package.json +0 -28
  68. package/src/vue/rollup.config.mjs +0 -44
  69. 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
- return this.validateOption(option);
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
- return this.validateOption(dataObj);
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('value', this.getSelected());
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
- this.setData(this.getData().concat(new Option(option)));
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 && this.selectType === 'single') {
170
- hasSelected = true;
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 && this.selectType === 'single') {
180
- hasSelected = true;
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
- let selectedOptions = this.getSelectedOptions();
190
- let selectedValues = [];
191
- selectedOptions.forEach((option) => {
192
- selectedValues.push(option.value);
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 false;
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 value = firstOption ? firstOption.value : '';
461
- this.callbacks.setSelected(value, false);
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.innerText = option.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 selectedValues = [];
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
- selectedValues.push(c.value);
713
+ selectedIds.push(c.id);
666
714
  }
667
715
  }
668
716
  if (o instanceof Option) {
669
- selectedValues.push(o.value);
717
+ selectedIds.push(o.id);
670
718
  }
671
719
  }
672
- this.callbacks.setSelected(selectedValues, false);
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
- if (this.callbacks.addable && e.ctrlKey) {
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 values = this.store.getSelected();
802
- values.push(newOption.value);
803
- this.callbacks.setSelected(values, true);
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.value], true);
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
- noResults.innerHTML = this.settings.searchText;
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.value) {
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.value));
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.value), false);
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.getSelectedValues());
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 === 'none' ? false : true,
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
- getSelectedValues() {
1392
- let values = [];
1393
- const options = this.select.childNodes;
1394
- for (const o of options) {
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
- values.push(option.value);
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
- values.push(option.value);
1494
+ options.push(this.getDataFromOption(option));
1410
1495
  }
1411
1496
  }
1412
1497
  }
1413
- return values;
1498
+ return options;
1414
1499
  }
1415
- setSelected(value) {
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 = value.includes(option.value);
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 = value.includes(option.value);
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 === false) {
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 = (values) => {
1650
- this.setSelected(values);
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
- return this.store.getSelected();
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(value, runAfterChange = true) {
1858
+ setSelected(values, runAfterChange = true) {
1743
1859
  const selected = this.store.getSelected();
1744
- this.store.setSelectedBy('value', Array.isArray(value) ? value : [value]);
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;