@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.
- package/CHANGELOG.md +15 -0
- package/build/browser/object-table/CellContextMenu.js +48 -0
- package/build/browser/object-table/CellContextMenu.js.map +1 -0
- package/build/browser/object-table/ObjectTable.js +53 -9
- package/build/browser/object-table/ObjectTable.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/SelectionCells.js +67 -0
- package/build/browser/object-table/SelectionCells.js.map +1 -0
- package/build/browser/object-table/Table.js +8 -4
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/TableBody.js +3 -1
- package/build/browser/object-table/TableBody.js.map +1 -1
- package/build/browser/object-table/TableCell.js +51 -0
- package/build/browser/object-table/TableCell.js.map +1 -0
- package/build/browser/object-table/TableHeader.js +20 -4
- package/build/browser/object-table/TableHeader.js.map +1 -1
- package/build/browser/object-table/TableRow.js +7 -9
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +147 -0
- package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +1 -0
- package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +12 -0
- package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +1 -1
- package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +548 -0
- package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +1 -0
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +274 -0
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -0
- package/build/browser/object-table/hooks/useCellContextMenu.js +48 -0
- package/build/browser/object-table/hooks/useCellContextMenu.js.map +1 -0
- package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/browser/object-table/hooks/useObjectTableData.js +3 -2
- package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/browser/object-table/hooks/useRowSelection.js +180 -0
- package/build/browser/object-table/hooks/useRowSelection.js.map +1 -0
- package/build/browser/object-table/hooks/useSelectionColumn.js +51 -0
- package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -0
- package/build/browser/object-table/utils/getRowId.js +21 -0
- package/build/browser/object-table/utils/getRowId.js.map +1 -0
- package/build/browser/public/experimental.js +1 -0
- package/build/browser/public/experimental.js.map +1 -1
- package/build/cjs/public/experimental.cjs +406 -30
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.d.cts +6 -11
- package/build/esm/object-table/CellContextMenu.js +48 -0
- package/build/esm/object-table/CellContextMenu.js.map +1 -0
- package/build/esm/object-table/ObjectTable.js +53 -9
- package/build/esm/object-table/ObjectTable.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/SelectionCells.js +67 -0
- package/build/esm/object-table/SelectionCells.js.map +1 -0
- package/build/esm/object-table/Table.js +8 -4
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/TableBody.js +3 -1
- package/build/esm/object-table/TableBody.js.map +1 -1
- package/build/esm/object-table/TableCell.js +51 -0
- package/build/esm/object-table/TableCell.js.map +1 -0
- package/build/esm/object-table/TableHeader.js +20 -4
- package/build/esm/object-table/TableHeader.js.map +1 -1
- package/build/esm/object-table/TableRow.js +7 -9
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +147 -0
- package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +1 -0
- package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +12 -0
- package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +1 -1
- package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +548 -0
- package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +1 -0
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +274 -0
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -0
- package/build/esm/object-table/hooks/useCellContextMenu.js +48 -0
- package/build/esm/object-table/hooks/useCellContextMenu.js.map +1 -0
- package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/esm/object-table/hooks/useObjectTableData.js +3 -2
- package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/esm/object-table/hooks/useRowSelection.js +180 -0
- package/build/esm/object-table/hooks/useRowSelection.js.map +1 -0
- package/build/esm/object-table/hooks/useSelectionColumn.js +51 -0
- package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -0
- package/build/esm/object-table/utils/getRowId.js +21 -0
- package/build/esm/object-table/utils/getRowId.js.map +1 -0
- package/build/esm/public/experimental.js +1 -0
- package/build/esm/public/experimental.js.map +1 -1
- package/build/types/object-table/CellContextMenu.d.ts +11 -0
- package/build/types/object-table/CellContextMenu.d.ts.map +1 -0
- package/build/types/object-table/ObjectTable.d.ts +1 -1
- package/build/types/object-table/ObjectTable.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +5 -10
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/SelectionCells.d.ts +14 -0
- package/build/types/object-table/SelectionCells.d.ts.map +1 -0
- package/build/types/object-table/Table.d.ts +4 -3
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableBody.d.ts +3 -2
- package/build/types/object-table/TableBody.d.ts.map +1 -1
- package/build/types/object-table/TableCell.d.ts +8 -0
- package/build/types/object-table/TableCell.d.ts.map +1 -0
- package/build/types/object-table/TableHeader.d.ts +3 -3
- package/build/types/object-table/TableHeader.d.ts.map +1 -1
- package/build/types/object-table/TableRow.d.ts +3 -2
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +1 -0
- package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +1 -0
- package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +1 -0
- package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +1 -0
- package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +1 -0
- package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +1 -0
- package/build/types/object-table/hooks/useCellContextMenu.d.ts +17 -0
- package/build/types/object-table/hooks/useCellContextMenu.d.ts.map +1 -0
- package/build/types/object-table/hooks/useObjectTableData.d.ts +2 -2
- package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
- package/build/types/object-table/hooks/useRowSelection.d.ts +22 -0
- package/build/types/object-table/hooks/useRowSelection.d.ts.map +1 -0
- package/build/types/object-table/hooks/useSelectionColumn.d.ts +15 -0
- package/build/types/object-table/hooks/useSelectionColumn.d.ts.map +1 -0
- package/build/types/object-table/utils/getRowId.d.ts +6 -0
- package/build/types/object-table/utils/getRowId.d.ts.map +1 -0
- package/build/types/public/experimental.d.ts.map +1 -1
- 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":[]}
|