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
|
@@ -9,62 +9,211 @@ import Select from './select'
|
|
|
9
9
|
import Store, { Optgroup, Option } from './store'
|
|
10
10
|
|
|
11
11
|
describe('select module', () => {
|
|
12
|
-
|
|
13
|
-
document.body.innerHTML = '<select id="test"></select>'
|
|
12
|
+
let select: Select
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
document.body.innerHTML = `<select id="test" multiple>
|
|
16
|
+
<optgroup label="test1">
|
|
17
|
+
<option id="111" value="1">One</option>
|
|
18
|
+
<option id="222" value="2">Two</option>
|
|
19
|
+
</optgroup>
|
|
20
|
+
<optgroup label="test2">
|
|
21
|
+
<option id="333" value="3">Three</option>
|
|
22
|
+
<option id="444" value="4">Four</option>
|
|
23
|
+
<option id="555" value="5">Five</option>
|
|
24
|
+
</optgroup>
|
|
25
|
+
<option id="666" value="6">Six</option>
|
|
26
|
+
</select>`
|
|
27
|
+
|
|
28
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
29
|
+
select = new Select(selectElement)
|
|
18
30
|
})
|
|
19
31
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
<option value="2">Two</option>
|
|
24
|
-
</select>`
|
|
32
|
+
describe('constructor', () => {
|
|
33
|
+
test('constructor works', () => {
|
|
34
|
+
document.body.innerHTML = '<select id="test"></select>'
|
|
25
35
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
37
|
+
const select = new Select(selectElement)
|
|
38
|
+
|
|
39
|
+
expect(select).toBeInstanceOf(Select)
|
|
40
|
+
expect(select.listen).toBe(true)
|
|
41
|
+
expect((<any>select).observer).toBeInstanceOf(MutationObserver)
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
describe('enable', () => {
|
|
46
|
+
test('enable enables select element', () => {
|
|
47
|
+
select.select.disabled = true
|
|
48
|
+
select.enable()
|
|
49
|
+
|
|
50
|
+
expect(select.select.disabled).toBe(false)
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
describe('disable', () => {
|
|
55
|
+
test('disable disables select element', () => {
|
|
56
|
+
select.disable()
|
|
57
|
+
|
|
58
|
+
expect(select.select.disabled).toBe(true)
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
describe('hideUI', () => {
|
|
63
|
+
test('correct HTML attributes get set', () => {
|
|
64
|
+
select.hideUI()
|
|
65
|
+
|
|
66
|
+
expect(select.select.tabIndex).toBe(-1)
|
|
67
|
+
expect(select.select.style.display).toBe('none')
|
|
68
|
+
expect(select.select.getAttribute('aria-hidden')).toBe('true')
|
|
69
|
+
})
|
|
35
70
|
})
|
|
36
71
|
|
|
37
|
-
|
|
38
|
-
|
|
72
|
+
describe('showUI', () => {
|
|
73
|
+
test('HTML attributes get reset', () => {
|
|
74
|
+
select.select.tabIndex = -1
|
|
75
|
+
select.select.style.display = 'none'
|
|
76
|
+
select.select.setAttribute('aria-hidden', 'true')
|
|
77
|
+
|
|
78
|
+
select.showUI()
|
|
79
|
+
|
|
80
|
+
expect(select.select.tabIndex).toBeFalsy()
|
|
81
|
+
expect(select.select.style.display).toBeFalsy()
|
|
82
|
+
expect(select.select.getAttribute('aria-hidden')).toBeNull()
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
describe('getData', () => {
|
|
87
|
+
test('get data from select options', () => {
|
|
88
|
+
document.body.innerHTML = `<select id="test">
|
|
89
|
+
<option id="value1" value="1">One</option>
|
|
90
|
+
<option value="2">Two</option>
|
|
91
|
+
</select>`
|
|
92
|
+
|
|
93
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
94
|
+
const select = new Select(selectElement)
|
|
95
|
+
const data = select.getData() as Option[]
|
|
96
|
+
|
|
97
|
+
expect(data).toHaveLength(2)
|
|
98
|
+
expect(data[0].id).toBe('value1')
|
|
99
|
+
expect(data[0].value).toBe('1')
|
|
100
|
+
expect(data[0].text).toBe('One')
|
|
101
|
+
expect(data[1].value).toBe('2')
|
|
102
|
+
expect(data[1].text).toBe('Two')
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
test('get data from select optgroups', () => {
|
|
106
|
+
document.body.innerHTML = `<select id="test">
|
|
39
107
|
<optgroup label="test1">
|
|
40
|
-
<option value="1">One</option>
|
|
41
|
-
<option value="2">Two</option>
|
|
108
|
+
<option id="111" value="1">One</option>
|
|
109
|
+
<option id="222" value="2">Two</option>
|
|
42
110
|
</optgroup>
|
|
43
111
|
<optgroup label="test2">
|
|
44
|
-
<option value="3">Three</option>
|
|
45
|
-
<option value="4">Four</option>
|
|
46
|
-
<option value="5">Five</option>
|
|
112
|
+
<option id="333" value="3">Three</option>
|
|
113
|
+
<option id="444" value="4">Four</option>
|
|
114
|
+
<option id="555" value="5">Five</option>
|
|
47
115
|
</optgroup>
|
|
48
|
-
|
|
116
|
+
</select>`
|
|
117
|
+
|
|
118
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
119
|
+
const select = new Select(selectElement)
|
|
120
|
+
const data = select.getData() as Optgroup[]
|
|
121
|
+
|
|
122
|
+
expect(data).toHaveLength(2)
|
|
123
|
+
|
|
124
|
+
expect(data[0].label).toBe('test1')
|
|
125
|
+
expect(data[0].options).toHaveLength(2)
|
|
126
|
+
expect(data[0].options[0].id).toBe('111')
|
|
127
|
+
expect(data[0].options[0].value).toBe('1')
|
|
128
|
+
expect(data[0].options[0].text).toBe('One')
|
|
129
|
+
expect(data[0].options[1].id).toBe('222')
|
|
130
|
+
expect(data[0].options[1].value).toBe('2')
|
|
131
|
+
expect(data[0].options[1].text).toBe('Two')
|
|
132
|
+
|
|
133
|
+
expect(data[1].label).toBe('test2')
|
|
134
|
+
expect(data[1].options).toHaveLength(3)
|
|
135
|
+
expect(data[1].options[0].id).toBe('333')
|
|
136
|
+
expect(data[1].options[0].value).toBe('3')
|
|
137
|
+
expect(data[1].options[0].text).toBe('Three')
|
|
138
|
+
expect(data[1].options[1].id).toBe('444')
|
|
139
|
+
expect(data[1].options[1].value).toBe('4')
|
|
140
|
+
expect(data[1].options[1].text).toBe('Four')
|
|
141
|
+
expect(data[1].options[2].id).toBe('555')
|
|
142
|
+
expect(data[1].options[2].value).toBe('5')
|
|
143
|
+
expect(data[1].options[2].text).toBe('Five')
|
|
144
|
+
})
|
|
145
|
+
})
|
|
49
146
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
147
|
+
describe('setSelected', () => {
|
|
148
|
+
test('single option gets selected correctly', () => {
|
|
149
|
+
// get id of the first option in the first optgroup
|
|
150
|
+
const id = select.select.querySelector<HTMLOptionElement>('optgroup option')?.id
|
|
151
|
+
expect(id).toBe('111')
|
|
152
|
+
|
|
153
|
+
select.setSelected([id as string])
|
|
154
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="1"]')?.selected).toBe(true)
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
test('mix of options get selected correctly', () => {
|
|
158
|
+
select.setSelected(['111', '222', '333'])
|
|
159
|
+
|
|
160
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="1"]')?.selected).toBe(true)
|
|
161
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="2"]')?.selected).toBe(true)
|
|
162
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="3"]')?.selected).toBe(true)
|
|
163
|
+
})
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
describe('setSelectedByValue', () => {
|
|
167
|
+
test('single value get selected correctly', () => {
|
|
168
|
+
select.setSelectedByValue(['6'])
|
|
169
|
+
|
|
170
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="6"]')?.selected).toBe(true)
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
test('opt group value gets selected correctly', () => {
|
|
174
|
+
select.setSelectedByValue(['4'])
|
|
175
|
+
|
|
176
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="4"]')?.selected).toBe(true)
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
test('mix of options get selected correctly', () => {
|
|
180
|
+
select.setSelectedByValue(['2', '3', '6'])
|
|
181
|
+
|
|
182
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="2"]')?.selected).toBe(true)
|
|
183
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="3"]')?.selected).toBe(true)
|
|
184
|
+
expect(select.select.querySelector<HTMLOptionElement>('option[value="6"]')?.selected).toBe(true)
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
describe('updateSelected', () => {
|
|
189
|
+
test('id gets updated correctly', () => {
|
|
190
|
+
select.select.dataset.id = 'old_id'
|
|
191
|
+
|
|
192
|
+
select.updateSelect('new_id')
|
|
193
|
+
|
|
194
|
+
expect(select.select.dataset.id).toBe('new_id')
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
test('new styles are set correctly', () => {
|
|
198
|
+
select.updateSelect(undefined, 'color: red')
|
|
199
|
+
|
|
200
|
+
expect(select.select.style.color).toBe('red')
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
test("setting styles doesn't override id", () => {
|
|
204
|
+
select.select.dataset.id = 'set_id'
|
|
205
|
+
|
|
206
|
+
select.updateSelect(undefined, 'color: red')
|
|
207
|
+
|
|
208
|
+
expect(select.select.dataset.id).toBe('set_id')
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
test('classes are set correctly', () => {
|
|
212
|
+
select.updateSelect(undefined, undefined, ['class0', 'class1'])
|
|
213
|
+
|
|
214
|
+
expect(select.select.classList.contains('class0')).toBe(true)
|
|
215
|
+
expect(select.select.classList.contains('class1')).toBe(true)
|
|
216
|
+
})
|
|
68
217
|
})
|
|
69
218
|
|
|
70
219
|
test('update select from data', () => {
|
|
@@ -77,113 +226,109 @@ describe('select module', () => {
|
|
|
77
226
|
id: '1',
|
|
78
227
|
value: '1',
|
|
79
228
|
text: 'One',
|
|
80
|
-
selected: false
|
|
229
|
+
selected: false
|
|
81
230
|
},
|
|
82
231
|
{
|
|
83
232
|
id: '2',
|
|
84
233
|
value: '2',
|
|
85
234
|
text: 'Two',
|
|
86
|
-
selected: false
|
|
87
|
-
}
|
|
235
|
+
selected: false
|
|
236
|
+
}
|
|
88
237
|
])
|
|
89
238
|
let data = store.getData()
|
|
90
239
|
select.updateOptions(data)
|
|
91
240
|
|
|
92
241
|
expect(selectElement.outerHTML).toBe(
|
|
93
|
-
'<select id="test"><option id="1" value="1">One</option><option id="2" value="2">Two</option></select>'
|
|
242
|
+
'<select id="test"><option id="1" value="1">One</option><option id="2" value="2">Two</option></select>'
|
|
94
243
|
)
|
|
95
244
|
})
|
|
96
245
|
|
|
97
|
-
|
|
98
|
-
|
|
246
|
+
describe('onValueChange', () => {
|
|
247
|
+
let select: Select
|
|
248
|
+
let selectElement: HTMLSelectElement
|
|
249
|
+
|
|
250
|
+
beforeEach(() => {
|
|
251
|
+
document.body.innerHTML = `<select id="test">
|
|
99
252
|
<option value="1">One</option>
|
|
100
253
|
<option value="2">Two</option>
|
|
101
254
|
<option value="3">Three</option>
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
let selectElement = document.getElementById('test') as HTMLSelectElement
|
|
105
|
-
let select = new Select(selectElement)
|
|
106
|
-
|
|
107
|
-
let data = select.getData() as Option[]
|
|
108
|
-
|
|
109
|
-
expect(data[0].selected).toBe(true)
|
|
255
|
+
</select>`
|
|
110
256
|
|
|
111
|
-
|
|
112
|
-
|
|
257
|
+
selectElement = document.getElementById('test') as HTMLSelectElement
|
|
258
|
+
select = new Select(selectElement)
|
|
259
|
+
})
|
|
113
260
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
261
|
+
test('listener is triggered when the select value changes', async () => {
|
|
262
|
+
// make sure the first element is selected as standard
|
|
263
|
+
let data = select.getData() as Option[]
|
|
264
|
+
expect(data[0].selected).toBe(true)
|
|
117
265
|
|
|
118
|
-
|
|
119
|
-
|
|
266
|
+
const onValueMock = jest.fn()
|
|
267
|
+
select.onValueChange = onValueMock
|
|
120
268
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
269
|
+
// Change the value
|
|
270
|
+
selectElement.value = '2'
|
|
271
|
+
selectElement.dispatchEvent(new Event('change'))
|
|
124
272
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
expect(data[1].selected).toBe(true)
|
|
128
|
-
})
|
|
273
|
+
await new Promise((r) => setTimeout(r, 50))
|
|
274
|
+
expect(onValueMock).toHaveBeenCalled()
|
|
129
275
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
<option value="2">Two</option>
|
|
134
|
-
<option value="3">Three</option>
|
|
135
|
-
</select>`
|
|
276
|
+
// Get selected data
|
|
277
|
+
const selected = select.getSelectedValues()
|
|
278
|
+
expect(selected[0]).toBe('2')
|
|
136
279
|
|
|
137
|
-
|
|
138
|
-
|
|
280
|
+
// Check all data
|
|
281
|
+
data = select.getData() as Option[]
|
|
282
|
+
expect(data[0].selected).toBe(false)
|
|
283
|
+
expect(data[1].selected).toBe(true)
|
|
284
|
+
})
|
|
139
285
|
|
|
140
|
-
|
|
286
|
+
test('listener is triggered when inner HTML is replaced with new options', async () => {
|
|
287
|
+
const onValueMock = jest.fn()
|
|
288
|
+
select.onValueChange = onValueMock
|
|
141
289
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const callback = jest.fn()
|
|
145
|
-
select.onValueChange = callback
|
|
146
|
-
|
|
147
|
-
selectElement.innerHTML = `<option value="4">Four</option>
|
|
290
|
+
selectElement.innerHTML = `<option value="4">Four</option>
|
|
148
291
|
<option value="5" selected>Five</option>
|
|
149
292
|
<option value="6">Six</option>`
|
|
150
293
|
|
|
151
|
-
|
|
152
|
-
|
|
294
|
+
await new Promise((r) => setTimeout(r, 50))
|
|
295
|
+
expect(onValueMock).toHaveBeenCalled()
|
|
153
296
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
297
|
+
// Give the mutation observer time to run
|
|
298
|
+
const data = select.getData() as Option[]
|
|
299
|
+
expect(data[1].value).toBe('5')
|
|
300
|
+
expect(data[1].selected).toBe(true)
|
|
301
|
+
})
|
|
158
302
|
})
|
|
159
303
|
|
|
160
|
-
|
|
161
|
-
|
|
304
|
+
describe('onOptionsChange', () => {
|
|
305
|
+
test('listener triggers when select options change without changing the select value', async () => {
|
|
306
|
+
document.body.innerHTML = `<select id="test">
|
|
162
307
|
<option value="1">One</option>
|
|
163
308
|
<option value="2">Two</option>
|
|
164
309
|
<option value="3">Three</option>
|
|
165
|
-
|
|
310
|
+
</select>`
|
|
166
311
|
|
|
167
|
-
|
|
168
|
-
|
|
312
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
313
|
+
const select = new Select(selectElement)
|
|
169
314
|
|
|
170
|
-
|
|
171
|
-
|
|
315
|
+
let data = select.getData() as Option[]
|
|
316
|
+
expect(data).toHaveLength(3)
|
|
172
317
|
|
|
173
|
-
|
|
174
|
-
|
|
318
|
+
const onOptionsMock = jest.fn()
|
|
319
|
+
select.onOptionsChange = onOptionsMock
|
|
175
320
|
|
|
176
|
-
|
|
321
|
+
selectElement.innerHTML = '<option value="1">One</option><option value="2">Two</option>'
|
|
177
322
|
|
|
178
|
-
|
|
179
|
-
|
|
323
|
+
await new Promise((r) => setTimeout(r, 50))
|
|
324
|
+
expect(onOptionsMock).toHaveBeenCalled()
|
|
180
325
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
326
|
+
data = select.getData() as Option[]
|
|
327
|
+
expect(data).toHaveLength(2)
|
|
328
|
+
})
|
|
184
329
|
|
|
185
|
-
|
|
186
|
-
|
|
330
|
+
test('listener triggers when optgroup options change', async () => {
|
|
331
|
+
document.body.innerHTML = `<select id="test">
|
|
187
332
|
<optgroup id="test_optgroup" label="test1">
|
|
188
333
|
<option value="1">One</option>
|
|
189
334
|
<option value="2">Two</option>
|
|
@@ -193,58 +338,59 @@ describe('select module', () => {
|
|
|
193
338
|
<option value="4">Four</option>
|
|
194
339
|
<option value="5">Five</option>
|
|
195
340
|
</optgroup>
|
|
196
|
-
|
|
341
|
+
</select>`
|
|
197
342
|
|
|
198
|
-
|
|
199
|
-
|
|
343
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
344
|
+
const select = new Select(selectElement)
|
|
200
345
|
|
|
201
|
-
|
|
346
|
+
const optGroups = select.getData() as Optgroup[]
|
|
347
|
+
expect(optGroups).toHaveLength(2)
|
|
202
348
|
|
|
203
|
-
|
|
349
|
+
const onOptionsMock = jest.fn()
|
|
350
|
+
select.onOptionsChange = onOptionsMock
|
|
204
351
|
|
|
205
|
-
|
|
206
|
-
|
|
352
|
+
const selectOptgroup = document.getElementById('test_optgroup') as HTMLOptGroupElement
|
|
353
|
+
selectOptgroup.innerHTML = '<option value="8">Eight</option><option value="9">Nine</option>'
|
|
207
354
|
|
|
208
|
-
|
|
209
|
-
|
|
355
|
+
await new Promise((r) => setTimeout(r, 50))
|
|
356
|
+
expect(onOptionsMock).toHaveBeenCalled()
|
|
210
357
|
|
|
211
|
-
|
|
212
|
-
|
|
358
|
+
const options = select.getData() as Option[]
|
|
359
|
+
expect(options).toHaveLength(2)
|
|
213
360
|
|
|
214
|
-
|
|
215
|
-
|
|
361
|
+
// get selected data
|
|
362
|
+
const selected = select.getSelectedValues()
|
|
363
|
+
expect(selected).toHaveLength(1)
|
|
364
|
+
})
|
|
216
365
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
expect(selected.length).toBe(1)
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
test('mutation observer listener for select option text changes', () => {
|
|
223
|
-
document.body.innerHTML = `<select id="test">
|
|
366
|
+
test('listener triggers when select option text changes', async () => {
|
|
367
|
+
document.body.innerHTML = `<select id="test">
|
|
224
368
|
<option value="1">One</option>
|
|
225
369
|
<option value="2">Two</option>
|
|
226
370
|
<option value="3">Three</option>
|
|
227
|
-
|
|
371
|
+
</select>`
|
|
228
372
|
|
|
229
|
-
|
|
230
|
-
|
|
373
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
374
|
+
const select = new Select(selectElement)
|
|
231
375
|
|
|
232
|
-
|
|
376
|
+
let data = select.getData() as Option[]
|
|
377
|
+
expect(data[0].text).toBe('One')
|
|
233
378
|
|
|
234
|
-
|
|
379
|
+
const onOptionsMock = jest.fn()
|
|
380
|
+
select.onOptionsChange = onOptionsMock
|
|
235
381
|
|
|
236
|
-
|
|
237
|
-
|
|
382
|
+
let option = selectElement.options[0]
|
|
383
|
+
option.text = 'New One'
|
|
238
384
|
|
|
239
|
-
|
|
240
|
-
|
|
385
|
+
await new Promise((r) => setTimeout(r, 50))
|
|
386
|
+
expect(onOptionsMock).toHaveBeenCalled()
|
|
241
387
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
388
|
+
data = select.getData() as Option[]
|
|
389
|
+
expect(data[0].text).toBe('New One')
|
|
390
|
+
})
|
|
245
391
|
|
|
246
|
-
|
|
247
|
-
|
|
392
|
+
test('listener triggers when select optgroup option text changes', async () => {
|
|
393
|
+
document.body.innerHTML = `<select id="test">
|
|
248
394
|
<optgroup id="test_optgroup" label="test1">
|
|
249
395
|
<option id=test_option value="1">One</option>
|
|
250
396
|
<option value="2">Two</option>
|
|
@@ -254,22 +400,26 @@ describe('select module', () => {
|
|
|
254
400
|
<option value="4">Four</option>
|
|
255
401
|
<option value="5">Five</option>
|
|
256
402
|
</optgroup>
|
|
257
|
-
|
|
403
|
+
</select>`
|
|
258
404
|
|
|
259
|
-
|
|
260
|
-
|
|
405
|
+
const selectElement = document.getElementById('test') as HTMLSelectElement
|
|
406
|
+
const select = new Select(selectElement)
|
|
407
|
+
|
|
408
|
+
let dataOptgroup = select.getData() as Optgroup[]
|
|
261
409
|
|
|
262
|
-
|
|
410
|
+
expect(dataOptgroup[0].options[0].text).toBe('One')
|
|
263
411
|
|
|
264
|
-
|
|
412
|
+
const onOptionsMock = jest.fn()
|
|
413
|
+
select.onOptionsChange = onOptionsMock
|
|
265
414
|
|
|
266
|
-
|
|
267
|
-
|
|
415
|
+
let selectOption = document.getElementById('test_option') as HTMLOptionElement
|
|
416
|
+
selectOption.text = 'New One'
|
|
268
417
|
|
|
269
|
-
|
|
270
|
-
|
|
418
|
+
await new Promise((r) => setTimeout(r, 50))
|
|
419
|
+
expect(onOptionsMock).toHaveBeenCalled()
|
|
271
420
|
|
|
272
|
-
|
|
273
|
-
|
|
421
|
+
let dataOption = select.getData() as Optgroup[]
|
|
422
|
+
expect(dataOption[0].options[0].text).toBe('New One')
|
|
423
|
+
})
|
|
274
424
|
})
|
|
275
425
|
})
|