@osdk/react-components 0.2.0-beta.10 → 0.2.0-beta.12
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/AGENTS.md +105 -0
- package/CHANGELOG.md +22 -0
- package/build/browser/object-table/DefaultCellRenderer.js +5 -2
- package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/browser/object-table/EditableCell.js +16 -6
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/EditableCell.module.css +30 -2
- package/build/browser/object-table/EditableCell.module.css.js +2 -1
- package/build/browser/object-table/ObjectTable.js +9 -22
- 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/Table.js +23 -15
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/Table.module.css +0 -8
- package/build/browser/object-table/Table.module.css.js +1 -2
- package/build/browser/object-table/TableBody.js +8 -2
- package/build/browser/object-table/TableBody.js.map +1 -1
- package/build/browser/object-table/TableCell.module.css +0 -8
- package/build/browser/object-table/TableEditContainer.js +79 -0
- package/build/browser/object-table/TableEditContainer.js.map +1 -0
- package/build/browser/object-table/TableEditContainer.module.css +44 -0
- package/build/browser/object-table/TableEditContainer.module.css.js +9 -0
- package/build/browser/object-table/TableRow.js +12 -4
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/object-table/TableRow.module.css +2 -1
- package/build/browser/object-table/hooks/useEditableTable.js +20 -11
- package/build/browser/object-table/hooks/useEditableTable.js.map +1 -1
- package/build/browser/object-table/hooks/useObjectTableData.js +0 -5
- package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/browser/object-table/utils/getCellId.js +0 -7
- package/build/browser/object-table/utils/getCellId.js.map +1 -1
- package/build/browser/object-table/utils/types.js.map +1 -1
- package/build/browser/public/experimental.js.map +1 -1
- package/build/browser/styles.css +79 -19
- package/build/cjs/public/experimental.cjs +179 -90
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +96 -57
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +40 -18
- package/build/esm/object-table/DefaultCellRenderer.js +5 -2
- package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/esm/object-table/EditableCell.js +16 -6
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/EditableCell.module.css +30 -2
- package/build/esm/object-table/ObjectTable.js +9 -22
- 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/Table.js +23 -15
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/Table.module.css +0 -8
- package/build/esm/object-table/TableBody.js +8 -2
- package/build/esm/object-table/TableBody.js.map +1 -1
- package/build/esm/object-table/TableCell.module.css +0 -8
- package/build/esm/object-table/TableEditContainer.js +79 -0
- package/build/esm/object-table/TableEditContainer.js.map +1 -0
- package/build/esm/object-table/TableEditContainer.module.css +44 -0
- package/build/esm/object-table/TableRow.js +12 -4
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/esm/object-table/TableRow.module.css +2 -1
- package/build/esm/object-table/hooks/useEditableTable.js +20 -11
- package/build/esm/object-table/hooks/useEditableTable.js.map +1 -1
- package/build/esm/object-table/hooks/useObjectTableData.js +0 -5
- package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/esm/object-table/utils/getCellId.js +0 -7
- package/build/esm/object-table/utils/getCellId.js.map +1 -1
- package/build/esm/object-table/utils/types.js.map +1 -1
- package/build/esm/public/experimental.js.map +1 -1
- package/build/types/object-table/DefaultCellRenderer.d.ts +2 -2
- package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
- package/build/types/object-table/EditableCell.d.ts +18 -6
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- 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 +16 -6
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +5 -10
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableBody.d.ts +4 -1
- package/build/types/object-table/TableBody.d.ts.map +1 -1
- package/build/types/object-table/TableEditContainer.d.ts +9 -0
- package/build/types/object-table/TableEditContainer.d.ts.map +1 -0
- package/build/types/object-table/TableRow.d.ts +5 -1
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/build/types/object-table/hooks/useEditableTable.d.ts +4 -9
- package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -1
- package/build/types/object-table/utils/getCellId.d.ts +0 -1
- package/build/types/object-table/utils/getCellId.d.ts.map +1 -1
- package/build/types/object-table/utils/types.d.ts +25 -3
- package/build/types/object-table/utils/types.d.ts.map +1 -1
- package/build/types/public/experimental.d.ts +1 -1
- package/build/types/public/experimental.d.ts.map +1 -1
- package/package.json +7 -6
- package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
- package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/dateUtils.test.js +0 -55
- package/build/browser/filter-list/__tests__/dateUtils.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
- package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/getFilterKey.test.js +0 -53
- package/build/browser/filter-list/__tests__/getFilterKey.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/testUtils.js +0 -203
- package/build/browser/filter-list/__tests__/testUtils.js.map +0 -1
- package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
- package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
- package/build/browser/object-table/__tests__/useEditableTable.test.js +0 -197
- package/build/browser/object-table/__tests__/useEditableTable.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
- package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
- package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
- package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
- package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
- package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
- package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
- package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
- package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/dateUtils.test.js +0 -55
- package/build/esm/filter-list/__tests__/dateUtils.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
- package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/getFilterKey.test.js +0 -53
- package/build/esm/filter-list/__tests__/getFilterKey.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/testUtils.js +0 -203
- package/build/esm/filter-list/__tests__/testUtils.js.map +0 -1
- package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
- package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
- package/build/esm/object-table/__tests__/useEditableTable.test.js +0 -197
- package/build/esm/object-table/__tests__/useEditableTable.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
- package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
- package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
- package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
- package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
- package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
- package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
- package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
- package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/dateUtils.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/dateUtils.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/getFilterKey.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/getFilterKey.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/testUtils.d.ts +0 -65
- package/build/types/filter-list/__tests__/testUtils.d.ts.map +0 -1
- package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts +0 -1
- package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts.map +0 -1
- package/build/types/object-table/__tests__/useEditableTable.test.d.ts +0 -1
- package/build/types/object-table/__tests__/useEditableTable.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +0 -1
|
@@ -1,147 +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 { beforeEach, describe, expect, it, vi } from "vitest";
|
|
19
|
-
import { useCellContextMenu } from "../useCellContextMenu.js";
|
|
20
|
-
describe("useCellContextMenu", () => {
|
|
21
|
-
let mockElement;
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
// Create a mock table cell element with getBoundingClientRect
|
|
24
|
-
mockElement = document.createElement("td");
|
|
25
|
-
vi.spyOn(mockElement, "getBoundingClientRect").mockReturnValue({
|
|
26
|
-
left: 100,
|
|
27
|
-
top: 200,
|
|
28
|
-
bottom: 240,
|
|
29
|
-
width: 150,
|
|
30
|
-
height: 40,
|
|
31
|
-
right: 250,
|
|
32
|
-
x: 100,
|
|
33
|
-
y: 200,
|
|
34
|
-
toJSON: () => ({})
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe("initial state", () => {
|
|
38
|
-
it("returns closed context menu state by default", () => {
|
|
39
|
-
const tdRef = {
|
|
40
|
-
current: mockElement
|
|
41
|
-
};
|
|
42
|
-
const {
|
|
43
|
-
result
|
|
44
|
-
} = renderHook(() => useCellContextMenu({
|
|
45
|
-
tdRef
|
|
46
|
-
}));
|
|
47
|
-
expect(result.current.isContextMenuOpen).toBe(false);
|
|
48
|
-
expect(result.current.popoverPosition).toBeNull();
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
describe("handleOpenContextMenu", () => {
|
|
52
|
-
it("opens context menu and use position from bounding client rect", () => {
|
|
53
|
-
const tdRef = {
|
|
54
|
-
current: mockElement
|
|
55
|
-
};
|
|
56
|
-
const {
|
|
57
|
-
result
|
|
58
|
-
} = renderHook(() => useCellContextMenu({
|
|
59
|
-
tdRef
|
|
60
|
-
}));
|
|
61
|
-
const mockEvent = {
|
|
62
|
-
preventDefault: vi.fn(),
|
|
63
|
-
stopPropagation: vi.fn()
|
|
64
|
-
};
|
|
65
|
-
act(() => {
|
|
66
|
-
result.current.handleOpenContextMenu(mockEvent);
|
|
67
|
-
});
|
|
68
|
-
expect(mockEvent.preventDefault).toHaveBeenCalled();
|
|
69
|
-
expect(mockEvent.stopPropagation).toHaveBeenCalled();
|
|
70
|
-
expect(result.current.isContextMenuOpen).toBe(true);
|
|
71
|
-
expect(result.current.popoverPosition).toEqual({
|
|
72
|
-
left: 100,
|
|
73
|
-
top: 240,
|
|
74
|
-
width: 150
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
it("does not open context menu if tdRef.current is null", () => {
|
|
78
|
-
const tdRef = {
|
|
79
|
-
current: null
|
|
80
|
-
};
|
|
81
|
-
const {
|
|
82
|
-
result
|
|
83
|
-
} = renderHook(() => useCellContextMenu({
|
|
84
|
-
tdRef
|
|
85
|
-
}));
|
|
86
|
-
const mockEvent = {
|
|
87
|
-
preventDefault: vi.fn(),
|
|
88
|
-
stopPropagation: vi.fn()
|
|
89
|
-
};
|
|
90
|
-
act(() => {
|
|
91
|
-
result.current.handleOpenContextMenu(mockEvent);
|
|
92
|
-
});
|
|
93
|
-
expect(mockEvent.preventDefault).toHaveBeenCalled();
|
|
94
|
-
expect(mockEvent.stopPropagation).toHaveBeenCalled();
|
|
95
|
-
expect(result.current.isContextMenuOpen).toBe(false);
|
|
96
|
-
expect(result.current.popoverPosition).toBeNull();
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
describe("handleCloseContextMenu", () => {
|
|
100
|
-
it("closes context menu and clears position", () => {
|
|
101
|
-
const tdRef = {
|
|
102
|
-
current: mockElement
|
|
103
|
-
};
|
|
104
|
-
const {
|
|
105
|
-
result
|
|
106
|
-
} = renderHook(() => useCellContextMenu({
|
|
107
|
-
tdRef
|
|
108
|
-
}));
|
|
109
|
-
const mockEvent = {
|
|
110
|
-
preventDefault: vi.fn(),
|
|
111
|
-
stopPropagation: vi.fn()
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
// Open first
|
|
115
|
-
act(() => {
|
|
116
|
-
result.current.handleOpenContextMenu(mockEvent);
|
|
117
|
-
});
|
|
118
|
-
expect(result.current.isContextMenuOpen).toBe(true);
|
|
119
|
-
expect(result.current.popoverPosition).not.toBeNull();
|
|
120
|
-
|
|
121
|
-
// Close
|
|
122
|
-
act(() => {
|
|
123
|
-
result.current.handleCloseContextMenu();
|
|
124
|
-
});
|
|
125
|
-
expect(result.current.isContextMenuOpen).toBe(false);
|
|
126
|
-
expect(result.current.popoverPosition).toBeNull();
|
|
127
|
-
});
|
|
128
|
-
it("is safe to call when already closed", () => {
|
|
129
|
-
const tdRef = {
|
|
130
|
-
current: mockElement
|
|
131
|
-
};
|
|
132
|
-
const {
|
|
133
|
-
result
|
|
134
|
-
} = renderHook(() => useCellContextMenu({
|
|
135
|
-
tdRef
|
|
136
|
-
}));
|
|
137
|
-
|
|
138
|
-
// Close without opening
|
|
139
|
-
act(() => {
|
|
140
|
-
result.current.handleCloseContextMenu();
|
|
141
|
-
});
|
|
142
|
-
expect(result.current.isContextMenuOpen).toBe(false);
|
|
143
|
-
expect(result.current.popoverPosition).toBeNull();
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
//# sourceMappingURL=useCellContextMenu.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCellContextMenu.test.js","names":["act","renderHook","beforeEach","describe","expect","it","vi","useCellContextMenu","mockElement","document","createElement","spyOn","mockReturnValue","left","top","bottom","width","height","right","x","y","toJSON","tdRef","current","result","isContextMenuOpen","toBe","popoverPosition","toBeNull","mockEvent","preventDefault","fn","stopPropagation","handleOpenContextMenu","toHaveBeenCalled","toEqual","not","handleCloseContextMenu"],"sources":["useCellContextMenu.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 { act, renderHook } from \"@testing-library/react\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { PopoverPosition } from \"../useCellContextMenu.js\";\nimport { useCellContextMenu } from \"../useCellContextMenu.js\";\n\ndescribe(\"useCellContextMenu\", () => {\n let mockElement: HTMLTableCellElement;\n\n beforeEach(() => {\n // Create a mock table cell element with getBoundingClientRect\n mockElement = document.createElement(\"td\");\n\n vi.spyOn(mockElement, \"getBoundingClientRect\").mockReturnValue({\n left: 100,\n top: 200,\n bottom: 240,\n width: 150,\n height: 40,\n right: 250,\n x: 100,\n y: 200,\n toJSON: () => ({}),\n });\n });\n\n describe(\"initial state\", () => {\n it(\"returns closed context menu state by default\", () => {\n const tdRef = { current: mockElement };\n const { result } = renderHook(() => useCellContextMenu({ tdRef }));\n\n expect(result.current.isContextMenuOpen).toBe(false);\n expect(result.current.popoverPosition).toBeNull();\n });\n });\n\n describe(\"handleOpenContextMenu\", () => {\n it(\"opens context menu and use position from bounding client rect\", () => {\n const tdRef = { current: mockElement };\n const { result } = renderHook(() => useCellContextMenu({ tdRef }));\n\n const mockEvent = {\n preventDefault: vi.fn(),\n stopPropagation: vi.fn(),\n } as unknown as React.MouseEvent<HTMLTableCellElement>;\n\n act(() => {\n result.current.handleOpenContextMenu(mockEvent);\n });\n\n expect(mockEvent.preventDefault).toHaveBeenCalled();\n expect(mockEvent.stopPropagation).toHaveBeenCalled();\n expect(result.current.isContextMenuOpen).toBe(true);\n expect(result.current.popoverPosition).toEqual({\n left: 100,\n top: 240,\n width: 150,\n } as PopoverPosition);\n });\n\n it(\"does not open context menu if tdRef.current is null\", () => {\n const tdRef = { current: null };\n const { result } = renderHook(() => useCellContextMenu({ tdRef }));\n\n const mockEvent = {\n preventDefault: vi.fn(),\n stopPropagation: vi.fn(),\n } as unknown as React.MouseEvent<HTMLTableCellElement>;\n\n act(() => {\n result.current.handleOpenContextMenu(mockEvent);\n });\n\n expect(mockEvent.preventDefault).toHaveBeenCalled();\n expect(mockEvent.stopPropagation).toHaveBeenCalled();\n expect(result.current.isContextMenuOpen).toBe(false);\n expect(result.current.popoverPosition).toBeNull();\n });\n });\n\n describe(\"handleCloseContextMenu\", () => {\n it(\"closes context menu and clears position\", () => {\n const tdRef = { current: mockElement };\n const { result } = renderHook(() => useCellContextMenu({ tdRef }));\n\n const mockEvent = {\n preventDefault: vi.fn(),\n stopPropagation: vi.fn(),\n } as unknown as React.MouseEvent<HTMLTableCellElement>;\n\n // Open first\n act(() => {\n result.current.handleOpenContextMenu(mockEvent);\n });\n\n expect(result.current.isContextMenuOpen).toBe(true);\n expect(result.current.popoverPosition).not.toBeNull();\n\n // Close\n act(() => {\n result.current.handleCloseContextMenu();\n });\n\n expect(result.current.isContextMenuOpen).toBe(false);\n expect(result.current.popoverPosition).toBeNull();\n });\n\n it(\"is safe to call when already closed\", () => {\n const tdRef = { current: mockElement };\n const { result } = renderHook(() => useCellContextMenu({ tdRef }));\n\n // Close without opening\n act(() => {\n result.current.handleCloseContextMenu();\n });\n\n expect(result.current.isContextMenuOpen).toBe(false);\n expect(result.current.popoverPosition).toBeNull();\n });\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,GAAG,EAAEC,UAAU,QAAQ,wBAAwB;AACxD,SAASC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AAE7D,SAASC,kBAAkB,QAAQ,0BAA0B;AAE7DJ,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnC,IAAIK,WAAiC;EAErCN,UAAU,CAAC,MAAM;IACf;IACAM,WAAW,GAAGC,QAAQ,CAACC,aAAa,CAAC,IAAI,CAAC;IAE1CJ,EAAE,CAACK,KAAK,CAACH,WAAW,EAAE,uBAAuB,CAAC,CAACI,eAAe,CAAC;MAC7DC,IAAI,EAAE,GAAG;MACTC,GAAG,EAAE,GAAG;MACRC,MAAM,EAAE,GAAG;MACXC,KAAK,EAAE,GAAG;MACVC,MAAM,EAAE,EAAE;MACVC,KAAK,EAAE,GAAG;MACVC,CAAC,EAAE,GAAG;MACNC,CAAC,EAAE,GAAG;MACNC,MAAM,EAAEA,CAAA,MAAO,CAAC,CAAC;IACnB,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFlB,QAAQ,CAAC,eAAe,EAAE,MAAM;IAC9BE,EAAE,CAAC,8CAA8C,EAAE,MAAM;MACvD,MAAMiB,KAAK,GAAG;QAAEC,OAAO,EAAEf;MAAY,CAAC;MACtC,MAAM;QAAEgB;MAAO,CAAC,GAAGvB,UAAU,CAAC,MAAMM,kBAAkB,CAAC;QAAEe;MAAM,CAAC,CAAC,CAAC;MAElElB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACE,iBAAiB,CAAC,CAACC,IAAI,CAAC,KAAK,CAAC;MACpDtB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACI,eAAe,CAAC,CAACC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFzB,QAAQ,CAAC,uBAAuB,EAAE,MAAM;IACtCE,EAAE,CAAC,+DAA+D,EAAE,MAAM;MACxE,MAAMiB,KAAK,GAAG;QAAEC,OAAO,EAAEf;MAAY,CAAC;MACtC,MAAM;QAAEgB;MAAO,CAAC,GAAGvB,UAAU,CAAC,MAAMM,kBAAkB,CAAC;QAAEe;MAAM,CAAC,CAAC,CAAC;MAElE,MAAMO,SAAS,GAAG;QAChBC,cAAc,EAAExB,EAAE,CAACyB,EAAE,CAAC,CAAC;QACvBC,eAAe,EAAE1B,EAAE,CAACyB,EAAE,CAAC;MACzB,CAAsD;MAEtD/B,GAAG,CAAC,MAAM;QACRwB,MAAM,CAACD,OAAO,CAACU,qBAAqB,CAACJ,SAAS,CAAC;MACjD,CAAC,CAAC;MAEFzB,MAAM,CAACyB,SAAS,CAACC,cAAc,CAAC,CAACI,gBAAgB,CAAC,CAAC;MACnD9B,MAAM,CAACyB,SAAS,CAACG,eAAe,CAAC,CAACE,gBAAgB,CAAC,CAAC;MACpD9B,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACE,iBAAiB,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;MACnDtB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACI,eAAe,CAAC,CAACQ,OAAO,CAAC;QAC7CtB,IAAI,EAAE,GAAG;QACTC,GAAG,EAAE,GAAG;QACRE,KAAK,EAAE;MACT,CAAoB,CAAC;IACvB,CAAC,CAAC;IAEFX,EAAE,CAAC,qDAAqD,EAAE,MAAM;MAC9D,MAAMiB,KAAK,GAAG;QAAEC,OAAO,EAAE;MAAK,CAAC;MAC/B,MAAM;QAAEC;MAAO,CAAC,GAAGvB,UAAU,CAAC,MAAMM,kBAAkB,CAAC;QAAEe;MAAM,CAAC,CAAC,CAAC;MAElE,MAAMO,SAAS,GAAG;QAChBC,cAAc,EAAExB,EAAE,CAACyB,EAAE,CAAC,CAAC;QACvBC,eAAe,EAAE1B,EAAE,CAACyB,EAAE,CAAC;MACzB,CAAsD;MAEtD/B,GAAG,CAAC,MAAM;QACRwB,MAAM,CAACD,OAAO,CAACU,qBAAqB,CAACJ,SAAS,CAAC;MACjD,CAAC,CAAC;MAEFzB,MAAM,CAACyB,SAAS,CAACC,cAAc,CAAC,CAACI,gBAAgB,CAAC,CAAC;MACnD9B,MAAM,CAACyB,SAAS,CAACG,eAAe,CAAC,CAACE,gBAAgB,CAAC,CAAC;MACpD9B,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACE,iBAAiB,CAAC,CAACC,IAAI,CAAC,KAAK,CAAC;MACpDtB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACI,eAAe,CAAC,CAACC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFzB,QAAQ,CAAC,wBAAwB,EAAE,MAAM;IACvCE,EAAE,CAAC,yCAAyC,EAAE,MAAM;MAClD,MAAMiB,KAAK,GAAG;QAAEC,OAAO,EAAEf;MAAY,CAAC;MACtC,MAAM;QAAEgB;MAAO,CAAC,GAAGvB,UAAU,CAAC,MAAMM,kBAAkB,CAAC;QAAEe;MAAM,CAAC,CAAC,CAAC;MAElE,MAAMO,SAAS,GAAG;QAChBC,cAAc,EAAExB,EAAE,CAACyB,EAAE,CAAC,CAAC;QACvBC,eAAe,EAAE1B,EAAE,CAACyB,EAAE,CAAC;MACzB,CAAsD;;MAEtD;MACA/B,GAAG,CAAC,MAAM;QACRwB,MAAM,CAACD,OAAO,CAACU,qBAAqB,CAACJ,SAAS,CAAC;MACjD,CAAC,CAAC;MAEFzB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACE,iBAAiB,CAAC,CAACC,IAAI,CAAC,IAAI,CAAC;MACnDtB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACI,eAAe,CAAC,CAACS,GAAG,CAACR,QAAQ,CAAC,CAAC;;MAErD;MACA5B,GAAG,CAAC,MAAM;QACRwB,MAAM,CAACD,OAAO,CAACc,sBAAsB,CAAC,CAAC;MACzC,CAAC,CAAC;MAEFjC,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACE,iBAAiB,CAAC,CAACC,IAAI,CAAC,KAAK,CAAC;MACpDtB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACI,eAAe,CAAC,CAACC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;IAEFvB,EAAE,CAAC,qCAAqC,EAAE,MAAM;MAC9C,MAAMiB,KAAK,GAAG;QAAEC,OAAO,EAAEf;MAAY,CAAC;MACtC,MAAM;QAAEgB;MAAO,CAAC,GAAGvB,UAAU,CAAC,MAAMM,kBAAkB,CAAC;QAAEe;MAAM,CAAC,CAAC,CAAC;;MAElE;MACAtB,GAAG,CAAC,MAAM;QACRwB,MAAM,CAACD,OAAO,CAACc,sBAAsB,CAAC,CAAC;MACzC,CAAC,CAAC;MAEFjC,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACE,iBAAiB,CAAC,CAACC,IAAI,CAAC,KAAK,CAAC;MACpDtB,MAAM,CAACoB,MAAM,CAACD,OAAO,CAACI,eAAe,CAAC,CAACC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,520 +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 { renderHook, waitFor } from "@testing-library/react";
|
|
19
|
-
import pDefer from "p-defer";
|
|
20
|
-
import * as React from "react";
|
|
21
|
-
import { describe, expect, it, vitest } from "vitest";
|
|
22
|
-
import { useColumnDefs } from "../useColumnDefs.js";
|
|
23
|
-
const TestObjectType = {
|
|
24
|
-
type: "object",
|
|
25
|
-
apiName: "TestObject"
|
|
26
|
-
};
|
|
27
|
-
const mockMetadata = {
|
|
28
|
-
apiName: "TestObject",
|
|
29
|
-
primaryKeyApiName: "id",
|
|
30
|
-
primaryKeyType: "string",
|
|
31
|
-
properties: {
|
|
32
|
-
id: {
|
|
33
|
-
type: "string",
|
|
34
|
-
displayName: "ID"
|
|
35
|
-
},
|
|
36
|
-
name: {
|
|
37
|
-
type: "string",
|
|
38
|
-
displayName: "Name"
|
|
39
|
-
},
|
|
40
|
-
age: {
|
|
41
|
-
type: "integer",
|
|
42
|
-
displayName: "Age"
|
|
43
|
-
},
|
|
44
|
-
email: {
|
|
45
|
-
type: "string",
|
|
46
|
-
displayName: "Email Address"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
describe(useColumnDefs, () => {
|
|
51
|
-
const createWrapper = client => {
|
|
52
|
-
return ({
|
|
53
|
-
children
|
|
54
|
-
}) => {
|
|
55
|
-
return /*#__PURE__*/React.createElement(OsdkProvider, {
|
|
56
|
-
client: client
|
|
57
|
-
}, children);
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
it("returns loading state initially", () => {
|
|
61
|
-
const deferred = pDefer();
|
|
62
|
-
const fakeClient = {
|
|
63
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
64
|
-
};
|
|
65
|
-
const wrapper = createWrapper(fakeClient);
|
|
66
|
-
const {
|
|
67
|
-
result
|
|
68
|
-
} = renderHook(() => useColumnDefs(TestObjectType), {
|
|
69
|
-
wrapper
|
|
70
|
-
});
|
|
71
|
-
expect(result.current.loading).toBe(true);
|
|
72
|
-
expect(result.current.columns).toEqual([]);
|
|
73
|
-
expect(result.current.error).toBeUndefined();
|
|
74
|
-
});
|
|
75
|
-
describe("when no columnDefinitions provided", () => {
|
|
76
|
-
it("generates default columns from metadata", async () => {
|
|
77
|
-
const deferred = pDefer();
|
|
78
|
-
const fakeClient = {
|
|
79
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
80
|
-
};
|
|
81
|
-
const wrapper = createWrapper(fakeClient);
|
|
82
|
-
const {
|
|
83
|
-
result
|
|
84
|
-
} = renderHook(() => useColumnDefs(TestObjectType), {
|
|
85
|
-
wrapper
|
|
86
|
-
});
|
|
87
|
-
expect(result.current.loading).toBe(true);
|
|
88
|
-
deferred.resolve(mockMetadata);
|
|
89
|
-
await waitFor(() => {
|
|
90
|
-
expect(result.current.loading).toBe(false);
|
|
91
|
-
});
|
|
92
|
-
expect(result.current.columns).toHaveLength(4);
|
|
93
|
-
expect(result.current.columns[0]).toEqual({
|
|
94
|
-
accessorKey: "id",
|
|
95
|
-
header: "ID"
|
|
96
|
-
});
|
|
97
|
-
expect(result.current.columns[1]).toEqual({
|
|
98
|
-
accessorKey: "name",
|
|
99
|
-
header: "Name"
|
|
100
|
-
});
|
|
101
|
-
expect(result.current.columns[2]).toEqual({
|
|
102
|
-
accessorKey: "age",
|
|
103
|
-
header: "Age"
|
|
104
|
-
});
|
|
105
|
-
expect(result.current.columns[3]).toEqual({
|
|
106
|
-
accessorKey: "email",
|
|
107
|
-
header: "Email Address"
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
it("returns empty columns array when metadata has no properties", async () => {
|
|
111
|
-
const deferred = pDefer();
|
|
112
|
-
const fakeClient = {
|
|
113
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
114
|
-
};
|
|
115
|
-
const wrapper = createWrapper(fakeClient);
|
|
116
|
-
const {
|
|
117
|
-
result
|
|
118
|
-
} = renderHook(() => useColumnDefs(TestObjectType), {
|
|
119
|
-
wrapper
|
|
120
|
-
});
|
|
121
|
-
deferred.resolve({
|
|
122
|
-
...mockMetadata,
|
|
123
|
-
properties: undefined
|
|
124
|
-
});
|
|
125
|
-
await waitFor(() => {
|
|
126
|
-
expect(result.current.loading).toBe(false);
|
|
127
|
-
});
|
|
128
|
-
expect(result.current.columns).toEqual([]);
|
|
129
|
-
});
|
|
130
|
-
it("uses property key as header when displayName is not available", async () => {
|
|
131
|
-
const deferred = pDefer();
|
|
132
|
-
const fakeClient = {
|
|
133
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
134
|
-
};
|
|
135
|
-
const wrapper = createWrapper(fakeClient);
|
|
136
|
-
const {
|
|
137
|
-
result
|
|
138
|
-
} = renderHook(() => useColumnDefs(TestObjectType), {
|
|
139
|
-
wrapper
|
|
140
|
-
});
|
|
141
|
-
deferred.resolve({
|
|
142
|
-
...mockMetadata,
|
|
143
|
-
properties: {
|
|
144
|
-
noDisplayName: {
|
|
145
|
-
type: "string"
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
await waitFor(() => {
|
|
150
|
-
expect(result.current.loading).toBe(false);
|
|
151
|
-
});
|
|
152
|
-
expect(result.current.columns).toHaveLength(1);
|
|
153
|
-
expect(result.current.columns[0]).toEqual({
|
|
154
|
-
accessorKey: "noDisplayName",
|
|
155
|
-
header: "noDisplayName"
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
describe("when columnDefinitions is provided", () => {
|
|
160
|
-
it("builds columns from columnDefinitions with property locators", async () => {
|
|
161
|
-
const deferred = pDefer();
|
|
162
|
-
const fakeClient = {
|
|
163
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
164
|
-
};
|
|
165
|
-
const wrapper = createWrapper(fakeClient);
|
|
166
|
-
const columnDefinitions = [{
|
|
167
|
-
locator: {
|
|
168
|
-
type: "property",
|
|
169
|
-
id: "name"
|
|
170
|
-
},
|
|
171
|
-
width: 200,
|
|
172
|
-
minWidth: 100,
|
|
173
|
-
maxWidth: 400,
|
|
174
|
-
resizable: true,
|
|
175
|
-
orderable: true,
|
|
176
|
-
filterable: false
|
|
177
|
-
}, {
|
|
178
|
-
locator: {
|
|
179
|
-
type: "property",
|
|
180
|
-
id: "email"
|
|
181
|
-
}
|
|
182
|
-
}];
|
|
183
|
-
const {
|
|
184
|
-
result
|
|
185
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
186
|
-
wrapper
|
|
187
|
-
});
|
|
188
|
-
deferred.resolve(mockMetadata);
|
|
189
|
-
await waitFor(() => {
|
|
190
|
-
expect(result.current.loading).toBe(false);
|
|
191
|
-
});
|
|
192
|
-
expect(result.current.columns).toHaveLength(2);
|
|
193
|
-
const nameColumn = result.current.columns[0];
|
|
194
|
-
expect(nameColumn.id).toBe("name");
|
|
195
|
-
expect(nameColumn.accessorKey).toBe("name");
|
|
196
|
-
expect(nameColumn.header).toBe("Name");
|
|
197
|
-
expect(nameColumn.size).toBe(200);
|
|
198
|
-
expect(nameColumn.minSize).toBe(100);
|
|
199
|
-
expect(nameColumn.maxSize).toBe(400);
|
|
200
|
-
expect(nameColumn.enableResizing).toBe(true);
|
|
201
|
-
expect(nameColumn.enableSorting).toBe(true);
|
|
202
|
-
expect(nameColumn.enableColumnFilter).toBe(false);
|
|
203
|
-
const emailColumn = result.current.columns[1];
|
|
204
|
-
expect(emailColumn.id).toBe("email");
|
|
205
|
-
expect(emailColumn.accessorKey).toBe("email");
|
|
206
|
-
expect(emailColumn.header).toBe("Email Address");
|
|
207
|
-
});
|
|
208
|
-
it("builds columns from columnDefinitions even when metadata has no properties", async () => {
|
|
209
|
-
const columnDefinitions = [{
|
|
210
|
-
locator: {
|
|
211
|
-
type: "property",
|
|
212
|
-
id: "name"
|
|
213
|
-
},
|
|
214
|
-
width: 200,
|
|
215
|
-
minWidth: 100,
|
|
216
|
-
maxWidth: 400,
|
|
217
|
-
resizable: true,
|
|
218
|
-
orderable: true,
|
|
219
|
-
filterable: false
|
|
220
|
-
}, {
|
|
221
|
-
locator: {
|
|
222
|
-
type: "property",
|
|
223
|
-
id: "email"
|
|
224
|
-
}
|
|
225
|
-
}];
|
|
226
|
-
const deferred = pDefer();
|
|
227
|
-
const fakeClient = {
|
|
228
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
229
|
-
};
|
|
230
|
-
const wrapper = createWrapper(fakeClient);
|
|
231
|
-
const {
|
|
232
|
-
result
|
|
233
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
234
|
-
wrapper
|
|
235
|
-
});
|
|
236
|
-
deferred.resolve({
|
|
237
|
-
...mockMetadata,
|
|
238
|
-
properties: undefined
|
|
239
|
-
});
|
|
240
|
-
await waitFor(() => {
|
|
241
|
-
expect(result.current.loading).toBe(false);
|
|
242
|
-
});
|
|
243
|
-
expect(result.current.columns.length).toBe(2);
|
|
244
|
-
const nameColumn = result.current.columns[0];
|
|
245
|
-
expect(nameColumn.header).toBeUndefined();
|
|
246
|
-
const emailColumn = result.current.columns[1];
|
|
247
|
-
expect(emailColumn.header).toBeUndefined();
|
|
248
|
-
});
|
|
249
|
-
it("uses custom renderHeader when provided", async () => {
|
|
250
|
-
const deferred = pDefer();
|
|
251
|
-
const fakeClient = {
|
|
252
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
253
|
-
};
|
|
254
|
-
const wrapper = createWrapper(fakeClient);
|
|
255
|
-
const customHeader = () => /*#__PURE__*/React.createElement("div", null, "Custom Header");
|
|
256
|
-
const columnDefinitions = [{
|
|
257
|
-
locator: {
|
|
258
|
-
type: "property",
|
|
259
|
-
id: "name"
|
|
260
|
-
},
|
|
261
|
-
renderHeader: customHeader
|
|
262
|
-
}];
|
|
263
|
-
const {
|
|
264
|
-
result
|
|
265
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
266
|
-
wrapper
|
|
267
|
-
});
|
|
268
|
-
deferred.resolve(mockMetadata);
|
|
269
|
-
await waitFor(() => {
|
|
270
|
-
expect(result.current.loading).toBe(false);
|
|
271
|
-
});
|
|
272
|
-
expect(result.current.columns[0].header).toBe(customHeader);
|
|
273
|
-
});
|
|
274
|
-
it("uses custom renderCell when provided", async () => {
|
|
275
|
-
const deferred = pDefer();
|
|
276
|
-
const fakeClient = {
|
|
277
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
278
|
-
};
|
|
279
|
-
const wrapper = createWrapper(fakeClient);
|
|
280
|
-
const customRenderCell = vitest.fn(object => /*#__PURE__*/React.createElement("div", null, "Custom: ", object.name));
|
|
281
|
-
const columnDefinitions = [{
|
|
282
|
-
locator: {
|
|
283
|
-
type: "property",
|
|
284
|
-
id: "name"
|
|
285
|
-
},
|
|
286
|
-
renderCell: customRenderCell
|
|
287
|
-
}];
|
|
288
|
-
const {
|
|
289
|
-
result
|
|
290
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
291
|
-
wrapper
|
|
292
|
-
});
|
|
293
|
-
deferred.resolve(mockMetadata);
|
|
294
|
-
await waitFor(() => {
|
|
295
|
-
expect(result.current.loading).toBe(false);
|
|
296
|
-
});
|
|
297
|
-
const nameColumn = result.current.columns[0];
|
|
298
|
-
expect(nameColumn.cell).toBeDefined();
|
|
299
|
-
|
|
300
|
-
// Test the cell renderer
|
|
301
|
-
const mockObject = {
|
|
302
|
-
name: "John"
|
|
303
|
-
};
|
|
304
|
-
const mockCellContext = {
|
|
305
|
-
row: {
|
|
306
|
-
original: mockObject
|
|
307
|
-
},
|
|
308
|
-
getValue: () => "John"
|
|
309
|
-
};
|
|
310
|
-
if (typeof nameColumn.cell === "function") {
|
|
311
|
-
nameColumn.cell(mockCellContext);
|
|
312
|
-
}
|
|
313
|
-
expect(customRenderCell).toHaveBeenCalledWith(mockObject, {
|
|
314
|
-
type: "property",
|
|
315
|
-
id: "name"
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
it("defaults to getValue when renderCell is not provided", async () => {
|
|
319
|
-
const deferred = pDefer();
|
|
320
|
-
const fakeClient = {
|
|
321
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
322
|
-
};
|
|
323
|
-
const wrapper = createWrapper(fakeClient);
|
|
324
|
-
const columnDefinitions = [{
|
|
325
|
-
locator: {
|
|
326
|
-
type: "property",
|
|
327
|
-
id: "name"
|
|
328
|
-
}
|
|
329
|
-
}];
|
|
330
|
-
const {
|
|
331
|
-
result
|
|
332
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
333
|
-
wrapper
|
|
334
|
-
});
|
|
335
|
-
deferred.resolve(mockMetadata);
|
|
336
|
-
await waitFor(() => {
|
|
337
|
-
expect(result.current.loading).toBe(false);
|
|
338
|
-
});
|
|
339
|
-
const nameColumn = result.current.columns[0];
|
|
340
|
-
expect(nameColumn.cell).toBeDefined();
|
|
341
|
-
const mockGetValue = vitest.fn(() => "John");
|
|
342
|
-
let cellResult;
|
|
343
|
-
if (typeof nameColumn.cell === "function") {
|
|
344
|
-
cellResult = nameColumn.cell({
|
|
345
|
-
row: {
|
|
346
|
-
original: {
|
|
347
|
-
name: "John"
|
|
348
|
-
},
|
|
349
|
-
id: "row-1"
|
|
350
|
-
},
|
|
351
|
-
getValue: mockGetValue,
|
|
352
|
-
column: {
|
|
353
|
-
id: "name",
|
|
354
|
-
columnDef: {
|
|
355
|
-
meta: {}
|
|
356
|
-
}
|
|
357
|
-
},
|
|
358
|
-
table: {
|
|
359
|
-
options: {
|
|
360
|
-
meta: {}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
expect(cellResult).toEqual(/*#__PURE__*/React.createElement(React.Fragment, null, "John"));
|
|
366
|
-
expect(mockGetValue).toHaveBeenCalled();
|
|
367
|
-
});
|
|
368
|
-
it("handles function column locators", async () => {
|
|
369
|
-
const deferred = pDefer();
|
|
370
|
-
const fakeClient = {
|
|
371
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
372
|
-
};
|
|
373
|
-
const wrapper = createWrapper(fakeClient);
|
|
374
|
-
const columnDefinitions = [{
|
|
375
|
-
locator: {
|
|
376
|
-
type: "function",
|
|
377
|
-
id: "myFunction"
|
|
378
|
-
},
|
|
379
|
-
width: 150
|
|
380
|
-
}];
|
|
381
|
-
const {
|
|
382
|
-
result
|
|
383
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
384
|
-
wrapper
|
|
385
|
-
});
|
|
386
|
-
deferred.resolve(mockMetadata);
|
|
387
|
-
await waitFor(() => {
|
|
388
|
-
expect(result.current.loading).toBe(false);
|
|
389
|
-
});
|
|
390
|
-
expect(result.current.columns).toHaveLength(1);
|
|
391
|
-
const functionColumn = result.current.columns[0];
|
|
392
|
-
expect(functionColumn.id).toBe("myFunction");
|
|
393
|
-
expect(functionColumn.accessorKey).toBe("myFunction");
|
|
394
|
-
expect(functionColumn.header).toBeUndefined();
|
|
395
|
-
expect(functionColumn.size).toBe(150);
|
|
396
|
-
});
|
|
397
|
-
it("handles RDP column locators", async () => {
|
|
398
|
-
const deferred = pDefer();
|
|
399
|
-
const fakeClient = {
|
|
400
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
401
|
-
};
|
|
402
|
-
const wrapper = createWrapper(fakeClient);
|
|
403
|
-
const mockRdpCreator = vitest.fn();
|
|
404
|
-
const columnDefinitions = [{
|
|
405
|
-
locator: {
|
|
406
|
-
type: "rdp",
|
|
407
|
-
id: "myRdp",
|
|
408
|
-
creator: mockRdpCreator
|
|
409
|
-
},
|
|
410
|
-
width: 180
|
|
411
|
-
}];
|
|
412
|
-
const {
|
|
413
|
-
result
|
|
414
|
-
} = renderHook(() => useColumnDefs(TestObjectType, columnDefinitions), {
|
|
415
|
-
wrapper
|
|
416
|
-
});
|
|
417
|
-
deferred.resolve(mockMetadata);
|
|
418
|
-
await waitFor(() => {
|
|
419
|
-
expect(result.current.loading).toBe(false);
|
|
420
|
-
});
|
|
421
|
-
expect(result.current.columns).toHaveLength(1);
|
|
422
|
-
const rdpColumn = result.current.columns[0];
|
|
423
|
-
expect(rdpColumn.id).toBe("myRdp");
|
|
424
|
-
expect(rdpColumn.accessorKey).toBe("myRdp");
|
|
425
|
-
expect(rdpColumn.header).toBeUndefined();
|
|
426
|
-
expect(rdpColumn.size).toBe(180);
|
|
427
|
-
});
|
|
428
|
-
it("updates columns when columnDefinitions changed", async () => {
|
|
429
|
-
const deferred = pDefer();
|
|
430
|
-
const fakeClient = {
|
|
431
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
432
|
-
};
|
|
433
|
-
const wrapper = createWrapper(fakeClient);
|
|
434
|
-
const {
|
|
435
|
-
result,
|
|
436
|
-
rerender
|
|
437
|
-
} = renderHook(({
|
|
438
|
-
colDefs
|
|
439
|
-
}) => useColumnDefs(TestObjectType, colDefs), {
|
|
440
|
-
initialProps: {
|
|
441
|
-
colDefs: [{
|
|
442
|
-
locator: {
|
|
443
|
-
type: "property",
|
|
444
|
-
id: "name"
|
|
445
|
-
}
|
|
446
|
-
}]
|
|
447
|
-
},
|
|
448
|
-
wrapper
|
|
449
|
-
});
|
|
450
|
-
deferred.resolve(mockMetadata);
|
|
451
|
-
await waitFor(() => {
|
|
452
|
-
expect(result.current.loading).toBe(false);
|
|
453
|
-
});
|
|
454
|
-
const firstColumns = result.current.columns;
|
|
455
|
-
// Rerender with new columnDefinitions
|
|
456
|
-
rerender({
|
|
457
|
-
colDefs: [{
|
|
458
|
-
locator: {
|
|
459
|
-
type: "property",
|
|
460
|
-
id: "name"
|
|
461
|
-
}
|
|
462
|
-
}, {
|
|
463
|
-
locator: {
|
|
464
|
-
type: "property",
|
|
465
|
-
id: "email"
|
|
466
|
-
}
|
|
467
|
-
}]
|
|
468
|
-
});
|
|
469
|
-
|
|
470
|
-
// Updated columns should have two items
|
|
471
|
-
const updatedColumns = result.current.columns;
|
|
472
|
-
expect(firstColumns.length).toBe(1);
|
|
473
|
-
expect(updatedColumns.length).toBe(2);
|
|
474
|
-
});
|
|
475
|
-
});
|
|
476
|
-
it("handles metadata fetch errors", async () => {
|
|
477
|
-
const deferred = pDefer();
|
|
478
|
-
const fakeClient = {
|
|
479
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
480
|
-
};
|
|
481
|
-
const wrapper = createWrapper(fakeClient);
|
|
482
|
-
const {
|
|
483
|
-
result
|
|
484
|
-
} = renderHook(() => useColumnDefs(TestObjectType), {
|
|
485
|
-
wrapper
|
|
486
|
-
});
|
|
487
|
-
const error = new Error("Failed to fetch metadata");
|
|
488
|
-
deferred.reject(error);
|
|
489
|
-
await waitFor(() => {
|
|
490
|
-
expect(result.current.loading).toBe(false);
|
|
491
|
-
});
|
|
492
|
-
expect(result.current.error).toBeDefined();
|
|
493
|
-
expect(result.current.columns).toEqual([]);
|
|
494
|
-
});
|
|
495
|
-
it("memoizes columns based on metadata properties", async () => {
|
|
496
|
-
const deferred = pDefer();
|
|
497
|
-
const fakeClient = {
|
|
498
|
-
fetchMetadata: vitest.fn(() => deferred.promise)
|
|
499
|
-
};
|
|
500
|
-
const wrapper = createWrapper(fakeClient);
|
|
501
|
-
const {
|
|
502
|
-
result,
|
|
503
|
-
rerender
|
|
504
|
-
} = renderHook(() => useColumnDefs(TestObjectType), {
|
|
505
|
-
wrapper
|
|
506
|
-
});
|
|
507
|
-
deferred.resolve(mockMetadata);
|
|
508
|
-
await waitFor(() => {
|
|
509
|
-
expect(result.current.loading).toBe(false);
|
|
510
|
-
});
|
|
511
|
-
const firstColumns = result.current.columns;
|
|
512
|
-
|
|
513
|
-
// Rerender without changing metadata
|
|
514
|
-
rerender();
|
|
515
|
-
|
|
516
|
-
// Columns should be the same reference (memoized)
|
|
517
|
-
expect(result.current.columns).toBe(firstColumns);
|
|
518
|
-
});
|
|
519
|
-
});
|
|
520
|
-
//# sourceMappingURL=useColumnDefs.test.js.map
|