@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.
- package/CHANGELOG.md +56 -0
- package/README.md +26 -0
- package/esm/components/cache-view.d.ts +46 -0
- package/esm/components/cache-view.d.ts.map +1 -0
- package/esm/components/cache-view.js +65 -0
- package/esm/components/cache-view.js.map +1 -0
- package/esm/components/cache-view.spec.d.ts +2 -0
- package/esm/components/cache-view.spec.d.ts.map +1 -0
- package/esm/components/cache-view.spec.js +183 -0
- package/esm/components/cache-view.spec.js.map +1 -0
- package/esm/components/command-palette/command-palette-input.spec.js +148 -148
- package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js +258 -258
- package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
- package/esm/components/context-menu/context-menu-manager.spec.js +211 -217
- package/esm/components/context-menu/context-menu-manager.spec.js.map +1 -1
- package/esm/components/data-grid/body.spec.js +173 -173
- package/esm/components/data-grid/body.spec.js.map +1 -1
- package/esm/components/data-grid/data-grid.spec.js +39 -130
- package/esm/components/data-grid/data-grid.spec.js.map +1 -1
- package/esm/components/index.d.ts +1 -0
- package/esm/components/index.d.ts.map +1 -1
- package/esm/components/index.js +1 -0
- package/esm/components/index.js.map +1 -1
- package/esm/components/skeleton.d.ts.map +1 -1
- package/esm/components/skeleton.js +2 -11
- package/esm/components/skeleton.js.map +1 -1
- package/esm/components/skeleton.spec.js +6 -55
- package/esm/components/skeleton.spec.js.map +1 -1
- package/esm/services/click-away-service.spec.js +14 -12
- package/esm/services/click-away-service.spec.js.map +1 -1
- package/esm/services/list-service.spec.js +170 -141
- package/esm/services/list-service.spec.js.map +1 -1
- package/esm/services/tree-service.spec.js +190 -159
- package/esm/services/tree-service.spec.js.map +1 -1
- package/package.json +8 -8
- package/src/components/cache-view.spec.tsx +210 -0
- package/src/components/cache-view.tsx +103 -0
- package/src/components/command-palette/command-palette-input.spec.tsx +183 -194
- package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +303 -321
- package/src/components/context-menu/context-menu-manager.spec.ts +213 -258
- package/src/components/data-grid/body.spec.tsx +266 -276
- package/src/components/data-grid/data-grid.spec.tsx +137 -232
- package/src/components/index.ts +1 -0
- package/src/components/skeleton.spec.tsx +6 -73
- package/src/components/skeleton.tsx +2 -11
- package/src/services/click-away-service.spec.ts +14 -16
- package/src/services/list-service.spec.ts +170 -172
- 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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
127
|
-
|
|
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
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
|
|
183
|
-
|
|
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
|
-
|
|
192
|
-
|
|
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
|
-
|
|
201
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
224
|
-
|
|
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
|
|
234
|
-
|
|
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
|
-
|
|
223
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
|
|
239
224
|
|
|
240
|
-
|
|
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
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
236
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
|
|
252
237
|
|
|
253
|
-
|
|
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
|
|
259
|
-
|
|
244
|
+
using(service, () => {
|
|
245
|
+
service.hasFocus.setValue(true)
|
|
246
|
+
service.focusedItem.setValue(rootItems[1])
|
|
260
247
|
|
|
261
|
-
|
|
248
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
|
|
262
249
|
|
|
263
|
-
|
|
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
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
261
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
|
|
277
262
|
|
|
278
|
-
|
|
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
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
|
|
274
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
|
|
290
275
|
|
|
291
|
-
|
|
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
|
|
297
|
-
|
|
282
|
+
using(service, () => {
|
|
283
|
+
service.hasFocus.setValue(true)
|
|
284
|
+
service.focusedItem.setValue(rootItems[1])
|
|
298
285
|
|
|
299
|
-
|
|
286
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowLeft' }))
|
|
300
287
|
|
|
301
|
-
|
|
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
|
|
309
|
-
|
|
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
|
-
|
|
298
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowRight' }))
|
|
314
299
|
|
|
315
|
-
|
|
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
|
|
323
|
-
|
|
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
|
-
|
|
312
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowDown' }))
|
|
328
313
|
|
|
329
|
-
|
|
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
|
|
335
|
-
|
|
320
|
+
using(service, () => {
|
|
321
|
+
service.hasFocus.setValue(true)
|
|
322
|
+
service.focusedItem.setValue(rootItems[1])
|
|
336
323
|
|
|
337
|
-
|
|
324
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'ArrowUp' }))
|
|
338
325
|
|
|
339
|
-
|
|
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
|
|
347
|
-
|
|
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
|
-
|
|
336
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'Home' }))
|
|
352
337
|
|
|
353
|
-
|
|
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
|
|
359
|
-
|
|
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
|
-
|
|
348
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'End' }))
|
|
364
349
|
|
|
365
|
-
|
|
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
|
|
371
|
-
|
|
356
|
+
using(service, () => {
|
|
357
|
+
service.hasFocus.setValue(true)
|
|
358
|
+
service.focusedItem.setValue(rootItems[0])
|
|
372
359
|
|
|
373
|
-
|
|
374
|
-
|
|
360
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: ' ' }))
|
|
361
|
+
expect(service.selection.getValue()).toContain(rootItems[0])
|
|
375
362
|
|
|
376
|
-
|
|
377
|
-
|
|
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
|
|
385
|
-
|
|
386
|
-
|
|
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
|
-
|
|
391
|
-
expect(service.searchTerm.getValue()).toBe('')
|
|
375
|
+
service.handleKeyDown(new KeyboardEvent('keydown', { key: 'Escape' }))
|
|
392
376
|
|
|
393
|
-
|
|
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
|
-
|
|
402
|
-
|
|
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
|
-
|
|
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
|
|