slim-select 3.4.3 → 3.6.0

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 (73) hide show
  1. package/dist/classes.d.ts +47 -0
  2. package/dist/helpers.d.ts +5 -0
  3. package/dist/index.d.ts +53 -319
  4. package/dist/index.umd.d.ts +2 -0
  5. package/dist/react/index.d.ts +4 -319
  6. package/dist/react/index.js +1471 -1697
  7. package/dist/react/index.umd.js +2 -2
  8. package/dist/react/react.d.ts +17 -0
  9. package/dist/react/react.test.d.ts +1 -0
  10. package/dist/react/slim-select/react/index.d.ts +4 -0
  11. package/dist/render.d.ts +90 -0
  12. package/dist/select.d.ts +38 -0
  13. package/dist/settings.d.ts +40 -0
  14. package/dist/slimselect.cjs.js +2 -2
  15. package/dist/slimselect.cjs.js.map +1 -1
  16. package/dist/slimselect.css +1 -1
  17. package/dist/slimselect.css.map +1 -1
  18. package/dist/slimselect.es.js +1245 -1385
  19. package/dist/slimselect.es.js.map +1 -1
  20. package/dist/slimselect.iife.js +2 -2
  21. package/dist/slimselect.iife.js.map +1 -1
  22. package/dist/slimselect.js +2 -2
  23. package/dist/slimselect.js.map +1 -1
  24. package/dist/src/docs/main.d.ts +0 -0
  25. package/dist/src/docs/router.d.ts +2 -0
  26. package/dist/src/docs/store.d.ts +12 -0
  27. package/dist/store.d.ts +53 -0
  28. package/dist/vue/index.d.ts +4 -319
  29. package/dist/vue/index.js +1347 -1504
  30. package/dist/vue/index.umd.js +1 -1
  31. package/dist/vue/slim-select/vue/index.d.ts +4 -0
  32. package/package.json +30 -36
  33. package/src/slim-select/slimselect.scss +47 -5
  34. package/.nvmrc +0 -1
  35. package/.prettierignore +0 -1
  36. package/.prettierrc +0 -7
  37. package/CODE_OF_CONDUCT.md +0 -46
  38. package/CONTRIBUTING.md +0 -1
  39. package/cdn.html +0 -21
  40. package/docs.go +0 -12
  41. package/example.html +0 -25
  42. package/index.html +0 -76
  43. package/release.js +0 -191
  44. package/sitemap.js +0 -108
  45. package/src/slim-select/accessibility.test.ts +0 -782
  46. package/src/slim-select/classes.test.ts +0 -73
  47. package/src/slim-select/classes.ts +0 -117
  48. package/src/slim-select/helpers.test.ts +0 -162
  49. package/src/slim-select/helpers.ts +0 -61
  50. package/src/slim-select/index.test.ts +0 -1356
  51. package/src/slim-select/index.ts +0 -594
  52. package/src/slim-select/index.umd.ts +0 -8
  53. package/src/slim-select/react/index.tsx +0 -9
  54. package/src/slim-select/react/react.test.tsx +0 -498
  55. package/src/slim-select/react/react.tsx +0 -209
  56. package/src/slim-select/render.test.ts +0 -1927
  57. package/src/slim-select/render.ts +0 -1771
  58. package/src/slim-select/select.test.ts +0 -683
  59. package/src/slim-select/select.ts +0 -659
  60. package/src/slim-select/settings.test.ts +0 -285
  61. package/src/slim-select/settings.ts +0 -78
  62. package/src/slim-select/store.test.ts +0 -1007
  63. package/src/slim-select/store.ts +0 -433
  64. package/src/slim-select/vue/index.ts +0 -9
  65. package/src/slim-select/vue/vue.test.ts +0 -1091
  66. package/src/slim-select/vue/vue.vue +0 -224
  67. package/tsconfig.json +0 -26
  68. package/vite.config.docs.mts +0 -29
  69. package/vite.config.lib.es-cjs.ts +0 -40
  70. package/vite.config.lib.umd-iife.ts +0 -34
  71. package/vite.config.react.mts +0 -41
  72. package/vite.config.vue.mts +0 -40
  73. package/vitest.config.ts +0 -30
@@ -1,1007 +0,0 @@
1
- 'use strict'
2
-
3
- import { describe, expect, test, beforeAll, beforeEach } from 'vitest'
4
- import Store, { Optgroup, Option } from './store'
5
-
6
- describe('store module', () => {
7
- describe('constructor', () => {
8
- test('constructor without data', () => {
9
- let store = new Store('single', [])
10
- expect(store).toBeInstanceOf(Store)
11
- })
12
-
13
- test('constructor with single option', () => {
14
- const store = new Store('single', [
15
- {
16
- text: 'test'
17
- }
18
- ])
19
-
20
- const data = store.getData()
21
-
22
- // Make sure data has one item and that it has the correct text
23
- expect(data).toHaveLength(1)
24
- expect(data[0]).toBeInstanceOf(Option)
25
-
26
- const option = data[0] as Option
27
-
28
- expect(option.text).toBe('test')
29
- expect(option.id).toBeDefined()
30
- expect(option.value).toBeDefined()
31
- expect(option.text).toBeDefined()
32
- expect(option.html).toBeDefined()
33
- expect(option.selected).toBeDefined()
34
- expect(option.display).toBeDefined()
35
- expect(option.disabled).toBeDefined()
36
- expect(option.placeholder).toBeDefined()
37
- expect(option.class).toBeDefined()
38
- expect(option.style).toBeDefined()
39
- expect(option.data).toBeDefined()
40
- expect(option.mandatory).toBeDefined()
41
- })
42
-
43
- test('constructor with optgroup', () => {
44
- const store = new Store('single', [
45
- {
46
- label: 'opt group',
47
- options: [
48
- {
49
- text: 'test'
50
- }
51
- ]
52
- }
53
- ])
54
-
55
- const data = store.getData()
56
-
57
- expect(data).toHaveLength(1)
58
-
59
- expect(data[0]).toBeInstanceOf(Optgroup)
60
- const optGroup = data[0] as Optgroup
61
-
62
- expect(optGroup.label).toBe('opt group')
63
- expect(optGroup.options).toHaveLength(1)
64
- expect(optGroup.options?.[0].text).toBe('test')
65
- })
66
-
67
- test('constructor with optgroup and option', () => {
68
- const store = new Store('single', [
69
- {
70
- label: 'opt group',
71
- options: [
72
- {
73
- text: 'opt group option'
74
- }
75
- ]
76
- },
77
- {
78
- text: 'option'
79
- }
80
- ])
81
-
82
- const data = store.getData()
83
-
84
- expect(data).toHaveLength(2)
85
-
86
- expect(data[0]).toBeInstanceOf(Optgroup)
87
- const optGroup = data[0] as Optgroup
88
-
89
- expect(optGroup.label).toBe('opt group')
90
- expect(optGroup.options).toHaveLength(1)
91
- expect(optGroup.options?.[0].text).toBe('opt group option')
92
-
93
- expect(data[1]).toBeInstanceOf(Option)
94
- expect((data[1] as Option).text).toBe('option')
95
- })
96
-
97
- test('constructor with multiple selected on single select only registers first selected', () => {
98
- const store = new Store('single', [
99
- {
100
- text: 'test1'
101
- },
102
- {
103
- text: 'test2',
104
- value: 'test2',
105
- selected: true
106
- },
107
- {
108
- text: 'test3',
109
- selected: true
110
- }
111
- ])
112
-
113
- // cast to an option array here, so we don't need casts in the comparisons
114
- const data = store.getData() as Array<Option>
115
-
116
- expect(data).toHaveLength(3)
117
- expect(data[0].text).toBe('test1')
118
- expect(data[0].selected).toBe(false)
119
- expect(data[1].text).toBe('test2')
120
- expect(data[1].selected).toBe(true)
121
- expect(data[2].text).toBe('test3')
122
- expect(data[2].selected).toBe(false)
123
- })
124
-
125
- test('constructor without a selected element on single select selects first option', () => {
126
- const store = new Store('single', [
127
- {
128
- text: 'test1'
129
- },
130
- {
131
- text: 'test2',
132
- value: 'test2'
133
- },
134
- {
135
- text: 'test3'
136
- }
137
- ])
138
-
139
- // cast to an option array here, so we don't need casts in the comparisons
140
- const data = store.getData() as Array<Option>
141
-
142
- expect(data).toHaveLength(3)
143
- expect(data[0].text).toBe('test1')
144
- expect(data[0].selected).toBe(true)
145
- expect(data[1].text).toBe('test2')
146
- expect(data[1].selected).toBe(false)
147
- expect(data[2].text).toBe('test3')
148
- expect(data[2].selected).toBe(false)
149
- })
150
-
151
- test('constructor with multiple selected on multiple select registers all selected', () => {
152
- const store = new Store('multiple', [
153
- {
154
- text: 'test1'
155
- },
156
- {
157
- text: 'test2',
158
- value: 'test2',
159
- selected: true
160
- },
161
- {
162
- text: 'test3',
163
- selected: true
164
- }
165
- ])
166
-
167
- // cast to an option array here, so we don't need casts in the comparisons
168
- const data = store.getData() as Array<Option>
169
-
170
- expect(data).toHaveLength(3)
171
- expect(data[0].text).toBe('test1')
172
- expect(data[0].selected).toBe(false)
173
- expect(data[1].text).toBe('test2')
174
- expect(data[1].selected).toBe(true)
175
- expect(data[2].text).toBe('test3')
176
- expect(data[2].selected).toBe(true)
177
- })
178
-
179
- test('constructor without a selected element on multiple select does not select anything', () => {
180
- const store = new Store('multiple', [
181
- {
182
- text: 'test1'
183
- },
184
- {
185
- text: 'test2',
186
- value: 'test2'
187
- },
188
- {
189
- text: 'test3'
190
- }
191
- ])
192
-
193
- // cast to an option array here, so we don't need casts in the comparisons
194
- const data = store.getData() as Array<Option>
195
-
196
- expect(data).toHaveLength(3)
197
- data.forEach((option) => {
198
- expect(option.selected).toBe(false)
199
- })
200
- })
201
- })
202
-
203
- describe('validateDataArray', () => {
204
- let store: Store
205
-
206
- beforeAll(() => {
207
- store = new Store('single', [])
208
- })
209
-
210
- test('invalid data returns error', () => {
211
- const invalidData = { test: true } as any
212
-
213
- const res = store.validateDataArray(invalidData)
214
- expect(res).toBeInstanceOf(Error)
215
- expect(res?.message).toBe('Data must be an array')
216
- })
217
-
218
- test('single invalid data entry returns error', () => {
219
- const invalidData = [{ name: 'this is invalid' }] as any
220
-
221
- const res = store.validateDataArray(invalidData)
222
- expect(res).toBeInstanceOf(Error)
223
- expect(res?.message).toBe('Data object must be a valid optgroup or option')
224
- })
225
-
226
- test('invalid data and valid option returns error', () => {
227
- const invalidData = [
228
- {
229
- name: 'invalid data'
230
- },
231
- {
232
- text: 'valid option'
233
- }
234
- ] as any
235
-
236
- const res = store.validateDataArray(invalidData)
237
- expect(res).toBeInstanceOf(Error)
238
- expect(res?.message).toBe('Data object must be a valid optgroup or option')
239
- })
240
-
241
- test('valid option and invalid data returns error', () => {
242
- const invalidData = [
243
- {
244
- text: 'valid'
245
- },
246
- {
247
- name: 'this is invalid'
248
- }
249
- ] as any
250
-
251
- const res = store.validateDataArray(invalidData)
252
- expect(res).toBeInstanceOf(Error)
253
- expect(res?.message).toBe('Data object must be a valid optgroup or option')
254
- })
255
-
256
- test('valid opt group with invalid data returns error', () => {
257
- const invalidData = [
258
- {
259
- label: 'valid',
260
- options: [
261
- {
262
- invalid: 'asdf'
263
- }
264
- ]
265
- }
266
- ] as any
267
-
268
- const res = store.validateDataArray(invalidData)
269
- expect(res).toBeInstanceOf(Error)
270
- expect(res?.message).toBe('Option must have a text')
271
- })
272
-
273
- test('single valid option validates', () => {
274
- const validData = [
275
- {
276
- text: 'valid option'
277
- }
278
- ]
279
-
280
- const res = store.validateDataArray(validData)
281
- expect(res).toBeNull()
282
- })
283
-
284
- test('multiple valid options validates', () => {
285
- const validData = [
286
- {
287
- text: 'valid option 1'
288
- },
289
- {
290
- text: 'valid option 2'
291
- }
292
- ]
293
-
294
- const res = store.validateDataArray(validData)
295
- expect(res).toBeNull()
296
- })
297
-
298
- test('single valid opt group validates', () => {
299
- const validData = [
300
- {
301
- label: 'valid opt group'
302
- }
303
- ]
304
-
305
- const res = store.validateDataArray(validData)
306
- expect(res).toBeNull()
307
- })
308
-
309
- test('valid opt group with options validates', () => {
310
- const validData = [
311
- {
312
- label: 'valid opt group',
313
- options: [
314
- {
315
- text: 'option 1'
316
- },
317
- {
318
- text: 'option 2'
319
- }
320
- ]
321
- }
322
- ]
323
-
324
- const res = store.validateDataArray(validData)
325
- expect(res).toBeNull()
326
- })
327
- test('valid opt group with options and separate options validates', () => {
328
- const validData = [
329
- {
330
- label: 'valid opt group',
331
- options: [
332
- {
333
- text: 'option 1'
334
- },
335
- {
336
- text: 'option 2'
337
- }
338
- ]
339
- },
340
- {
341
- text: 'main option 1'
342
- },
343
- {
344
- text: 'main option 2'
345
- }
346
- ]
347
-
348
- const res = store.validateDataArray(validData)
349
- expect(res).toBeNull()
350
- })
351
- })
352
-
353
- describe('validateOption', () => {
354
- let store: Store
355
-
356
- beforeAll(() => {
357
- store = new Store('single', [])
358
- })
359
-
360
- test('empty option returns error', () => {
361
- const res = store.validateOption({} as Option)
362
- expect(res).toBeInstanceOf(Error)
363
- expect(res?.message).toBe('Option must have a text')
364
- })
365
-
366
- test('invalid data returns error', () => {
367
- const res = store.validateOption({ label: 'text' } as unknown as Option)
368
- expect(res).toBeInstanceOf(Error)
369
- expect(res?.message).toBe('Option must have a text')
370
- })
371
-
372
- test('valid data returns null', () => {
373
- const res = store.validateOption({ text: 'text' })
374
- expect(res).toBeNull()
375
- })
376
- })
377
-
378
- describe('partialToFullData', () => {
379
- let store: Store
380
-
381
- beforeAll(() => {
382
- store = new Store('single', [])
383
- })
384
-
385
- test('empty partial returns empty data array', () => {
386
- const res = store.partialToFullData([])
387
- expect(res).toBeInstanceOf(Array)
388
- expect(res).toHaveLength(0)
389
- })
390
-
391
- test("invalid data get's ignored", () => {
392
- const res = store.partialToFullData([{ error: 'this is invalid' } as any, { text: 'valid' }])
393
- expect(res).toBeInstanceOf(Array)
394
- expect(res).toHaveLength(1)
395
-
396
- expect(res[0]).toBeInstanceOf(Option)
397
-
398
- const option = res[0] as Option
399
- expect(option.text).toBe('valid')
400
- })
401
-
402
- test('valid data gets filled correctly', () => {
403
- const res = store.partialToFullData([
404
- {
405
- label: 'opt group',
406
- options: [{ text: 'opt 1' }, { text: 'opt 2' }]
407
- },
408
- {
409
- text: 'opt 3'
410
- }
411
- ])
412
-
413
- expect(res).toHaveLength(2)
414
- expect(res[0]).toBeInstanceOf(Optgroup)
415
-
416
- const optGroup = res[0] as Optgroup
417
- expect(optGroup.label).toBe('opt group')
418
- expect(optGroup.options).toHaveLength(2)
419
- expect(optGroup.options[0]).toBeInstanceOf(Option)
420
- expect(optGroup.options[0].text).toBe('opt 1')
421
- expect(optGroup.options[1]).toBeInstanceOf(Option)
422
- expect(optGroup.options[1].text).toBe('opt 2')
423
- })
424
- })
425
-
426
- describe('setData', () => {
427
- let store: Store
428
-
429
- beforeEach(() => {
430
- store = new Store('single', [
431
- {
432
- text: 'initial option'
433
- },
434
- {
435
- text: 'initial selected option',
436
- selected: true
437
- }
438
- ])
439
- })
440
-
441
- test('invalid data does override existing data', () => {
442
- store.setData([{ invalid: true } as unknown as Option])
443
-
444
- const data = store.getData()
445
- expect(data).toHaveLength(0)
446
- })
447
-
448
- test('valid data overrides existing data', () => {
449
- store.setData([
450
- {
451
- text: 'opt 1'
452
- },
453
- {
454
- text: 'opt 2'
455
- },
456
- {
457
- text: 'opt 3'
458
- }
459
- ])
460
-
461
- const data = store.getData() as Array<Option>
462
- expect(data).toHaveLength(3)
463
- expect(data[0].text).toBe('opt 1')
464
- expect(data[1].text).toBe('opt 2')
465
- expect(data[2].text).toBe('opt 3')
466
- })
467
-
468
- test('valid data on single select automatically selects first option', () => {
469
- store.setData([
470
- {
471
- text: 'opt 1'
472
- },
473
- {
474
- text: 'opt 2'
475
- }
476
- ])
477
-
478
- const data = store.getData() as Array<Option>
479
- expect(data).toHaveLength(2)
480
- expect(data[0].selected).toBe(true)
481
- })
482
-
483
- test('valid data on single select selects correct option', () => {
484
- store.setData([
485
- {
486
- text: 'opt 1'
487
- },
488
- {
489
- text: 'opt 2',
490
- selected: true
491
- }
492
- ])
493
-
494
- const data = store.getData() as Array<Option>
495
- expect(data).toHaveLength(2)
496
- expect(data[1].text).toBe('opt 2')
497
- expect(data[1].selected).toBe(true)
498
- })
499
- })
500
-
501
- describe('getData', () => {
502
- test('getData gets all options', () => {
503
- const data = [
504
- {
505
- label: 'group test',
506
- options: [
507
- {
508
- text: 'sub opt 1'
509
- },
510
- {
511
- text: 'sub opt 2'
512
- }
513
- ]
514
- },
515
- {
516
- text: 'test1'
517
- },
518
- {
519
- text: 'test2',
520
- value: 'test2'
521
- },
522
- {
523
- text: 'test3'
524
- }
525
- ]
526
-
527
- const flatData = [
528
- {
529
- text: 'sub opt 1'
530
- },
531
- {
532
- text: 'sub opt 2'
533
- },
534
- {
535
- text: 'test1'
536
- },
537
- {
538
- text: 'test2',
539
- value: 'test2'
540
- },
541
- {
542
- text: 'test3'
543
- }
544
- ]
545
-
546
- const store = new Store('single', data)
547
-
548
- const storedData = store.getData()
549
- storedData.forEach((dataObject, index) => {
550
- if ('label' in dataObject) {
551
- expect(dataObject.label).toBe(data[index].label)
552
- dataObject.options.forEach((subOpt, subIndex) => {
553
- expect(subOpt.text).toBe(data[index].options![subIndex].text)
554
- expect(subOpt.value).toBe(data[index].options![subIndex].text)
555
- })
556
- } else {
557
- expect(dataObject.text).toBe(data[index].text)
558
- expect(dataObject.value).toBe(data[index].text)
559
- }
560
- })
561
-
562
- // test flat array directly
563
- const storedDataOptions = store.getDataOptions()
564
- storedDataOptions.forEach((option, index) => {
565
- expect(option.text).toBe(flatData[index].text)
566
- expect(option.value).toBe(flatData[index].text)
567
- })
568
- })
569
- })
570
-
571
- describe('getDataOptions', () => {
572
- test('options only store returns same structure', () => {
573
- const store = new Store('single', [
574
- {
575
- text: 'opt 0'
576
- },
577
- {
578
- text: 'opt 1'
579
- }
580
- ])
581
-
582
- const data = store.getDataOptions()
583
- expect(data).toHaveLength(2)
584
- data.forEach((option, index) => {
585
- expect(option).toBeInstanceOf(Option)
586
- expect(option.text).toBe(`opt ${index}`)
587
- })
588
- })
589
-
590
- test('option group gets flattened', () => {
591
- const store = new Store('single', [
592
- {
593
- label: 'opt group',
594
- options: [
595
- {
596
- text: 'opt 0'
597
- },
598
- {
599
- text: 'opt 1'
600
- }
601
- ]
602
- },
603
- {
604
- text: 'opt 2'
605
- },
606
- {
607
- text: 'opt 3'
608
- }
609
- ])
610
-
611
- const data = store.getDataOptions()
612
- expect(data).toHaveLength(4)
613
- data.forEach((option, index) => {
614
- expect(option).toBeInstanceOf(Option)
615
- expect(option.text).toBe(`opt ${index}`)
616
- })
617
- })
618
- })
619
-
620
- describe('addOption', () => {
621
- test('append option', () => {
622
- const store = new Store('single', [
623
- {
624
- text: 'test1'
625
- }
626
- ])
627
-
628
- store.addOption({ text: 'test2' })
629
-
630
- const storeData = store.getDataOptions()
631
- expect(storeData).toHaveLength(2)
632
- expect(storeData[0].text).toBe('test1')
633
- expect(storeData[1].text).toBe('test2')
634
- })
635
- })
636
-
637
- describe('setSelectedBy', () => {
638
- let store: Store
639
-
640
- beforeEach(() => {
641
- store = new Store('single', [
642
- {
643
- text: 'opt 1'
644
- },
645
- {
646
- id: '12345678',
647
- text: 'id opt'
648
- },
649
- {
650
- text: 'opt 2'
651
- },
652
- {
653
- text: 'opt 3'
654
- }
655
- ])
656
- })
657
-
658
- test('set selected by ID', () => {
659
- store.setSelectedBy('id', ['12345678'])
660
- const data = store.getDataOptions()
661
-
662
- expect(data[0].text).toBe('opt 1')
663
- expect(data[0].selected).toBe(false)
664
-
665
- expect(data[1].text).toBe('id opt')
666
- expect(data[1].selected).toBe(true)
667
- })
668
-
669
- test('set selected by value', () => {
670
- store.setSelectedBy('value', ['opt 3'])
671
-
672
- const data = store.getDataOptions()
673
-
674
- expect(data[0].text).toBe('opt 1')
675
- expect(data[0].selected).toBe(false)
676
-
677
- expect(data[3].text).toBe('opt 3')
678
- expect(data[3].selected).toBe(true)
679
- })
680
-
681
- test('set selected to empty string selects first option', () => {
682
- const store = new Store('single', [
683
- {
684
- text: 'all',
685
- value: ''
686
- },
687
- {
688
- text: 'Value 1',
689
- value: '1',
690
- selected: true
691
- }
692
- ])
693
- store.setSelectedBy('value', [''])
694
-
695
- const data = store.getDataOptions()
696
-
697
- expect(data[0].text).toBe('all')
698
- expect(data[0].selected).toBe(true)
699
- expect(data[1].selected).toBe(false)
700
- })
701
-
702
- test('set multiple selected by value on single select only selects the first element', () => {
703
- store.setSelectedBy('value', ['opt 2', 'opt 3'])
704
-
705
- const data = store.getDataOptions()
706
-
707
- expect(data[2].selected).toBe(true)
708
- expect(data[3].selected).toBe(false)
709
- })
710
-
711
- test('allowEmptySelection true leaves no option selected (e.g. after search with no prior selection)', () => {
712
- store.setSelectedBy('id', [], true)
713
-
714
- const data = store.getDataOptions()
715
- const selected = data.filter((o) => o.selected)
716
-
717
- expect(selected).toHaveLength(0)
718
- expect(data[0].selected).toBe(false)
719
- })
720
-
721
- test('allowEmptySelection false (default) selects first option when given empty ids', () => {
722
- store.setSelectedBy('id', [])
723
-
724
- const data = store.getDataOptions()
725
- expect(data[0].selected).toBe(true)
726
- })
727
- })
728
-
729
- describe('getSelected', () => {
730
- test('get correct value when one option is selected', () => {
731
- const store = new Store('single', [
732
- {
733
- text: 'opt 0'
734
- },
735
- {
736
- text: 'opt 1'
737
- }
738
- ])
739
-
740
- const selected = store.getSelectedValues()
741
- expect(selected).toHaveLength(1)
742
- expect(selected[0]).toBe('opt 0')
743
- })
744
-
745
- test('get correct value when two options is selected', () => {
746
- const store = new Store('multiple', [
747
- {
748
- text: 'opt 0'
749
- },
750
- {
751
- text: 'opt 1',
752
- selected: true
753
- },
754
- {
755
- text: 'opt 2',
756
- selected: true
757
- }
758
- ])
759
-
760
- const selected = store.getSelectedValues()
761
- expect(selected).toHaveLength(2)
762
-
763
- expect(selected[0]).toBe('opt 1')
764
- expect(selected[1]).toBe('opt 2')
765
- })
766
-
767
- test('get correct order when using reorder options', () => {
768
- const store = new Store('multiple', [
769
- {
770
- text: 'opt 0'
771
- },
772
- {
773
- text: 'opt 1'
774
- },
775
- {
776
- text: 'opt 2'
777
- }
778
- ])
779
-
780
- store.setSelectedBy('value', ['opt 2', 'opt 0'])
781
-
782
- let selected = store.getSelectedOptions()
783
- selected = store.selectedOrderOptions(selected)
784
- expect(selected.map((opt) => opt.text)).toEqual(['opt 2', 'opt 0'])
785
- })
786
- })
787
-
788
- describe('getSelectedOptions', () => {
789
- test('get correct value when one option is selected', () => {
790
- const store = new Store('single', [
791
- {
792
- text: 'opt 0'
793
- },
794
- {
795
- text: 'opt 1'
796
- }
797
- ])
798
-
799
- const selected = store.getSelectedOptions()
800
- expect(selected).toHaveLength(1)
801
- expect(selected[0].text).toBe('opt 0')
802
- })
803
-
804
- test('get correct value when two options is selected', () => {
805
- const store = new Store('multiple', [
806
- {
807
- text: 'opt 0'
808
- },
809
- {
810
- text: 'opt 1',
811
- selected: true
812
- },
813
- {
814
- text: 'opt 2',
815
- selected: true
816
- }
817
- ])
818
-
819
- const selected = store.getSelectedOptions()
820
- expect(selected).toHaveLength(2)
821
- expect(selected[0].text).toBe('opt 1')
822
- expect(selected[1].text).toBe('opt 2')
823
- })
824
- })
825
-
826
- describe('getOptionByID', () => {
827
- let store: Store
828
-
829
- beforeAll(() => {
830
- store = new Store('single', [
831
- {
832
- text: 'opt 1'
833
- },
834
- {
835
- id: '12345678',
836
- text: 'id opt'
837
- },
838
- {
839
- text: 'opt 2'
840
- },
841
- {
842
- text: 'opt 3'
843
- }
844
- ])
845
- })
846
-
847
- test('invalid id gets null as result', () => {
848
- const res = store.getOptionByID('0000')
849
- expect(res).toBeNull()
850
- })
851
-
852
- test('valid id gets correct result', () => {
853
- const res = store.getOptionByID('12345678')
854
- expect(res).toBeInstanceOf(Option)
855
- expect((res as Option).text).toBe('id opt')
856
- })
857
- })
858
-
859
- describe('getSelectType', () => {
860
- test('get correct type on single select', () => {
861
- const store = new Store('single', [])
862
- expect(store.getSelectType()).toBe('single')
863
- })
864
-
865
- test('get correct type on multiple select', () => {
866
- const store = new Store('multiple', [])
867
- expect(store.getSelectType()).toBe('multiple')
868
- })
869
- })
870
-
871
- describe('getFirstOption', () => {
872
- test('getFirstOption returns first option', () => {
873
- const flatStore = new Store('single', [
874
- {
875
- text: 'test0'
876
- },
877
- {
878
- text: 'test1'
879
- }
880
- ])
881
-
882
- expect(flatStore.getFirstOption()?.text).toBe('test0')
883
-
884
- const store = new Store('single', [
885
- {
886
- label: 'group0',
887
- options: [
888
- {
889
- text: 'test0'
890
- },
891
- {
892
- text: 'test1'
893
- }
894
- ]
895
- },
896
- {
897
- text: 'test2'
898
- }
899
- ])
900
-
901
- expect(store.getFirstOption()?.text).toBe('test0')
902
- })
903
- })
904
-
905
- describe('search', () => {
906
- test('search with term returns correct option', () => {
907
- const store = new Store('single', [
908
- {
909
- text: 'test1'
910
- },
911
- {
912
- text: 'test2',
913
- value: 'test2'
914
- },
915
- {
916
- text: 'test3'
917
- }
918
- ])
919
-
920
- const searchFilter = (opt: Option, search: string): boolean => {
921
- return opt.text.toLowerCase().indexOf(search.toLowerCase()) !== -1
922
- }
923
-
924
- // With searchFilter search against current store data set
925
- const searchResults = store.search('test2', searchFilter)
926
- expect(searchResults).toHaveLength(1)
927
- expect((searchResults[0] as Option).value).toBe('test2')
928
- })
929
-
930
- test('empty search term returns all options', () => {
931
- const store = new Store('single', [
932
- {
933
- text: 'test1'
934
- },
935
- {
936
- text: 'test2',
937
- value: 'test2'
938
- },
939
- {
940
- text: 'test3'
941
- }
942
- ])
943
-
944
- const searchFilter = (opt: Option, search: string): boolean => {
945
- return opt.text.toLowerCase().indexOf(search.toLowerCase()) !== -1
946
- }
947
-
948
- // Test empty search term
949
- const searchResults = store.search('', searchFilter)
950
- expect(searchResults).toHaveLength(3)
951
- })
952
- })
953
-
954
- describe('filter', () => {
955
- let store: Store
956
-
957
- beforeAll(() => {
958
- store = new Store('single', [
959
- {
960
- label: 'group 0',
961
- options: [
962
- {
963
- text: 'opt 0',
964
- class: 'filter-me'
965
- },
966
- {
967
- text: 'opt 1'
968
- }
969
- ]
970
- },
971
- {
972
- text: 'opt 2',
973
- class: 'filter-me'
974
- }
975
- ])
976
- })
977
-
978
- test('empty filter function returns all options (with opt group)', () => {
979
- const res = store.filter(null, true)
980
- expect(res).toHaveLength(2)
981
- expect(res[0]).toBeInstanceOf(Optgroup)
982
- expect((res[0] as Optgroup).label).toBe('group 0')
983
- expect((res[0] as Optgroup).options).toHaveLength(2)
984
- expect(res[1]).toBeInstanceOf(Option)
985
- })
986
-
987
- test('empty filter function returns all options without optgroups flattens results', () => {
988
- const res = store.filter(null, false)
989
- expect(res).toHaveLength(3)
990
- expect(res[0]).toBeInstanceOf(Option)
991
- expect((res[0] as Option).text).toBe('opt 0')
992
- expect(res[1]).toBeInstanceOf(Option)
993
- expect((res[1] as Option).text).toBe('opt 1')
994
- expect(res[2]).toBeInstanceOf(Option)
995
- expect((res[2] as Option).text).toBe('opt 2')
996
- })
997
-
998
- test('filter function filters results accordingly', () => {
999
- const res = store.filter((o) => o.class === 'filter-me', false)
1000
- expect(res).toHaveLength(2)
1001
- expect(res[0]).toBeInstanceOf(Option)
1002
- expect((res[0] as Option).text).toBe('opt 0')
1003
- expect(res[1]).toBeInstanceOf(Option)
1004
- expect((res[1] as Option).text).toBe('opt 2')
1005
- })
1006
- })
1007
- })