@osdk/react-components 0.1.0-beta.3 → 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 (154) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/build/browser/base-components/checkbox/Checkbox.module.css +11 -10
  3. package/build/browser/object-table/CellContextMenu.js +2 -2
  4. package/build/browser/object-table/CellContextMenu.js.map +1 -1
  5. package/build/browser/object-table/CellContextMenu.module.css +20 -0
  6. package/build/browser/object-table/ObjectTable.js +37 -10
  7. package/build/browser/object-table/ObjectTable.js.map +1 -1
  8. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  9. package/build/browser/object-table/Table.js +7 -16
  10. package/build/browser/object-table/Table.js.map +1 -1
  11. package/build/browser/object-table/Table.module.css +22 -0
  12. package/build/browser/object-table/TableBody.js +2 -2
  13. package/build/browser/object-table/TableBody.js.map +1 -1
  14. package/build/browser/object-table/TableBody.module.css +20 -0
  15. package/build/browser/object-table/TableCell.js +12 -7
  16. package/build/browser/object-table/TableCell.js.map +1 -1
  17. package/build/browser/object-table/TableCell.module.css +63 -0
  18. package/build/browser/object-table/TableHeader.js +35 -38
  19. package/build/browser/object-table/TableHeader.js.map +1 -1
  20. package/build/browser/object-table/TableHeader.module.css +95 -0
  21. package/build/browser/object-table/TableHeaderContent.js +27 -0
  22. package/build/browser/object-table/TableHeaderContent.js.map +1 -0
  23. package/build/browser/object-table/TableHeaderContent.module.css +30 -0
  24. package/build/browser/object-table/TableHeaderWithPopover.js +155 -0
  25. package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -0
  26. package/build/browser/object-table/TableHeaderWithPopover.module.css +105 -0
  27. package/build/browser/object-table/TableRow.js +4 -3
  28. package/build/browser/object-table/TableRow.js.map +1 -1
  29. package/build/browser/object-table/TableRow.module.css +60 -0
  30. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
  31. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
  32. package/build/browser/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
  33. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
  34. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
  35. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  36. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
  37. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
  38. package/build/browser/object-table/hooks/useColumnPinning.js +95 -0
  39. package/build/browser/object-table/hooks/useColumnPinning.js.map +1 -0
  40. package/build/{esm/object-table/hooks/useDefaultTableStates.js → browser/object-table/hooks/useColumnVisibility.js} +3 -5
  41. package/build/browser/object-table/hooks/useColumnVisibility.js.map +1 -0
  42. package/build/browser/object-table/hooks/useObjectTableData.js +15 -3
  43. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  44. package/build/browser/object-table/hooks/useSelectionColumn.js +3 -2
  45. package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -1
  46. package/build/browser/object-table/hooks/useTableSorting.js +66 -0
  47. package/build/browser/object-table/hooks/useTableSorting.js.map +1 -0
  48. package/build/browser/object-table/utils/constants.js +18 -0
  49. package/build/browser/object-table/utils/constants.js.map +1 -0
  50. package/build/browser/object-table/utils/getColumnPinningStyles.js +27 -0
  51. package/build/browser/object-table/utils/getColumnPinningStyles.js.map +1 -0
  52. package/build/browser/public/experimental.js +4 -0
  53. package/build/browser/public/experimental.js.map +1 -1
  54. package/build/cjs/public/experimental.cjs +446 -129
  55. package/build/cjs/public/experimental.cjs.map +1 -1
  56. package/build/cjs/public/experimental.css +248 -4
  57. package/build/cjs/public/experimental.css.map +1 -1
  58. package/build/cjs/public/experimental.d.cts +26 -3
  59. package/build/esm/base-components/checkbox/Checkbox.module.css +11 -10
  60. package/build/esm/object-table/CellContextMenu.js +2 -2
  61. package/build/esm/object-table/CellContextMenu.js.map +1 -1
  62. package/build/esm/object-table/CellContextMenu.module.css +20 -0
  63. package/build/esm/object-table/ObjectTable.js +37 -10
  64. package/build/esm/object-table/ObjectTable.js.map +1 -1
  65. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  66. package/build/esm/object-table/Table.js +7 -16
  67. package/build/esm/object-table/Table.js.map +1 -1
  68. package/build/esm/object-table/Table.module.css +22 -0
  69. package/build/esm/object-table/TableBody.js +2 -2
  70. package/build/esm/object-table/TableBody.js.map +1 -1
  71. package/build/esm/object-table/TableBody.module.css +20 -0
  72. package/build/esm/object-table/TableCell.js +12 -7
  73. package/build/esm/object-table/TableCell.js.map +1 -1
  74. package/build/esm/object-table/TableCell.module.css +63 -0
  75. package/build/esm/object-table/TableHeader.js +35 -38
  76. package/build/esm/object-table/TableHeader.js.map +1 -1
  77. package/build/esm/object-table/TableHeader.module.css +95 -0
  78. package/build/esm/object-table/TableHeaderContent.js +27 -0
  79. package/build/esm/object-table/TableHeaderContent.js.map +1 -0
  80. package/build/esm/object-table/TableHeaderContent.module.css +30 -0
  81. package/build/esm/object-table/TableHeaderWithPopover.js +155 -0
  82. package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -0
  83. package/build/esm/object-table/TableHeaderWithPopover.module.css +105 -0
  84. package/build/esm/object-table/TableRow.js +4 -3
  85. package/build/esm/object-table/TableRow.js.map +1 -1
  86. package/build/esm/object-table/TableRow.module.css +60 -0
  87. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
  88. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
  89. package/build/esm/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
  90. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
  91. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
  92. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  93. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
  94. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
  95. package/build/esm/object-table/hooks/useColumnPinning.js +95 -0
  96. package/build/esm/object-table/hooks/useColumnPinning.js.map +1 -0
  97. package/build/{browser/object-table/hooks/useDefaultTableStates.js → esm/object-table/hooks/useColumnVisibility.js} +3 -5
  98. package/build/esm/object-table/hooks/useColumnVisibility.js.map +1 -0
  99. package/build/esm/object-table/hooks/useObjectTableData.js +15 -3
  100. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  101. package/build/esm/object-table/hooks/useSelectionColumn.js +3 -2
  102. package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -1
  103. package/build/esm/object-table/hooks/useTableSorting.js +66 -0
  104. package/build/esm/object-table/hooks/useTableSorting.js.map +1 -0
  105. package/build/esm/object-table/utils/constants.js +18 -0
  106. package/build/esm/object-table/utils/constants.js.map +1 -0
  107. package/build/esm/object-table/utils/getColumnPinningStyles.js +27 -0
  108. package/build/esm/object-table/utils/getColumnPinningStyles.js.map +1 -0
  109. package/build/esm/public/experimental.js +4 -0
  110. package/build/esm/public/experimental.js.map +1 -1
  111. package/build/types/object-table/CellContextMenu.d.ts.map +1 -1
  112. package/build/types/object-table/ObjectTable.d.ts +1 -1
  113. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  114. package/build/types/object-table/ObjectTableApi.d.ts +11 -0
  115. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  116. package/build/types/object-table/Table.d.ts +3 -3
  117. package/build/types/object-table/Table.d.ts.map +1 -1
  118. package/build/types/object-table/TableBody.d.ts.map +1 -1
  119. package/build/types/object-table/TableCell.d.ts.map +1 -1
  120. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  121. package/build/types/object-table/TableHeaderContent.d.ts +7 -0
  122. package/build/types/object-table/TableHeaderContent.d.ts.map +1 -0
  123. package/build/types/object-table/TableHeaderWithPopover.d.ts +13 -0
  124. package/build/types/object-table/TableHeaderWithPopover.d.ts.map +1 -0
  125. package/build/types/object-table/TableRow.d.ts.map +1 -1
  126. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +1 -0
  127. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +1 -0
  128. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +1 -0
  129. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +1 -0
  130. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +1 -0
  131. package/build/types/object-table/hooks/useColumnPinning.d.ts +22 -0
  132. package/build/types/object-table/hooks/useColumnPinning.d.ts.map +1 -0
  133. package/build/types/object-table/hooks/{useDefaultTableStates.d.ts → useColumnVisibility.d.ts} +3 -6
  134. package/build/types/object-table/hooks/useColumnVisibility.d.ts.map +1 -0
  135. package/build/types/object-table/hooks/useObjectTableData.d.ts +2 -1
  136. package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
  137. package/build/types/object-table/hooks/useSelectionColumn.d.ts +0 -1
  138. package/build/types/object-table/hooks/useSelectionColumn.d.ts.map +1 -1
  139. package/build/types/object-table/hooks/useTableSorting.d.ts +22 -0
  140. package/build/types/object-table/hooks/useTableSorting.d.ts.map +1 -0
  141. package/build/types/object-table/utils/constants.d.ts +1 -0
  142. package/build/types/object-table/utils/constants.d.ts.map +1 -0
  143. package/build/types/object-table/utils/getColumnPinningStyles.d.ts +7 -0
  144. package/build/types/object-table/utils/getColumnPinningStyles.d.ts.map +1 -0
  145. package/build/types/public/experimental.d.ts +2 -0
  146. package/build/types/public/experimental.d.ts.map +1 -1
  147. package/package.json +8 -8
  148. package/build/browser/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
  149. package/build/browser/object-table/hooks/useDefaultTableStates.js.map +0 -1
  150. package/build/esm/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
  151. package/build/esm/object-table/hooks/useDefaultTableStates.js.map +0 -1
  152. package/build/types/object-table/hooks/__tests__/useDefaultTableStates.test.d.ts.map +0 -1
  153. package/build/types/object-table/hooks/useDefaultTableStates.d.ts.map +0 -1
  154. /package/build/types/object-table/hooks/__tests__/{useDefaultTableStates.test.d.ts → useColumnPinning.test.d.ts} +0 -0
@@ -0,0 +1,63 @@
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
+ .osdkTableCell {
18
+ display: flex;
19
+ align-items: center;
20
+ text-align: left;
21
+ position: relative;
22
+ padding: var(--osdk-table-cell-padding);
23
+ font-size: var(--osdk-table-cell-fontSize);
24
+ color: var(--osdk-table-cell-color);
25
+ background-color: inherit;
26
+ border-right: var(--osdk-table-cell-divider);
27
+
28
+ &:first-child {
29
+ border-left: var(--osdk-table-border);
30
+ }
31
+
32
+ &:last-child {
33
+ border-right: var(--osdk-table-border);
34
+ }
35
+ }
36
+
37
+ .osdkTableCell:has([role="checkbox"]) {
38
+ justify-content: center;
39
+ }
40
+
41
+
42
+ .osdkTableCell[data-pinned="left"],
43
+ .osdkTableCell[data-pinned="right"] {
44
+ position: sticky;
45
+ z-index: var(--bp-surface-zIndex-1);
46
+ }
47
+
48
+ /* Last left-pinned column - no left-pinned siblings after it */
49
+ .osdkTableCell[data-pinned="left"]:not(:has(~ [data-pinned="left"])) {
50
+ border-right: calc(var(--bp-surface-borderWidth) * 2) solid var(--osdk-table-border-color);
51
+ }
52
+
53
+ /* First right-pinned column - no right-pinned siblings before it */
54
+ .osdkTableCell[data-pinned="right"]:not(:has(~ [data-pinned="right"]):nth-child(n+2)) {
55
+ border-left: calc(var(--bp-surface-borderWidth) * 2) solid var(--osdk-table-border-color);
56
+ }
57
+
58
+ .osdkTableCellContent:not(:has([role="checkbox"])) {
59
+ overflow: hidden;
60
+ text-overflow: ellipsis;
61
+ white-space: nowrap;
62
+ text-align: left;
63
+ }
@@ -14,50 +14,47 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { flexRender } from "@tanstack/react-table";
18
17
  import React from "react";
18
+ import styles from "./TableHeader.module.css";
19
+ import { TableHeaderContent } from "./TableHeaderContent.js";
20
+ import { TableHeaderWithPopover } from "./TableHeaderWithPopover.js";
21
+ import { SELECTION_COLUMN_ID } from "./utils/constants.js";
22
+ import { getColumnPinningStyles } from "./utils/getColumnPinningStyles.js";
19
23
  export function TableHeader({
20
24
  table
21
25
  }) {
26
+ // TODO: If value is number type, right align header
27
+
28
+ const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;
22
29
  return /*#__PURE__*/React.createElement("thead", {
23
- style: {
24
- display: "grid",
25
- position: "sticky",
26
- top: 0,
27
- zIndex: 1
28
- }
30
+ className: styles.osdkTableHeader,
31
+ "data-resizing": isResizing
29
32
  }, table.getHeaderGroups().map(headerGroup => /*#__PURE__*/React.createElement("tr", {
30
33
  key: headerGroup.id,
31
- style: {
32
- display: "flex"
33
- }
34
- }, headerGroup.headers.map(header =>
35
- /*#__PURE__*/
36
- // TODO: Move inline styling to CSS file
37
- React.createElement("th", {
38
- key: header.id,
39
- style: {
40
- display: "flex",
41
- width: header.getSize(),
42
- justifyContent: "flex-start",
43
- alignItems: "center",
44
- position: "relative"
45
- }
46
- }, header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()), header.column.getCanResize() && /*#__PURE__*/React.createElement("div", {
47
- onDoubleClick: () => header.column.resetSize(),
48
- onMouseDown: header.getResizeHandler(),
49
- onTouchStart: header.getResizeHandler(),
50
- style: {
51
- position: "absolute",
52
- right: 0,
53
- top: 0,
54
- height: "100%",
55
- width: "3px",
56
- cursor: "col-resize",
57
- touchAction: "none",
58
- zIndex: 11,
59
- transform: header.column.getIsResizing() ? `translateX(${table.getState().columnSizingInfo.deltaOffset ?? 0}px)` : ""
60
- }
61
- }))))));
34
+ className: styles.osdkTableHeaderRow
35
+ }, headerGroup.headers.map(header => {
36
+ const {
37
+ columnStyles
38
+ } = getColumnPinningStyles(header.column);
39
+ const isColumnPinned = header.column.getIsPinned();
40
+ const isSelectColumn = header.id === SELECTION_COLUMN_ID;
41
+ return /*#__PURE__*/React.createElement("th", {
42
+ key: header.id,
43
+ "data-pinned": header.column.getIsPinned(),
44
+ className: styles.osdkTableHeaderCell,
45
+ style: columnStyles
46
+ }, header.isPlaceholder ? null : isSelectColumn ? /*#__PURE__*/React.createElement(TableHeaderContent, {
47
+ header: header
48
+ }) : /*#__PURE__*/React.createElement(TableHeaderWithPopover, {
49
+ header: header,
50
+ isColumnPinned: isColumnPinned,
51
+ setColumnPinning: table.setColumnPinning
52
+ }), header.column.getCanResize() && /*#__PURE__*/React.createElement("div", {
53
+ className: styles.osdkTableHeaderResizer,
54
+ onDoubleClick: () => header.column.resetSize(),
55
+ onMouseDown: header.getResizeHandler(),
56
+ onTouchStart: header.getResizeHandler()
57
+ }));
58
+ }))));
62
59
  }
63
60
  //# sourceMappingURL=TableHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeader.js","names":["flexRender","React","TableHeader","table","createElement","style","display","position","top","zIndex","getHeaderGroups","map","headerGroup","key","id","headers","header","width","getSize","justifyContent","alignItems","isPlaceholder","column","columnDef","getContext","getCanResize","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","right","height","cursor","touchAction","transform","getIsResizing","getState","columnSizingInfo","deltaOffset"],"sources":["TableHeader.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 { RowData, Table } from \"@tanstack/react-table\";\nimport { flexRender } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\nimport React from \"react\";\n\ninterface TableHeaderProps<TData extends RowData> {\n table: Table<TData>;\n}\n\nexport function TableHeader<TData extends RowData>({\n table,\n}: TableHeaderProps<TData>): React.ReactElement {\n return (\n <thead\n style={{\n display: \"grid\",\n position: \"sticky\",\n top: 0,\n zIndex: 1,\n }}\n >\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n style={{\n display: \"flex\",\n }}\n >\n {headerGroup.headers.map((header) => (\n // TODO: Move inline styling to CSS file\n <th\n key={header.id}\n style={{\n display: \"flex\",\n width: header.getSize(),\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n position: \"relative\",\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n ) as ReactNode | React.JSX.Element}\n {header.column.getCanResize() && (\n <div\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n style={{\n position: \"absolute\",\n right: 0,\n top: 0,\n height: \"100%\",\n width: \"3px\",\n cursor: \"col-resize\",\n touchAction: \"none\",\n zIndex: 11,\n transform: header.column.getIsResizing()\n ? `translateX(${\n table.getState().columnSizingInfo.deltaOffset ?? 0\n }px)`\n : \"\",\n }}\n />\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,UAAU,QAAQ,uBAAuB;AAElD,OAAOC,KAAK,MAAM,OAAO;AAMzB,OAAO,SAASC,WAAWA,CAAwB;EACjDC;AACuB,CAAC,EAAsB;EAC9C,oBACEF,KAAA,CAAAG,aAAA;IACEC,KAAK,EAAE;MACLC,OAAO,EAAE,MAAM;MACfC,QAAQ,EAAE,QAAQ;MAClBC,GAAG,EAAE,CAAC;MACNC,MAAM,EAAE;IACV;EAAE,GAEDN,KAAK,CAACO,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,WAAW,iBACvCX,KAAA,CAAAG,aAAA;IACES,GAAG,EAAED,WAAW,CAACE,EAAG;IACpBT,KAAK,EAAE;MACLC,OAAO,EAAE;IACX;EAAE,GAEDM,WAAW,CAACG,OAAO,CAACJ,GAAG,CAAEK,MAAM;EAAA;EAC9B;EACAf,KAAA,CAAAG,aAAA;IACES,GAAG,EAAEG,MAAM,CAACF,EAAG;IACfT,KAAK,EAAE;MACLC,OAAO,EAAE,MAAM;MACfW,KAAK,EAAED,MAAM,CAACE,OAAO,CAAC,CAAC;MACvBC,cAAc,EAAE,YAAY;MAC5BC,UAAU,EAAE,QAAQ;MACpBb,QAAQ,EAAE;IACZ;EAAE,GAEDS,MAAM,CAACK,aAAa,GACjB,IAAI,GACJrB,UAAU,CACVgB,MAAM,CAACM,MAAM,CAACC,SAAS,CAACP,MAAM,EAC9BA,MAAM,CAACQ,UAAU,CAAC,CACpB,CAAkC,EACnCR,MAAM,CAACM,MAAM,CAACG,YAAY,CAAC,CAAC,iBAC3BxB,KAAA,CAAAG,aAAA;IACEsB,aAAa,EAAEA,CAAA,KAAMV,MAAM,CAACM,MAAM,CAACK,SAAS,CAAC,CAAE;IAC/CC,WAAW,EAAEZ,MAAM,CAACa,gBAAgB,CAAC,CAAE;IACvCC,YAAY,EAAEd,MAAM,CAACa,gBAAgB,CAAC,CAAE;IACxCxB,KAAK,EAAE;MACLE,QAAQ,EAAE,UAAU;MACpBwB,KAAK,EAAE,CAAC;MACRvB,GAAG,EAAE,CAAC;MACNwB,MAAM,EAAE,MAAM;MACdf,KAAK,EAAE,KAAK;MACZgB,MAAM,EAAE,YAAY;MACpBC,WAAW,EAAE,MAAM;MACnBzB,MAAM,EAAE,EAAE;MACV0B,SAAS,EAAEnB,MAAM,CAACM,MAAM,CAACc,aAAa,CAAC,CAAC,GACpC,cACAjC,KAAK,CAACkC,QAAQ,CAAC,CAAC,CAACC,gBAAgB,CAACC,WAAW,IAAI,CAAC,KAC/C,GACH;IACN;EAAE,CACH,CAED,CACL,CACC,CACL,CACI,CAAC;AAEZ","ignoreList":[]}
1
+ {"version":3,"file":"TableHeader.js","names":["React","styles","TableHeaderContent","TableHeaderWithPopover","SELECTION_COLUMN_ID","getColumnPinningStyles","TableHeader","table","isResizing","getState","columnSizingInfo","isResizingColumn","createElement","className","osdkTableHeader","getHeaderGroups","map","headerGroup","key","id","osdkTableHeaderRow","headers","header","columnStyles","column","isColumnPinned","getIsPinned","isSelectColumn","osdkTableHeaderCell","style","isPlaceholder","setColumnPinning","getCanResize","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart"],"sources":["TableHeader.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 { RowData, Table } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport styles from \"./TableHeader.module.css\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport { TableHeaderWithPopover } from \"./TableHeaderWithPopover.js\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\n\ninterface TableHeaderProps<TData extends RowData> {\n table: Table<TData>;\n}\n\nexport function TableHeader<TData extends RowData>({\n table,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n return (\n <thead className={styles.osdkTableHeader} data-resizing={isResizing}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className={styles.osdkTableHeaderRow}\n >\n {headerGroup.headers.map((header) => {\n const { columnStyles } = getColumnPinningStyles(header.column);\n const isColumnPinned = header.column.getIsPinned();\n const isSelectColumn = header.id === SELECTION_COLUMN_ID;\n return (\n <th\n key={header.id}\n data-pinned={header.column.getIsPinned()}\n className={styles.osdkTableHeaderCell}\n style={columnStyles}\n >\n {header.isPlaceholder\n ? null\n : isSelectColumn\n ? <TableHeaderContent header={header} />\n : (\n <TableHeaderWithPopover\n header={header}\n isColumnPinned={isColumnPinned}\n setColumnPinning={table.setColumnPinning}\n />\n )}\n {header.column.getCanResize() && (\n <div\n className={styles.osdkTableHeaderResizer}\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,0BAA0B;AAC7C,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,sBAAsB,QAAQ,6BAA6B;AACpE,SAASC,mBAAmB,QAAQ,sBAAsB;AAC1D,SAASC,sBAAsB,QAAQ,mCAAmC;AAM1E,OAAO,SAASC,WAAWA,CAAwB;EACjDC;AACuB,CAAC,EAAsB;EAC9C;;EAEA,MAAMC,UAAU,GAAG,CAAC,CAACD,KAAK,CAACE,QAAQ,CAAC,CAAC,CAACC,gBAAgB,EAAEC,gBAAgB;EAExE,oBACEX,KAAA,CAAAY,aAAA;IAAOC,SAAS,EAAEZ,MAAM,CAACa,eAAgB;IAAC,iBAAeN;EAAW,GACjED,KAAK,CAACQ,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,WAAW,iBACvCjB,KAAA,CAAAY,aAAA;IACEM,GAAG,EAAED,WAAW,CAACE,EAAG;IACpBN,SAAS,EAAEZ,MAAM,CAACmB;EAAmB,GAEpCH,WAAW,CAACI,OAAO,CAACL,GAAG,CAAEM,MAAM,IAAK;IACnC,MAAM;MAAEC;IAAa,CAAC,GAAGlB,sBAAsB,CAACiB,MAAM,CAACE,MAAM,CAAC;IAC9D,MAAMC,cAAc,GAAGH,MAAM,CAACE,MAAM,CAACE,WAAW,CAAC,CAAC;IAClD,MAAMC,cAAc,GAAGL,MAAM,CAACH,EAAE,KAAKf,mBAAmB;IACxD,oBACEJ,KAAA,CAAAY,aAAA;MACEM,GAAG,EAAEI,MAAM,CAACH,EAAG;MACf,eAAaG,MAAM,CAACE,MAAM,CAACE,WAAW,CAAC,CAAE;MACzCb,SAAS,EAAEZ,MAAM,CAAC2B,mBAAoB;MACtCC,KAAK,EAAEN;IAAa,GAEnBD,MAAM,CAACQ,aAAa,GACjB,IAAI,GACJH,cAAc,gBACd3B,KAAA,CAAAY,aAAA,CAACV,kBAAkB;MAACoB,MAAM,EAAEA;IAAO,CAAE,CAAC,gBAEtCtB,KAAA,CAAAY,aAAA,CAACT,sBAAsB;MACrBmB,MAAM,EAAEA,MAAO;MACfG,cAAc,EAAEA,cAAe;MAC/BM,gBAAgB,EAAExB,KAAK,CAACwB;IAAiB,CAC1C,CACF,EACFT,MAAM,CAACE,MAAM,CAACQ,YAAY,CAAC,CAAC,iBAC3BhC,KAAA,CAAAY,aAAA;MACEC,SAAS,EAAEZ,MAAM,CAACgC,sBAAuB;MACzCC,aAAa,EAAEA,CAAA,KAAMZ,MAAM,CAACE,MAAM,CAACW,SAAS,CAAC,CAAE;MAC/CC,WAAW,EAAEd,MAAM,CAACe,gBAAgB,CAAC,CAAE;MACvCC,YAAY,EAAEhB,MAAM,CAACe,gBAAgB,CAAC;IAAE,CACzC,CAED,CAAC;EAET,CAAC,CACC,CACL,CACI,CAAC;AAEZ","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
+ .osdkTableHeader {
18
+ display: grid;
19
+ position: sticky;
20
+ top: 0;
21
+ z-index: var(--bp-surface-zIndex-1);
22
+ background-color: var(--osdk-table-header-bg);
23
+ }
24
+
25
+ .osdkTableHeader[data-resizing="true"] {
26
+ cursor: col-resize;
27
+ user-select: none;
28
+ }
29
+
30
+
31
+ .osdkTableHeaderRow {
32
+ display: flex;
33
+ }
34
+
35
+ .osdkTableHeaderCell {
36
+ display: flex;
37
+ align-items: center;
38
+ text-align: left;
39
+ position: relative;
40
+ padding: var(--osdk-table-cell-padding);
41
+ font-weight: var(--osdk-table-header-fontWeight);
42
+ font-size: var(--osdk-table-header-fontSize);
43
+ color: var(--osdk-table-header-color);
44
+ border-top: var(--osdk-table-border);
45
+ border-right: var(--osdk-table-header-divider);
46
+ background-color: inherit;
47
+
48
+ &:first-child {
49
+ border-left: var(--osdk-table-border);
50
+ }
51
+
52
+ &:last-child {
53
+ border-right: var(--osdk-table-border);
54
+ }
55
+ }
56
+
57
+ .osdkTableHeaderCell[data-pinned="left"],
58
+ .osdkTableHeaderCell[data-pinned="right"] {
59
+ position: sticky;
60
+ z-index: var(--bp-surface-zIndex-2);
61
+ }
62
+
63
+ /* Last left-pinned column - no left-pinned siblings after it */
64
+ .osdkTableHeaderCell[data-pinned="left"]:not(:has(~ [data-pinned="left"])) {
65
+ border-right: calc(var(--osdk-table-border-width)* 2) solid var(--osdk-table-border-color);
66
+ }
67
+
68
+ /* First right-pinned column - no right-pinned siblings before it */
69
+ .osdkTableHeaderCell[data-pinned="right"]:not(:has(~ [data-pinned="right"]):nth-child(n+2)) {
70
+ border-left: calc(var(--osdk-table-border-width)* 2) solid var(--osdk-table-border-color);
71
+ }
72
+
73
+ .osdkTableHeaderCell:has([role="checkbox"]) {
74
+ justify-content: center;
75
+ }
76
+
77
+ .osdkTableHeaderResizer {
78
+ background: none;
79
+ cursor: col-resize;
80
+ height: 100%;
81
+ position: absolute;
82
+ right: calc(-1 * var(--osdk-table-border-width));
83
+ top: 0;
84
+ touch-action: none;
85
+ width: 3px;
86
+ z-index: var(--bp-surface-zIndex-2);
87
+
88
+ &:hover {
89
+ background: var(--bp-intent-primary-hover);
90
+ }
91
+
92
+ &:active {
93
+ background: var(--bp-intent-primary-active);
94
+ }
95
+ }
@@ -0,0 +1,27 @@
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 { flexRender } from "@tanstack/react-table";
18
+ import React from "react";
19
+ import styles from "./TableHeaderContent.module.css";
20
+ export function TableHeaderContent({
21
+ header
22
+ }) {
23
+ return /*#__PURE__*/React.createElement("div", {
24
+ className: styles.osdkHeaderContent
25
+ }, flexRender(header.column.columnDef.header, header.getContext()));
26
+ }
27
+ //# sourceMappingURL=TableHeaderContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableHeaderContent.js","names":["flexRender","React","styles","TableHeaderContent","header","createElement","className","osdkHeaderContent","column","columnDef","getContext"],"sources":["TableHeaderContent.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 { flexRender, type Header, type RowData } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport styles from \"./TableHeaderContent.module.css\";\n\ninterface TableHeaderContentProps<TData extends RowData> {\n header: Header<TData, unknown>;\n}\n\nexport function TableHeaderContent<TData extends RowData>(\n { header }: TableHeaderContentProps<TData>,\n): React.ReactElement {\n return (\n <div className={styles.osdkHeaderContent}>\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,UAAU,QAAmC,uBAAuB;AAC7E,OAAOC,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,iCAAiC;AAMpD,OAAO,SAASC,kBAAkBA,CAChC;EAAEC;AAAuC,CAAC,EACtB;EACpB,oBACEH,KAAA,CAAAI,aAAA;IAAKC,SAAS,EAAEJ,MAAM,CAACK;EAAkB,GACtCP,UAAU,CACTI,MAAM,CAACI,MAAM,CAACC,SAAS,CAACL,MAAM,EAC9BA,MAAM,CAACM,UAAU,CAAC,CACpB,CACG,CAAC;AAEV","ignoreList":[]}
@@ -0,0 +1,30 @@
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
+ .osdkHeaderContent {
18
+ display: -webkit-box;
19
+ -webkit-box-orient: vertical;
20
+ -webkit-line-clamp: 2;
21
+ line-clamp: 2;
22
+ text-align: left;
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+ }
26
+
27
+ .osdkHeaderContent:has([role="checkbox"]) {
28
+ display: flex;
29
+ justify-content: center;
30
+ }
@@ -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
+ }