@furystack/shades-common-components 12.0.0 → 12.1.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 (49) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +26 -0
  3. package/esm/components/cache-view.d.ts +46 -0
  4. package/esm/components/cache-view.d.ts.map +1 -0
  5. package/esm/components/cache-view.js +65 -0
  6. package/esm/components/cache-view.js.map +1 -0
  7. package/esm/components/cache-view.spec.d.ts +2 -0
  8. package/esm/components/cache-view.spec.d.ts.map +1 -0
  9. package/esm/components/cache-view.spec.js +183 -0
  10. package/esm/components/cache-view.spec.js.map +1 -0
  11. package/esm/components/command-palette/command-palette-input.spec.js +148 -148
  12. package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
  13. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +258 -258
  14. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
  15. package/esm/components/context-menu/context-menu-manager.spec.js +211 -217
  16. package/esm/components/context-menu/context-menu-manager.spec.js.map +1 -1
  17. package/esm/components/data-grid/body.spec.js +173 -173
  18. package/esm/components/data-grid/body.spec.js.map +1 -1
  19. package/esm/components/data-grid/data-grid.spec.js +39 -130
  20. package/esm/components/data-grid/data-grid.spec.js.map +1 -1
  21. package/esm/components/index.d.ts +1 -0
  22. package/esm/components/index.d.ts.map +1 -1
  23. package/esm/components/index.js +1 -0
  24. package/esm/components/index.js.map +1 -1
  25. package/esm/components/skeleton.d.ts.map +1 -1
  26. package/esm/components/skeleton.js +2 -11
  27. package/esm/components/skeleton.js.map +1 -1
  28. package/esm/components/skeleton.spec.js +6 -55
  29. package/esm/components/skeleton.spec.js.map +1 -1
  30. package/esm/services/click-away-service.spec.js +14 -12
  31. package/esm/services/click-away-service.spec.js.map +1 -1
  32. package/esm/services/list-service.spec.js +170 -141
  33. package/esm/services/list-service.spec.js.map +1 -1
  34. package/esm/services/tree-service.spec.js +190 -159
  35. package/esm/services/tree-service.spec.js.map +1 -1
  36. package/package.json +8 -8
  37. package/src/components/cache-view.spec.tsx +210 -0
  38. package/src/components/cache-view.tsx +103 -0
  39. package/src/components/command-palette/command-palette-input.spec.tsx +183 -194
  40. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +303 -321
  41. package/src/components/context-menu/context-menu-manager.spec.ts +213 -258
  42. package/src/components/data-grid/body.spec.tsx +266 -276
  43. package/src/components/data-grid/data-grid.spec.tsx +137 -232
  44. package/src/components/index.ts +1 -0
  45. package/src/components/skeleton.spec.tsx +6 -73
  46. package/src/components/skeleton.tsx +2 -11
  47. package/src/services/click-away-service.spec.ts +14 -16
  48. package/src/services/list-service.spec.ts +170 -172
  49. package/src/services/tree-service.spec.ts +191 -207
@@ -1,3 +1,4 @@
1
+ import { using } from '@furystack/utils'
1
2
  import { describe, expect, it } from 'vitest'
2
3
  import { TreeService } from './tree-service.js'
3
4
 
@@ -43,378 +44,361 @@ describe('TreeService', () => {
43
44
  describe('flattenedNodes', () => {
44
45
  it('should flatten only root items when none are expanded', () => {
45
46
  const { service, rootItems } = createTestService()
46
-
47
- const flattened = service.flattenedNodes.getValue()
48
- expect(flattened.length).toBe(3)
49
- expect(flattened[0].item).toBe(rootItems[0])
50
- expect(flattened[0].level).toBe(0)
51
- expect(flattened[0].hasChildren).toBe(true)
52
- expect(flattened[0].isExpanded).toBe(false)
53
- expect(flattened[1].item).toBe(rootItems[1])
54
- expect(flattened[1].hasChildren).toBe(false)
55
- expect(flattened[2].item).toBe(rootItems[2])
56
-
57
- service[Symbol.dispose]()
47
+ using(service, () => {
48
+ const flattened = service.flattenedNodes.getValue()
49
+ expect(flattened.length).toBe(3)
50
+ expect(flattened[0].item).toBe(rootItems[0])
51
+ expect(flattened[0].level).toBe(0)
52
+ expect(flattened[0].hasChildren).toBe(true)
53
+ expect(flattened[0].isExpanded).toBe(false)
54
+ expect(flattened[1].item).toBe(rootItems[1])
55
+ expect(flattened[1].hasChildren).toBe(false)
56
+ expect(flattened[2].item).toBe(rootItems[2])
57
+ })
58
58
  })
59
59
 
60
60
  it('should flatten children when a node is expanded', () => {
61
61
  const { service, rootItems } = createTestService()
62
-
63
- service.expand(rootItems[0])
64
-
65
- const flattened = service.flattenedNodes.getValue()
66
- expect(flattened.length).toBe(5)
67
- expect(flattened[0].item).toBe(rootItems[0])
68
- expect(flattened[0].isExpanded).toBe(true)
69
- expect(flattened[1].item).toBe(rootItems[0].children![0])
70
- expect(flattened[1].level).toBe(1)
71
- expect(flattened[2].item).toBe(rootItems[0].children![1])
72
- expect(flattened[2].level).toBe(1)
73
- expect(flattened[3].item).toBe(rootItems[1])
74
- expect(flattened[4].item).toBe(rootItems[2])
75
-
76
- service[Symbol.dispose]()
62
+ using(service, () => {
63
+ service.expand(rootItems[0])
64
+
65
+ const flattened = service.flattenedNodes.getValue()
66
+ expect(flattened.length).toBe(5)
67
+ expect(flattened[0].item).toBe(rootItems[0])
68
+ expect(flattened[0].isExpanded).toBe(true)
69
+ expect(flattened[1].item).toBe(rootItems[0].children![0])
70
+ expect(flattened[1].level).toBe(1)
71
+ expect(flattened[2].item).toBe(rootItems[0].children![1])
72
+ expect(flattened[2].level).toBe(1)
73
+ expect(flattened[3].item).toBe(rootItems[1])
74
+ expect(flattened[4].item).toBe(rootItems[2])
75
+ })
77
76
  })
78
77
 
79
78
  it('should flatten deeply nested children', () => {
80
79
  const { service, rootItems } = createTestService()
80
+ using(service, () => {
81
+ service.expand(rootItems[0])
82
+ service.expand(rootItems[0].children![0])
81
83
 
82
- service.expand(rootItems[0])
83
- service.expand(rootItems[0].children![0])
84
-
85
- const flattened = service.flattenedNodes.getValue()
86
- expect(flattened.length).toBe(7)
87
- expect(flattened[2].item.id).toBe(111)
88
- expect(flattened[2].level).toBe(2)
89
- expect(flattened[3].item.id).toBe(112)
90
- expect(flattened[3].level).toBe(2)
91
-
92
- service[Symbol.dispose]()
84
+ const flattened = service.flattenedNodes.getValue()
85
+ expect(flattened.length).toBe(7)
86
+ expect(flattened[2].item.id).toBe(111)
87
+ expect(flattened[2].level).toBe(2)
88
+ expect(flattened[3].item.id).toBe(112)
89
+ expect(flattened[3].level).toBe(2)
90
+ })
93
91
  })
94
92
 
95
93
  it('should sync items with flattened nodes', () => {
96
94
  const { service, rootItems } = createTestService()
95
+ using(service, () => {
96
+ service.expand(rootItems[0])
97
97
 
98
- service.expand(rootItems[0])
99
-
100
- const items = service.items.getValue()
101
- const flattened = service.flattenedNodes.getValue()
102
-
103
- expect(items.length).toBe(flattened.length)
104
- for (let i = 0; i < items.length; i++) {
105
- expect(items[i]).toBe(flattened[i].item)
106
- }
98
+ const items = service.items.getValue()
99
+ const flattened = service.flattenedNodes.getValue()
107
100
 
108
- service[Symbol.dispose]()
101
+ expect(items.length).toBe(flattened.length)
102
+ for (let i = 0; i < items.length; i++) {
103
+ expect(items[i]).toBe(flattened[i].item)
104
+ }
105
+ })
109
106
  })
110
107
  })
111
108
 
112
109
  describe('expand/collapse', () => {
113
110
  it('should expand a node', () => {
114
111
  const { service, rootItems } = createTestService()
112
+ using(service, () => {
113
+ service.expand(rootItems[0])
115
114
 
116
- service.expand(rootItems[0])
117
-
118
- expect(service.isExpanded(rootItems[0])).toBe(true)
119
-
120
- service[Symbol.dispose]()
115
+ expect(service.isExpanded(rootItems[0])).toBe(true)
116
+ })
121
117
  })
122
118
 
123
119
  it('should collapse a node', () => {
124
120
  const { service, rootItems } = createTestService()
121
+ using(service, () => {
122
+ service.expand(rootItems[0])
123
+ service.collapse(rootItems[0])
125
124
 
126
- service.expand(rootItems[0])
127
- service.collapse(rootItems[0])
128
-
129
- expect(service.isExpanded(rootItems[0])).toBe(false)
130
-
131
- service[Symbol.dispose]()
125
+ expect(service.isExpanded(rootItems[0])).toBe(false)
126
+ })
132
127
  })
133
128
 
134
129
  it('should toggle expand on a collapsed node with children', () => {
135
130
  const { service, rootItems } = createTestService()
131
+ using(service, () => {
132
+ service.toggleExpanded(rootItems[0])
136
133
 
137
- service.toggleExpanded(rootItems[0])
138
-
139
- expect(service.isExpanded(rootItems[0])).toBe(true)
140
-
141
- service[Symbol.dispose]()
134
+ expect(service.isExpanded(rootItems[0])).toBe(true)
135
+ })
142
136
  })
143
137
 
144
138
  it('should toggle collapse on an expanded node', () => {
145
139
  const { service, rootItems } = createTestService()
140
+ using(service, () => {
141
+ service.expand(rootItems[0])
142
+ service.toggleExpanded(rootItems[0])
146
143
 
147
- service.expand(rootItems[0])
148
- service.toggleExpanded(rootItems[0])
149
-
150
- expect(service.isExpanded(rootItems[0])).toBe(false)
151
-
152
- service[Symbol.dispose]()
144
+ expect(service.isExpanded(rootItems[0])).toBe(false)
145
+ })
153
146
  })
154
147
 
155
148
  it('should not expand a leaf node', () => {
156
149
  const { service, rootItems } = createTestService()
150
+ using(service, () => {
151
+ service.toggleExpanded(rootItems[1])
157
152
 
158
- service.toggleExpanded(rootItems[1])
159
-
160
- expect(service.isExpanded(rootItems[1])).toBe(false)
161
-
162
- service[Symbol.dispose]()
153
+ expect(service.isExpanded(rootItems[1])).toBe(false)
154
+ })
163
155
  })
164
156
 
165
157
  it('should hide children when collapsing a node', () => {
166
158
  const { service, rootItems } = createTestService()
159
+ using(service, () => {
160
+ service.expand(rootItems[0])
161
+ expect(service.flattenedNodes.getValue().length).toBe(5)
167
162
 
168
- service.expand(rootItems[0])
169
- expect(service.flattenedNodes.getValue().length).toBe(5)
170
-
171
- service.collapse(rootItems[0])
172
- expect(service.flattenedNodes.getValue().length).toBe(3)
173
-
174
- service[Symbol.dispose]()
163
+ service.collapse(rootItems[0])
164
+ expect(service.flattenedNodes.getValue().length).toBe(3)
165
+ })
175
166
  })
176
167
  })
177
168
 
178
169
  describe('getParent', () => {
179
170
  it('should return undefined for root items', () => {
180
171
  const { service, rootItems } = createTestService()
181
-
182
- expect(service.getParent(rootItems[0])).toBeUndefined()
183
- expect(service.getParent(rootItems[1])).toBeUndefined()
184
-
185
- service[Symbol.dispose]()
172
+ using(service, () => {
173
+ expect(service.getParent(rootItems[0])).toBeUndefined()
174
+ expect(service.getParent(rootItems[1])).toBeUndefined()
175
+ })
186
176
  })
187
177
 
188
178
  it('should return the parent of a child node', () => {
189
179
  const { service, rootItems } = createTestService()
190
-
191
- const parent = service.getParent(rootItems[0].children![0])
192
- expect(parent).toBe(rootItems[0])
193
-
194
- service[Symbol.dispose]()
180
+ using(service, () => {
181
+ const parent = service.getParent(rootItems[0].children![0])
182
+ expect(parent).toBe(rootItems[0])
183
+ })
195
184
  })
196
185
 
197
186
  it('should return the parent of a deeply nested node', () => {
198
187
  const { service, rootItems } = createTestService()
199
-
200
- const parent = service.getParent(rootItems[0].children![0].children![0])
201
- expect(parent).toBe(rootItems[0].children![0])
202
-
203
- service[Symbol.dispose]()
188
+ using(service, () => {
189
+ const parent = service.getParent(rootItems[0].children![0].children![0])
190
+ expect(parent).toBe(rootItems[0].children![0])
191
+ })
204
192
  })
205
193
  })
206
194
 
207
195
  describe('getNodeInfo', () => {
208
196
  it('should return node info for a visible item', () => {
209
197
  const { service, rootItems } = createTestService()
210
-
211
- const info = service.getNodeInfo(rootItems[0])
212
- expect(info).toBeDefined()
213
- expect(info?.level).toBe(0)
214
- expect(info?.hasChildren).toBe(true)
215
- expect(info?.isExpanded).toBe(false)
216
-
217
- service[Symbol.dispose]()
198
+ using(service, () => {
199
+ const info = service.getNodeInfo(rootItems[0])
200
+ expect(info).toBeDefined()
201
+ expect(info?.level).toBe(0)
202
+ expect(info?.hasChildren).toBe(true)
203
+ expect(info?.isExpanded).toBe(false)
204
+ })
218
205
  })
219
206
 
220
207
  it('should return undefined for a hidden item', () => {
221
208
  const { service, rootItems } = createTestService()
222
-
223
- const info = service.getNodeInfo(rootItems[0].children![0])
224
- expect(info).toBeUndefined()
225
-
226
- service[Symbol.dispose]()
209
+ using(service, () => {
210
+ const info = service.getNodeInfo(rootItems[0].children![0])
211
+ expect(info).toBeUndefined()
212
+ })
227
213
  })
228
214
  })
229
215
 
230
216
  describe('handleKeyDown - tree navigation', () => {
231
217
  it('should expand a collapsed node on ArrowRight', () => {
232
218
  const { service, rootItems } = createTestService()
233
- service.hasFocus.setValue(true)
234
- service.focusedItem.setValue(rootItems[0])
235
-
236
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
219
+ using(service, () => {
220
+ service.hasFocus.setValue(true)
221
+ service.focusedItem.setValue(rootItems[0])
237
222
 
238
- expect(service.isExpanded(rootItems[0])).toBe(true)
223
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
239
224
 
240
- service[Symbol.dispose]()
225
+ expect(service.isExpanded(rootItems[0])).toBe(true)
226
+ })
241
227
  })
242
228
 
243
229
  it('should move focus to first child on ArrowRight when already expanded', () => {
244
230
  const { service, rootItems } = createTestService()
245
- service.hasFocus.setValue(true)
246
- service.expand(rootItems[0])
247
- service.focusedItem.setValue(rootItems[0])
248
-
249
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
231
+ using(service, () => {
232
+ service.hasFocus.setValue(true)
233
+ service.expand(rootItems[0])
234
+ service.focusedItem.setValue(rootItems[0])
250
235
 
251
- expect(service.focusedItem.getValue()).toBe(rootItems[0].children![0])
236
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
252
237
 
253
- service[Symbol.dispose]()
238
+ expect(service.focusedItem.getValue()).toBe(rootItems[0].children![0])
239
+ })
254
240
  })
255
241
 
256
242
  it('should do nothing on ArrowRight on a leaf node', () => {
257
243
  const { service, rootItems } = createTestService()
258
- service.hasFocus.setValue(true)
259
- service.focusedItem.setValue(rootItems[1])
244
+ using(service, () => {
245
+ service.hasFocus.setValue(true)
246
+ service.focusedItem.setValue(rootItems[1])
260
247
 
261
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
248
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
262
249
 
263
- expect(service.focusedItem.getValue()).toBe(rootItems[1])
264
-
265
- service[Symbol.dispose]()
250
+ expect(service.focusedItem.getValue()).toBe(rootItems[1])
251
+ })
266
252
  })
267
253
 
268
254
  it('should collapse an expanded node on ArrowLeft', () => {
269
255
  const { service, rootItems } = createTestService()
270
- service.hasFocus.setValue(true)
271
- service.expand(rootItems[0])
272
- service.focusedItem.setValue(rootItems[0])
273
-
274
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
256
+ using(service, () => {
257
+ service.hasFocus.setValue(true)
258
+ service.expand(rootItems[0])
259
+ service.focusedItem.setValue(rootItems[0])
275
260
 
276
- expect(service.isExpanded(rootItems[0])).toBe(false)
261
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
277
262
 
278
- service[Symbol.dispose]()
263
+ expect(service.isExpanded(rootItems[0])).toBe(false)
264
+ })
279
265
  })
280
266
 
281
267
  it('should move focus to parent on ArrowLeft when node is collapsed', () => {
282
268
  const { service, rootItems } = createTestService()
283
- service.hasFocus.setValue(true)
284
- service.expand(rootItems[0])
285
- service.focusedItem.setValue(rootItems[0].children![0])
286
-
287
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
269
+ using(service, () => {
270
+ service.hasFocus.setValue(true)
271
+ service.expand(rootItems[0])
272
+ service.focusedItem.setValue(rootItems[0].children![0])
288
273
 
289
- expect(service.focusedItem.getValue()).toBe(rootItems[0])
274
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
290
275
 
291
- service[Symbol.dispose]()
276
+ expect(service.focusedItem.getValue()).toBe(rootItems[0])
277
+ })
292
278
  })
293
279
 
294
280
  it('should do nothing on ArrowLeft on a root node that is collapsed', () => {
295
281
  const { service, rootItems } = createTestService()
296
- service.hasFocus.setValue(true)
297
- service.focusedItem.setValue(rootItems[1])
282
+ using(service, () => {
283
+ service.hasFocus.setValue(true)
284
+ service.focusedItem.setValue(rootItems[1])
298
285
 
299
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
286
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
300
287
 
301
- expect(service.focusedItem.getValue()).toBe(rootItems[1])
302
-
303
- service[Symbol.dispose]()
288
+ expect(service.focusedItem.getValue()).toBe(rootItems[1])
289
+ })
304
290
  })
305
291
 
306
292
  it('should not handle keys when not focused', () => {
307
293
  const { service, rootItems } = createTestService()
308
- service.hasFocus.setValue(false)
309
- service.focusedItem.setValue(rootItems[0])
310
-
311
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
294
+ using(service, () => {
295
+ service.hasFocus.setValue(false)
296
+ service.focusedItem.setValue(rootItems[0])
312
297
 
313
- expect(service.isExpanded(rootItems[0])).toBe(false)
298
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
314
299
 
315
- service[Symbol.dispose]()
300
+ expect(service.isExpanded(rootItems[0])).toBe(false)
301
+ })
316
302
  })
317
303
  })
318
304
 
319
305
  describe('inherited ListService keyboard navigation', () => {
320
306
  it('should handle ArrowDown to move focus to next visible item', () => {
321
307
  const { service, rootItems } = createTestService()
322
- service.hasFocus.setValue(true)
323
- service.focusedItem.setValue(rootItems[0])
324
-
325
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowDown' }))
308
+ using(service, () => {
309
+ service.hasFocus.setValue(true)
310
+ service.focusedItem.setValue(rootItems[0])
326
311
 
327
- expect(service.focusedItem.getValue()).toBe(rootItems[1])
312
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowDown' }))
328
313
 
329
- service[Symbol.dispose]()
314
+ expect(service.focusedItem.getValue()).toBe(rootItems[1])
315
+ })
330
316
  })
331
317
 
332
318
  it('should handle ArrowUp to move focus to previous visible item', () => {
333
319
  const { service, rootItems } = createTestService()
334
- service.hasFocus.setValue(true)
335
- service.focusedItem.setValue(rootItems[1])
320
+ using(service, () => {
321
+ service.hasFocus.setValue(true)
322
+ service.focusedItem.setValue(rootItems[1])
336
323
 
337
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowUp' }))
324
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowUp' }))
338
325
 
339
- expect(service.focusedItem.getValue()).toBe(rootItems[0])
340
-
341
- service[Symbol.dispose]()
326
+ expect(service.focusedItem.getValue()).toBe(rootItems[0])
327
+ })
342
328
  })
343
329
 
344
330
  it('should handle Home to move focus to first item', () => {
345
331
  const { service, rootItems } = createTestService()
346
- service.hasFocus.setValue(true)
347
- service.focusedItem.setValue(rootItems[2])
348
-
349
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'Home' }))
332
+ using(service, () => {
333
+ service.hasFocus.setValue(true)
334
+ service.focusedItem.setValue(rootItems[2])
350
335
 
351
- expect(service.focusedItem.getValue()).toBe(rootItems[0])
336
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'Home' }))
352
337
 
353
- service[Symbol.dispose]()
338
+ expect(service.focusedItem.getValue()).toBe(rootItems[0])
339
+ })
354
340
  })
355
341
 
356
342
  it('should handle End to move focus to last item', () => {
357
343
  const { service, rootItems } = createTestService()
358
- service.hasFocus.setValue(true)
359
- service.focusedItem.setValue(rootItems[0])
360
-
361
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'End' }))
344
+ using(service, () => {
345
+ service.hasFocus.setValue(true)
346
+ service.focusedItem.setValue(rootItems[0])
362
347
 
363
- expect(service.focusedItem.getValue()).toBe(rootItems[2])
348
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'End' }))
364
349
 
365
- service[Symbol.dispose]()
350
+ expect(service.focusedItem.getValue()).toBe(rootItems[2])
351
+ })
366
352
  })
367
353
 
368
354
  it('should handle Space to toggle selection of focused item', () => {
369
355
  const { service, rootItems } = createTestService()
370
- service.hasFocus.setValue(true)
371
- service.focusedItem.setValue(rootItems[0])
356
+ using(service, () => {
357
+ service.hasFocus.setValue(true)
358
+ service.focusedItem.setValue(rootItems[0])
372
359
 
373
- service.handleKeyDown(new KeyboardEvent('keydown', { key: ' ' }))
374
- expect(service.selection.getValue()).toContain(rootItems[0])
360
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: ' ' }))
361
+ expect(service.selection.getValue()).toContain(rootItems[0])
375
362
 
376
- service.handleKeyDown(new KeyboardEvent('keydown', { key: ' ' }))
377
- expect(service.selection.getValue()).not.toContain(rootItems[0])
378
-
379
- service[Symbol.dispose]()
363
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: ' ' }))
364
+ expect(service.selection.getValue()).not.toContain(rootItems[0])
365
+ })
380
366
  })
381
367
 
382
368
  it('should handle Escape to clear selection and search term', () => {
383
369
  const { service, rootItems } = createTestService()
384
- service.hasFocus.setValue(true)
385
- service.selection.setValue([rootItems[0]])
386
- service.searchTerm.setValue('test')
387
-
388
- service.handleKeyDown(new KeyboardEvent('keydown', { key: 'Escape' }))
370
+ using(service, () => {
371
+ service.hasFocus.setValue(true)
372
+ service.selection.setValue([rootItems[0]])
373
+ service.searchTerm.setValue('test')
389
374
 
390
- expect(service.selection.getValue()).toEqual([])
391
- expect(service.searchTerm.getValue()).toBe('')
375
+ service.handleKeyDown(new KeyboardEvent('keydown', { key: 'Escape' }))
392
376
 
393
- service[Symbol.dispose]()
377
+ expect(service.selection.getValue()).toEqual([])
378
+ expect(service.searchTerm.getValue()).toBe('')
379
+ })
394
380
  })
395
381
  })
396
382
 
397
383
  describe('handleItemDoubleClick', () => {
398
384
  it('should toggle expansion on double-click of a node with children', () => {
399
385
  const { service, rootItems } = createTestService()
386
+ using(service, () => {
387
+ service.handleItemDoubleClick(rootItems[0])
388
+ expect(service.isExpanded(rootItems[0])).toBe(true)
400
389
 
401
- service.handleItemDoubleClick(rootItems[0])
402
- expect(service.isExpanded(rootItems[0])).toBe(true)
403
-
404
- service.handleItemDoubleClick(rootItems[0])
405
- expect(service.isExpanded(rootItems[0])).toBe(false)
406
-
407
- service[Symbol.dispose]()
390
+ service.handleItemDoubleClick(rootItems[0])
391
+ expect(service.isExpanded(rootItems[0])).toBe(false)
392
+ })
408
393
  })
409
394
 
410
395
  it('should not expand on double-click of a leaf node', () => {
411
396
  const { service, rootItems } = createTestService()
397
+ using(service, () => {
398
+ service.handleItemDoubleClick(rootItems[1])
412
399
 
413
- service.handleItemDoubleClick(rootItems[1])
414
-
415
- expect(service.isExpanded(rootItems[1])).toBe(false)
416
-
417
- service[Symbol.dispose]()
400
+ expect(service.isExpanded(rootItems[1])).toBe(false)
401
+ })
418
402
  })
419
403
  })
420
404