@osdk/react-components 0.2.0-beta.11 → 0.2.0-beta.13

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 (157) hide show
  1. package/AGENTS.md +105 -0
  2. package/CHANGELOG.md +30 -0
  3. package/build/browser/base-components/draggable-list/DraggableList.module.css +2 -2
  4. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  5. package/build/browser/filter-list/base/DragHandleIcon.js +51 -0
  6. package/build/browser/filter-list/base/DragHandleIcon.js.map +1 -0
  7. package/build/browser/filter-list/base/FilterList.js +3 -1
  8. package/build/browser/filter-list/base/FilterList.js.map +1 -1
  9. package/build/browser/filter-list/base/FilterListContent.js +143 -3
  10. package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
  11. package/build/browser/filter-list/base/FilterListContent.module.css +6 -0
  12. package/build/browser/filter-list/base/FilterListContent.module.css.js +2 -1
  13. package/build/browser/filter-list/base/FilterListItem.js +11 -18
  14. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  15. package/build/browser/filter-list/base/FilterListItem.module.css +32 -0
  16. package/build/browser/filter-list/base/FilterListItem.module.css.js +3 -1
  17. package/build/browser/filter-list/base/SortableFilterListItem.js +63 -0
  18. package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -0
  19. package/build/browser/filter-list/utils/getFilterLabel.js +36 -0
  20. package/build/browser/filter-list/utils/getFilterLabel.js.map +1 -0
  21. package/build/browser/object-table/EditableCell.js +1 -2
  22. package/build/browser/object-table/EditableCell.js.map +1 -1
  23. package/build/browser/object-table/TableRow.js +1 -2
  24. package/build/browser/object-table/TableRow.js.map +1 -1
  25. package/build/browser/styles.css +40 -2
  26. package/build/cjs/public/experimental.cjs +905 -677
  27. package/build/cjs/public/experimental.cjs.map +1 -1
  28. package/build/cjs/public/experimental.css +34 -2
  29. package/build/cjs/public/experimental.css.map +1 -1
  30. package/build/cjs/public/experimental.d.cts +7 -0
  31. package/build/esm/base-components/draggable-list/DraggableList.module.css +2 -2
  32. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  33. package/build/esm/filter-list/base/DragHandleIcon.js +51 -0
  34. package/build/esm/filter-list/base/DragHandleIcon.js.map +1 -0
  35. package/build/esm/filter-list/base/FilterList.js +3 -1
  36. package/build/esm/filter-list/base/FilterList.js.map +1 -1
  37. package/build/esm/filter-list/base/FilterListContent.js +143 -3
  38. package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
  39. package/build/esm/filter-list/base/FilterListContent.module.css +6 -0
  40. package/build/esm/filter-list/base/FilterListItem.js +11 -18
  41. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  42. package/build/esm/filter-list/base/FilterListItem.module.css +32 -0
  43. package/build/esm/filter-list/base/SortableFilterListItem.js +63 -0
  44. package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -0
  45. package/build/esm/filter-list/utils/getFilterLabel.js +36 -0
  46. package/build/esm/filter-list/utils/getFilterLabel.js.map +1 -0
  47. package/build/esm/object-table/EditableCell.js +1 -2
  48. package/build/esm/object-table/EditableCell.js.map +1 -1
  49. package/build/esm/object-table/TableRow.js +1 -2
  50. package/build/esm/object-table/TableRow.js.map +1 -1
  51. package/build/types/filter-list/FilterListApi.d.ts +7 -0
  52. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  53. package/build/types/filter-list/base/DragHandleIcon.d.ts +2 -0
  54. package/build/types/filter-list/base/DragHandleIcon.d.ts.map +1 -0
  55. package/build/types/filter-list/base/FilterListContent.d.ts +2 -1
  56. package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
  57. package/build/types/filter-list/base/FilterListItem.d.ts +4 -1
  58. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
  59. package/build/types/filter-list/base/SortableFilterListItem.d.ts +16 -0
  60. package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -0
  61. package/build/types/filter-list/utils/getFilterLabel.d.ts +3 -0
  62. package/build/types/filter-list/utils/getFilterLabel.d.ts.map +1 -0
  63. package/build/types/object-table/EditableCell.d.ts +1 -3
  64. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  65. package/build/types/object-table/TableRow.d.ts +1 -2
  66. package/build/types/object-table/TableRow.d.ts.map +1 -1
  67. package/package.json +6 -5
  68. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
  69. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
  70. package/build/browser/filter-list/__tests__/dateUtils.test.js +0 -55
  71. package/build/browser/filter-list/__tests__/dateUtils.test.js.map +0 -1
  72. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
  73. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
  74. package/build/browser/filter-list/__tests__/getFilterKey.test.js +0 -53
  75. package/build/browser/filter-list/__tests__/getFilterKey.test.js.map +0 -1
  76. package/build/browser/filter-list/__tests__/testUtils.js +0 -203
  77. package/build/browser/filter-list/__tests__/testUtils.js.map +0 -1
  78. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
  79. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
  80. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
  81. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
  82. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
  83. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
  84. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
  85. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
  86. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
  87. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
  88. package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js +0 -292
  89. package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js.map +0 -1
  90. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
  91. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
  92. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
  93. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
  94. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
  95. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
  96. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
  97. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
  98. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
  99. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
  100. package/build/esm/filter-list/__tests__/dateUtils.test.js +0 -55
  101. package/build/esm/filter-list/__tests__/dateUtils.test.js.map +0 -1
  102. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
  103. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
  104. package/build/esm/filter-list/__tests__/getFilterKey.test.js +0 -53
  105. package/build/esm/filter-list/__tests__/getFilterKey.test.js.map +0 -1
  106. package/build/esm/filter-list/__tests__/testUtils.js +0 -203
  107. package/build/esm/filter-list/__tests__/testUtils.js.map +0 -1
  108. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
  109. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
  110. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
  111. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
  112. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
  113. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
  114. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
  115. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
  116. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
  117. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
  118. package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js +0 -292
  119. package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js.map +0 -1
  120. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
  121. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
  122. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
  123. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
  124. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
  125. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
  126. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
  127. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
  128. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts +0 -1
  129. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts.map +0 -1
  130. package/build/types/filter-list/__tests__/dateUtils.test.d.ts +0 -1
  131. package/build/types/filter-list/__tests__/dateUtils.test.d.ts.map +0 -1
  132. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts +0 -1
  133. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts.map +0 -1
  134. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts +0 -1
  135. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts.map +0 -1
  136. package/build/types/filter-list/__tests__/testUtils.d.ts +0 -65
  137. package/build/types/filter-list/__tests__/testUtils.d.ts.map +0 -1
  138. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts +0 -1
  139. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts.map +0 -1
  140. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +0 -1
  141. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +0 -1
  142. package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts +0 -1
  143. package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts.map +0 -1
  144. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts +0 -1
  145. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +0 -1
  146. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +0 -1
  147. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +0 -1
  148. package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts +0 -1
  149. package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts.map +0 -1
  150. package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts +0 -1
  151. package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts.map +0 -1
  152. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +0 -1
  153. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +0 -1
  154. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +0 -1
  155. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +0 -1
  156. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +0 -1
  157. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +0 -1
@@ -1,292 +0,0 @@
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 { getCellId } from "../../utils/getCellId.js";
20
- import { useEditableTable } from "../useEditableTable.js";
21
- function createMockObjectInstance(id, additionalProps = {}) {
22
- return {
23
- $apiName: "mock-object",
24
- $primaryKey: id,
25
- id,
26
- ...additionalProps
27
- };
28
- }
29
- describe("useEditableTable", () => {
30
- it("adds cell to cellEdits when edited", () => {
31
- const onCellValueChanged = vi.fn();
32
- const {
33
- result
34
- } = renderHook(() => useEditableTable({
35
- editMode: "always",
36
- onCellValueChanged
37
- }));
38
- const cellId = getCellId({
39
- rowId: "row-1",
40
- columnId: "col-1"
41
- });
42
- const mockRowData = createMockObjectInstance("row-1", {
43
- name: "Test"
44
- });
45
- const editEvent = {
46
- rowId: "row-1",
47
- columnId: "col-1",
48
- newValue: "new value",
49
- oldValue: "old value",
50
- originalRowData: mockRowData
51
- };
52
- act(() => {
53
- result.current.onCellEdit(cellId, editEvent);
54
- });
55
- expect(result.current.cellEdits).toEqual({
56
- [cellId]: editEvent
57
- });
58
- expect(onCellValueChanged).toHaveBeenCalledWith(editEvent);
59
- });
60
- it("removes cell from cellEdits when edited back to original value", () => {
61
- const onCellValueChanged = vi.fn();
62
- const {
63
- result
64
- } = renderHook(() => useEditableTable({
65
- editMode: "always",
66
- onCellValueChanged
67
- }));
68
- const cellId = getCellId({
69
- rowId: "row-1",
70
- columnId: "col-1"
71
- });
72
- const mockRowData = createMockObjectInstance("row-1", {
73
- name: "Test"
74
- });
75
-
76
- // First edit
77
- const firstEdit = {
78
- rowId: "row-1",
79
- columnId: "col-1",
80
- newValue: "new value",
81
- oldValue: "original",
82
- originalRowData: mockRowData
83
- };
84
- act(() => {
85
- result.current.onCellEdit(cellId, firstEdit);
86
- });
87
- expect(result.current.cellEdits).toEqual({
88
- [cellId]: firstEdit
89
- });
90
-
91
- // Edit back to original
92
- const revertEdit = {
93
- rowId: "row-1",
94
- columnId: "col-1",
95
- newValue: "original",
96
- oldValue: "original",
97
- originalRowData: mockRowData
98
- };
99
- act(() => {
100
- result.current.onCellEdit(cellId, revertEdit);
101
- });
102
-
103
- // Should remove the cell from cellEdits
104
- expect(result.current.cellEdits).toEqual({});
105
- });
106
- it("handles multiple cell edits", () => {
107
- const {
108
- result
109
- } = renderHook(() => useEditableTable({
110
- editMode: "always"
111
- }));
112
- const cellId1 = getCellId({
113
- rowId: "row-1",
114
- columnId: "col-1"
115
- });
116
- const cellId2 = getCellId({
117
- rowId: "row-2",
118
- columnId: "col-2"
119
- });
120
- const cellId3 = getCellId({
121
- rowId: "row-3",
122
- columnId: "col-3"
123
- });
124
- const edit1 = {
125
- rowId: "row-1",
126
- columnId: "col-1",
127
- newValue: "new1",
128
- oldValue: "old1",
129
- originalRowData: createMockObjectInstance("row-1")
130
- };
131
- const edit2 = {
132
- rowId: "row-2",
133
- columnId: "col-2",
134
- newValue: "new2",
135
- oldValue: "old2",
136
- originalRowData: createMockObjectInstance("row-2")
137
- };
138
- const edit3 = {
139
- rowId: "row-3",
140
- columnId: "col-3",
141
- newValue: "new3",
142
- oldValue: "old3",
143
- originalRowData: createMockObjectInstance("row-3")
144
- };
145
- act(() => {
146
- result.current.onCellEdit(cellId1, edit1);
147
- result.current.onCellEdit(cellId2, edit2);
148
- result.current.onCellEdit(cellId3, edit3);
149
- });
150
- expect(Object.keys(result.current.cellEdits).length).toBe(3);
151
-
152
- // Edit one back to original
153
- const revertEdit2 = {
154
- rowId: "row-2",
155
- columnId: "col-2",
156
- newValue: "old2",
157
- oldValue: "old2",
158
- originalRowData: createMockObjectInstance("row-2")
159
- };
160
- act(() => {
161
- result.current.onCellEdit(cellId2, revertEdit2);
162
- });
163
- expect(Object.keys(result.current.cellEdits).length).toBe(2);
164
- expect(result.current.cellEdits[cellId2]).toBeUndefined();
165
- });
166
- it("clears all edits", () => {
167
- const {
168
- result
169
- } = renderHook(() => useEditableTable({
170
- editMode: "always"
171
- }));
172
- const cellId1 = getCellId({
173
- rowId: "row-1",
174
- columnId: "col-1"
175
- });
176
- const cellId2 = getCellId({
177
- rowId: "row-2",
178
- columnId: "col-2"
179
- });
180
- const edit1 = {
181
- rowId: "row-1",
182
- columnId: "col-1",
183
- newValue: "new1",
184
- oldValue: "old1",
185
- originalRowData: createMockObjectInstance("row-1")
186
- };
187
- const edit2 = {
188
- rowId: "row-2",
189
- columnId: "col-2",
190
- newValue: "new2",
191
- oldValue: "old2",
192
- originalRowData: createMockObjectInstance("row-2")
193
- };
194
- act(() => {
195
- result.current.onCellEdit(cellId1, edit1);
196
- result.current.onCellEdit(cellId2, edit2);
197
- });
198
- act(() => {
199
- result.current.clearEdits();
200
- });
201
- expect(result.current.cellEdits).toEqual({});
202
- });
203
- it("handles submit edits", async () => {
204
- const onSubmitEdits = vi.fn();
205
- const {
206
- result
207
- } = renderHook(() => useEditableTable({
208
- editMode: "always",
209
- onSubmitEdits
210
- }));
211
- const cellId1 = getCellId({
212
- rowId: "row-1",
213
- columnId: "col-1"
214
- });
215
- const cellId2 = getCellId({
216
- rowId: "row-2",
217
- columnId: "col-2"
218
- });
219
- const edit1 = {
220
- rowId: "row-1",
221
- columnId: "col-1",
222
- newValue: "new1",
223
- oldValue: "old1",
224
- originalRowData: createMockObjectInstance("row-1")
225
- };
226
- const edit2 = {
227
- rowId: "row-2",
228
- columnId: "col-2",
229
- newValue: "new2",
230
- oldValue: "old2",
231
- originalRowData: createMockObjectInstance("row-2")
232
- };
233
- act(() => {
234
- result.current.onCellEdit(cellId1, edit1);
235
- result.current.onCellEdit(cellId2, edit2);
236
- });
237
- await act(async () => {
238
- await result.current.onSubmitEdits?.();
239
- });
240
- expect(onSubmitEdits).toHaveBeenCalledWith([edit1, edit2]);
241
- });
242
- it("when submit edits is undefined, onSubmitEdits is undefined", async () => {
243
- const {
244
- result
245
- } = renderHook(() => useEditableTable({
246
- editMode: "always",
247
- onSubmitEdits: undefined
248
- }));
249
- expect(result.current.onSubmitEdits).toBeUndefined();
250
- });
251
- it("when editMode is manual, isActive is false initially", () => {
252
- const {
253
- result
254
- } = renderHook(() => useEditableTable({
255
- editMode: "manual"
256
- }));
257
- expect(result.current.editMode.type).toBe("manual");
258
- if (result.current.editMode.type === "manual") {
259
- expect(result.current.editMode.isActive).toBe(false);
260
- expect(result.current.editMode.setActive).toBeDefined();
261
- act(() => {
262
- result.current.editMode.type === "manual" && result.current.editMode.setActive(true);
263
- });
264
- expect(result.current.editMode.type === "manual" && result.current.editMode.isActive).toBe(true);
265
- act(() => {
266
- result.current.editMode.type === "manual" && result.current.editMode.setActive(false);
267
- });
268
- expect(result.current.editMode.type === "manual" && result.current.editMode.isActive).toBe(false);
269
- }
270
- });
271
- it("when editMode is always, the type is always and isActive is true", () => {
272
- const {
273
- result
274
- } = renderHook(() => useEditableTable({
275
- editMode: "always"
276
- }));
277
- expect(result.current.editMode.type).toBe("always");
278
- expect(result.current.editMode.isActive).toBe(true);
279
- });
280
- it("when editMode is manual with default settings, it starts as inactive", () => {
281
- const {
282
- result
283
- } = renderHook(() => useEditableTable({
284
- editMode: "manual"
285
- }));
286
- expect(result.current.editMode.type).toBe("manual");
287
- if (result.current.editMode.type === "manual") {
288
- expect(result.current.editMode.isActive).toBe(false);
289
- }
290
- });
291
- });
292
- //# sourceMappingURL=useEditableTable.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useEditableTable.test.js","names":["act","renderHook","describe","expect","it","vi","getCellId","useEditableTable","createMockObjectInstance","id","additionalProps","$apiName","$primaryKey","onCellValueChanged","fn","result","editMode","cellId","rowId","columnId","mockRowData","name","editEvent","newValue","oldValue","originalRowData","current","onCellEdit","cellEdits","toEqual","toHaveBeenCalledWith","firstEdit","revertEdit","cellId1","cellId2","cellId3","edit1","edit2","edit3","Object","keys","length","toBe","revertEdit2","toBeUndefined","clearEdits","onSubmitEdits","undefined","type","isActive","setActive","toBeDefined"],"sources":["useEditableTable.test.ts"],"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 { ObjectOrInterfaceDefinition, Osdk } from \"@osdk/api\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { getCellId } from \"../../utils/getCellId.js\";\nimport { useEditableTable } from \"../useEditableTable.js\";\n\ntype MockObjectDef = ObjectOrInterfaceDefinition;\ntype MockInstance = Osdk.Instance<MockObjectDef, \"$allBaseProperties\", string>;\n\nfunction createMockObjectInstance(\n id: string,\n additionalProps = {},\n): MockInstance {\n return {\n $apiName: \"mock-object\" as const,\n $primaryKey: id,\n id,\n ...additionalProps,\n } as unknown as MockInstance;\n}\n\ndescribe(\"useEditableTable\", () => {\n it(\"adds cell to cellEdits when edited\", () => {\n const onCellValueChanged = vi.fn();\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"always\", onCellValueChanged })\n );\n const cellIdentifier = { rowId: \"row-1\", columnId: \"col-1\" };\n const cellId = getCellId(cellIdentifier);\n const mockRowData = createMockObjectInstance(\"row-1\", { name: \"Test\" });\n\n const editEvent = {\n rowId: \"row-1\",\n columnId: \"col-1\",\n newValue: \"new value\",\n oldValue: \"old value\",\n originalRowData: mockRowData,\n };\n\n act(() => {\n result.current.onCellEdit(cellId, editEvent);\n });\n\n expect(result.current.cellEdits).toEqual({\n [cellId]: editEvent,\n });\n expect(onCellValueChanged).toHaveBeenCalledWith(editEvent);\n });\n\n it(\"removes cell from cellEdits when edited back to original value\", () => {\n const onCellValueChanged = vi.fn();\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"always\", onCellValueChanged })\n );\n const cellIdentifier = { rowId: \"row-1\", columnId: \"col-1\" };\n const cellId = getCellId(cellIdentifier);\n const mockRowData = createMockObjectInstance(\"row-1\", { name: \"Test\" });\n\n // First edit\n const firstEdit = {\n rowId: \"row-1\",\n columnId: \"col-1\",\n newValue: \"new value\",\n oldValue: \"original\",\n originalRowData: mockRowData,\n };\n\n act(() => {\n result.current.onCellEdit(cellId, firstEdit);\n });\n\n expect(result.current.cellEdits).toEqual({\n [cellId]: firstEdit,\n });\n\n // Edit back to original\n const revertEdit = {\n rowId: \"row-1\",\n columnId: \"col-1\",\n newValue: \"original\",\n oldValue: \"original\",\n originalRowData: mockRowData,\n };\n\n act(() => {\n result.current.onCellEdit(cellId, revertEdit);\n });\n\n // Should remove the cell from cellEdits\n expect(result.current.cellEdits).toEqual({});\n });\n\n it(\"handles multiple cell edits\", () => {\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"always\" })\n );\n const cellId1 = getCellId({ rowId: \"row-1\", columnId: \"col-1\" });\n const cellId2 = getCellId({ rowId: \"row-2\", columnId: \"col-2\" });\n const cellId3 = getCellId({ rowId: \"row-3\", columnId: \"col-3\" });\n\n const edit1 = {\n rowId: \"row-1\",\n columnId: \"col-1\",\n newValue: \"new1\",\n oldValue: \"old1\",\n originalRowData: createMockObjectInstance(\"row-1\"),\n };\n\n const edit2 = {\n rowId: \"row-2\",\n columnId: \"col-2\",\n newValue: \"new2\",\n oldValue: \"old2\",\n originalRowData: createMockObjectInstance(\"row-2\"),\n };\n\n const edit3 = {\n rowId: \"row-3\",\n columnId: \"col-3\",\n newValue: \"new3\",\n oldValue: \"old3\",\n originalRowData: createMockObjectInstance(\"row-3\"),\n };\n\n act(() => {\n result.current.onCellEdit(cellId1, edit1);\n result.current.onCellEdit(cellId2, edit2);\n result.current.onCellEdit(cellId3, edit3);\n });\n\n expect(Object.keys(result.current.cellEdits).length).toBe(3);\n\n // Edit one back to original\n const revertEdit2 = {\n rowId: \"row-2\",\n columnId: \"col-2\",\n newValue: \"old2\",\n oldValue: \"old2\",\n originalRowData: createMockObjectInstance(\"row-2\"),\n };\n\n act(() => {\n result.current.onCellEdit(cellId2, revertEdit2);\n });\n\n expect(Object.keys(result.current.cellEdits).length).toBe(2);\n expect(result.current.cellEdits[cellId2]).toBeUndefined();\n });\n\n it(\"clears all edits\", () => {\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"always\" })\n );\n const cellId1 = getCellId({ rowId: \"row-1\", columnId: \"col-1\" });\n const cellId2 = getCellId({ rowId: \"row-2\", columnId: \"col-2\" });\n\n const edit1 = {\n rowId: \"row-1\",\n columnId: \"col-1\",\n newValue: \"new1\",\n oldValue: \"old1\",\n originalRowData: createMockObjectInstance(\"row-1\"),\n };\n\n const edit2 = {\n rowId: \"row-2\",\n columnId: \"col-2\",\n newValue: \"new2\",\n oldValue: \"old2\",\n originalRowData: createMockObjectInstance(\"row-2\"),\n };\n\n act(() => {\n result.current.onCellEdit(cellId1, edit1);\n result.current.onCellEdit(cellId2, edit2);\n });\n\n act(() => {\n result.current.clearEdits();\n });\n\n expect(result.current.cellEdits).toEqual({});\n });\n\n it(\"handles submit edits\", async () => {\n const onSubmitEdits = vi.fn();\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"always\", onSubmitEdits })\n );\n const cellId1 = getCellId({ rowId: \"row-1\", columnId: \"col-1\" });\n const cellId2 = getCellId({ rowId: \"row-2\", columnId: \"col-2\" });\n\n const edit1 = {\n rowId: \"row-1\",\n columnId: \"col-1\",\n newValue: \"new1\",\n oldValue: \"old1\",\n originalRowData: createMockObjectInstance(\"row-1\"),\n };\n\n const edit2 = {\n rowId: \"row-2\",\n columnId: \"col-2\",\n newValue: \"new2\",\n oldValue: \"old2\",\n originalRowData: createMockObjectInstance(\"row-2\"),\n };\n\n act(() => {\n result.current.onCellEdit(cellId1, edit1);\n result.current.onCellEdit(cellId2, edit2);\n });\n\n await act(async () => {\n await result.current.onSubmitEdits?.();\n });\n\n expect(onSubmitEdits).toHaveBeenCalledWith([edit1, edit2]);\n });\n\n it(\"when submit edits is undefined, onSubmitEdits is undefined\", async () => {\n const { result } = renderHook(() =>\n useEditableTable({\n editMode: \"always\",\n onSubmitEdits: undefined,\n })\n );\n\n expect(result.current.onSubmitEdits).toBeUndefined();\n });\n\n it(\"when editMode is manual, isActive is false initially\", () => {\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"manual\" })\n );\n\n expect(result.current.editMode.type).toBe(\"manual\");\n if (result.current.editMode.type === \"manual\") {\n expect(result.current.editMode.isActive).toBe(false);\n expect(result.current.editMode.setActive).toBeDefined();\n\n act(() => {\n result.current.editMode.type === \"manual\"\n && result.current.editMode.setActive(true);\n });\n\n expect(\n result.current.editMode.type === \"manual\"\n && result.current.editMode.isActive,\n ).toBe(true);\n\n act(() => {\n result.current.editMode.type === \"manual\"\n && result.current.editMode.setActive(false);\n });\n\n expect(\n result.current.editMode.type === \"manual\"\n && result.current.editMode.isActive,\n ).toBe(false);\n }\n });\n\n it(\"when editMode is always, the type is always and isActive is true\", () => {\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"always\" })\n );\n\n expect(result.current.editMode.type).toBe(\"always\");\n expect(result.current.editMode.isActive).toBe(true);\n });\n\n it(\"when editMode is manual with default settings, it starts as inactive\", () => {\n const { result } = renderHook(() =>\n useEditableTable({ editMode: \"manual\" })\n );\n\n expect(result.current.editMode.type).toBe(\"manual\");\n if (result.current.editMode.type === \"manual\") {\n expect(result.current.editMode.isActive).toBe(false);\n }\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,315 +0,0 @@
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 { OsdkProvider } from "@osdk/react";
18
- import { useObjectSet, useOsdkObjects } from "@osdk/react/experimental";
19
- import { renderHook } from "@testing-library/react";
20
- import * as React from "react";
21
- import { beforeEach, describe, expect, it, vi } from "vitest";
22
- import { useObjectTableData } from "../useObjectTableData.js";
23
- const TestObjectType = {
24
- type: "object",
25
- apiName: "TestObject"
26
- };
27
- vi.mock("@osdk/react/experimental", () => ({
28
- useOsdkObjects: vi.fn((objectType, options) => {
29
- return {
30
- data: [],
31
- isLoading: false,
32
- error: undefined,
33
- fetchMore: undefined,
34
- isOptimistic: false,
35
- // Return the options to verify they were passed correctly
36
- _testOptions: options
37
- };
38
- }),
39
- useObjectSet: vi.fn((objectSet, options) => {
40
- return {
41
- data: [],
42
- isLoading: false,
43
- error: undefined,
44
- fetchMore: vi.fn(),
45
- totalCount: undefined,
46
- // Return the options to verify they were passed correctly
47
- _testOptions: options,
48
- isOptimistic: false
49
- };
50
- })
51
- }));
52
- const TestInterfaceType = {
53
- type: "interface",
54
- apiName: "TestInterface"
55
- };
56
- describe(useObjectTableData, () => {
57
- beforeEach(() => {
58
- vi.mocked(useOsdkObjects).mockClear();
59
- vi.mocked(useObjectSet).mockClear();
60
- });
61
- const wrapper = (client => {
62
- return ({
63
- children
64
- }) => {
65
- return /*#__PURE__*/React.createElement(OsdkProvider, {
66
- client: client
67
- }, children);
68
- };
69
- })({});
70
- const mockObjectSet = {
71
- $objectSetInternals: {
72
- def: TestObjectType
73
- }
74
- };
75
- it("calls useOsdkObjects with filter clause and orderBy provided", () => {
76
- const filterClause = {
77
- name: "John"
78
- };
79
- const orderBy = [{
80
- id: "name",
81
- desc: false
82
- }];
83
- const {
84
- result
85
- } = renderHook(() => useObjectTableData(TestObjectType, undefined, filterClause, orderBy), {
86
- wrapper
87
- });
88
- const mockResult = result.current;
89
- expect(mockResult._testOptions.where).toEqual(filterClause);
90
- expect(mockResult._testOptions.orderBy).toEqual({
91
- "name": "asc"
92
- });
93
- });
94
- it("calls useOsdkObjects without withProperties when no columnDefinitions provided", () => {
95
- const {
96
- result
97
- } = renderHook(() => useObjectTableData(TestObjectType, undefined), {
98
- wrapper
99
- });
100
- const mockResult = result.current;
101
- expect(mockResult._testOptions.withProperties).toBeUndefined();
102
- expect(mockResult._testOptions.pageSize).toBe(50);
103
- });
104
- it("calls useOsdkObjects without withProperties when columnDefinitions have no RDP columns", () => {
105
- const columnDefinitions = [{
106
- locator: {
107
- type: "property",
108
- id: "name"
109
- }
110
- }, {
111
- locator: {
112
- type: "property",
113
- id: "email"
114
- }
115
- }];
116
- const {
117
- result
118
- } = renderHook(() => useObjectTableData(TestObjectType, columnDefinitions), {
119
- wrapper
120
- });
121
- const mockResult = result.current;
122
- expect(mockResult._testOptions.withProperties).toBeUndefined();
123
- expect(mockResult._testOptions.pageSize).toBe(50);
124
- });
125
- it("extracts RDP creators and passes them to useOsdkObjects", () => {
126
- const mockRdpCreator1 = vi.fn();
127
- const mockRdpCreator2 = vi.fn();
128
- const columnDefinitions = [{
129
- locator: {
130
- type: "property",
131
- id: "name"
132
- }
133
- }, {
134
- locator: {
135
- type: "rdp",
136
- id: "rdp1",
137
- creator: mockRdpCreator1
138
- }
139
- }, {
140
- locator: {
141
- type: "rdp",
142
- id: "rdp2",
143
- creator: mockRdpCreator2
144
- }
145
- }, {
146
- locator: {
147
- type: "function",
148
- id: "myFunction"
149
- }
150
- }];
151
- const {
152
- result
153
- } = renderHook(() => useObjectTableData(TestObjectType, columnDefinitions), {
154
- wrapper
155
- });
156
- const mockResult = result.current;
157
- expect(mockResult._testOptions.withProperties).toEqual({
158
- rdp1: mockRdpCreator1,
159
- rdp2: mockRdpCreator2
160
- });
161
- });
162
- it("memoizes withProperties based on columnDefinitions", () => {
163
- const mockRdpCreator = vi.fn();
164
- const columnDefinitions = [{
165
- locator: {
166
- type: "rdp",
167
- id: "myRdp",
168
- creator: mockRdpCreator
169
- }
170
- }];
171
- const {
172
- result,
173
- rerender
174
- } = renderHook(({
175
- colDefs
176
- }) => useObjectTableData(TestObjectType, colDefs), {
177
- initialProps: {
178
- colDefs: columnDefinitions
179
- },
180
- wrapper
181
- });
182
- const firstMockResult = result.current;
183
- const firstWithProperties = firstMockResult._testOptions.withProperties;
184
-
185
- // Rerender with same columnDefinitions reference
186
- rerender({
187
- colDefs: columnDefinitions
188
- });
189
-
190
- // Should be the same reference (memoized)
191
- const secondMockResult = result.current;
192
- expect(secondMockResult._testOptions.withProperties).toBe(firstWithProperties);
193
- });
194
- it("updates withProperties when columnDefinitions change", () => {
195
- const mockRdpCreator1 = vi.fn();
196
- const mockRdpCreator2 = vi.fn();
197
- const {
198
- result,
199
- rerender
200
- } = renderHook(({
201
- colDefs
202
- }) => useObjectTableData(TestObjectType, colDefs), {
203
- initialProps: {
204
- colDefs: [{
205
- locator: {
206
- type: "rdp",
207
- id: "rdp1",
208
- creator: mockRdpCreator1
209
- }
210
- }]
211
- },
212
- wrapper
213
- });
214
- const firstMockResult = result.current;
215
- expect(firstMockResult._testOptions.withProperties).toEqual({
216
- rdp1: mockRdpCreator1
217
- });
218
- rerender({
219
- colDefs: [{
220
- locator: {
221
- type: "rdp",
222
- id: "rdp2",
223
- creator: mockRdpCreator2
224
- }
225
- }]
226
- });
227
- const secondMockResult = result.current;
228
- expect(secondMockResult._testOptions.withProperties).toEqual({
229
- rdp2: mockRdpCreator2
230
- });
231
- });
232
- it("returns useOsdkObjects result structure", () => {
233
- const {
234
- result
235
- } = renderHook(() => useObjectTableData(TestObjectType), {
236
- wrapper
237
- });
238
- expect(result.current).toHaveProperty("data");
239
- expect(result.current).toHaveProperty("isLoading");
240
- expect(result.current).toHaveProperty("error");
241
- expect(result.current).toHaveProperty("fetchMore");
242
- });
243
- it("when no objectSet provided, only enables useOsdkObjects", () => {
244
- const {
245
- result
246
- } = renderHook(() => useObjectTableData(TestObjectType), {
247
- wrapper
248
- });
249
- expect(useOsdkObjects).toHaveBeenCalledWith(TestObjectType, expect.objectContaining({
250
- enabled: true,
251
- pageSize: 50
252
- }));
253
- expect(useObjectSet).toHaveBeenCalledWith(undefined, expect.objectContaining({
254
- enabled: false,
255
- pageSize: 50
256
- }));
257
- });
258
- it(" when objectSet is provided, only enables useObjectSet", () => {
259
- const {
260
- result
261
- } = renderHook(() => useObjectTableData(TestObjectType, undefined, undefined, undefined, mockObjectSet), {
262
- wrapper
263
- });
264
- expect(useOsdkObjects).toHaveBeenCalledWith(TestObjectType, expect.objectContaining({
265
- enabled: false,
266
- pageSize: 50
267
- }));
268
- expect(useObjectSet).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
269
- enabled: true,
270
- pageSize: 50
271
- }));
272
- });
273
- it("when objectSet is provided but type is interface, only enables useOsdkObjects ", () => {
274
- renderHook(() => useObjectTableData(TestInterfaceType, undefined, undefined, undefined, mockObjectSet), {
275
- wrapper
276
- });
277
- expect(useOsdkObjects).toHaveBeenCalledWith(TestInterfaceType, expect.objectContaining({
278
- enabled: true,
279
- pageSize: 50
280
- }));
281
- expect(useObjectSet).toHaveBeenCalledWith(undefined, expect.objectContaining({
282
- enabled: false,
283
- pageSize: 50
284
- }));
285
- });
286
- it("passes filter, orderBy and objectSetOptions to useObjectSet", () => {
287
- const filterClause = {
288
- name: "John"
289
- };
290
- const sorting = [{
291
- id: "name",
292
- desc: false
293
- }];
294
- const objectSetOptions = {
295
- union: [mockObjectSet],
296
- intersect: [],
297
- subtract: []
298
- };
299
- renderHook(() => useObjectTableData(TestObjectType, undefined, filterClause, sorting, mockObjectSet, objectSetOptions), {
300
- wrapper
301
- });
302
- expect(useObjectSet).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
303
- enabled: true,
304
- pageSize: 50,
305
- where: filterClause,
306
- orderBy: {
307
- name: "asc"
308
- },
309
- union: objectSetOptions.union,
310
- intersect: objectSetOptions.intersect,
311
- subtract: objectSetOptions.subtract
312
- }));
313
- });
314
- });
315
- //# sourceMappingURL=useObjectTableData.test.js.map