@osdk/react-components 0.1.0-beta.1 → 0.1.0-beta.2

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 (116) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/build/browser/object-table/CellContextMenu.js +48 -0
  3. package/build/browser/object-table/CellContextMenu.js.map +1 -0
  4. package/build/browser/object-table/ObjectTable.js +53 -9
  5. package/build/browser/object-table/ObjectTable.js.map +1 -1
  6. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  7. package/build/browser/object-table/SelectionCells.js +67 -0
  8. package/build/browser/object-table/SelectionCells.js.map +1 -0
  9. package/build/browser/object-table/Table.js +8 -4
  10. package/build/browser/object-table/Table.js.map +1 -1
  11. package/build/browser/object-table/TableBody.js +3 -1
  12. package/build/browser/object-table/TableBody.js.map +1 -1
  13. package/build/browser/object-table/TableCell.js +51 -0
  14. package/build/browser/object-table/TableCell.js.map +1 -0
  15. package/build/browser/object-table/TableHeader.js +20 -4
  16. package/build/browser/object-table/TableHeader.js.map +1 -1
  17. package/build/browser/object-table/TableRow.js +7 -9
  18. package/build/browser/object-table/TableRow.js.map +1 -1
  19. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +147 -0
  20. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +1 -0
  21. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +12 -0
  22. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +1 -1
  23. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +548 -0
  24. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +1 -0
  25. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +274 -0
  26. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -0
  27. package/build/browser/object-table/hooks/useCellContextMenu.js +48 -0
  28. package/build/browser/object-table/hooks/useCellContextMenu.js.map +1 -0
  29. package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
  30. package/build/browser/object-table/hooks/useObjectTableData.js +3 -2
  31. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  32. package/build/browser/object-table/hooks/useRowSelection.js +180 -0
  33. package/build/browser/object-table/hooks/useRowSelection.js.map +1 -0
  34. package/build/browser/object-table/hooks/useSelectionColumn.js +51 -0
  35. package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -0
  36. package/build/browser/object-table/utils/getRowId.js +21 -0
  37. package/build/browser/object-table/utils/getRowId.js.map +1 -0
  38. package/build/browser/public/experimental.js +1 -0
  39. package/build/browser/public/experimental.js.map +1 -1
  40. package/build/cjs/public/experimental.cjs +406 -30
  41. package/build/cjs/public/experimental.cjs.map +1 -1
  42. package/build/cjs/public/experimental.d.cts +6 -11
  43. package/build/esm/object-table/CellContextMenu.js +48 -0
  44. package/build/esm/object-table/CellContextMenu.js.map +1 -0
  45. package/build/esm/object-table/ObjectTable.js +53 -9
  46. package/build/esm/object-table/ObjectTable.js.map +1 -1
  47. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  48. package/build/esm/object-table/SelectionCells.js +67 -0
  49. package/build/esm/object-table/SelectionCells.js.map +1 -0
  50. package/build/esm/object-table/Table.js +8 -4
  51. package/build/esm/object-table/Table.js.map +1 -1
  52. package/build/esm/object-table/TableBody.js +3 -1
  53. package/build/esm/object-table/TableBody.js.map +1 -1
  54. package/build/esm/object-table/TableCell.js +51 -0
  55. package/build/esm/object-table/TableCell.js.map +1 -0
  56. package/build/esm/object-table/TableHeader.js +20 -4
  57. package/build/esm/object-table/TableHeader.js.map +1 -1
  58. package/build/esm/object-table/TableRow.js +7 -9
  59. package/build/esm/object-table/TableRow.js.map +1 -1
  60. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +147 -0
  61. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +1 -0
  62. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +12 -0
  63. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +1 -1
  64. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +548 -0
  65. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +1 -0
  66. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +274 -0
  67. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -0
  68. package/build/esm/object-table/hooks/useCellContextMenu.js +48 -0
  69. package/build/esm/object-table/hooks/useCellContextMenu.js.map +1 -0
  70. package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
  71. package/build/esm/object-table/hooks/useObjectTableData.js +3 -2
  72. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  73. package/build/esm/object-table/hooks/useRowSelection.js +180 -0
  74. package/build/esm/object-table/hooks/useRowSelection.js.map +1 -0
  75. package/build/esm/object-table/hooks/useSelectionColumn.js +51 -0
  76. package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -0
  77. package/build/esm/object-table/utils/getRowId.js +21 -0
  78. package/build/esm/object-table/utils/getRowId.js.map +1 -0
  79. package/build/esm/public/experimental.js +1 -0
  80. package/build/esm/public/experimental.js.map +1 -1
  81. package/build/types/object-table/CellContextMenu.d.ts +11 -0
  82. package/build/types/object-table/CellContextMenu.d.ts.map +1 -0
  83. package/build/types/object-table/ObjectTable.d.ts +1 -1
  84. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  85. package/build/types/object-table/ObjectTableApi.d.ts +5 -10
  86. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  87. package/build/types/object-table/SelectionCells.d.ts +14 -0
  88. package/build/types/object-table/SelectionCells.d.ts.map +1 -0
  89. package/build/types/object-table/Table.d.ts +4 -3
  90. package/build/types/object-table/Table.d.ts.map +1 -1
  91. package/build/types/object-table/TableBody.d.ts +3 -2
  92. package/build/types/object-table/TableBody.d.ts.map +1 -1
  93. package/build/types/object-table/TableCell.d.ts +8 -0
  94. package/build/types/object-table/TableCell.d.ts.map +1 -0
  95. package/build/types/object-table/TableHeader.d.ts +3 -3
  96. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  97. package/build/types/object-table/TableRow.d.ts +3 -2
  98. package/build/types/object-table/TableRow.d.ts.map +1 -1
  99. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +1 -0
  100. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +1 -0
  101. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +1 -0
  102. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +1 -0
  103. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +1 -0
  104. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +1 -0
  105. package/build/types/object-table/hooks/useCellContextMenu.d.ts +17 -0
  106. package/build/types/object-table/hooks/useCellContextMenu.d.ts.map +1 -0
  107. package/build/types/object-table/hooks/useObjectTableData.d.ts +2 -2
  108. package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
  109. package/build/types/object-table/hooks/useRowSelection.d.ts +22 -0
  110. package/build/types/object-table/hooks/useRowSelection.d.ts.map +1 -0
  111. package/build/types/object-table/hooks/useSelectionColumn.d.ts +15 -0
  112. package/build/types/object-table/hooks/useSelectionColumn.d.ts.map +1 -0
  113. package/build/types/object-table/utils/getRowId.d.ts +6 -0
  114. package/build/types/object-table/utils/getRowId.d.ts.map +1 -0
  115. package/build/types/public/experimental.d.ts.map +1 -1
  116. package/package.json +6 -4
@@ -0,0 +1,548 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { act, renderHook } from "@testing-library/react";
18
+ import { describe, expect, it, vi } from "vitest";
19
+ import { useRowSelection } from "../useRowSelection.js";
20
+ const TestObjectType = {
21
+ type: "object",
22
+ apiName: "TestObject"
23
+ };
24
+ // Helper to create mock data
25
+ function createMockData(count) {
26
+ return Array.from({
27
+ length: count
28
+ }, (_, i) => ({
29
+ $primaryKey: `item-${i}`,
30
+ $objectType: "TestObject",
31
+ $apiName: "TestObject",
32
+ $title: `Item ${i}`
33
+ }));
34
+ }
35
+ describe("useRowSelection", () => {
36
+ describe("disabled mode (selectionMode: 'none')", () => {
37
+ it("returns empty selection state", () => {
38
+ const data = createMockData(5);
39
+ const {
40
+ result
41
+ } = renderHook(() => useRowSelection({
42
+ selectionMode: "none",
43
+ data
44
+ }));
45
+ expect(result.current.rowSelection).toEqual({});
46
+ expect(result.current.isAllSelected).toBe(false);
47
+ expect(result.current.hasSelection).toBe(false);
48
+ });
49
+ it("does not respond to toggle operations", () => {
50
+ const data = createMockData(5);
51
+ const {
52
+ result
53
+ } = renderHook(() => useRowSelection({
54
+ selectionMode: "none",
55
+ data
56
+ }));
57
+ act(() => {
58
+ result.current.onToggleRow("item-0", 0);
59
+ });
60
+ expect(result.current.rowSelection).toEqual({});
61
+ expect(result.current.hasSelection).toBe(false);
62
+ act(() => {
63
+ result.current.onToggleAll();
64
+ });
65
+ expect(result.current.rowSelection).toEqual({});
66
+ expect(result.current.hasSelection).toBe(false);
67
+ });
68
+ });
69
+ describe("uncontrolled mode", () => {
70
+ describe("single selection mode", () => {
71
+ it("selects a single row and calls onRowSelection", () => {
72
+ const data = createMockData(5);
73
+ const onRowSelection = vi.fn();
74
+ const {
75
+ result
76
+ } = renderHook(() => useRowSelection({
77
+ selectionMode: "single",
78
+ onRowSelection,
79
+ data
80
+ }));
81
+ act(() => {
82
+ result.current.onToggleRow("item-0", 0);
83
+ });
84
+ expect(result.current.rowSelection).toEqual({
85
+ "item-0": true
86
+ });
87
+ expect(result.current.hasSelection).toBe(true);
88
+ expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey]);
89
+ });
90
+ it("deselects when toggling selected row and calls onRowSelection", () => {
91
+ const data = createMockData(5);
92
+ const onRowSelection = vi.fn();
93
+ const {
94
+ result
95
+ } = renderHook(() => useRowSelection({
96
+ selectionMode: "single",
97
+ onRowSelection,
98
+ data
99
+ }));
100
+
101
+ // Select
102
+ act(() => {
103
+ result.current.onToggleRow("item-0", 0);
104
+ });
105
+ expect(result.current.rowSelection).toEqual({
106
+ "item-0": true
107
+ });
108
+
109
+ // Deselect
110
+ act(() => {
111
+ result.current.onToggleRow("item-0", 0);
112
+ });
113
+ expect(result.current.rowSelection).toEqual({});
114
+ expect(result.current.hasSelection).toBe(false);
115
+ expect(onRowSelection).toHaveBeenLastCalledWith([]);
116
+ });
117
+ it("replaces selection when selecting different row", () => {
118
+ const data = createMockData(5);
119
+ const {
120
+ result
121
+ } = renderHook(() => useRowSelection({
122
+ selectionMode: "single",
123
+ data
124
+ }));
125
+ act(() => {
126
+ result.current.onToggleRow("item-0", 0);
127
+ });
128
+ expect(result.current.rowSelection).toEqual({
129
+ "item-0": true
130
+ });
131
+ act(() => {
132
+ result.current.onToggleRow("item-1", 1);
133
+ });
134
+ expect(result.current.rowSelection).toEqual({
135
+ "item-1": true
136
+ });
137
+ expect(result.current.hasSelection).toBe(true);
138
+ });
139
+ it("treats shift-click as a normal click", () => {
140
+ const data = createMockData(5);
141
+ const {
142
+ result
143
+ } = renderHook(() => useRowSelection({
144
+ selectionMode: "single",
145
+ data
146
+ }));
147
+ // First click as the lastSelectedRow
148
+ act(() => {
149
+ result.current.onToggleRow("item-0", 0);
150
+ });
151
+
152
+ // Shift-click
153
+ act(() => {
154
+ result.current.onToggleRow("item-2", 2, true);
155
+ });
156
+ expect(result.current.rowSelection).toEqual({
157
+ "item-2": true
158
+ });
159
+ });
160
+ });
161
+ describe("multiple selection mode", () => {
162
+ it("selects multiple rows independently and calls onRowSelection", () => {
163
+ const data = createMockData(5);
164
+ const onRowSelection = vi.fn();
165
+ const {
166
+ result
167
+ } = renderHook(() => useRowSelection({
168
+ selectionMode: "multiple",
169
+ onRowSelection,
170
+ data
171
+ }));
172
+ act(() => {
173
+ result.current.onToggleRow("item-0", 0);
174
+ });
175
+ expect(result.current.rowSelection).toEqual({
176
+ "item-0": true
177
+ });
178
+ act(() => {
179
+ result.current.onToggleRow("item-2", 2);
180
+ });
181
+ expect(result.current.rowSelection).toEqual({
182
+ "item-0": true,
183
+ "item-2": true
184
+ });
185
+ expect(result.current.isAllSelected).toBe(false);
186
+ expect(onRowSelection).toHaveBeenLastCalledWith([data[0].$primaryKey, data[2].$primaryKey]);
187
+ });
188
+ it("deselects individual rows", () => {
189
+ const data = createMockData(5);
190
+ const {
191
+ result
192
+ } = renderHook(() => useRowSelection({
193
+ selectionMode: "multiple",
194
+ data
195
+ }));
196
+
197
+ // Select two rows
198
+ act(() => {
199
+ result.current.onToggleRow("item-0", 0);
200
+ });
201
+ act(() => {
202
+ result.current.onToggleRow("item-1", 1);
203
+ });
204
+ expect(result.current.rowSelection).toEqual({
205
+ "item-0": true,
206
+ "item-1": true
207
+ });
208
+
209
+ // Deselect one
210
+ act(() => {
211
+ result.current.onToggleRow("item-0", 0);
212
+ });
213
+ expect(result.current.rowSelection).toEqual({
214
+ "item-1": true
215
+ });
216
+ });
217
+ it("selects range with shift-click and calls onRowSelection", () => {
218
+ const data = createMockData(5);
219
+ const onRowSelection = vi.fn();
220
+ const {
221
+ result
222
+ } = renderHook(() => useRowSelection({
223
+ selectionMode: "multiple",
224
+ onRowSelection,
225
+ data
226
+ }));
227
+
228
+ // First click
229
+ act(() => {
230
+ result.current.onToggleRow("item-1", 1);
231
+ });
232
+
233
+ // Shift-click to select range
234
+ act(() => {
235
+ result.current.onToggleRow("item-3", 3, true);
236
+ });
237
+ expect(result.current.rowSelection).toEqual({
238
+ "item-1": true,
239
+ "item-2": true,
240
+ "item-3": true
241
+ });
242
+ expect(onRowSelection).toHaveBeenLastCalledWith([data[1].$primaryKey, data[2].$primaryKey, data[3].$primaryKey]);
243
+ });
244
+ it("selects range in reverse order (shift-click up)", () => {
245
+ const data = createMockData(5);
246
+ const {
247
+ result
248
+ } = renderHook(() => useRowSelection({
249
+ selectionMode: "multiple",
250
+ data
251
+ }));
252
+
253
+ // First click on row 3
254
+ act(() => {
255
+ result.current.onToggleRow("item-3", 3);
256
+ });
257
+
258
+ // Shift-click to row 1 (upward)
259
+ act(() => {
260
+ result.current.onToggleRow("item-1", 1, true);
261
+ });
262
+ expect(result.current.rowSelection).toEqual({
263
+ "item-1": true,
264
+ "item-2": true,
265
+ "item-3": true
266
+ });
267
+ });
268
+ it("shift-click without previous selection does not select range", () => {
269
+ const data = createMockData(5);
270
+ const {
271
+ result
272
+ } = renderHook(() => useRowSelection({
273
+ selectionMode: "multiple",
274
+ data
275
+ }));
276
+
277
+ // Shift-click without previous selection
278
+ act(() => {
279
+ result.current.onToggleRow("item-2", 2, true);
280
+ });
281
+ expect(result.current.rowSelection).toEqual({
282
+ "item-2": true
283
+ });
284
+ });
285
+ it("merges range selection with existing selections", () => {
286
+ const data = createMockData(10);
287
+ const {
288
+ result
289
+ } = renderHook(() => useRowSelection({
290
+ selectionMode: "multiple",
291
+ data
292
+ }));
293
+
294
+ // Select row 0
295
+ act(() => {
296
+ result.current.onToggleRow("item-0", 0);
297
+ });
298
+
299
+ // Select row 5
300
+ act(() => {
301
+ result.current.onToggleRow("item-5", 5);
302
+ });
303
+
304
+ // Shift-click to row 7 (should keep row 0)
305
+ act(() => {
306
+ result.current.onToggleRow("item-7", 7, true);
307
+ });
308
+ expect(result.current.rowSelection).toEqual({
309
+ "item-0": true,
310
+ "item-5": true,
311
+ "item-6": true,
312
+ "item-7": true
313
+ });
314
+ });
315
+ it("toggles all rows", () => {
316
+ const data = createMockData(3);
317
+ const onRowSelection = vi.fn();
318
+ const {
319
+ result
320
+ } = renderHook(() => useRowSelection({
321
+ selectionMode: "multiple",
322
+ onRowSelection,
323
+ data
324
+ }));
325
+ expect(result.current.isAllSelected).toBe(false);
326
+
327
+ // Select all
328
+ act(() => {
329
+ result.current.onToggleAll();
330
+ });
331
+ expect(result.current.rowSelection).toEqual({
332
+ "item-0": true,
333
+ "item-1": true,
334
+ "item-2": true
335
+ });
336
+ expect(result.current.isAllSelected).toBe(true);
337
+ expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey, data[1].$primaryKey, data[2].$primaryKey]);
338
+
339
+ // Deselect all
340
+ act(() => {
341
+ result.current.onToggleAll();
342
+ });
343
+ expect(result.current.rowSelection).toEqual({});
344
+ expect(result.current.isAllSelected).toBe(false);
345
+ expect(onRowSelection).toHaveBeenLastCalledWith([]);
346
+ });
347
+ });
348
+ });
349
+ describe("controlled mode", () => {
350
+ describe("single selection mode", () => {
351
+ it("uses selectedRows prop for selection state", () => {
352
+ const data = createMockData(5);
353
+ const {
354
+ result
355
+ } = renderHook(() => useRowSelection({
356
+ selectionMode: "single",
357
+ selectedRows: [data[1].$primaryKey],
358
+ data
359
+ }));
360
+ expect(result.current.rowSelection).toEqual({
361
+ "item-1": true
362
+ });
363
+ expect(result.current.hasSelection).toBe(true);
364
+ });
365
+ it("calls onRowSelection when toggling but does not update internal state", () => {
366
+ const data = createMockData(5);
367
+ const onRowSelection = vi.fn();
368
+ const {
369
+ result,
370
+ rerender
371
+ } = renderHook(({
372
+ selectedRows
373
+ }) => useRowSelection({
374
+ selectionMode: "single",
375
+ selectedRows,
376
+ onRowSelection,
377
+ data
378
+ }), {
379
+ initialProps: {
380
+ selectedRows: []
381
+ }
382
+ });
383
+ expect(result.current.rowSelection).toEqual({});
384
+
385
+ // Click row
386
+ act(() => {
387
+ result.current.onToggleRow("item-0", 0);
388
+ });
389
+
390
+ // Callback is called
391
+ expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey]);
392
+
393
+ // State doesn't change (controlled)
394
+ expect(result.current.rowSelection).toEqual({});
395
+
396
+ // Parent updates prop
397
+ rerender({
398
+ selectedRows: [data[0].$primaryKey]
399
+ });
400
+
401
+ // Now state reflects the prop
402
+ expect(result.current.rowSelection).toEqual({
403
+ "item-0": true
404
+ });
405
+ });
406
+ });
407
+ describe("multiple selection mode", () => {
408
+ it("uses selectedRows prop for selection state", () => {
409
+ const data = createMockData(5);
410
+ const {
411
+ result
412
+ } = renderHook(() => useRowSelection({
413
+ selectionMode: "multiple",
414
+ selectedRows: [data[0].$primaryKey, data[2].$primaryKey],
415
+ data
416
+ }));
417
+ expect(result.current.rowSelection).toEqual({
418
+ "item-0": true,
419
+ "item-2": true
420
+ });
421
+ });
422
+ it("calls onRowSelection when toggling rows", () => {
423
+ const data = createMockData(5);
424
+ const onRowSelection = vi.fn();
425
+ const {
426
+ result
427
+ } = renderHook(() => useRowSelection({
428
+ selectionMode: "multiple",
429
+ selectedRows: [data[0].$primaryKey],
430
+ onRowSelection,
431
+ data
432
+ }));
433
+
434
+ // Add selection to selectedRows
435
+ act(() => {
436
+ result.current.onToggleRow("item-2", 2);
437
+ });
438
+ expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey, data[2].$primaryKey]);
439
+
440
+ // Remove selection from selectedRows
441
+ act(() => {
442
+ result.current.onToggleRow("item-0", 0);
443
+ });
444
+ expect(onRowSelection).toHaveBeenCalledWith([]);
445
+ });
446
+ it("calls onRowSelection for shift-click range selection", () => {
447
+ const data = createMockData(5);
448
+ const onRowSelection = vi.fn();
449
+ const {
450
+ result
451
+ } = renderHook(() => useRowSelection({
452
+ selectionMode: "multiple",
453
+ selectedRows: [],
454
+ onRowSelection,
455
+ data
456
+ }));
457
+
458
+ // First click
459
+ act(() => {
460
+ result.current.onToggleRow("item-1", 1);
461
+ });
462
+
463
+ // Shift-click
464
+ act(() => {
465
+ result.current.onToggleRow("item-3", 3, true);
466
+ });
467
+ expect(onRowSelection).toHaveBeenLastCalledWith([data[1].$primaryKey, data[2].$primaryKey, data[3].$primaryKey]);
468
+ });
469
+ it("calls onRowSelection when toggling all rows", () => {
470
+ const data = createMockData(3);
471
+ const onRowSelection = vi.fn();
472
+ const {
473
+ result
474
+ } = renderHook(() => useRowSelection({
475
+ selectionMode: "multiple",
476
+ selectedRows: [],
477
+ onRowSelection,
478
+ data
479
+ }));
480
+ act(() => {
481
+ result.current.onToggleAll();
482
+ });
483
+ expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey, data[1].$primaryKey, data[2].$primaryKey]);
484
+ });
485
+ it("updates when selectedRows prop changes", () => {
486
+ const data = createMockData(5);
487
+ const {
488
+ result,
489
+ rerender
490
+ } = renderHook(({
491
+ selectedRows
492
+ }) => useRowSelection({
493
+ selectionMode: "multiple",
494
+ selectedRows,
495
+ data
496
+ }), {
497
+ initialProps: {
498
+ selectedRows: [data[0].$primaryKey]
499
+ }
500
+ });
501
+ expect(result.current.rowSelection).toEqual({
502
+ "item-0": true
503
+ });
504
+ rerender({
505
+ selectedRows: [data[1].$primaryKey, data[2].$primaryKey]
506
+ });
507
+ expect(result.current.rowSelection).toEqual({
508
+ "item-1": true,
509
+ "item-2": true
510
+ });
511
+ });
512
+ });
513
+ });
514
+ describe("edge cases", () => {
515
+ it("handles undefined data gracefully", () => {
516
+ const {
517
+ result
518
+ } = renderHook(() => useRowSelection({
519
+ selectionMode: "multiple",
520
+ data: undefined
521
+ }));
522
+ expect(result.current.rowSelection).toEqual({});
523
+ expect(result.current.isAllSelected).toBe(false);
524
+ expect(result.current.hasSelection).toBe(false);
525
+
526
+ // Should not crash
527
+ act(() => {
528
+ result.current.onToggleAll();
529
+ result.current.onToggleRow("item-0", 0);
530
+ });
531
+ });
532
+ it("handles empty data array", () => {
533
+ const {
534
+ result
535
+ } = renderHook(() => useRowSelection({
536
+ selectionMode: "multiple",
537
+ data: []
538
+ }));
539
+ expect(result.current.rowSelection).toEqual({});
540
+ expect(result.current.isAllSelected).toBe(false);
541
+ act(() => {
542
+ result.current.onToggleAll();
543
+ });
544
+ expect(result.current.rowSelection).toEqual({});
545
+ });
546
+ });
547
+ });
548
+ //# sourceMappingURL=useRowSelection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRowSelection.test.js","names":["act","renderHook","describe","expect","it","vi","useRowSelection","TestObjectType","type","apiName","createMockData","count","Array","from","length","_","i","$primaryKey","$objectType","$apiName","$title","data","result","selectionMode","current","rowSelection","toEqual","isAllSelected","toBe","hasSelection","onToggleRow","onToggleAll","onRowSelection","fn","toHaveBeenCalledWith","toHaveBeenLastCalledWith","selectedRows","rerender","initialProps","undefined"],"sources":["useRowSelection.test.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, Osdk, PrimaryKeyType } from \"@osdk/api\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { useRowSelection } from \"../useRowSelection.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\n\n// Helper to create mock data\nfunction createMockData(\n count: number,\n): Array<\n Osdk.Instance<TestObject, \"$allBaseProperties\", never, Record<string, never>>\n> {\n return Array.from({ length: count }, (_, i) => ({\n $primaryKey: `item-${i}` as PrimaryKeyType<TestObject>,\n $objectType: \"TestObject\",\n $apiName: \"TestObject\",\n $title: `Item ${i}`,\n } as Osdk.Instance<\n TestObject,\n \"$allBaseProperties\",\n never,\n Record<string, never>\n >));\n}\n\ndescribe(\"useRowSelection\", () => {\n describe(\"disabled mode (selectionMode: 'none')\", () => {\n it(\"returns empty selection state\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"none\",\n data,\n })\n );\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.isAllSelected).toBe(false);\n expect(result.current.hasSelection).toBe(false);\n });\n\n it(\"does not respond to toggle operations\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"none\",\n data,\n })\n );\n\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.hasSelection).toBe(false);\n\n act(() => {\n result.current.onToggleAll();\n });\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.hasSelection).toBe(false);\n });\n });\n\n describe(\"uncontrolled mode\", () => {\n describe(\"single selection mode\", () => {\n it(\"selects a single row and calls onRowSelection\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"single\",\n onRowSelection,\n data,\n })\n );\n\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-0\": true });\n expect(result.current.hasSelection).toBe(true);\n expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey]);\n });\n\n it(\"deselects when toggling selected row and calls onRowSelection\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"single\",\n onRowSelection,\n data,\n })\n );\n\n // Select\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-0\": true });\n\n // Deselect\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.hasSelection).toBe(false);\n expect(onRowSelection).toHaveBeenLastCalledWith([]);\n });\n\n it(\"replaces selection when selecting different row\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"single\",\n data,\n })\n );\n\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-0\": true });\n\n act(() => {\n result.current.onToggleRow(\"item-1\", 1);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-1\": true });\n expect(result.current.hasSelection).toBe(true);\n });\n\n it(\"treats shift-click as a normal click\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"single\",\n data,\n })\n );\n // First click as the lastSelectedRow\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n // Shift-click\n act(() => {\n result.current.onToggleRow(\"item-2\", 2, true);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-2\": true });\n });\n });\n\n describe(\"multiple selection mode\", () => {\n it(\"selects multiple rows independently and calls onRowSelection\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n onRowSelection,\n data,\n })\n );\n\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-0\": true });\n\n act(() => {\n result.current.onToggleRow(\"item-2\", 2);\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-0\": true,\n \"item-2\": true,\n });\n expect(result.current.isAllSelected).toBe(false);\n expect(onRowSelection).toHaveBeenLastCalledWith([\n data[0].$primaryKey,\n data[2].$primaryKey,\n ]);\n });\n\n it(\"deselects individual rows\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n data,\n })\n );\n\n // Select two rows\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n act(() => {\n result.current.onToggleRow(\"item-1\", 1);\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-0\": true,\n \"item-1\": true,\n });\n\n // Deselect one\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-1\": true });\n });\n\n it(\"selects range with shift-click and calls onRowSelection\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n onRowSelection,\n data,\n })\n );\n\n // First click\n act(() => {\n result.current.onToggleRow(\"item-1\", 1);\n });\n\n // Shift-click to select range\n act(() => {\n result.current.onToggleRow(\"item-3\", 3, true);\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-1\": true,\n \"item-2\": true,\n \"item-3\": true,\n });\n expect(onRowSelection).toHaveBeenLastCalledWith([\n data[1].$primaryKey,\n data[2].$primaryKey,\n data[3].$primaryKey,\n ]);\n });\n\n it(\"selects range in reverse order (shift-click up)\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n data,\n })\n );\n\n // First click on row 3\n act(() => {\n result.current.onToggleRow(\"item-3\", 3);\n });\n\n // Shift-click to row 1 (upward)\n act(() => {\n result.current.onToggleRow(\"item-1\", 1, true);\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-1\": true,\n \"item-2\": true,\n \"item-3\": true,\n });\n });\n\n it(\"shift-click without previous selection does not select range\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n data,\n })\n );\n\n // Shift-click without previous selection\n act(() => {\n result.current.onToggleRow(\"item-2\", 2, true);\n });\n\n expect(result.current.rowSelection).toEqual({ \"item-2\": true });\n });\n\n it(\"merges range selection with existing selections\", () => {\n const data = createMockData(10);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n data,\n })\n );\n\n // Select row 0\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n // Select row 5\n act(() => {\n result.current.onToggleRow(\"item-5\", 5);\n });\n\n // Shift-click to row 7 (should keep row 0)\n act(() => {\n result.current.onToggleRow(\"item-7\", 7, true);\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-0\": true,\n \"item-5\": true,\n \"item-6\": true,\n \"item-7\": true,\n });\n });\n\n it(\"toggles all rows\", () => {\n const data = createMockData(3);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n onRowSelection,\n data,\n })\n );\n\n expect(result.current.isAllSelected).toBe(false);\n\n // Select all\n act(() => {\n result.current.onToggleAll();\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-0\": true,\n \"item-1\": true,\n \"item-2\": true,\n });\n expect(result.current.isAllSelected).toBe(true);\n expect(onRowSelection).toHaveBeenCalledWith([\n data[0].$primaryKey,\n data[1].$primaryKey,\n data[2].$primaryKey,\n ]);\n\n // Deselect all\n act(() => {\n result.current.onToggleAll();\n });\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.isAllSelected).toBe(false);\n expect(onRowSelection).toHaveBeenLastCalledWith([]);\n });\n });\n });\n\n describe(\"controlled mode\", () => {\n describe(\"single selection mode\", () => {\n it(\"uses selectedRows prop for selection state\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"single\",\n selectedRows: [data[1].$primaryKey],\n data,\n })\n );\n\n expect(result.current.rowSelection).toEqual({ \"item-1\": true });\n expect(result.current.hasSelection).toBe(true);\n });\n\n it(\"calls onRowSelection when toggling but does not update internal state\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result, rerender } = renderHook(\n ({ selectedRows }) =>\n useRowSelection({\n selectionMode: \"single\",\n selectedRows,\n onRowSelection,\n data,\n }),\n {\n initialProps: { selectedRows: [] as PrimaryKeyType<TestObject>[] },\n },\n );\n\n expect(result.current.rowSelection).toEqual({});\n\n // Click row\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n // Callback is called\n expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey]);\n\n // State doesn't change (controlled)\n expect(result.current.rowSelection).toEqual({});\n\n // Parent updates prop\n rerender({ selectedRows: [data[0].$primaryKey] });\n\n // Now state reflects the prop\n expect(result.current.rowSelection).toEqual({ \"item-0\": true });\n });\n });\n\n describe(\"multiple selection mode\", () => {\n it(\"uses selectedRows prop for selection state\", () => {\n const data = createMockData(5);\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n selectedRows: [data[0].$primaryKey, data[2].$primaryKey],\n data,\n })\n );\n\n expect(result.current.rowSelection).toEqual({\n \"item-0\": true,\n \"item-2\": true,\n });\n });\n\n it(\"calls onRowSelection when toggling rows\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n selectedRows: [data[0].$primaryKey],\n onRowSelection,\n data,\n })\n );\n\n // Add selection to selectedRows\n act(() => {\n result.current.onToggleRow(\"item-2\", 2);\n });\n\n expect(onRowSelection).toHaveBeenCalledWith([\n data[0].$primaryKey,\n data[2].$primaryKey,\n ]);\n\n // Remove selection from selectedRows\n act(() => {\n result.current.onToggleRow(\"item-0\", 0);\n });\n\n expect(onRowSelection).toHaveBeenCalledWith([]);\n });\n\n it(\"calls onRowSelection for shift-click range selection\", () => {\n const data = createMockData(5);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n selectedRows: [],\n onRowSelection,\n data,\n })\n );\n\n // First click\n act(() => {\n result.current.onToggleRow(\"item-1\", 1);\n });\n\n // Shift-click\n act(() => {\n result.current.onToggleRow(\"item-3\", 3, true);\n });\n\n expect(onRowSelection).toHaveBeenLastCalledWith([\n data[1].$primaryKey,\n data[2].$primaryKey,\n data[3].$primaryKey,\n ]);\n });\n\n it(\"calls onRowSelection when toggling all rows\", () => {\n const data = createMockData(3);\n const onRowSelection = vi.fn();\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n selectedRows: [],\n onRowSelection,\n data,\n })\n );\n\n act(() => {\n result.current.onToggleAll();\n });\n\n expect(onRowSelection).toHaveBeenCalledWith([\n data[0].$primaryKey,\n data[1].$primaryKey,\n data[2].$primaryKey,\n ]);\n });\n\n it(\"updates when selectedRows prop changes\", () => {\n const data = createMockData(5);\n const { result, rerender } = renderHook(\n ({ selectedRows }) =>\n useRowSelection({\n selectionMode: \"multiple\",\n selectedRows,\n data,\n }),\n {\n initialProps: {\n selectedRows: [data[0].$primaryKey] as PrimaryKeyType<\n TestObject\n >[],\n },\n },\n );\n\n expect(result.current.rowSelection).toEqual({ \"item-0\": true });\n\n rerender({\n selectedRows: [data[1].$primaryKey, data[2].$primaryKey],\n });\n\n expect(result.current.rowSelection).toEqual({\n \"item-1\": true,\n \"item-2\": true,\n });\n });\n });\n });\n describe(\"edge cases\", () => {\n it(\"handles undefined data gracefully\", () => {\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n data: undefined,\n })\n );\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.isAllSelected).toBe(false);\n expect(result.current.hasSelection).toBe(false);\n\n // Should not crash\n act(() => {\n result.current.onToggleAll();\n result.current.onToggleRow(\"item-0\", 0);\n });\n });\n\n it(\"handles empty data array\", () => {\n const { result } = renderHook(() =>\n useRowSelection({\n selectionMode: \"multiple\",\n data: [],\n })\n );\n\n expect(result.current.rowSelection).toEqual({});\n expect(result.current.isAllSelected).toBe(false);\n\n act(() => {\n result.current.onToggleAll();\n });\n\n expect(result.current.rowSelection).toEqual({});\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}