@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.
- package/CHANGELOG.md +15 -0
- package/build/browser/base-components/checkbox/Checkbox.module.css +1 -2
- package/build/browser/object-table/ObjectTable.js +35 -9
- package/build/browser/object-table/ObjectTable.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/Table.js +1 -1
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/Table.module.css +1 -0
- package/build/browser/object-table/TableCell.js +7 -4
- package/build/browser/object-table/TableCell.js.map +1 -1
- package/build/browser/object-table/TableCell.module.css +18 -1
- package/build/browser/object-table/TableHeader.js +28 -13
- package/build/browser/object-table/TableHeader.js.map +1 -1
- package/build/browser/object-table/TableHeader.module.css +17 -0
- package/build/browser/object-table/TableHeaderContent.js +27 -0
- package/build/browser/object-table/TableHeaderContent.js.map +1 -0
- package/build/browser/object-table/TableHeaderContent.module.css +30 -0
- package/build/browser/object-table/TableHeaderWithPopover.js +155 -0
- package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -0
- package/build/browser/object-table/TableHeaderWithPopover.module.css +105 -0
- package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
- package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
- package/build/browser/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
- package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
- package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
- package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
- package/build/browser/object-table/hooks/useColumnPinning.js +95 -0
- package/build/browser/object-table/hooks/useColumnPinning.js.map +1 -0
- package/build/{esm/object-table/hooks/useDefaultTableStates.js → browser/object-table/hooks/useColumnVisibility.js} +3 -5
- package/build/browser/object-table/hooks/useColumnVisibility.js.map +1 -0
- package/build/browser/object-table/hooks/useObjectTableData.js +15 -3
- package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/browser/object-table/hooks/useSelectionColumn.js +3 -2
- package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -1
- package/build/browser/object-table/hooks/useTableSorting.js +66 -0
- package/build/browser/object-table/hooks/useTableSorting.js.map +1 -0
- package/build/browser/object-table/utils/constants.js +18 -0
- package/build/browser/object-table/utils/constants.js.map +1 -0
- package/build/browser/object-table/utils/getColumnPinningStyles.js +27 -0
- package/build/browser/object-table/utils/getColumnPinningStyles.js.map +1 -0
- package/build/browser/public/experimental.js +4 -0
- package/build/browser/public/experimental.js.map +1 -1
- package/build/cjs/public/experimental.cjs +412 -85
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +113 -1
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +25 -3
- package/build/esm/base-components/checkbox/Checkbox.module.css +1 -2
- package/build/esm/object-table/ObjectTable.js +35 -9
- package/build/esm/object-table/ObjectTable.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/Table.js +1 -1
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/Table.module.css +1 -0
- package/build/esm/object-table/TableCell.js +7 -4
- package/build/esm/object-table/TableCell.js.map +1 -1
- package/build/esm/object-table/TableCell.module.css +18 -1
- package/build/esm/object-table/TableHeader.js +28 -13
- package/build/esm/object-table/TableHeader.js.map +1 -1
- package/build/esm/object-table/TableHeader.module.css +17 -0
- package/build/esm/object-table/TableHeaderContent.js +27 -0
- package/build/esm/object-table/TableHeaderContent.js.map +1 -0
- package/build/esm/object-table/TableHeaderContent.module.css +30 -0
- package/build/esm/object-table/TableHeaderWithPopover.js +155 -0
- package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -0
- package/build/esm/object-table/TableHeaderWithPopover.module.css +105 -0
- package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
- package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
- package/build/esm/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
- package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
- package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
- package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
- package/build/esm/object-table/hooks/useColumnPinning.js +95 -0
- package/build/esm/object-table/hooks/useColumnPinning.js.map +1 -0
- package/build/{browser/object-table/hooks/useDefaultTableStates.js → esm/object-table/hooks/useColumnVisibility.js} +3 -5
- package/build/esm/object-table/hooks/useColumnVisibility.js.map +1 -0
- package/build/esm/object-table/hooks/useObjectTableData.js +15 -3
- package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
- package/build/esm/object-table/hooks/useSelectionColumn.js +3 -2
- package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -1
- package/build/esm/object-table/hooks/useTableSorting.js +66 -0
- package/build/esm/object-table/hooks/useTableSorting.js.map +1 -0
- package/build/esm/object-table/utils/constants.js +18 -0
- package/build/esm/object-table/utils/constants.js.map +1 -0
- package/build/esm/object-table/utils/getColumnPinningStyles.js +27 -0
- package/build/esm/object-table/utils/getColumnPinningStyles.js.map +1 -0
- package/build/esm/public/experimental.js +4 -0
- package/build/esm/public/experimental.js.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 +10 -0
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +2 -3
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableCell.d.ts.map +1 -1
- package/build/types/object-table/TableHeader.d.ts.map +1 -1
- package/build/types/object-table/TableHeaderContent.d.ts +7 -0
- package/build/types/object-table/TableHeaderContent.d.ts.map +1 -0
- package/build/types/object-table/TableHeaderWithPopover.d.ts +13 -0
- package/build/types/object-table/TableHeaderWithPopover.d.ts.map +1 -0
- package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +1 -0
- package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +1 -0
- package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +1 -0
- package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +1 -0
- package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +1 -0
- package/build/types/object-table/hooks/useColumnPinning.d.ts +22 -0
- package/build/types/object-table/hooks/useColumnPinning.d.ts.map +1 -0
- package/build/types/object-table/hooks/{useDefaultTableStates.d.ts → useColumnVisibility.d.ts} +3 -6
- package/build/types/object-table/hooks/useColumnVisibility.d.ts.map +1 -0
- package/build/types/object-table/hooks/useObjectTableData.d.ts +2 -1
- package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
- package/build/types/object-table/hooks/useSelectionColumn.d.ts +0 -1
- package/build/types/object-table/hooks/useSelectionColumn.d.ts.map +1 -1
- package/build/types/object-table/hooks/useTableSorting.d.ts +22 -0
- package/build/types/object-table/hooks/useTableSorting.d.ts.map +1 -0
- package/build/types/object-table/utils/constants.d.ts +1 -0
- package/build/types/object-table/utils/constants.d.ts.map +1 -0
- package/build/types/object-table/utils/getColumnPinningStyles.d.ts +7 -0
- package/build/types/object-table/utils/getColumnPinningStyles.d.ts.map +1 -0
- package/build/types/public/experimental.d.ts +2 -0
- package/build/types/public/experimental.d.ts.map +1 -1
- package/package.json +5 -5
- package/build/browser/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
- package/build/browser/object-table/hooks/useDefaultTableStates.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
- package/build/esm/object-table/hooks/useDefaultTableStates.js.map +0 -1
- package/build/types/object-table/hooks/__tests__/useDefaultTableStates.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/useDefaultTableStates.d.ts.map +0 -1
- /package/build/types/object-table/hooks/__tests__/{useDefaultTableStates.test.d.ts → useColumnPinning.test.d.ts} +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
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 { Menu } from "@base-ui/react/menu";
|
|
18
|
+
import { ChevronDown, Pin, Remove, SortAlphabetical, SortAlphabeticalDesc, Unpin, VerticalDistribution } from "@blueprintjs/icons";
|
|
19
|
+
import classNames from "classnames";
|
|
20
|
+
import React, { useCallback, useState } from "react";
|
|
21
|
+
import { TableHeaderContent } from "./TableHeaderContent.js";
|
|
22
|
+
import styles from "./TableHeaderWithPopover.module.css";
|
|
23
|
+
function HeaderMenuItem({
|
|
24
|
+
onClick,
|
|
25
|
+
icon: Icon,
|
|
26
|
+
label,
|
|
27
|
+
active = false
|
|
28
|
+
}) {
|
|
29
|
+
return /*#__PURE__*/React.createElement(Menu.Item, {
|
|
30
|
+
closeOnClick: true,
|
|
31
|
+
className: classNames(styles.osdkCenterContainer, styles.osdkContentGap, styles.osdkHeaderMenuItem, active && styles.osdkHeaderActiveMenuItem),
|
|
32
|
+
onClick: onClick
|
|
33
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
34
|
+
className: styles.osdkHeaderIcon,
|
|
35
|
+
color: "currentColor"
|
|
36
|
+
}), /*#__PURE__*/React.createElement("span", null, label));
|
|
37
|
+
}
|
|
38
|
+
export function TableHeaderWithPopover({
|
|
39
|
+
header,
|
|
40
|
+
isColumnPinned,
|
|
41
|
+
setColumnPinning,
|
|
42
|
+
onSortChange,
|
|
43
|
+
onResetSize
|
|
44
|
+
}) {
|
|
45
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
46
|
+
const handlePinLeft = useCallback(() => {
|
|
47
|
+
setColumnPinning(prev => {
|
|
48
|
+
return {
|
|
49
|
+
left: [...(prev.left || []), header.column.id],
|
|
50
|
+
right: prev.right?.filter(id => id !== header.column.id) || []
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
}, [header.column.id, setColumnPinning]);
|
|
54
|
+
const handleUnpin = useCallback(() => {
|
|
55
|
+
setColumnPinning(prev => {
|
|
56
|
+
return {
|
|
57
|
+
left: prev.left?.filter(id => id !== header.column.id) || [],
|
|
58
|
+
right: prev.right?.filter(id => id !== header.column.id) || []
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
}, [header.column.id, setColumnPinning]);
|
|
62
|
+
const handleSortAscending = useCallback(() => {
|
|
63
|
+
header.column.toggleSorting(false);
|
|
64
|
+
onSortChange?.([{
|
|
65
|
+
id: header.column.id,
|
|
66
|
+
desc: false
|
|
67
|
+
}]);
|
|
68
|
+
}, [header.column, onSortChange]);
|
|
69
|
+
const handleSortDescending = useCallback(() => {
|
|
70
|
+
header.column.toggleSorting(true);
|
|
71
|
+
onSortChange?.([{
|
|
72
|
+
id: header.column.id,
|
|
73
|
+
desc: true
|
|
74
|
+
}]);
|
|
75
|
+
}, [header.column, onSortChange]);
|
|
76
|
+
const handleClearAllSorts = useCallback(() => {
|
|
77
|
+
header.column.clearSorting();
|
|
78
|
+
onSortChange?.([]);
|
|
79
|
+
}, [header.column, onSortChange]);
|
|
80
|
+
const handleResetSize = useCallback(() => {
|
|
81
|
+
header.column.resetSize();
|
|
82
|
+
if (onResetSize) {
|
|
83
|
+
onResetSize();
|
|
84
|
+
}
|
|
85
|
+
}, [header.column, onResetSize]);
|
|
86
|
+
const handleInteraction = useCallback(e => {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
setIsOpen(prev => !prev);
|
|
89
|
+
}, []);
|
|
90
|
+
const isSorted = header.column.getIsSorted();
|
|
91
|
+
const isSortable = header.column.getCanSort();
|
|
92
|
+
return /*#__PURE__*/React.createElement(Menu.Root, {
|
|
93
|
+
open: isOpen,
|
|
94
|
+
onOpenChange: setIsOpen
|
|
95
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
96
|
+
className: classNames(styles.osdkCenterContainer, styles.osdkContentGap, styles.osdkHeaderContainer),
|
|
97
|
+
onContextMenu: handleInteraction
|
|
98
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
99
|
+
className: classNames(styles.osdkCenterContainer, styles.osdkContentGap, styles.osdkHeaderContentLeft)
|
|
100
|
+
}, isColumnPinned && /*#__PURE__*/React.createElement(Pin, {
|
|
101
|
+
className: styles.osdkHeaderIcon,
|
|
102
|
+
color: "currentColor"
|
|
103
|
+
}), /*#__PURE__*/React.createElement(TableHeaderContent, {
|
|
104
|
+
header: header
|
|
105
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
106
|
+
className: classNames(styles.osdkCenterContainer, styles.osdkContentGap, styles.osdkHeaderContentRight)
|
|
107
|
+
}, isSorted && /*#__PURE__*/React.createElement("div", {
|
|
108
|
+
className: styles.osdkCenterContainer
|
|
109
|
+
}, isSorted === "asc" ? /*#__PURE__*/React.createElement(SortAlphabetical, {
|
|
110
|
+
className: styles.osdkHeaderIcon,
|
|
111
|
+
color: "currentColor"
|
|
112
|
+
}) : /*#__PURE__*/React.createElement(SortAlphabeticalDesc, {
|
|
113
|
+
className: styles.osdkHeaderIcon,
|
|
114
|
+
color: "currentColor"
|
|
115
|
+
})), /*#__PURE__*/React.createElement(Menu.Trigger, {
|
|
116
|
+
"aria-label": `Open header menu for column with id=${header.column.id}`,
|
|
117
|
+
className: classNames(styles.osdkCenterContainer, styles.osdkHeaderPopoverTrigger)
|
|
118
|
+
}, /*#__PURE__*/React.createElement(ChevronDown, {
|
|
119
|
+
className: styles.osdkHeaderIcon
|
|
120
|
+
}))), /*#__PURE__*/React.createElement(Menu.Portal, {
|
|
121
|
+
container: document.body
|
|
122
|
+
}, /*#__PURE__*/React.createElement(Menu.Positioner, {
|
|
123
|
+
sideOffset: 4
|
|
124
|
+
}, /*#__PURE__*/React.createElement(Menu.Popup, {
|
|
125
|
+
className: styles.osdkHeaderPopup
|
|
126
|
+
}, !isColumnPinned && /*#__PURE__*/React.createElement(HeaderMenuItem, {
|
|
127
|
+
onClick: handlePinLeft,
|
|
128
|
+
icon: Pin,
|
|
129
|
+
label: "Pin column"
|
|
130
|
+
}), isColumnPinned && /*#__PURE__*/React.createElement(HeaderMenuItem, {
|
|
131
|
+
onClick: handleUnpin,
|
|
132
|
+
icon: Unpin,
|
|
133
|
+
label: "Unpin Column",
|
|
134
|
+
active: true
|
|
135
|
+
}), isSortable && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(HeaderMenuItem, {
|
|
136
|
+
onClick: handleSortAscending,
|
|
137
|
+
icon: SortAlphabetical,
|
|
138
|
+
label: "Sort ascending",
|
|
139
|
+
active: isSorted === "asc"
|
|
140
|
+
}), /*#__PURE__*/React.createElement(HeaderMenuItem, {
|
|
141
|
+
onClick: handleSortDescending,
|
|
142
|
+
icon: SortAlphabeticalDesc,
|
|
143
|
+
label: "Sort descending",
|
|
144
|
+
active: isSorted === "desc"
|
|
145
|
+
})), !!isSorted && /*#__PURE__*/React.createElement(HeaderMenuItem, {
|
|
146
|
+
onClick: handleClearAllSorts,
|
|
147
|
+
icon: Remove,
|
|
148
|
+
label: "Clear all sorts"
|
|
149
|
+
}), /*#__PURE__*/React.createElement(HeaderMenuItem, {
|
|
150
|
+
onClick: handleResetSize,
|
|
151
|
+
icon: VerticalDistribution,
|
|
152
|
+
label: "Reset Column Size"
|
|
153
|
+
}))))));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=TableHeaderWithPopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableHeaderWithPopover.js","names":["Menu","ChevronDown","Pin","Remove","SortAlphabetical","SortAlphabeticalDesc","Unpin","VerticalDistribution","classNames","React","useCallback","useState","TableHeaderContent","styles","HeaderMenuItem","onClick","icon","Icon","label","active","createElement","Item","closeOnClick","className","osdkCenterContainer","osdkContentGap","osdkHeaderMenuItem","osdkHeaderActiveMenuItem","osdkHeaderIcon","color","TableHeaderWithPopover","header","isColumnPinned","setColumnPinning","onSortChange","onResetSize","isOpen","setIsOpen","handlePinLeft","prev","left","column","id","right","filter","handleUnpin","handleSortAscending","toggleSorting","desc","handleSortDescending","handleClearAllSorts","clearSorting","handleResetSize","resetSize","handleInteraction","e","preventDefault","isSorted","getIsSorted","isSortable","getCanSort","Root","open","onOpenChange","osdkHeaderContainer","onContextMenu","osdkHeaderContentLeft","osdkHeaderContentRight","Trigger","osdkHeaderPopoverTrigger","Portal","container","document","body","Positioner","sideOffset","Popup","osdkHeaderPopup","Fragment"],"sources":["TableHeaderWithPopover.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 { Menu } from \"@base-ui/react/menu\";\nimport {\n ChevronDown,\n Pin,\n Remove,\n SortAlphabetical,\n SortAlphabeticalDesc,\n Unpin,\n VerticalDistribution,\n} from \"@blueprintjs/icons\";\nimport type {\n ColumnPinningState,\n Header,\n RowData,\n SortingState,\n} from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useState } from \"react\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport styles from \"./TableHeaderWithPopover.module.css\";\n\ninterface HeaderMenuItemProps {\n onClick: () => void;\n icon: React.ComponentType<{ className?: string; color?: string }>;\n label: string;\n active?: boolean;\n}\n\nfunction HeaderMenuItem({\n onClick,\n icon: Icon,\n label,\n active = false,\n}: HeaderMenuItemProps): React.ReactElement {\n return (\n <Menu.Item\n closeOnClick\n className={classNames(\n styles.osdkCenterContainer,\n styles.osdkContentGap,\n styles.osdkHeaderMenuItem,\n active && styles.osdkHeaderActiveMenuItem,\n )}\n onClick={onClick}\n >\n <Icon className={styles.osdkHeaderIcon} color=\"currentColor\" />\n <span>{label}</span>\n </Menu.Item>\n );\n}\n\ninterface TableHeaderWithPopoverProps<TData extends RowData> {\n header: Header<TData, unknown>;\n isColumnPinned: false | \"left\" | \"right\";\n setColumnPinning: React.Dispatch<React.SetStateAction<ColumnPinningState>>;\n onSortChange?: (sorting: SortingState) => void;\n onResetSize?: () => void;\n onColumnConfig?: () => void;\n enableColumnPinningRight?: boolean;\n}\n\nexport function TableHeaderWithPopover<TData extends RowData>({\n header,\n isColumnPinned,\n setColumnPinning,\n onSortChange,\n onResetSize,\n}: TableHeaderWithPopoverProps<TData>): React.ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n\n const handlePinLeft = useCallback(() => {\n setColumnPinning((prev) => {\n return {\n left: [...(prev.left || []), header.column.id],\n right: prev.right?.filter((id) => id !== header.column.id) || [],\n };\n });\n }, [header.column.id, setColumnPinning]);\n\n const handleUnpin = useCallback(() => {\n setColumnPinning((prev) => {\n return {\n left: prev.left?.filter((id) => id !== header.column.id) || [],\n right: prev.right?.filter((id) => id !== header.column.id) || [],\n };\n });\n }, [header.column.id, setColumnPinning]);\n\n const handleSortAscending = useCallback(() => {\n header.column.toggleSorting(false);\n onSortChange?.([{ id: header.column.id, desc: false }]);\n }, [header.column, onSortChange]);\n\n const handleSortDescending = useCallback(() => {\n header.column.toggleSorting(true);\n onSortChange?.([{ id: header.column.id, desc: true }]);\n }, [header.column, onSortChange]);\n\n const handleClearAllSorts = useCallback(() => {\n header.column.clearSorting();\n onSortChange?.([]);\n }, [header.column, onSortChange]);\n\n const handleResetSize = useCallback(() => {\n header.column.resetSize();\n if (onResetSize) {\n onResetSize();\n }\n }, [header.column, onResetSize]);\n\n const handleInteraction = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n setIsOpen((prev) => !prev);\n },\n [],\n );\n\n const isSorted = header.column.getIsSorted();\n const isSortable = header.column.getCanSort();\n\n return (\n <Menu.Root open={isOpen} onOpenChange={setIsOpen}>\n <div\n className={classNames(\n styles.osdkCenterContainer,\n styles.osdkContentGap,\n styles.osdkHeaderContainer,\n )}\n onContextMenu={handleInteraction}\n >\n <div\n className={classNames(\n styles.osdkCenterContainer,\n styles.osdkContentGap,\n styles.osdkHeaderContentLeft,\n )}\n >\n {isColumnPinned && (\n <Pin\n className={styles.osdkHeaderIcon}\n color={\"currentColor\"}\n />\n )}\n <TableHeaderContent header={header} />\n </div>\n <div\n className={classNames(\n styles.osdkCenterContainer,\n styles.osdkContentGap,\n styles.osdkHeaderContentRight,\n )}\n >\n {isSorted && (\n <div className={styles.osdkCenterContainer}>\n {isSorted === \"asc\"\n ? (\n <SortAlphabetical\n className={styles.osdkHeaderIcon}\n color={\"currentColor\"}\n />\n )\n : (\n <SortAlphabeticalDesc\n className={styles.osdkHeaderIcon}\n color={\"currentColor\"}\n />\n )}\n </div>\n )}\n <Menu.Trigger\n aria-label={`Open header menu for column with id=${header.column.id}`}\n className={classNames(\n styles.osdkCenterContainer,\n styles.osdkHeaderPopoverTrigger,\n )}\n >\n <ChevronDown\n className={styles.osdkHeaderIcon}\n />\n </Menu.Trigger>\n </div>\n <Menu.Portal container={document.body}>\n <Menu.Positioner sideOffset={4}>\n <Menu.Popup\n className={styles.osdkHeaderPopup}\n >\n {!isColumnPinned && (\n <HeaderMenuItem\n onClick={handlePinLeft}\n icon={Pin}\n label=\"Pin column\"\n />\n )}\n\n {isColumnPinned && (\n <HeaderMenuItem\n onClick={handleUnpin}\n icon={Unpin}\n label=\"Unpin Column\"\n active={true}\n />\n )}\n {isSortable && (\n <>\n <HeaderMenuItem\n onClick={handleSortAscending}\n icon={SortAlphabetical}\n label=\"Sort ascending\"\n active={isSorted === \"asc\"}\n />\n <HeaderMenuItem\n onClick={handleSortDescending}\n icon={SortAlphabeticalDesc}\n label=\"Sort descending\"\n active={isSorted === \"desc\"}\n />\n </>\n )}\n {!!isSorted && (\n <HeaderMenuItem\n onClick={handleClearAllSorts}\n icon={Remove}\n label=\"Clear all sorts\"\n />\n )}\n <HeaderMenuItem\n onClick={handleResetSize}\n icon={VerticalDistribution}\n label=\"Reset Column Size\"\n />\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </div>\n </Menu.Root>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,105 @@
|
|
|
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
|
+
.osdkCenterContainer {
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
justify-content: center;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.osdkContentGap {
|
|
24
|
+
display: flex;
|
|
25
|
+
gap: var(--bp-surface-spacing);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.osdkHeaderContainer {
|
|
29
|
+
justify-content: space-between;
|
|
30
|
+
flex: 1;
|
|
31
|
+
min-width: 0;
|
|
32
|
+
align-self: stretch;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.osdkHeaderContentLeft {
|
|
36
|
+
min-width: 0;
|
|
37
|
+
flex-shrink: 1;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.osdkHeaderContentRight {
|
|
41
|
+
flex-shrink: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.osdkHeaderPopoverTrigger {
|
|
45
|
+
flex-shrink: 0;
|
|
46
|
+
flex-grow: 0;
|
|
47
|
+
border: var(--bp-surface-borderWidth) solid
|
|
48
|
+
var(--bp-surface-borderColor-default);
|
|
49
|
+
border-radius: var(--bp-surface-borderRadius);
|
|
50
|
+
color: var(--bp-intent-default-foreground);
|
|
51
|
+
user-select: none;
|
|
52
|
+
&:hover {
|
|
53
|
+
background-color: var(--bp-intent-default-hover);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
&[data-popup-open] {
|
|
57
|
+
background-color: var(--bp-intent-primary-rest);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
&:focus-visible {
|
|
61
|
+
outline: var(--bp-surface-borderWidth) solid var(--bp-intent-primary-rest);
|
|
62
|
+
outline-offset: calc(-1 * var(--bp-surface-borderWidth));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.osdkHeaderIcon {
|
|
67
|
+
width: var(--bp-iconography-size-small);
|
|
68
|
+
height: var(--bp-iconography-size-small);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.osdkHeaderPopup {
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
padding: var(--bp-surface-spacing);
|
|
74
|
+
border-radius: var(--bp-surface-borderRadius);
|
|
75
|
+
border: var(--bp-surface-borderWidth) solid
|
|
76
|
+
var(--bp-surface-borderColor-default);
|
|
77
|
+
background-color: var(--bp-palette-gray-100);
|
|
78
|
+
color: var(--bp-typography-colorRest-default);
|
|
79
|
+
box-shadow: var(--bp-surface-shadow-2);
|
|
80
|
+
font-size: var(--bp-typography-size-bodyMedium);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.osdkHeaderMenuItem {
|
|
84
|
+
justify-content: flex-start;
|
|
85
|
+
padding: var(--bp-surface-spacing);
|
|
86
|
+
cursor: pointer;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.osdkHeaderMenuItem:hover {
|
|
90
|
+
background-color: var(--bp-surface-colorHover-default);
|
|
91
|
+
border-radius: var(--bp-surface-borderRadius);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.osdkHeaderActiveMenuItem {
|
|
95
|
+
background-color: var(--bp-intent-primary-rest);
|
|
96
|
+
color: var(--bp-intent-primary-foreground);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.osdkHeaderActiveMenuItem:hover {
|
|
100
|
+
background-color: var(--bp-intent-primary-hover);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.osdkHeaderActiveMenuItem:active {
|
|
104
|
+
background-color: var(--bp-intent-primary-active);
|
|
105
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
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 { SELECTION_COLUMN_ID } from "../../utils/constants.js";
|
|
20
|
+
import { useColumnPinning } from "../useColumnPinning.js";
|
|
21
|
+
const TestObjectType = {
|
|
22
|
+
type: "object",
|
|
23
|
+
apiName: "TestObject"
|
|
24
|
+
};
|
|
25
|
+
function createColumnDef(id, pinned) {
|
|
26
|
+
return {
|
|
27
|
+
locator: {
|
|
28
|
+
type: "property",
|
|
29
|
+
id: id
|
|
30
|
+
},
|
|
31
|
+
pinned
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
describe("useColumnPinning", () => {
|
|
35
|
+
describe("initialization", () => {
|
|
36
|
+
it("initializes with empty pinning state when no columnDefinitions provided", () => {
|
|
37
|
+
const {
|
|
38
|
+
result
|
|
39
|
+
} = renderHook(() => useColumnPinning({
|
|
40
|
+
columnDefinitions: undefined
|
|
41
|
+
}));
|
|
42
|
+
expect(result.current.columnPinning).toEqual({
|
|
43
|
+
left: [],
|
|
44
|
+
right: []
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it("initializes with empty pinning state when columnDefinitions has no pinned columns", () => {
|
|
48
|
+
const columnDefinitions = [createColumnDef("name")];
|
|
49
|
+
const {
|
|
50
|
+
result
|
|
51
|
+
} = renderHook(() => useColumnPinning({
|
|
52
|
+
columnDefinitions
|
|
53
|
+
}));
|
|
54
|
+
expect(result.current.columnPinning).toEqual({
|
|
55
|
+
left: [],
|
|
56
|
+
right: []
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
it("initializes with default pinning from columnDefinitions", () => {
|
|
60
|
+
const columnDefinitions = [createColumnDef("firstName", "left"), createColumnDef("lastName", "left"), createColumnDef("age", "none"), createColumnDef("email", "right")];
|
|
61
|
+
const {
|
|
62
|
+
result
|
|
63
|
+
} = renderHook(() => useColumnPinning({
|
|
64
|
+
columnDefinitions
|
|
65
|
+
}));
|
|
66
|
+
expect(result.current.columnPinning).toEqual({
|
|
67
|
+
left: ["firstName", "lastName"],
|
|
68
|
+
right: ["email"]
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it("adds selection column to left pinning when hasSelectionColumn is true", () => {
|
|
72
|
+
const columnDefinitions = [createColumnDef("name", "left")];
|
|
73
|
+
const {
|
|
74
|
+
result
|
|
75
|
+
} = renderHook(() => useColumnPinning({
|
|
76
|
+
columnDefinitions,
|
|
77
|
+
hasSelectionColumn: true
|
|
78
|
+
}));
|
|
79
|
+
expect(result.current.columnPinning).toEqual({
|
|
80
|
+
left: [SELECTION_COLUMN_ID, "name"],
|
|
81
|
+
right: []
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
it("does not add selection column when hasSelectionColumn is false", () => {
|
|
85
|
+
const columnDefinitions = [createColumnDef("name", "left")];
|
|
86
|
+
const {
|
|
87
|
+
result
|
|
88
|
+
} = renderHook(() => useColumnPinning({
|
|
89
|
+
columnDefinitions,
|
|
90
|
+
hasSelectionColumn: false
|
|
91
|
+
}));
|
|
92
|
+
expect(result.current.columnPinning).toEqual({
|
|
93
|
+
left: ["name"],
|
|
94
|
+
right: []
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("onColumnPinningChange", () => {
|
|
99
|
+
it("updates column pinning state when called", () => {
|
|
100
|
+
const {
|
|
101
|
+
result
|
|
102
|
+
} = renderHook(() => useColumnPinning({
|
|
103
|
+
columnDefinitions: undefined
|
|
104
|
+
}));
|
|
105
|
+
expect(result.current.columnPinning).toEqual({
|
|
106
|
+
left: [],
|
|
107
|
+
right: []
|
|
108
|
+
});
|
|
109
|
+
act(() => {
|
|
110
|
+
result.current.onColumnPinningChange({
|
|
111
|
+
left: ["name"],
|
|
112
|
+
right: ["email"]
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
expect(result.current.columnPinning).toEqual({
|
|
116
|
+
left: ["name"],
|
|
117
|
+
right: ["email"]
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
it("calls onColumnsPinnedChanged with converted format when pinning changes", () => {
|
|
121
|
+
const onColumnsPinnedChanged = vi.fn();
|
|
122
|
+
const {
|
|
123
|
+
result
|
|
124
|
+
} = renderHook(() => useColumnPinning({
|
|
125
|
+
columnDefinitions: undefined,
|
|
126
|
+
onColumnsPinnedChanged
|
|
127
|
+
}));
|
|
128
|
+
act(() => {
|
|
129
|
+
result.current.onColumnPinningChange({
|
|
130
|
+
left: ["name", "age"],
|
|
131
|
+
right: ["email"]
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
expect(onColumnsPinnedChanged).toHaveBeenCalledWith([{
|
|
135
|
+
columnId: "name",
|
|
136
|
+
pinned: "left"
|
|
137
|
+
}, {
|
|
138
|
+
columnId: "age",
|
|
139
|
+
pinned: "left"
|
|
140
|
+
}, {
|
|
141
|
+
columnId: "email",
|
|
142
|
+
pinned: "right"
|
|
143
|
+
}]);
|
|
144
|
+
});
|
|
145
|
+
it("filters out selection column from onColumnsPinnedChanged callback", () => {
|
|
146
|
+
const onColumnsPinnedChanged = vi.fn();
|
|
147
|
+
const {
|
|
148
|
+
result
|
|
149
|
+
} = renderHook(() => useColumnPinning({
|
|
150
|
+
columnDefinitions: undefined,
|
|
151
|
+
onColumnsPinnedChanged
|
|
152
|
+
}));
|
|
153
|
+
act(() => {
|
|
154
|
+
result.current.onColumnPinningChange({
|
|
155
|
+
left: [SELECTION_COLUMN_ID, "name"],
|
|
156
|
+
right: ["email"]
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
expect(onColumnsPinnedChanged).toHaveBeenCalledWith([{
|
|
160
|
+
columnId: "name",
|
|
161
|
+
pinned: "left"
|
|
162
|
+
}, {
|
|
163
|
+
columnId: "email",
|
|
164
|
+
pinned: "right"
|
|
165
|
+
}]);
|
|
166
|
+
});
|
|
167
|
+
it("handles updater function in onColumnPinningChange", () => {
|
|
168
|
+
const onColumnsPinnedChanged = vi.fn();
|
|
169
|
+
const {
|
|
170
|
+
result
|
|
171
|
+
} = renderHook(() => useColumnPinning({
|
|
172
|
+
columnDefinitions: undefined,
|
|
173
|
+
onColumnsPinnedChanged
|
|
174
|
+
}));
|
|
175
|
+
|
|
176
|
+
// Set initial pinning
|
|
177
|
+
act(() => {
|
|
178
|
+
result.current.onColumnPinningChange({
|
|
179
|
+
left: ["name"],
|
|
180
|
+
right: []
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// Pin second column
|
|
185
|
+
act(() => {
|
|
186
|
+
result.current.onColumnPinningChange(prev => ({
|
|
187
|
+
...prev,
|
|
188
|
+
right: ["email"]
|
|
189
|
+
}));
|
|
190
|
+
});
|
|
191
|
+
expect(result.current.columnPinning).toEqual({
|
|
192
|
+
left: ["name"],
|
|
193
|
+
right: ["email"]
|
|
194
|
+
});
|
|
195
|
+
expect(onColumnsPinnedChanged).toHaveBeenLastCalledWith([{
|
|
196
|
+
columnId: "name",
|
|
197
|
+
pinned: "left"
|
|
198
|
+
}, {
|
|
199
|
+
columnId: "email",
|
|
200
|
+
pinned: "right"
|
|
201
|
+
}]);
|
|
202
|
+
|
|
203
|
+
// Unpin first column
|
|
204
|
+
act(() => {
|
|
205
|
+
result.current.onColumnPinningChange(prev => ({
|
|
206
|
+
...prev,
|
|
207
|
+
left: []
|
|
208
|
+
}));
|
|
209
|
+
});
|
|
210
|
+
expect(result.current.columnPinning).toEqual({
|
|
211
|
+
left: [],
|
|
212
|
+
right: ["email"]
|
|
213
|
+
});
|
|
214
|
+
expect(onColumnsPinnedChanged).toHaveBeenLastCalledWith([{
|
|
215
|
+
columnId: "email",
|
|
216
|
+
pinned: "right"
|
|
217
|
+
}]);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
describe("updates when props change", () => {
|
|
221
|
+
it("updates pinning state when columnDefinitions change", () => {
|
|
222
|
+
const {
|
|
223
|
+
result,
|
|
224
|
+
rerender
|
|
225
|
+
} = renderHook(({
|
|
226
|
+
columnDefinitions
|
|
227
|
+
}) => useColumnPinning({
|
|
228
|
+
columnDefinitions
|
|
229
|
+
}), {
|
|
230
|
+
initialProps: {
|
|
231
|
+
columnDefinitions: [{
|
|
232
|
+
locator: {
|
|
233
|
+
type: "property",
|
|
234
|
+
id: "name"
|
|
235
|
+
},
|
|
236
|
+
pinned: "left"
|
|
237
|
+
}]
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
expect(result.current.columnPinning).toEqual({
|
|
241
|
+
left: ["name"],
|
|
242
|
+
right: []
|
|
243
|
+
});
|
|
244
|
+
rerender({
|
|
245
|
+
columnDefinitions: [{
|
|
246
|
+
locator: {
|
|
247
|
+
type: "property",
|
|
248
|
+
id: "name"
|
|
249
|
+
},
|
|
250
|
+
pinned: "left"
|
|
251
|
+
}, {
|
|
252
|
+
locator: {
|
|
253
|
+
type: "property",
|
|
254
|
+
id: "age"
|
|
255
|
+
},
|
|
256
|
+
pinned: "right"
|
|
257
|
+
}]
|
|
258
|
+
});
|
|
259
|
+
expect(result.current.columnPinning).toEqual({
|
|
260
|
+
left: ["name"],
|
|
261
|
+
right: ["age"]
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
//# sourceMappingURL=useColumnPinning.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useColumnPinning.test.js","names":["act","renderHook","describe","expect","it","vi","SELECTION_COLUMN_ID","useColumnPinning","TestObjectType","type","apiName","createColumnDef","id","pinned","locator","result","columnDefinitions","undefined","current","columnPinning","toEqual","left","right","hasSelectionColumn","onColumnPinningChange","onColumnsPinnedChanged","fn","toHaveBeenCalledWith","columnId","prev","toHaveBeenLastCalledWith","rerender","initialProps"],"sources":["useColumnPinning.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 type {\n ColumnDefinition,\n ObjectTableProps,\n} from \"../../ObjectTableApi.js\";\nimport { SELECTION_COLUMN_ID } from \"../../utils/constants.js\";\nimport { useColumnPinning } from \"../useColumnPinning.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\n\nfunction createColumnDef(\n id: string,\n pinned?: \"left\" | \"right\" | \"none\",\n): ColumnDefinition<TestObject> {\n return {\n locator: { type: \"property\", id: id as PropertyKeys<TestObject> },\n pinned,\n };\n}\n\ndescribe(\"useColumnPinning\", () => {\n describe(\"initialization\", () => {\n it(\"initializes with empty pinning state when no columnDefinitions provided\", () => {\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions: undefined,\n })\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [],\n right: [],\n });\n });\n\n it(\"initializes with empty pinning state when columnDefinitions has no pinned columns\", () => {\n const columnDefinitions = [\n createColumnDef(\"name\"),\n ];\n\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions,\n })\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [],\n right: [],\n });\n });\n\n it(\"initializes with default pinning from columnDefinitions\", () => {\n const columnDefinitions = [\n createColumnDef(\"firstName\", \"left\"),\n createColumnDef(\"lastName\", \"left\"),\n createColumnDef(\"age\", \"none\"),\n createColumnDef(\"email\", \"right\"),\n ];\n\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions,\n })\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [\"firstName\", \"lastName\"],\n right: [\"email\"],\n });\n });\n\n it(\"adds selection column to left pinning when hasSelectionColumn is true\", () => {\n const columnDefinitions = [\n createColumnDef(\"name\", \"left\"),\n ];\n\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions,\n hasSelectionColumn: true,\n })\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [SELECTION_COLUMN_ID, \"name\"],\n right: [],\n });\n });\n\n it(\"does not add selection column when hasSelectionColumn is false\", () => {\n const columnDefinitions = [\n createColumnDef(\"name\", \"left\"),\n ];\n\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions,\n hasSelectionColumn: false,\n })\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [\"name\"],\n right: [],\n });\n });\n });\n\n describe(\"onColumnPinningChange\", () => {\n it(\"updates column pinning state when called\", () => {\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions: undefined,\n })\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [],\n right: [],\n });\n\n act(() => {\n result.current.onColumnPinningChange({\n left: [\"name\"],\n right: [\"email\"],\n });\n });\n\n expect(result.current.columnPinning).toEqual({\n left: [\"name\"],\n right: [\"email\"],\n });\n });\n\n it(\"calls onColumnsPinnedChanged with converted format when pinning changes\", () => {\n const onColumnsPinnedChanged = vi.fn();\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions: undefined,\n onColumnsPinnedChanged,\n })\n );\n\n act(() => {\n result.current.onColumnPinningChange({\n left: [\"name\", \"age\"],\n right: [\"email\"],\n });\n });\n\n expect(onColumnsPinnedChanged).toHaveBeenCalledWith([\n { columnId: \"name\", pinned: \"left\" },\n { columnId: \"age\", pinned: \"left\" },\n { columnId: \"email\", pinned: \"right\" },\n ]);\n });\n\n it(\"filters out selection column from onColumnsPinnedChanged callback\", () => {\n const onColumnsPinnedChanged = vi.fn();\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions: undefined,\n onColumnsPinnedChanged,\n })\n );\n\n act(() => {\n result.current.onColumnPinningChange({\n left: [SELECTION_COLUMN_ID, \"name\"],\n right: [\"email\"],\n });\n });\n\n expect(onColumnsPinnedChanged).toHaveBeenCalledWith([\n { columnId: \"name\", pinned: \"left\" },\n { columnId: \"email\", pinned: \"right\" },\n ]);\n });\n\n it(\"handles updater function in onColumnPinningChange\", () => {\n const onColumnsPinnedChanged = vi.fn();\n const { result } = renderHook(() =>\n useColumnPinning<TestObject>({\n columnDefinitions: undefined,\n onColumnsPinnedChanged,\n })\n );\n\n // Set initial pinning\n act(() => {\n result.current.onColumnPinningChange({\n left: [\"name\"],\n right: [],\n });\n });\n\n // Pin second column\n act(() => {\n result.current.onColumnPinningChange((prev) => ({\n ...prev,\n right: [\"email\"],\n }));\n });\n\n expect(result.current.columnPinning).toEqual({\n left: [\"name\"],\n right: [\"email\"],\n });\n\n expect(onColumnsPinnedChanged).toHaveBeenLastCalledWith([\n { columnId: \"name\", pinned: \"left\" },\n { columnId: \"email\", pinned: \"right\" },\n ]);\n\n // Unpin first column\n act(() => {\n result.current.onColumnPinningChange((prev) => ({\n ...prev,\n left: [],\n }));\n });\n\n expect(result.current.columnPinning).toEqual({\n left: [],\n right: [\"email\"],\n });\n\n expect(onColumnsPinnedChanged).toHaveBeenLastCalledWith([\n { columnId: \"email\", pinned: \"right\" },\n ]);\n });\n });\n\n describe(\"updates when props change\", () => {\n it(\"updates pinning state when columnDefinitions change\", () => {\n const initialColumnDefinitions: ObjectTableProps<\n TestObject\n >[\"columnDefinitions\"] = [\n {\n locator: { type: \"property\", id: \"name\" as PropertyKeys<TestObject> },\n pinned: \"left\",\n },\n ];\n\n const { result, rerender } = renderHook(\n ({ columnDefinitions }) =>\n useColumnPinning<TestObject>({\n columnDefinitions,\n }),\n {\n initialProps: { columnDefinitions: initialColumnDefinitions },\n },\n );\n\n expect(result.current.columnPinning).toEqual({\n left: [\"name\"],\n right: [],\n });\n\n const newColumnDefinitions: ObjectTableProps<\n TestObject\n >[\"columnDefinitions\"] = [\n {\n locator: { type: \"property\", id: \"name\" as PropertyKeys<TestObject> },\n pinned: \"left\",\n },\n {\n locator: { type: \"property\", id: \"age\" as PropertyKeys<TestObject> },\n pinned: \"right\",\n },\n ];\n\n rerender({ columnDefinitions: newColumnDefinitions });\n\n expect(result.current.columnPinning).toEqual({\n left: [\"name\"],\n right: [\"age\"],\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|