@osdk/react-components 0.1.0-beta.4 → 0.1.0-beta.5

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 (133) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/build/browser/base-components/checkbox/Checkbox.module.css +1 -2
  3. package/build/browser/object-table/ObjectTable.js +35 -9
  4. package/build/browser/object-table/ObjectTable.js.map +1 -1
  5. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  6. package/build/browser/object-table/Table.js +1 -1
  7. package/build/browser/object-table/Table.js.map +1 -1
  8. package/build/browser/object-table/Table.module.css +1 -0
  9. package/build/browser/object-table/TableCell.js +7 -4
  10. package/build/browser/object-table/TableCell.js.map +1 -1
  11. package/build/browser/object-table/TableCell.module.css +18 -1
  12. package/build/browser/object-table/TableHeader.js +28 -13
  13. package/build/browser/object-table/TableHeader.js.map +1 -1
  14. package/build/browser/object-table/TableHeader.module.css +17 -0
  15. package/build/browser/object-table/TableHeaderContent.js +27 -0
  16. package/build/browser/object-table/TableHeaderContent.js.map +1 -0
  17. package/build/browser/object-table/TableHeaderContent.module.css +30 -0
  18. package/build/browser/object-table/TableHeaderWithPopover.js +155 -0
  19. package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -0
  20. package/build/browser/object-table/TableHeaderWithPopover.module.css +105 -0
  21. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
  22. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
  23. package/build/browser/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
  24. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
  25. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
  26. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  27. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
  28. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
  29. package/build/browser/object-table/hooks/useColumnPinning.js +95 -0
  30. package/build/browser/object-table/hooks/useColumnPinning.js.map +1 -0
  31. package/build/{esm/object-table/hooks/useDefaultTableStates.js → browser/object-table/hooks/useColumnVisibility.js} +3 -5
  32. package/build/browser/object-table/hooks/useColumnVisibility.js.map +1 -0
  33. package/build/browser/object-table/hooks/useObjectTableData.js +15 -3
  34. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  35. package/build/browser/object-table/hooks/useSelectionColumn.js +3 -2
  36. package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -1
  37. package/build/browser/object-table/hooks/useTableSorting.js +66 -0
  38. package/build/browser/object-table/hooks/useTableSorting.js.map +1 -0
  39. package/build/browser/object-table/utils/constants.js +18 -0
  40. package/build/browser/object-table/utils/constants.js.map +1 -0
  41. package/build/browser/object-table/utils/getColumnPinningStyles.js +27 -0
  42. package/build/browser/object-table/utils/getColumnPinningStyles.js.map +1 -0
  43. package/build/browser/public/experimental.js +4 -0
  44. package/build/browser/public/experimental.js.map +1 -1
  45. package/build/cjs/public/experimental.cjs +412 -85
  46. package/build/cjs/public/experimental.cjs.map +1 -1
  47. package/build/cjs/public/experimental.css +113 -1
  48. package/build/cjs/public/experimental.css.map +1 -1
  49. package/build/cjs/public/experimental.d.cts +25 -3
  50. package/build/esm/base-components/checkbox/Checkbox.module.css +1 -2
  51. package/build/esm/object-table/ObjectTable.js +35 -9
  52. package/build/esm/object-table/ObjectTable.js.map +1 -1
  53. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  54. package/build/esm/object-table/Table.js +1 -1
  55. package/build/esm/object-table/Table.js.map +1 -1
  56. package/build/esm/object-table/Table.module.css +1 -0
  57. package/build/esm/object-table/TableCell.js +7 -4
  58. package/build/esm/object-table/TableCell.js.map +1 -1
  59. package/build/esm/object-table/TableCell.module.css +18 -1
  60. package/build/esm/object-table/TableHeader.js +28 -13
  61. package/build/esm/object-table/TableHeader.js.map +1 -1
  62. package/build/esm/object-table/TableHeader.module.css +17 -0
  63. package/build/esm/object-table/TableHeaderContent.js +27 -0
  64. package/build/esm/object-table/TableHeaderContent.js.map +1 -0
  65. package/build/esm/object-table/TableHeaderContent.module.css +30 -0
  66. package/build/esm/object-table/TableHeaderWithPopover.js +155 -0
  67. package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -0
  68. package/build/esm/object-table/TableHeaderWithPopover.module.css +105 -0
  69. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
  70. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
  71. package/build/esm/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
  72. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
  73. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
  74. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  75. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
  76. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
  77. package/build/esm/object-table/hooks/useColumnPinning.js +95 -0
  78. package/build/esm/object-table/hooks/useColumnPinning.js.map +1 -0
  79. package/build/{browser/object-table/hooks/useDefaultTableStates.js → esm/object-table/hooks/useColumnVisibility.js} +3 -5
  80. package/build/esm/object-table/hooks/useColumnVisibility.js.map +1 -0
  81. package/build/esm/object-table/hooks/useObjectTableData.js +15 -3
  82. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  83. package/build/esm/object-table/hooks/useSelectionColumn.js +3 -2
  84. package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -1
  85. package/build/esm/object-table/hooks/useTableSorting.js +66 -0
  86. package/build/esm/object-table/hooks/useTableSorting.js.map +1 -0
  87. package/build/esm/object-table/utils/constants.js +18 -0
  88. package/build/esm/object-table/utils/constants.js.map +1 -0
  89. package/build/esm/object-table/utils/getColumnPinningStyles.js +27 -0
  90. package/build/esm/object-table/utils/getColumnPinningStyles.js.map +1 -0
  91. package/build/esm/public/experimental.js +4 -0
  92. package/build/esm/public/experimental.js.map +1 -1
  93. package/build/types/object-table/ObjectTable.d.ts +1 -1
  94. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  95. package/build/types/object-table/ObjectTableApi.d.ts +10 -0
  96. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  97. package/build/types/object-table/Table.d.ts +2 -3
  98. package/build/types/object-table/Table.d.ts.map +1 -1
  99. package/build/types/object-table/TableCell.d.ts.map +1 -1
  100. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  101. package/build/types/object-table/TableHeaderContent.d.ts +7 -0
  102. package/build/types/object-table/TableHeaderContent.d.ts.map +1 -0
  103. package/build/types/object-table/TableHeaderWithPopover.d.ts +13 -0
  104. package/build/types/object-table/TableHeaderWithPopover.d.ts.map +1 -0
  105. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +1 -0
  106. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +1 -0
  107. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +1 -0
  108. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +1 -0
  109. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +1 -0
  110. package/build/types/object-table/hooks/useColumnPinning.d.ts +22 -0
  111. package/build/types/object-table/hooks/useColumnPinning.d.ts.map +1 -0
  112. package/build/types/object-table/hooks/{useDefaultTableStates.d.ts → useColumnVisibility.d.ts} +3 -6
  113. package/build/types/object-table/hooks/useColumnVisibility.d.ts.map +1 -0
  114. package/build/types/object-table/hooks/useObjectTableData.d.ts +2 -1
  115. package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
  116. package/build/types/object-table/hooks/useSelectionColumn.d.ts +0 -1
  117. package/build/types/object-table/hooks/useSelectionColumn.d.ts.map +1 -1
  118. package/build/types/object-table/hooks/useTableSorting.d.ts +22 -0
  119. package/build/types/object-table/hooks/useTableSorting.d.ts.map +1 -0
  120. package/build/types/object-table/utils/constants.d.ts +1 -0
  121. package/build/types/object-table/utils/constants.d.ts.map +1 -0
  122. package/build/types/object-table/utils/getColumnPinningStyles.d.ts +7 -0
  123. package/build/types/object-table/utils/getColumnPinningStyles.d.ts.map +1 -0
  124. package/build/types/public/experimental.d.ts +2 -0
  125. package/build/types/public/experimental.d.ts.map +1 -1
  126. package/package.json +5 -5
  127. package/build/browser/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
  128. package/build/browser/object-table/hooks/useDefaultTableStates.js.map +0 -1
  129. package/build/esm/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
  130. package/build/esm/object-table/hooks/useDefaultTableStates.js.map +0 -1
  131. package/build/types/object-table/hooks/__tests__/useDefaultTableStates.test.d.ts.map +0 -1
  132. package/build/types/object-table/hooks/useDefaultTableStates.d.ts.map +0 -1
  133. /package/build/types/object-table/hooks/__tests__/{useDefaultTableStates.test.d.ts → useColumnPinning.test.d.ts} +0 -0
@@ -16,19 +16,19 @@
16
16
 
17
17
  import { renderHook, waitFor } from "@testing-library/react";
18
18
  import { describe, expect, it } from "vitest";
19
- import { useDefaultTableStates } from "../useDefaultTableStates.js";
19
+ import { useColumnVisibility } from "../useColumnVisibility.js";
20
20
  const TestObjectType = {
21
21
  type: "object",
22
22
  apiName: "TestObject"
23
23
  };
24
- describe(useDefaultTableStates, () => {
24
+ describe(useColumnVisibility, () => {
25
25
  it("returns undefined columnVisibility when no columnDefinitions provided", () => {
26
26
  const {
27
27
  result
28
- } = renderHook(() => useDefaultTableStates({
28
+ } = renderHook(() => useColumnVisibility({
29
29
  columnDefinitions: undefined
30
30
  }));
31
- expect(result.current.columnVisibility).toBeUndefined();
31
+ expect(result.current).toBeUndefined();
32
32
  });
33
33
  it("returns empty columnVisibility when columnDefinitions have no isVisible properties", () => {
34
34
  const columnDefinitions = [{
@@ -44,10 +44,10 @@ describe(useDefaultTableStates, () => {
44
44
  }];
45
45
  const {
46
46
  result
47
- } = renderHook(() => useDefaultTableStates({
47
+ } = renderHook(() => useColumnVisibility({
48
48
  columnDefinitions
49
49
  }));
50
- expect(result.current.columnVisibility).toEqual({});
50
+ expect(result.current).toEqual({});
51
51
  });
52
52
  it("handles mixed column types with different visibility states", async () => {
53
53
  const columnDefinitions = [{
@@ -77,11 +77,11 @@ describe(useDefaultTableStates, () => {
77
77
  }];
78
78
  const {
79
79
  result
80
- } = renderHook(() => useDefaultTableStates({
80
+ } = renderHook(() => useColumnVisibility({
81
81
  columnDefinitions
82
82
  }));
83
83
  await waitFor(() => {
84
- expect(result.current.columnVisibility).toEqual({
84
+ expect(result.current).toEqual({
85
85
  name: true,
86
86
  myFunction: false,
87
87
  myRdp: true
@@ -94,7 +94,7 @@ describe(useDefaultTableStates, () => {
94
94
  rerender
95
95
  } = renderHook(({
96
96
  columnDefinitions
97
- }) => useDefaultTableStates({
97
+ }) => useColumnVisibility({
98
98
  columnDefinitions
99
99
  }), {
100
100
  initialProps: {
@@ -108,7 +108,7 @@ describe(useDefaultTableStates, () => {
108
108
  }
109
109
  });
110
110
  await waitFor(() => {
111
- expect(result.current.columnVisibility).toEqual({
111
+ expect(result.current).toEqual({
112
112
  name: true
113
113
  });
114
114
  });
@@ -128,7 +128,7 @@ describe(useDefaultTableStates, () => {
128
128
  }]
129
129
  });
130
130
  await waitFor(() => {
131
- expect(result.current.columnVisibility).toEqual({
131
+ expect(result.current).toEqual({
132
132
  name: false,
133
133
  email: true
134
134
  });
@@ -160,19 +160,19 @@ describe(useDefaultTableStates, () => {
160
160
  }];
161
161
  const {
162
162
  result
163
- } = renderHook(() => useDefaultTableStates({
163
+ } = renderHook(() => useColumnVisibility({
164
164
  columnDefinitions
165
165
  }));
166
166
  await waitFor(() => {
167
- expect(result.current.columnVisibility).toEqual({
167
+ expect(result.current).toEqual({
168
168
  name: true,
169
169
  age: false
170
170
  });
171
171
  });
172
172
 
173
173
  // Verify that columns without isVisible are not in the state
174
- expect(result.current.columnVisibility).not.toHaveProperty("email");
175
- expect(result.current.columnVisibility).not.toHaveProperty("id");
174
+ expect(result.current).not.toHaveProperty("email");
175
+ expect(result.current).not.toHaveProperty("id");
176
176
  });
177
177
  });
178
- //# sourceMappingURL=useDefaultTableStates.test.js.map
178
+ //# sourceMappingURL=useColumnVisibility.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnVisibility.test.js","names":["renderHook","waitFor","describe","expect","it","useColumnVisibility","TestObjectType","type","apiName","result","columnDefinitions","undefined","current","toBeUndefined","locator","id","toEqual","isVisible","creator","name","myFunction","myRdp","rerender","initialProps","email","age","not","toHaveProperty"],"sources":["useColumnVisibility.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 {\n DerivedProperty,\n ObjectTypeDefinition,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { renderHook, waitFor } from \"@testing-library/react\";\nimport { describe, expect, it } from \"vitest\";\nimport type { ColumnDefinition } from \"../../ObjectTableApi.js\";\nimport { useColumnVisibility } from \"../useColumnVisibility.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\ntype TestObjectKeys = PropertyKeys<TestObject>;\n\ndescribe(useColumnVisibility, () => {\n it(\"returns undefined columnVisibility when no columnDefinitions provided\", () => {\n const { result } = renderHook(() =>\n useColumnVisibility({\n columnDefinitions: undefined,\n })\n );\n\n expect(result.current).toBeUndefined();\n });\n\n it(\"returns empty columnVisibility when columnDefinitions have no isVisible properties\", () => {\n const columnDefinitions: Array<ColumnDefinition<TestObject, {}, {}>> = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n },\n {\n locator: { type: \"property\", id: \"email\" as TestObjectKeys },\n },\n ];\n\n const { result } = renderHook(() =>\n useColumnVisibility({\n columnDefinitions,\n })\n );\n\n expect(result.current).toEqual({});\n });\n\n it(\"handles mixed column types with different visibility states\", async () => {\n const mockRdpCreator = (() => ({})) as unknown as DerivedProperty.Creator<\n TestObject,\n SimplePropertyDef\n >;\n\n const columnDefinitions: Array<\n ColumnDefinition<\n TestObject,\n { myRdp: SimplePropertyDef },\n { myFunction: QueryDefinition<{}> }\n >\n > = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n isVisible: true,\n },\n {\n locator: { type: \"function\", id: \"myFunction\" },\n isVisible: false,\n },\n {\n locator: { type: \"rdp\", id: \"myRdp\", creator: mockRdpCreator },\n isVisible: true,\n },\n {\n locator: { type: \"property\", id: \"email\" as TestObjectKeys },\n },\n ];\n\n const { result } = renderHook(() =>\n useColumnVisibility({\n columnDefinitions,\n })\n );\n\n await waitFor(() => {\n expect(result.current).toEqual({\n name: true,\n myFunction: false,\n myRdp: true,\n });\n });\n });\n\n it(\"updates columnVisibility when columnDefinitions change\", async () => {\n const initialColumnDefinitions: Array<\n ColumnDefinition<TestObject, {}, {}>\n > = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n isVisible: true,\n },\n ];\n\n const { result, rerender } = renderHook(\n ({ columnDefinitions }) =>\n useColumnVisibility({\n columnDefinitions,\n }),\n {\n initialProps: { columnDefinitions: initialColumnDefinitions },\n },\n );\n\n await waitFor(() => {\n expect(result.current).toEqual({\n name: true,\n });\n });\n\n const updatedColumnDefinitions: Array<\n ColumnDefinition<TestObject, {}, {}>\n > = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n isVisible: false,\n },\n {\n locator: { type: \"property\", id: \"email\" as TestObjectKeys },\n isVisible: true,\n },\n ];\n\n rerender({ columnDefinitions: updatedColumnDefinitions });\n\n await waitFor(() => {\n expect(result.current).toEqual({\n name: false,\n email: true,\n });\n });\n });\n\n it(\"only includes columns with explicit isVisible in the visibility state\", async () => {\n const columnDefinitions: Array<ColumnDefinition<TestObject, {}, {}>> = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n isVisible: true,\n },\n {\n locator: { type: \"property\", id: \"email\" as TestObjectKeys },\n },\n {\n locator: { type: \"property\", id: \"age\" as TestObjectKeys },\n isVisible: false,\n },\n {\n locator: { type: \"property\", id: \"id\" as TestObjectKeys },\n },\n ];\n\n const { result } = renderHook(() =>\n useColumnVisibility({\n columnDefinitions,\n })\n );\n\n await waitFor(() => {\n expect(result.current).toEqual({\n name: true,\n age: false,\n });\n });\n\n // Verify that columns without isVisible are not in the state\n expect(result.current).not.toHaveProperty(\"email\");\n expect(result.current).not.toHaveProperty(\"id\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -16,7 +16,8 @@
16
16
 
17
17
  import { renderHook } from "@testing-library/react";
18
18
  import { describe, expect, it, vi } from "vitest";
19
- import { SELECTION_COLUMN_ID, useSelectionColumn } from "../useSelectionColumn.js";
19
+ import { SELECTION_COLUMN_ID } from "../../utils/constants.js";
20
+ import { useSelectionColumn } from "../useSelectionColumn.js";
20
21
  const TestObjectType = {
21
22
  type: "object",
22
23
  apiName: "TestObject"
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectionColumn.test.js","names":["renderHook","describe","expect","it","vi","SELECTION_COLUMN_ID","useSelectionColumn","TestObjectType","type","apiName","result","selectionMode","isAllSelected","hasSelection","onToggleAll","fn","onToggleRow","current","toBeNull","not","toMatchObject","id","size","minSize","maxSize","enableSorting","enableResizing","columnDef","headerResult","header","cell","toBeDefined","rerender","initialProps","firstResult","toBe"],"sources":["useSelectionColumn.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 } from \"@osdk/api\";\nimport { renderHook } from \"@testing-library/react\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport {\n SELECTION_COLUMN_ID,\n useSelectionColumn,\n} from \"../useSelectionColumn.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\n\ndescribe(\"useSelectionColumn\", () => {\n describe(\"selectionMode: 'none'\", () => {\n it(\"returns null when selection is disabled\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"none\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).toBeNull();\n });\n\n it(\"returns null even with selection state\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"none\",\n isAllSelected: true,\n hasSelection: true,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).toBeNull();\n });\n });\n\n describe(\"selectionMode: 'single'\", () => {\n it(\"returns column definition with correct properties\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).not.toBeNull();\n expect(result.current).toMatchObject({\n id: SELECTION_COLUMN_ID,\n size: 50,\n minSize: 50,\n maxSize: 50,\n enableSorting: false,\n enableResizing: false,\n });\n });\n\n it(\"has header function that returns null for single mode\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n\n // Call header function\n const headerResult = typeof columnDef?.header === \"function\"\n ? columnDef.header({} as any)\n : null;\n\n expect(headerResult).toBeNull();\n });\n\n it(\"has cell function defined\", () => {\n const onToggleRow = vi.fn();\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow,\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n expect(columnDef?.cell).toBeDefined();\n });\n\n it(\"memoizes column definition based on dependencies\", () => {\n const onToggleRow = vi.fn();\n const onToggleAll = vi.fn();\n\n const { result, rerender } = renderHook(\n ({ isAllSelected, hasSelection }) =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n }),\n {\n initialProps: { isAllSelected: false, hasSelection: false },\n },\n );\n\n const firstResult = result.current;\n\n // Rerender with same props\n rerender({ isAllSelected: false, hasSelection: false });\n expect(result.current).toBe(firstResult);\n\n // Rerender with different hasSelection\n rerender({ isAllSelected: false, hasSelection: true });\n expect(result.current).not.toBe(firstResult);\n });\n });\n\n describe(\"selectionMode: 'multiple'\", () => {\n it(\"returns column definition with correct properties\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).not.toBeNull();\n expect(result.current).toMatchObject({\n id: SELECTION_COLUMN_ID,\n size: 50,\n minSize: 50,\n maxSize: 50,\n enableSorting: false,\n enableResizing: false,\n });\n });\n\n it(\"has header function that renders SelectionHeaderCell\", () => {\n const onToggleAll = vi.fn();\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll,\n onToggleRow: vi.fn(),\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n\n // Render header\n const headerResult = typeof columnDef?.header === \"function\"\n ? columnDef.header({} as any)\n : null;\n\n expect(headerResult).not.toBeNull();\n });\n\n it(\"has cell function defined\", () => {\n const onToggleRow = vi.fn();\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow,\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n expect(columnDef?.cell).toBeDefined();\n });\n\n it(\"memoizes column when dependencies don't change\", () => {\n const onToggleRow = vi.fn();\n const onToggleAll = vi.fn();\n\n const { result, rerender } = renderHook(\n ({ isAllSelected, hasSelection }) =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n }),\n {\n initialProps: { isAllSelected: false, hasSelection: false },\n },\n );\n\n const firstResult = result.current;\n\n // Rerender with same props\n rerender({ isAllSelected: false, hasSelection: false });\n expect(result.current).toBe(firstResult);\n });\n\n it(\"updates column when dependencies change\", () => {\n const onToggleRow = vi.fn();\n const onToggleAll = vi.fn();\n\n const { result, rerender } = renderHook(\n ({ isAllSelected, hasSelection }) =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n }),\n {\n initialProps: { isAllSelected: false, hasSelection: false },\n },\n );\n\n const firstResult = result.current;\n\n // Change isAllSelected\n rerender({ isAllSelected: true, hasSelection: true });\n expect(result.current).not.toBe(firstResult);\n });\n });\n\n describe(\"column definition structure\", () => {\n it(\"disables sorting and resizing\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n const columnDef = result.current;\n expect(columnDef?.enableSorting).toBe(false);\n expect(columnDef?.enableResizing).toBe(false);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useSelectionColumn.test.js","names":["renderHook","describe","expect","it","vi","SELECTION_COLUMN_ID","useSelectionColumn","TestObjectType","type","apiName","result","selectionMode","isAllSelected","hasSelection","onToggleAll","fn","onToggleRow","current","toBeNull","not","toMatchObject","id","size","minSize","maxSize","enableSorting","enableResizing","columnDef","headerResult","header","cell","toBeDefined","rerender","initialProps","firstResult","toBe"],"sources":["useSelectionColumn.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 } from \"@osdk/api\";\nimport { renderHook } from \"@testing-library/react\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { SELECTION_COLUMN_ID } from \"../../utils/constants.js\";\nimport { useSelectionColumn } from \"../useSelectionColumn.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\n\ndescribe(\"useSelectionColumn\", () => {\n describe(\"selectionMode: 'none'\", () => {\n it(\"returns null when selection is disabled\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"none\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).toBeNull();\n });\n\n it(\"returns null even with selection state\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"none\",\n isAllSelected: true,\n hasSelection: true,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).toBeNull();\n });\n });\n\n describe(\"selectionMode: 'single'\", () => {\n it(\"returns column definition with correct properties\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).not.toBeNull();\n expect(result.current).toMatchObject({\n id: SELECTION_COLUMN_ID,\n size: 50,\n minSize: 50,\n maxSize: 50,\n enableSorting: false,\n enableResizing: false,\n });\n });\n\n it(\"has header function that returns null for single mode\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n\n // Call header function\n const headerResult = typeof columnDef?.header === \"function\"\n ? columnDef.header({} as any)\n : null;\n\n expect(headerResult).toBeNull();\n });\n\n it(\"has cell function defined\", () => {\n const onToggleRow = vi.fn();\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow,\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n expect(columnDef?.cell).toBeDefined();\n });\n\n it(\"memoizes column definition based on dependencies\", () => {\n const onToggleRow = vi.fn();\n const onToggleAll = vi.fn();\n\n const { result, rerender } = renderHook(\n ({ isAllSelected, hasSelection }) =>\n useSelectionColumn<TestObject>({\n selectionMode: \"single\",\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n }),\n {\n initialProps: { isAllSelected: false, hasSelection: false },\n },\n );\n\n const firstResult = result.current;\n\n // Rerender with same props\n rerender({ isAllSelected: false, hasSelection: false });\n expect(result.current).toBe(firstResult);\n\n // Rerender with different hasSelection\n rerender({ isAllSelected: false, hasSelection: true });\n expect(result.current).not.toBe(firstResult);\n });\n });\n\n describe(\"selectionMode: 'multiple'\", () => {\n it(\"returns column definition with correct properties\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n expect(result.current).not.toBeNull();\n expect(result.current).toMatchObject({\n id: SELECTION_COLUMN_ID,\n size: 50,\n minSize: 50,\n maxSize: 50,\n enableSorting: false,\n enableResizing: false,\n });\n });\n\n it(\"has header function that renders SelectionHeaderCell\", () => {\n const onToggleAll = vi.fn();\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll,\n onToggleRow: vi.fn(),\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n\n // Render header\n const headerResult = typeof columnDef?.header === \"function\"\n ? columnDef.header({} as any)\n : null;\n\n expect(headerResult).not.toBeNull();\n });\n\n it(\"has cell function defined\", () => {\n const onToggleRow = vi.fn();\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow,\n })\n );\n\n const columnDef = result.current;\n expect(columnDef).not.toBeNull();\n expect(columnDef?.cell).toBeDefined();\n });\n\n it(\"memoizes column when dependencies don't change\", () => {\n const onToggleRow = vi.fn();\n const onToggleAll = vi.fn();\n\n const { result, rerender } = renderHook(\n ({ isAllSelected, hasSelection }) =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n }),\n {\n initialProps: { isAllSelected: false, hasSelection: false },\n },\n );\n\n const firstResult = result.current;\n\n // Rerender with same props\n rerender({ isAllSelected: false, hasSelection: false });\n expect(result.current).toBe(firstResult);\n });\n\n it(\"updates column when dependencies change\", () => {\n const onToggleRow = vi.fn();\n const onToggleAll = vi.fn();\n\n const { result, rerender } = renderHook(\n ({ isAllSelected, hasSelection }) =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n }),\n {\n initialProps: { isAllSelected: false, hasSelection: false },\n },\n );\n\n const firstResult = result.current;\n\n // Change isAllSelected\n rerender({ isAllSelected: true, hasSelection: true });\n expect(result.current).not.toBe(firstResult);\n });\n });\n\n describe(\"column definition structure\", () => {\n it(\"disables sorting and resizing\", () => {\n const { result } = renderHook(() =>\n useSelectionColumn<TestObject>({\n selectionMode: \"multiple\",\n isAllSelected: false,\n hasSelection: false,\n onToggleAll: vi.fn(),\n onToggleRow: vi.fn(),\n })\n );\n\n const columnDef = result.current;\n expect(columnDef?.enableSorting).toBe(false);\n expect(columnDef?.enableResizing).toBe(false);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,211 @@
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 { useTableSorting } from "../useTableSorting.js";
20
+ const TestObjectType = {
21
+ type: "object",
22
+ apiName: "TestObject"
23
+ };
24
+ describe("useTableSorting", () => {
25
+ describe("uncontrolled mode", () => {
26
+ it("initializes with empty sorting state when no defaultOrderBy provided", () => {
27
+ const {
28
+ result
29
+ } = renderHook(() => useTableSorting({}));
30
+ expect(result.current.sorting).toEqual([]);
31
+ });
32
+ it("initializes with defaultOrderBy when provided", () => {
33
+ const defaultOrderBy = [{
34
+ property: "name",
35
+ direction: "asc"
36
+ }, {
37
+ property: "age",
38
+ direction: "desc"
39
+ }];
40
+ const {
41
+ result
42
+ } = renderHook(() => useTableSorting({
43
+ defaultOrderBy
44
+ }));
45
+ expect(result.current.sorting).toEqual([{
46
+ id: "name",
47
+ desc: false
48
+ }, {
49
+ id: "age",
50
+ desc: true
51
+ }]);
52
+ });
53
+ it("updates internal sorting state when onSortingChange is called", () => {
54
+ const {
55
+ result
56
+ } = renderHook(() => useTableSorting({}));
57
+ expect(result.current.sorting).toEqual([]);
58
+ act(() => {
59
+ result.current.onSortingChange([{
60
+ id: "name",
61
+ desc: false
62
+ }]);
63
+ });
64
+ expect(result.current.sorting).toEqual([{
65
+ id: "name",
66
+ desc: false
67
+ }]);
68
+ });
69
+ it("calls onOrderByChanged with converted format when sorting changes", () => {
70
+ const onOrderByChanged = vi.fn();
71
+ const {
72
+ result
73
+ } = renderHook(() => useTableSorting({
74
+ onOrderByChanged
75
+ }));
76
+ act(() => {
77
+ result.current.onSortingChange([{
78
+ id: "name",
79
+ desc: false
80
+ }, {
81
+ id: "age",
82
+ desc: true
83
+ }]);
84
+ });
85
+ expect(onOrderByChanged).toHaveBeenCalledWith([{
86
+ property: "name",
87
+ direction: "asc"
88
+ }, {
89
+ property: "age",
90
+ direction: "desc"
91
+ }]);
92
+ });
93
+ it("handles clearing sorting", () => {
94
+ const onOrderByChanged = vi.fn();
95
+ const {
96
+ result
97
+ } = renderHook(() => useTableSorting({
98
+ defaultOrderBy: [{
99
+ property: "name",
100
+ direction: "asc"
101
+ }],
102
+ onOrderByChanged
103
+ }));
104
+ expect(result.current.sorting).toEqual([{
105
+ id: "name",
106
+ desc: false
107
+ }]);
108
+ act(() => {
109
+ result.current.onSortingChange([]);
110
+ });
111
+ expect(result.current.sorting).toEqual([]);
112
+ expect(onOrderByChanged).toHaveBeenCalledWith([]);
113
+ });
114
+ });
115
+ describe("controlled mode", () => {
116
+ it("uses orderBy prop for sorting state", () => {
117
+ const orderBy = [{
118
+ property: "name",
119
+ direction: "asc"
120
+ }];
121
+ const {
122
+ result
123
+ } = renderHook(() => useTableSorting({
124
+ orderBy
125
+ }));
126
+ expect(result.current.sorting).toEqual([{
127
+ id: "name",
128
+ desc: false
129
+ }]);
130
+ });
131
+ it("when both orderBy and defaultOrderBy are provided, orderBy takes precedence", () => {
132
+ const orderBy = [{
133
+ property: "name",
134
+ direction: "asc"
135
+ }];
136
+ const defaultOrderBy = [{
137
+ property: "age",
138
+ direction: "asc"
139
+ }];
140
+ const {
141
+ result
142
+ } = renderHook(() => useTableSorting({
143
+ orderBy,
144
+ defaultOrderBy
145
+ }));
146
+ expect(result.current.sorting).toEqual([{
147
+ id: "name",
148
+ desc: false
149
+ }]);
150
+ });
151
+ it("calls onOrderByChanged when sorting changes but does not update internal state", () => {
152
+ const onOrderByChanged = vi.fn();
153
+ const {
154
+ result,
155
+ rerender
156
+ } = renderHook(({
157
+ orderBy
158
+ }) => useTableSorting({
159
+ orderBy,
160
+ onOrderByChanged
161
+ }), {
162
+ initialProps: {
163
+ orderBy: [{
164
+ property: "name",
165
+ direction: "asc"
166
+ }]
167
+ }
168
+ });
169
+ expect(result.current.sorting).toEqual([{
170
+ id: "name",
171
+ desc: false
172
+ }]);
173
+
174
+ // Change sorting
175
+ act(() => {
176
+ result.current.onSortingChange([{
177
+ id: "age",
178
+ desc: true
179
+ }]);
180
+ });
181
+
182
+ // Callback is called
183
+ expect(onOrderByChanged).toHaveBeenCalledWith([{
184
+ property: "age",
185
+ direction: "desc"
186
+ }]);
187
+
188
+ // State doesn't change (controlled)
189
+ expect(result.current.sorting).toEqual([{
190
+ id: "name",
191
+ desc: false
192
+ }]);
193
+
194
+ // Parent updates prop
195
+
196
+ rerender({
197
+ orderBy: [{
198
+ property: "age",
199
+ direction: "desc"
200
+ }]
201
+ });
202
+
203
+ // Now state reflects the prop
204
+ expect(result.current.sorting).toEqual([{
205
+ id: "age",
206
+ desc: true
207
+ }]);
208
+ });
209
+ });
210
+ });
211
+ //# sourceMappingURL=useTableSorting.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableSorting.test.js","names":["act","renderHook","describe","expect","it","vi","useTableSorting","TestObjectType","type","apiName","result","current","sorting","toEqual","defaultOrderBy","property","direction","id","desc","onSortingChange","onOrderByChanged","fn","toHaveBeenCalledWith","orderBy","rerender","initialProps"],"sources":["useTableSorting.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, PropertyKeys } from \"@osdk/api\";\nimport { act, renderHook } from \"@testing-library/react\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { useTableSorting } from \"../useTableSorting.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\n\ndescribe(\"useTableSorting\", () => {\n describe(\"uncontrolled mode\", () => {\n it(\"initializes with empty sorting state when no defaultOrderBy provided\", () => {\n const { result } = renderHook(() => useTableSorting({}));\n\n expect(result.current.sorting).toEqual([]);\n });\n\n it(\"initializes with defaultOrderBy when provided\", () => {\n const defaultOrderBy: Array<{\n property: PropertyKeys<TestObject>;\n direction: \"asc\" | \"desc\";\n }> = [\n { property: \"name\" as PropertyKeys<TestObject>, direction: \"asc\" },\n { property: \"age\" as PropertyKeys<TestObject>, direction: \"desc\" },\n ];\n\n const { result } = renderHook(() =>\n useTableSorting<TestObject>({\n defaultOrderBy,\n })\n );\n\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n { id: \"age\", desc: true },\n ]);\n });\n\n it(\"updates internal sorting state when onSortingChange is called\", () => {\n const { result } = renderHook(() => useTableSorting<TestObject>({}));\n\n expect(result.current.sorting).toEqual([]);\n\n act(() => {\n result.current.onSortingChange([\n { id: \"name\", desc: false },\n ]);\n });\n\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n ]);\n });\n\n it(\"calls onOrderByChanged with converted format when sorting changes\", () => {\n const onOrderByChanged = vi.fn();\n const { result } = renderHook(() =>\n useTableSorting<TestObject>({\n onOrderByChanged,\n })\n );\n\n act(() => {\n result.current.onSortingChange([\n { id: \"name\", desc: false },\n { id: \"age\", desc: true },\n ]);\n });\n\n expect(onOrderByChanged).toHaveBeenCalledWith([\n { property: \"name\", direction: \"asc\" },\n { property: \"age\", direction: \"desc\" },\n ]);\n });\n\n it(\"handles clearing sorting\", () => {\n const onOrderByChanged = vi.fn();\n const { result } = renderHook(() =>\n useTableSorting<TestObject>({\n defaultOrderBy: [\n { property: \"name\" as PropertyKeys<TestObject>, direction: \"asc\" },\n ],\n onOrderByChanged,\n })\n );\n\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n ]);\n\n act(() => {\n result.current.onSortingChange([]);\n });\n\n expect(result.current.sorting).toEqual([]);\n expect(onOrderByChanged).toHaveBeenCalledWith([]);\n });\n });\n\n describe(\"controlled mode\", () => {\n it(\"uses orderBy prop for sorting state\", () => {\n const orderBy: Array<{\n property: PropertyKeys<TestObject>;\n direction: \"asc\" | \"desc\";\n }> = [\n { property: \"name\" as PropertyKeys<TestObject>, direction: \"asc\" },\n ];\n\n const { result } = renderHook(() =>\n useTableSorting<TestObject>({\n orderBy,\n })\n );\n\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n ]);\n });\n\n it(\"when both orderBy and defaultOrderBy are provided, orderBy takes precedence\", () => {\n const orderBy: Array<{\n property: PropertyKeys<TestObject>;\n direction: \"asc\" | \"desc\";\n }> = [\n { property: \"name\" as PropertyKeys<TestObject>, direction: \"asc\" },\n ];\n\n const defaultOrderBy: Array<{\n property: PropertyKeys<TestObject>;\n direction: \"asc\" | \"desc\";\n }> = [\n { property: \"age\" as PropertyKeys<TestObject>, direction: \"asc\" },\n ];\n\n const { result } = renderHook(() =>\n useTableSorting<TestObject>({\n orderBy,\n defaultOrderBy,\n })\n );\n\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n ]);\n });\n\n it(\"calls onOrderByChanged when sorting changes but does not update internal state\", () => {\n const onOrderByChanged = vi.fn();\n const orderBy: Array<{\n property: PropertyKeys<TestObject>;\n direction: \"asc\" | \"desc\";\n }> = [\n { property: \"name\" as PropertyKeys<TestObject>, direction: \"asc\" },\n ];\n\n const { result, rerender } = renderHook(\n ({ orderBy }) =>\n useTableSorting<TestObject>({\n orderBy,\n onOrderByChanged,\n }),\n {\n initialProps: { orderBy },\n },\n );\n\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n ]);\n\n // Change sorting\n act(() => {\n result.current.onSortingChange([\n { id: \"age\", desc: true },\n ]);\n });\n\n // Callback is called\n expect(onOrderByChanged).toHaveBeenCalledWith([\n { property: \"age\", direction: \"desc\" },\n ]);\n\n // State doesn't change (controlled)\n expect(result.current.sorting).toEqual([\n { id: \"name\", desc: false },\n ]);\n\n // Parent updates prop\n const newOrderBy: Array<{\n property: PropertyKeys<TestObject>;\n direction: \"asc\" | \"desc\";\n }> = [\n { property: \"age\" as PropertyKeys<TestObject>, direction: \"desc\" },\n ];\n rerender({ orderBy: newOrderBy });\n\n // Now state reflects the prop\n expect(result.current.sorting).toEqual([\n { id: \"age\", desc: true },\n ]);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,95 @@
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 { useCallback, useEffect, useState } from "react";
18
+ import { SELECTION_COLUMN_ID } from "../utils/constants.js";
19
+ export const useColumnPinning = ({
20
+ columnDefinitions,
21
+ hasSelectionColumn,
22
+ onColumnsPinnedChanged
23
+ }) => {
24
+ const [columnPinning, setColumnPinning] = useState({
25
+ left: [],
26
+ right: []
27
+ });
28
+
29
+ // Update column pinning when columnDefinitions change
30
+ useEffect(() => {
31
+ const defaultState = getColumnPinningStateFromColumnDefs(columnDefinitions);
32
+ const selectionCol = hasSelectionColumn ? [SELECTION_COLUMN_ID] : [];
33
+ setColumnPinning({
34
+ left: [...selectionCol, ...(defaultState.left ?? [])],
35
+ right: [...(defaultState.right ?? [])]
36
+ });
37
+ }, [columnDefinitions, hasSelectionColumn]);
38
+ const onColumnPinningChange = useCallback(updater => {
39
+ setColumnPinning(prev => {
40
+ const newPinning = typeof updater === "function" ? updater(prev) : updater;
41
+ if (onColumnsPinnedChanged) {
42
+ const newStates = convertColumnPinningStateToArray(newPinning);
43
+ const stateWithoutSelectionCol = newStates.filter(state => state.columnId !== SELECTION_COLUMN_ID);
44
+ onColumnsPinnedChanged(stateWithoutSelectionCol);
45
+ }
46
+ return newPinning;
47
+ });
48
+ }, [onColumnsPinnedChanged]);
49
+ return {
50
+ columnPinning,
51
+ onColumnPinningChange
52
+ };
53
+ };
54
+ const getColumnPinningStateFromColumnDefs = columnDefinitions => {
55
+ if (!columnDefinitions) {
56
+ return {};
57
+ }
58
+ const columnPinningState = columnDefinitions.reduce((acc, {
59
+ locator,
60
+ pinned
61
+ }) => {
62
+ const colKey = locator.id.toString();
63
+ if (!(pinned != null && pinned !== "none")) {
64
+ return acc;
65
+ }
66
+ if (pinned === "left") {
67
+ return {
68
+ ...acc,
69
+ left: [...(acc.left ?? []), colKey]
70
+ };
71
+ }
72
+ return {
73
+ ...acc,
74
+ right: [...(acc.right ?? []), colKey]
75
+ };
76
+ }, {
77
+ left: [],
78
+ right: []
79
+ });
80
+ return columnPinningState;
81
+ };
82
+
83
+ /**
84
+ * Converts ColumnPinningState to array format for the callback
85
+ */
86
+ function convertColumnPinningStateToArray(pinningState) {
87
+ return [...(pinningState.left ?? []).map(columnId => ({
88
+ columnId,
89
+ pinned: "left"
90
+ })), ...(pinningState.right ?? []).map(columnId => ({
91
+ columnId,
92
+ pinned: "right"
93
+ }))];
94
+ }
95
+ //# sourceMappingURL=useColumnPinning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnPinning.js","names":["useCallback","useEffect","useState","SELECTION_COLUMN_ID","useColumnPinning","columnDefinitions","hasSelectionColumn","onColumnsPinnedChanged","columnPinning","setColumnPinning","left","right","defaultState","getColumnPinningStateFromColumnDefs","selectionCol","onColumnPinningChange","updater","prev","newPinning","newStates","convertColumnPinningStateToArray","stateWithoutSelectionCol","filter","state","columnId","columnPinningState","reduce","acc","locator","pinned","colKey","id","toString","pinningState","map"],"sources":["useColumnPinning.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 {\n ObjectTypeDefinition,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { ColumnPinningState, OnChangeFn } from \"@tanstack/react-table\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport type { ObjectTableProps } from \"../ObjectTableApi.js\";\nimport { SELECTION_COLUMN_ID } from \"../utils/constants.js\";\n\ninterface UseColumnPinningProps<\n Q extends ObjectTypeDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n columnDefinitions: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"columnDefinitions\"];\n\n hasSelectionColumn?: boolean;\n\n onColumnsPinnedChanged?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onColumnsPinnedChanged\"];\n}\n\ninterface UseColumnPinningResults {\n columnPinning: ColumnPinningState;\n onColumnPinningChange: OnChangeFn<ColumnPinningState>;\n}\n\nexport const useColumnPinning = <\n Q extends ObjectTypeDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>({\n columnDefinitions,\n hasSelectionColumn,\n onColumnsPinnedChanged,\n}: UseColumnPinningProps<\n Q,\n RDPs,\n FunctionColumns\n>): UseColumnPinningResults => {\n const [columnPinning, setColumnPinning] = useState<ColumnPinningState>({\n left: [],\n right: [],\n });\n\n // Update column pinning when columnDefinitions change\n useEffect(() => {\n const defaultState = getColumnPinningStateFromColumnDefs(columnDefinitions);\n const selectionCol = hasSelectionColumn ? [SELECTION_COLUMN_ID] : [];\n setColumnPinning({\n left: [...selectionCol, ...(defaultState.left ?? [])],\n right: [...(defaultState.right ?? [])],\n });\n }, [columnDefinitions, hasSelectionColumn]);\n\n const onColumnPinningChange: OnChangeFn<ColumnPinningState> = useCallback(\n (updater) => {\n setColumnPinning((prev) => {\n const newPinning = typeof updater === \"function\"\n ? updater(prev)\n : updater;\n\n if (onColumnsPinnedChanged) {\n const newStates = convertColumnPinningStateToArray(newPinning);\n const stateWithoutSelectionCol = newStates.filter(\n (state) => state.columnId !== SELECTION_COLUMN_ID,\n );\n onColumnsPinnedChanged(stateWithoutSelectionCol);\n }\n\n return newPinning;\n });\n },\n [onColumnsPinnedChanged],\n );\n\n return { columnPinning, onColumnPinningChange };\n};\n\nconst getColumnPinningStateFromColumnDefs = <\n Q extends ObjectTypeDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"columnDefinitions\"],\n): ColumnPinningState => {\n if (!columnDefinitions) {\n return {};\n }\n const columnPinningState: ColumnPinningState = columnDefinitions.reduce<\n ColumnPinningState\n >(\n (acc, { locator, pinned }) => {\n const colKey: string = locator.id.toString();\n const isPinned = pinned != null && pinned !== \"none\";\n if (!isPinned) {\n return acc;\n }\n\n if (pinned === \"left\") {\n return {\n ...acc,\n left: [...(acc.left ?? []), colKey],\n };\n }\n\n return {\n ...acc,\n right: [...(acc.right ?? []), colKey],\n };\n },\n { left: [], right: [] },\n );\n return columnPinningState;\n};\n\n/**\n * Converts ColumnPinningState to array format for the callback\n */\nfunction convertColumnPinningStateToArray(\n pinningState: ColumnPinningState,\n): Array<{ columnId: string; pinned: \"left\" | \"right\" | \"none\" }> {\n return [\n ...(pinningState.left ?? []).map((columnId) => ({\n columnId,\n pinned: \"left\" as const,\n })),\n ...(pinningState.right ?? []).map((columnId) => ({\n columnId,\n pinned: \"right\" as const,\n })),\n ];\n}\n"],"mappings":"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","ignoreList":[]}
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import { useMemo } from "react";
18
- export const useDefaultTableStates = ({
18
+ export const useColumnVisibility = ({
19
19
  columnDefinitions
20
20
  }) => {
21
21
  const columnVisibility = useMemo(() => {
@@ -36,8 +36,6 @@ export const useDefaultTableStates = ({
36
36
  return colVisibility;
37
37
  }
38
38
  }, [columnDefinitions]);
39
- return {
40
- columnVisibility
41
- };
39
+ return columnVisibility;
42
40
  };
43
- //# sourceMappingURL=useDefaultTableStates.js.map
41
+ //# sourceMappingURL=useColumnVisibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnVisibility.js","names":["useMemo","useColumnVisibility","columnDefinitions","columnVisibility","colVisibility","reduce","acc","colDef","isVisible","undefined","locator","colKey","id"],"sources":["useColumnVisibility.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 {\n ObjectTypeDefinition,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { VisibilityState } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport type { ObjectTableProps } from \"../ObjectTableApi.js\";\n\ninterface UseColumnVisibilityProps<\n Q extends ObjectTypeDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n columnDefinitions: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"columnDefinitions\"];\n}\n\nexport const useColumnVisibility = <\n Q extends ObjectTypeDefinition,\n RDPs extends Record<string, SimplePropertyDef> = {},\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n { columnDefinitions }: UseColumnVisibilityProps<\n Q,\n RDPs,\n FunctionColumns\n >,\n): VisibilityState | undefined => {\n const columnVisibility = useMemo(() => {\n if (columnDefinitions) {\n const colVisibility: VisibilityState = columnDefinitions.reduce(\n (acc, colDef) => {\n if (colDef.isVisible !== undefined) {\n const { locator } = colDef;\n const colKey = locator.id;\n\n return {\n ...acc,\n [colKey]: colDef.isVisible,\n };\n }\n return acc;\n },\n {},\n );\n\n return colVisibility;\n }\n }, [columnDefinitions]);\n\n return columnVisibility;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA,SAASA,OAAO,QAAQ,OAAO;AAkB/B,OAAO,MAAMC,mBAAmB,GAAGA,CAQjC;EAAEC;AAIF,CAAC,KAC+B;EAChC,MAAMC,gBAAgB,GAAGH,OAAO,CAAC,MAAM;IACrC,IAAIE,iBAAiB,EAAE;MACrB,MAAME,aAA8B,GAAGF,iBAAiB,CAACG,MAAM,CAC7D,CAACC,GAAG,EAAEC,MAAM,KAAK;QACf,IAAIA,MAAM,CAACC,SAAS,KAAKC,SAAS,EAAE;UAClC,MAAM;YAAEC;UAAQ,CAAC,GAAGH,MAAM;UAC1B,MAAMI,MAAM,GAAGD,OAAO,CAACE,EAAE;UAEzB,OAAO;YACL,GAAGN,GAAG;YACN,CAACK,MAAM,GAAGJ,MAAM,CAACC;UACnB,CAAC;QACH;QACA,OAAOF,GAAG;MACZ,CAAC,EACD,CAAC,CACH,CAAC;MAED,OAAOF,aAAa;IACtB;EACF,CAAC,EAAE,CAACF,iBAAiB,CAAC,CAAC;EAEvB,OAAOC,gBAAgB;AACzB,CAAC","ignoreList":[]}
@@ -24,8 +24,19 @@ const PAGE_SIZE = 50;
24
24
  * to return data containing the derived properties.
25
25
  */
26
26
 
27
- export function useObjectTableData(objectSet, columnDefinitions, filter) {
28
- // Extract derived properties definition to be passed to useObjectSet hook
27
+ export function useObjectTableData(objectSet, columnDefinitions, filter, sorting) {
28
+ // Convert React Table sorting state to OSDK orderBy format
29
+ const orderBy = useMemo(() => {
30
+ if (!sorting || sorting.length === 0) {
31
+ return undefined;
32
+ }
33
+ return sorting.reduce((acc, sort) => {
34
+ acc[sort.id] = sort.desc ? "desc" : "asc";
35
+ return acc;
36
+ }, {});
37
+ }, [sorting]);
38
+
39
+ // Extract derived properties definition
29
40
  const withProperties = useMemo(() => {
30
41
  if (!columnDefinitions) {
31
42
  return;
@@ -43,7 +54,8 @@ export function useObjectTableData(objectSet, columnDefinitions, filter) {
43
54
  return useObjectSet(objectSet, {
44
55
  withProperties,
45
56
  pageSize: PAGE_SIZE,
46
- where: filter
57
+ where: filter,
58
+ orderBy
47
59
  });
48
60
  }
49
61
  //# sourceMappingURL=useObjectTableData.js.map