@osdk/react-components 0.2.0-beta.16 → 0.2.0-beta.18

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 (206) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +91 -3
  3. package/build/browser/action-form/ActionForm.js +109 -0
  4. package/build/browser/action-form/ActionForm.js.map +1 -0
  5. package/build/browser/action-form/ActionFormApi.js.map +1 -1
  6. package/build/browser/action-form/BaseForm.js +74 -0
  7. package/build/browser/action-form/BaseForm.js.map +1 -0
  8. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  9. package/build/browser/action-form/fields/FieldBridge.js +45 -0
  10. package/build/browser/action-form/fields/FieldBridge.js.map +1 -0
  11. package/build/browser/action-form/fields/FormFieldRenderer.js +68 -0
  12. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -0
  13. package/build/browser/action-form/fields/TextInputField.js +38 -0
  14. package/build/browser/action-form/fields/TextInputField.js.map +1 -0
  15. package/build/browser/action-form/utils/coerceFieldValue.js +93 -0
  16. package/build/browser/action-form/utils/coerceFieldValue.js.map +1 -0
  17. package/build/browser/action-form/utils/getDefaultFieldComponent.js +56 -0
  18. package/build/browser/action-form/utils/getDefaultFieldComponent.js.map +1 -0
  19. package/build/browser/action-form/utils/getDefaultFieldDefinitions.js +33 -0
  20. package/build/browser/action-form/utils/getDefaultFieldDefinitions.js.map +1 -0
  21. package/build/browser/base-components/tooltip/Tooltip.js +91 -0
  22. package/build/browser/base-components/tooltip/Tooltip.js.map +1 -0
  23. package/build/browser/base-components/tooltip/Tooltip.module.css +70 -0
  24. package/build/browser/base-components/tooltip/Tooltip.module.css.js +11 -0
  25. package/build/browser/base-components/tooltip/index.js +18 -0
  26. package/build/browser/base-components/tooltip/index.js.map +1 -0
  27. package/build/browser/filter-list/base/BaseFilterList.js +23 -11
  28. package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
  29. package/build/browser/filter-list/base/FilterIcons.js +48 -13
  30. package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
  31. package/build/browser/filter-list/base/FilterList.module.css +57 -13
  32. package/build/browser/filter-list/base/FilterList.module.css.js +5 -2
  33. package/build/browser/filter-list/base/FilterListHeader.js +10 -15
  34. package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
  35. package/build/browser/filter-list/base/FilterListHeader.module.css +13 -41
  36. package/build/browser/filter-list/base/FilterListHeader.module.css.js +1 -4
  37. package/build/browser/filter-list/hooks/useFilterListState.js +25 -7
  38. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  39. package/build/browser/filter-list/utils/assertUnreachable.js +1 -8
  40. package/build/browser/filter-list/utils/assertUnreachable.js.map +1 -1
  41. package/build/browser/filter-list/utils/filterStateToWhereClause.js +121 -91
  42. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  43. package/build/browser/object-table/DefaultCellRenderer.js +6 -1
  44. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
  45. package/build/browser/object-table/EditableCell.js +76 -9
  46. package/build/browser/object-table/EditableCell.js.map +1 -1
  47. package/build/browser/object-table/EditableCell.module.css +47 -8
  48. package/build/browser/object-table/EditableCell.module.css.js +5 -1
  49. package/build/browser/object-table/MultiColumnSortDialog.js +4 -1
  50. package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
  51. package/build/browser/object-table/ObjectTable.js +4 -1
  52. package/build/browser/object-table/ObjectTable.js.map +1 -1
  53. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  54. package/build/browser/object-table/SelectionCells.js +1 -0
  55. package/build/browser/object-table/SelectionCells.js.map +1 -1
  56. package/build/browser/object-table/Table.js +2 -2
  57. package/build/browser/object-table/Table.js.map +1 -1
  58. package/build/browser/object-table/TableBody.js +1 -1
  59. package/build/browser/object-table/TableBody.js.map +1 -1
  60. package/build/browser/object-table/TableEditContainer.js +27 -16
  61. package/build/browser/object-table/TableEditContainer.js.map +1 -1
  62. package/build/browser/object-table/TableEditContainer.module.css +27 -0
  63. package/build/browser/object-table/TableEditContainer.module.css.js +5 -1
  64. package/build/browser/object-table/TableHeader.js +4 -1
  65. package/build/browser/object-table/TableHeader.js.map +1 -1
  66. package/build/browser/object-table/TableHeader.module.css +2 -1
  67. package/build/browser/object-table/TableHeader.module.css.js +1 -0
  68. package/build/browser/object-table/TableRow.js +2 -2
  69. package/build/browser/object-table/TableRow.js.map +1 -1
  70. package/build/browser/object-table/hooks/useColumnDefs.js +2 -1
  71. package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
  72. package/build/browser/object-table/hooks/useEditableTable.js +21 -2
  73. package/build/browser/object-table/hooks/useEditableTable.js.map +1 -1
  74. package/build/browser/object-table/utils/types.js.map +1 -1
  75. package/build/browser/shared/assertUnreachable.js +25 -0
  76. package/build/browser/shared/assertUnreachable.js.map +1 -0
  77. package/build/browser/shared/typedMemo.js +25 -0
  78. package/build/browser/shared/typedMemo.js.map +1 -0
  79. package/build/browser/styles.css +219 -63
  80. package/build/cjs/public/experimental.cjs +1212 -966
  81. package/build/cjs/public/experimental.cjs.map +1 -1
  82. package/build/cjs/public/experimental.css +167 -55
  83. package/build/cjs/public/experimental.css.map +1 -1
  84. package/build/cjs/public/experimental.d.cts +18 -4
  85. package/build/esm/action-form/ActionForm.js +109 -0
  86. package/build/esm/action-form/ActionForm.js.map +1 -0
  87. package/build/esm/action-form/ActionFormApi.js.map +1 -1
  88. package/build/esm/action-form/BaseForm.js +74 -0
  89. package/build/esm/action-form/BaseForm.js.map +1 -0
  90. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  91. package/build/esm/action-form/fields/FieldBridge.js +45 -0
  92. package/build/esm/action-form/fields/FieldBridge.js.map +1 -0
  93. package/build/esm/action-form/fields/FormFieldRenderer.js +68 -0
  94. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -0
  95. package/build/esm/action-form/fields/TextInputField.js +38 -0
  96. package/build/esm/action-form/fields/TextInputField.js.map +1 -0
  97. package/build/esm/action-form/utils/coerceFieldValue.js +93 -0
  98. package/build/esm/action-form/utils/coerceFieldValue.js.map +1 -0
  99. package/build/esm/action-form/utils/getDefaultFieldComponent.js +56 -0
  100. package/build/esm/action-form/utils/getDefaultFieldComponent.js.map +1 -0
  101. package/build/esm/action-form/utils/getDefaultFieldDefinitions.js +33 -0
  102. package/build/esm/action-form/utils/getDefaultFieldDefinitions.js.map +1 -0
  103. package/build/esm/base-components/tooltip/Tooltip.js +91 -0
  104. package/build/esm/base-components/tooltip/Tooltip.js.map +1 -0
  105. package/build/esm/base-components/tooltip/Tooltip.module.css +70 -0
  106. package/build/esm/base-components/tooltip/index.js +18 -0
  107. package/build/esm/base-components/tooltip/index.js.map +1 -0
  108. package/build/esm/filter-list/base/BaseFilterList.js +23 -11
  109. package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
  110. package/build/esm/filter-list/base/FilterIcons.js +48 -13
  111. package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
  112. package/build/esm/filter-list/base/FilterList.module.css +57 -13
  113. package/build/esm/filter-list/base/FilterListHeader.js +10 -15
  114. package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
  115. package/build/esm/filter-list/base/FilterListHeader.module.css +13 -41
  116. package/build/esm/filter-list/hooks/useFilterListState.js +25 -7
  117. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  118. package/build/esm/filter-list/utils/assertUnreachable.js +1 -8
  119. package/build/esm/filter-list/utils/assertUnreachable.js.map +1 -1
  120. package/build/esm/filter-list/utils/filterStateToWhereClause.js +121 -91
  121. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  122. package/build/esm/object-table/DefaultCellRenderer.js +6 -1
  123. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
  124. package/build/esm/object-table/EditableCell.js +76 -9
  125. package/build/esm/object-table/EditableCell.js.map +1 -1
  126. package/build/esm/object-table/EditableCell.module.css +47 -8
  127. package/build/esm/object-table/MultiColumnSortDialog.js +4 -1
  128. package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
  129. package/build/esm/object-table/ObjectTable.js +4 -1
  130. package/build/esm/object-table/ObjectTable.js.map +1 -1
  131. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  132. package/build/esm/object-table/SelectionCells.js +1 -0
  133. package/build/esm/object-table/SelectionCells.js.map +1 -1
  134. package/build/esm/object-table/Table.js +2 -2
  135. package/build/esm/object-table/Table.js.map +1 -1
  136. package/build/esm/object-table/TableBody.js +1 -1
  137. package/build/esm/object-table/TableBody.js.map +1 -1
  138. package/build/esm/object-table/TableEditContainer.js +27 -16
  139. package/build/esm/object-table/TableEditContainer.js.map +1 -1
  140. package/build/esm/object-table/TableEditContainer.module.css +27 -0
  141. package/build/esm/object-table/TableHeader.js +4 -1
  142. package/build/esm/object-table/TableHeader.js.map +1 -1
  143. package/build/esm/object-table/TableHeader.module.css +2 -1
  144. package/build/esm/object-table/TableRow.js +2 -2
  145. package/build/esm/object-table/TableRow.js.map +1 -1
  146. package/build/esm/object-table/hooks/useColumnDefs.js +2 -1
  147. package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
  148. package/build/esm/object-table/hooks/useEditableTable.js +21 -2
  149. package/build/esm/object-table/hooks/useEditableTable.js.map +1 -1
  150. package/build/esm/object-table/utils/types.js.map +1 -1
  151. package/build/esm/shared/assertUnreachable.js +25 -0
  152. package/build/esm/shared/assertUnreachable.js.map +1 -0
  153. package/build/esm/shared/typedMemo.js +25 -0
  154. package/build/esm/shared/typedMemo.js.map +1 -0
  155. package/build/types/action-form/ActionForm.d.ts +4 -0
  156. package/build/types/action-form/ActionForm.d.ts.map +1 -0
  157. package/build/types/action-form/ActionFormApi.d.ts +48 -32
  158. package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
  159. package/build/types/action-form/BaseForm.d.ts +3 -0
  160. package/build/types/action-form/BaseForm.d.ts.map +1 -0
  161. package/build/types/action-form/FormFieldApi.d.ts +58 -18
  162. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  163. package/build/types/action-form/fields/FieldBridge.d.ts +9 -0
  164. package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -0
  165. package/build/types/action-form/fields/FormFieldRenderer.d.ts +8 -0
  166. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -0
  167. package/build/types/action-form/fields/TextInputField.d.ts +3 -0
  168. package/build/types/action-form/fields/TextInputField.d.ts.map +1 -0
  169. package/build/types/action-form/utils/coerceFieldValue.d.ts +10 -0
  170. package/build/types/action-form/utils/coerceFieldValue.d.ts.map +1 -0
  171. package/build/types/action-form/utils/getDefaultFieldComponent.d.ts +6 -0
  172. package/build/types/action-form/utils/getDefaultFieldComponent.d.ts.map +1 -0
  173. package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts +6 -0
  174. package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts.map +1 -0
  175. package/build/types/base-components/tooltip/Tooltip.d.ts +31 -0
  176. package/build/types/base-components/tooltip/Tooltip.d.ts.map +1 -0
  177. package/build/types/base-components/tooltip/index.d.ts +1 -0
  178. package/build/types/base-components/tooltip/index.d.ts.map +1 -0
  179. package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -1
  180. package/build/types/filter-list/base/FilterIcons.d.ts +7 -0
  181. package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
  182. package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
  183. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
  184. package/build/types/filter-list/utils/assertUnreachable.d.ts +1 -6
  185. package/build/types/filter-list/utils/assertUnreachable.d.ts.map +1 -1
  186. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +5 -1
  187. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
  188. package/build/types/object-table/EditableCell.d.ts +8 -2
  189. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  190. package/build/types/object-table/ObjectTableApi.d.ts +7 -0
  191. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  192. package/build/types/object-table/Table.d.ts +4 -0
  193. package/build/types/object-table/Table.d.ts.map +1 -1
  194. package/build/types/object-table/TableEditContainer.d.ts +1 -1
  195. package/build/types/object-table/TableEditContainer.d.ts.map +1 -1
  196. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  197. package/build/types/object-table/TableRow.d.ts +2 -2
  198. package/build/types/object-table/TableRow.d.ts.map +1 -1
  199. package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -1
  200. package/build/types/object-table/utils/types.d.ts +7 -4
  201. package/build/types/object-table/utils/types.d.ts.map +1 -1
  202. package/build/types/shared/assertUnreachable.d.ts +6 -0
  203. package/build/types/shared/assertUnreachable.d.ts.map +1 -0
  204. package/build/types/shared/typedMemo.d.ts +6 -0
  205. package/build/types/shared/typedMemo.d.ts.map +1 -0
  206. package/package.json +6 -5
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { Error } from "@blueprintjs/icons";
17
18
  import React, { useCallback, useState } from "react";
18
19
  import { ActionButton } from "../base-components/action-button/ActionButton.js";
19
20
  import styles from "./TableEditContainer.module.css.js";
@@ -25,42 +26,52 @@ export function TableEditContainer({
25
26
  cellEdits,
26
27
  onSubmitEdits,
27
28
  clearEdits,
28
- editMode
29
- } = editableConfig ?? {};
29
+ editModeState,
30
+ validationErrors
31
+ } = editableConfig;
30
32
  const hasEdits = Object.keys(cellEdits ?? {}).length > 0;
33
+ const hasValidationError = (validationErrors?.size ?? 0) > 0;
31
34
  const [isSubmitting, setIsSubmitting] = useState(false);
32
- const isInEditMode = editMode?.isActive;
33
- const canToggleEditMode = editMode?.type === "manual";
35
+ const isInEditMode = editModeState.isActive;
36
+ const canToggleEditMode = editModeState.type === "manual";
34
37
  const handleSubmitEdits = useCallback(async () => {
35
38
  setIsSubmitting(true);
36
39
  try {
37
40
  const success = await onSubmitEdits?.();
38
41
  if (success) {
39
42
  clearEdits?.();
40
- if (editMode?.type === "manual") {
41
- editMode.setActive(false);
43
+ if (editModeState?.type === "manual") {
44
+ editModeState.setActive(false);
42
45
  }
43
46
  }
44
47
  } finally {
45
48
  setIsSubmitting(false);
46
49
  }
47
- }, [editMode, onSubmitEdits, clearEdits]);
50
+ }, [editModeState, onSubmitEdits, clearEdits]);
48
51
  const handleCancelEdits = useCallback(() => {
49
52
  clearEdits?.();
50
- if (editMode?.type === "manual") {
51
- editMode.setActive(false);
53
+ if (editModeState?.type === "manual") {
54
+ editModeState.setActive(false);
52
55
  }
53
- }, [clearEdits, editMode]);
56
+ }, [clearEdits, editModeState]);
54
57
  const handleEnterEditMode = useCallback(() => {
55
- if (editMode?.type === "manual") {
56
- editMode.setActive(true);
58
+ if (editModeState?.type === "manual") {
59
+ editModeState.setActive(true);
57
60
  }
58
- }, [editMode]);
61
+ }, [editModeState]);
59
62
  return /*#__PURE__*/React.createElement("div", {
60
63
  className: styles.tableEditContainer
61
- }, hasEdits ? /*#__PURE__*/React.createElement("div", {
64
+ }, hasEdits || hasValidationError ? /*#__PURE__*/React.createElement("div", {
65
+ className: styles.editsInfoContainer
66
+ }, hasEdits && /*#__PURE__*/React.createElement("div", {
62
67
  className: styles.modificationCount
63
- }, `${cellEdits ? Object.keys(cellEdits).length : 0} modifications`) : isInEditMode && !focusedRowId && /*#__PURE__*/React.createElement("div", {
68
+ }, `${cellEdits ? Object.keys(cellEdits).length : 0} modifications`), hasEdits && hasValidationError && /*#__PURE__*/React.createElement("div", {
69
+ className: styles.divider
70
+ }), hasValidationError && /*#__PURE__*/React.createElement("div", {
71
+ className: styles.validationError
72
+ }, /*#__PURE__*/React.createElement(Error, {
73
+ className: styles.errorIcon
74
+ }), "Validation error")) : isInEditMode && !focusedRowId && /*#__PURE__*/React.createElement("div", {
64
75
  className: styles.placeholder
65
76
  }, "Select a row to edit data\u2026"), /*#__PURE__*/React.createElement("div", {
66
77
  className: styles.editButtons
@@ -73,7 +84,7 @@ export function TableEditContainer({
73
84
  }, "Cancel"), isInEditMode && !!onSubmitEdits && /*#__PURE__*/React.createElement(ActionButton, {
74
85
  variant: "primary",
75
86
  onClick: handleSubmitEdits,
76
- disabled: !hasEdits || isSubmitting
87
+ disabled: !hasEdits || isSubmitting || hasValidationError
77
88
  }, "Submit Edits")));
78
89
  }
79
90
  //# sourceMappingURL=TableEditContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditContainer.js","names":["React","useCallback","useState","ActionButton","styles","TableEditContainer","editableConfig","focusedRowId","cellEdits","onSubmitEdits","clearEdits","editMode","hasEdits","Object","keys","length","isSubmitting","setIsSubmitting","isInEditMode","isActive","canToggleEditMode","type","handleSubmitEdits","success","setActive","handleCancelEdits","handleEnterEditMode","createElement","className","tableEditContainer","modificationCount","placeholder","editButtons","variant","onClick","disabled"],"sources":["TableEditContainer.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 } from \"@tanstack/react-table\";\nimport React, { type ReactElement, useCallback, useState } from \"react\";\nimport { ActionButton } from \"../base-components/action-button/ActionButton.js\";\nimport styles from \"./TableEditContainer.module.css\";\nimport type { EditableConfig } from \"./utils/types.js\";\n\ninterface TableEditContainerProps<\n TData extends RowData,\n> {\n editableConfig?: EditableConfig<TData, unknown>;\n focusedRowId?: string | null;\n}\n\nexport function TableEditContainer<\n TData extends RowData,\n>({\n editableConfig,\n focusedRowId,\n}: TableEditContainerProps<TData>): ReactElement {\n const {\n cellEdits,\n onSubmitEdits,\n clearEdits,\n editMode,\n } = editableConfig ?? {};\n\n const hasEdits = Object.keys(cellEdits ?? {}).length > 0;\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isInEditMode = editMode?.isActive;\n const canToggleEditMode = editMode?.type === \"manual\";\n\n const handleSubmitEdits = useCallback(async () => {\n setIsSubmitting(true);\n try {\n const success = await onSubmitEdits?.();\n if (success) {\n clearEdits?.();\n if (editMode?.type === \"manual\") {\n editMode.setActive(false);\n }\n }\n } finally {\n setIsSubmitting(false);\n }\n }, [editMode, onSubmitEdits, clearEdits]);\n\n const handleCancelEdits = useCallback(() => {\n clearEdits?.();\n if (editMode?.type === \"manual\") {\n editMode.setActive(false);\n }\n }, [clearEdits, editMode]);\n\n const handleEnterEditMode = useCallback(() => {\n if (editMode?.type === \"manual\") {\n editMode.setActive(true);\n }\n }, [editMode]);\n\n return (\n <div className={styles.tableEditContainer}>\n {hasEdits\n ? (\n <div className={styles.modificationCount}>\n {`${cellEdits ? Object.keys(cellEdits).length : 0} modifications`}\n </div>\n )\n : (isInEditMode && !focusedRowId && (\n <div className={styles.placeholder}>\n Select a row to edit data…\n </div>\n ))}\n <div className={styles.editButtons}>\n {!isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"primary\"\n onClick={handleEnterEditMode}\n >\n Edit Table\n </ActionButton>\n )}\n {isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"secondary\"\n onClick={handleCancelEdits}\n >\n Cancel\n </ActionButton>\n )}\n {isInEditMode && !!onSubmitEdits && (\n <ActionButton\n variant=\"primary\"\n onClick={handleSubmitEdits}\n disabled={!hasEdits || isSubmitting}\n >\n Submit Edits\n </ActionButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TableEditContainer.js","names":["Error","React","useCallback","useState","ActionButton","styles","TableEditContainer","editableConfig","focusedRowId","cellEdits","onSubmitEdits","clearEdits","editModeState","validationErrors","hasEdits","Object","keys","length","hasValidationError","size","isSubmitting","setIsSubmitting","isInEditMode","isActive","canToggleEditMode","type","handleSubmitEdits","success","setActive","handleCancelEdits","handleEnterEditMode","createElement","className","tableEditContainer","editsInfoContainer","modificationCount","divider","validationError","errorIcon","placeholder","editButtons","variant","onClick","disabled"],"sources":["TableEditContainer.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { Error } from \"@blueprintjs/icons\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport React, { type ReactElement, useCallback, useState } from \"react\";\nimport { ActionButton } from \"../base-components/action-button/ActionButton.js\";\nimport styles from \"./TableEditContainer.module.css\";\nimport type { EditableConfig } from \"./utils/types.js\";\n\ninterface TableEditContainerProps<\n TData extends RowData,\n> {\n editableConfig: EditableConfig<TData, unknown>;\n focusedRowId?: string | null;\n}\n\nexport function TableEditContainer<\n TData extends RowData,\n>({\n editableConfig,\n focusedRowId,\n}: TableEditContainerProps<TData>): ReactElement {\n const {\n cellEdits,\n onSubmitEdits,\n clearEdits,\n editModeState,\n validationErrors,\n } = editableConfig;\n\n const hasEdits = Object.keys(cellEdits ?? {}).length > 0;\n const hasValidationError = (validationErrors?.size ?? 0) > 0;\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isInEditMode = editModeState.isActive;\n const canToggleEditMode = editModeState.type === \"manual\";\n\n const handleSubmitEdits = useCallback(async () => {\n setIsSubmitting(true);\n try {\n const success = await onSubmitEdits?.();\n if (success) {\n clearEdits?.();\n if (editModeState?.type === \"manual\") {\n editModeState.setActive(false);\n }\n }\n } finally {\n setIsSubmitting(false);\n }\n }, [editModeState, onSubmitEdits, clearEdits]);\n\n const handleCancelEdits = useCallback(() => {\n clearEdits?.();\n if (editModeState?.type === \"manual\") {\n editModeState.setActive(false);\n }\n }, [clearEdits, editModeState]);\n\n const handleEnterEditMode = useCallback(() => {\n if (editModeState?.type === \"manual\") {\n editModeState.setActive(true);\n }\n }, [editModeState]);\n\n return (\n <div className={styles.tableEditContainer}>\n {hasEdits || hasValidationError\n ? (\n <div className={styles.editsInfoContainer}>\n {hasEdits && (\n <div className={styles.modificationCount}>\n {`${\n cellEdits ? Object.keys(cellEdits).length : 0\n } modifications`}\n </div>\n )}\n {hasEdits && hasValidationError && (\n <div className={styles.divider} />\n )}\n {hasValidationError && (\n <div className={styles.validationError}>\n <Error className={styles.errorIcon} />\n Validation error\n </div>\n )}\n </div>\n )\n : (isInEditMode && !focusedRowId && (\n <div className={styles.placeholder}>\n Select a row to edit data…\n </div>\n ))}\n <div className={styles.editButtons}>\n {!isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"primary\"\n onClick={handleEnterEditMode}\n >\n Edit Table\n </ActionButton>\n )}\n {isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"secondary\"\n onClick={handleCancelEdits}\n >\n Cancel\n </ActionButton>\n )}\n {isInEditMode && !!onSubmitEdits && (\n <ActionButton\n variant=\"primary\"\n onClick={handleSubmitEdits}\n disabled={!hasEdits || isSubmitting || hasValidationError}\n >\n Submit Edits\n </ActionButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,6 +30,15 @@
30
30
  padding: calc(var(--osdk-surface-spacing) * 2) 0;
31
31
  }
32
32
 
33
+ .editsInfoContainer {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ flex-direction: row;
38
+ gap: calc(var(--osdk-surface-spacing) * 3);
39
+ font-size: var(--osdk-typography-size-body-small);
40
+ }
41
+
33
42
  .modificationCount {
34
43
  color: var(--osdk-intent-primary-rest);
35
44
  font-size: var(--osdk-typography-size-body-small);
@@ -42,3 +51,21 @@
42
51
  gap: 8px;
43
52
  flex: 1;
44
53
  }
54
+
55
+ .validationError {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: calc(var(--osdk-surface-spacing) * 2);
59
+ color: var(--osdk-intent-danger-rest);
60
+ }
61
+
62
+ .errorIcon {
63
+ color: var(--osdk-intent-danger-rest);
64
+ }
65
+
66
+ .divider {
67
+ width: 1px;
68
+ height: 8px;
69
+ background-color: var(--osdk-surface-border-color-default);
70
+ align-self: center;
71
+ }
@@ -2,8 +2,12 @@
2
2
  const styles = {
3
3
  "tableEditContainer": "TableEditContainer-module__tableEditContainer___cIVjgtld",
4
4
  "placeholder": "TableEditContainer-module__placeholder___ggxoxvTp",
5
+ "editsInfoContainer": "TableEditContainer-module__editsInfoContainer___rio3wv4g",
5
6
  "modificationCount": "TableEditContainer-module__modificationCount___sLN93v77",
6
- "editButtons": "TableEditContainer-module__editButtons___xI-Z7kz1"
7
+ "editButtons": "TableEditContainer-module__editButtons___xI-Z7kz1",
8
+ "validationError": "TableEditContainer-module__validationError___kQN-U73X",
9
+ "errorIcon": "TableEditContainer-module__errorIcon___aZ797GFl",
10
+ "divider": "TableEditContainer-module__divider___W-1K3O-k"
7
11
  };
8
12
 
9
13
  export default styles;
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import classNames from "classnames";
17
18
  import React, { useCallback, useMemo, useState } from "react";
18
19
  import { ColumnConfigDialog } from "./ColumnConfigDialog.js";
19
20
  import { MultiColumnSortDialog } from "./MultiColumnSortDialog.js";
@@ -111,7 +112,9 @@ export function TableHeader({
111
112
  return /*#__PURE__*/React.createElement("th", {
112
113
  key: header.id,
113
114
  "data-pinned": header.column.getIsPinned(),
114
- className: styles.osdkTableHeaderCell,
115
+ className: classNames(styles.osdkTableHeaderCell, {
116
+ [styles.osdkTableSelectionHeaderCell]: isSelectColumn
117
+ }),
115
118
  style: columnStyles
116
119
  }, header.isPlaceholder ? null : isSelectColumn ? /*#__PURE__*/React.createElement(TableHeaderContent, {
117
120
  header: header
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeader.js","names":["React","useCallback","useMemo","useState","ColumnConfigDialog","MultiColumnSortDialog","styles","TableHeaderContent","TableHeaderWithPopover","SELECTION_COLUMN_ID","getColumnPinningStyles","getHeaderName","column","allHeaders","id","columnDef","header","find","headerDef","displayedHeader","getContext","meta","columnName","TableHeader","table","headerMenuFeatureFlags","setColumnOrder","setColumnVisibility","setSorting","currentSorting","getState","sorting","currentVisibility","columnVisibility","currentColumnOrder","columnOrder","isResizing","columnSizingInfo","isResizingColumn","configDialogOpen","setConfigDialogOpen","multiSortDialogOpen","setMultiSortDialogOpen","handleOpenColumnConfig","handleCloseColumnConfig","handleOpenMultiSort","handleCloseMultiSort","handleApplyMultiSort","sortColumns","handleApplyColumnConfig","updates","newVisibilityState","update","columnId","isVisible","map","col","columnOptions","getHeaderGroups","flatMap","headerGroup","headers","getAllColumns","filter","name","canSort","getCanSort","createElement","Fragment","className","osdkTableHeader","key","osdkTableHeaderRow","columnStyles","isColumnPinned","getIsPinned","isSelectColumn","osdkTableHeaderCell","style","isPlaceholder","featureFlags","onOpenColumnConfig","onOpenMultiSort","getCanResize","showResizeItem","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","length","isOpen","onClose","onApply","some"],"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 {\n Column,\n Header,\n RowData,\n SortingState,\n Table,\n VisibilityState,\n} from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { type ColumnConfig, ColumnConfigDialog } from \"./ColumnConfigDialog.js\";\nimport { MultiColumnSortDialog } from \"./MultiColumnSortDialog.js\";\nimport styles from \"./TableHeader.module.css\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport {\n type HeaderMenuFeatureFlags,\n TableHeaderWithPopover,\n} from \"./TableHeaderWithPopover.js\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\nimport type { ColumnOption } from \"./utils/types.js\";\n\ninterface TableHeaderProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n}\n\nconst getHeaderName = <TData,>(\n column: Column<TData, unknown>,\n allHeaders: Header<TData, unknown>[],\n) => {\n const { id, columnDef } = column;\n const header = allHeaders.find(header => header.id === id);\n const headerDef = columnDef.header;\n\n if (headerDef) {\n if (typeof headerDef === \"string\") {\n return headerDef;\n }\n // Try to get header name from the renderHeader function\n if (header) {\n const displayedHeader = headerDef(header.getContext());\n if (typeof displayedHeader === \"string\") return displayedHeader;\n }\n }\n // Fallback to use the columnName provided by user or id\n const { meta } = columnDef;\n return meta?.columnName ?? id;\n};\n\nexport function TableHeader<\n TData extends RowData,\n>({\n table,\n headerMenuFeatureFlags,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const {\n setColumnOrder,\n setColumnVisibility,\n setSorting,\n } = table;\n\n const currentSorting = table.getState().sorting;\n const currentVisibility = table.getState().columnVisibility;\n const currentColumnOrder = table.getState().columnOrder;\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n const [configDialogOpen, setConfigDialogOpen] = useState(false);\n const [multiSortDialogOpen, setMultiSortDialogOpen] = useState(false);\n\n const handleOpenColumnConfig = useCallback(() => {\n setConfigDialogOpen(true);\n }, []);\n\n const handleCloseColumnConfig = useCallback(() => {\n setConfigDialogOpen(false);\n }, []);\n\n const handleOpenMultiSort = useCallback(() => {\n setMultiSortDialogOpen(true);\n }, []);\n\n const handleCloseMultiSort = useCallback(() => {\n setMultiSortDialogOpen(false);\n }, []);\n\n const handleApplyMultiSort = useCallback(\n (sortColumns: SortingState) => {\n setMultiSortDialogOpen(false);\n setSorting?.(sortColumns);\n },\n [setSorting],\n );\n\n const handleApplyColumnConfig = useCallback(\n (updates: ColumnConfig[]) => {\n const newVisibilityState: VisibilityState = {};\n for (const update of updates) {\n newVisibilityState[update.columnId] = update.isVisible;\n }\n\n setColumnOrder(updates.map(col => col.columnId));\n setColumnVisibility(newVisibilityState);\n },\n [setColumnOrder, setColumnVisibility],\n );\n\n const columnOptions: ColumnOption[] = useMemo(() => {\n const allHeaders = table.getHeaderGroups().flatMap(headerGroup =>\n headerGroup.headers\n );\n\n return table\n .getAllColumns()\n .filter((column) => column.id !== SELECTION_COLUMN_ID)\n .map((column) => {\n return {\n id: column.id,\n name: getHeaderName(column, allHeaders),\n canSort: column.getCanSort(),\n };\n });\n }, [table]);\n\n return (\n <>\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 table={table}\n header={header}\n isColumnPinned={isColumnPinned}\n columnOptions={columnOptions}\n featureFlags={headerMenuFeatureFlags}\n onOpenColumnConfig={handleOpenColumnConfig}\n onOpenMultiSort={handleOpenMultiSort}\n />\n )}\n {header.column.getCanResize()\n && headerMenuFeatureFlags?.showResizeItem !== false && (\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 {!!columnOptions?.length && (\n <ColumnConfigDialog\n isOpen={configDialogOpen}\n onClose={handleCloseColumnConfig}\n columnOptions={columnOptions}\n currentVisibility={currentVisibility}\n currentColumnOrder={currentColumnOrder}\n onApply={handleApplyColumnConfig}\n />\n )}\n {columnOptions?.some(col => col.canSort) && (\n <MultiColumnSortDialog\n isOpen={multiSortDialogOpen}\n onClose={handleCloseMultiSort}\n columnOptions={columnOptions}\n currentSorting={currentSorting}\n onApply={handleApplyMultiSort}\n />\n )}\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TableHeader.js","names":["classNames","React","useCallback","useMemo","useState","ColumnConfigDialog","MultiColumnSortDialog","styles","TableHeaderContent","TableHeaderWithPopover","SELECTION_COLUMN_ID","getColumnPinningStyles","getHeaderName","column","allHeaders","id","columnDef","header","find","headerDef","displayedHeader","getContext","meta","columnName","TableHeader","table","headerMenuFeatureFlags","setColumnOrder","setColumnVisibility","setSorting","currentSorting","getState","sorting","currentVisibility","columnVisibility","currentColumnOrder","columnOrder","isResizing","columnSizingInfo","isResizingColumn","configDialogOpen","setConfigDialogOpen","multiSortDialogOpen","setMultiSortDialogOpen","handleOpenColumnConfig","handleCloseColumnConfig","handleOpenMultiSort","handleCloseMultiSort","handleApplyMultiSort","sortColumns","handleApplyColumnConfig","updates","newVisibilityState","update","columnId","isVisible","map","col","columnOptions","getHeaderGroups","flatMap","headerGroup","headers","getAllColumns","filter","name","canSort","getCanSort","createElement","Fragment","className","osdkTableHeader","key","osdkTableHeaderRow","columnStyles","isColumnPinned","getIsPinned","isSelectColumn","osdkTableHeaderCell","osdkTableSelectionHeaderCell","style","isPlaceholder","featureFlags","onOpenColumnConfig","onOpenMultiSort","getCanResize","showResizeItem","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","length","isOpen","onClose","onApply","some"],"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 {\n Column,\n Header,\n RowData,\n SortingState,\n Table,\n VisibilityState,\n} from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { type ColumnConfig, ColumnConfigDialog } from \"./ColumnConfigDialog.js\";\nimport { MultiColumnSortDialog } from \"./MultiColumnSortDialog.js\";\nimport styles from \"./TableHeader.module.css\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport {\n type HeaderMenuFeatureFlags,\n TableHeaderWithPopover,\n} from \"./TableHeaderWithPopover.js\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\nimport type { ColumnOption } from \"./utils/types.js\";\n\ninterface TableHeaderProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n}\n\nconst getHeaderName = <TData,>(\n column: Column<TData, unknown>,\n allHeaders: Header<TData, unknown>[],\n) => {\n const { id, columnDef } = column;\n const header = allHeaders.find(header => header.id === id);\n const headerDef = columnDef.header;\n\n if (headerDef) {\n if (typeof headerDef === \"string\") {\n return headerDef;\n }\n // Try to get header name from the renderHeader function\n if (header) {\n const displayedHeader = headerDef(header.getContext());\n if (typeof displayedHeader === \"string\") return displayedHeader;\n }\n }\n // Fallback to use the columnName provided by user or id\n const { meta } = columnDef;\n return meta?.columnName ?? id;\n};\n\nexport function TableHeader<\n TData extends RowData,\n>({\n table,\n headerMenuFeatureFlags,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const {\n setColumnOrder,\n setColumnVisibility,\n setSorting,\n } = table;\n\n const currentSorting = table.getState().sorting;\n const currentVisibility = table.getState().columnVisibility;\n const currentColumnOrder = table.getState().columnOrder;\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n const [configDialogOpen, setConfigDialogOpen] = useState(false);\n const [multiSortDialogOpen, setMultiSortDialogOpen] = useState(false);\n\n const handleOpenColumnConfig = useCallback(() => {\n setConfigDialogOpen(true);\n }, []);\n\n const handleCloseColumnConfig = useCallback(() => {\n setConfigDialogOpen(false);\n }, []);\n\n const handleOpenMultiSort = useCallback(() => {\n setMultiSortDialogOpen(true);\n }, []);\n\n const handleCloseMultiSort = useCallback(() => {\n setMultiSortDialogOpen(false);\n }, []);\n\n const handleApplyMultiSort = useCallback(\n (sortColumns: SortingState) => {\n setMultiSortDialogOpen(false);\n setSorting?.(sortColumns);\n },\n [setSorting],\n );\n\n const handleApplyColumnConfig = useCallback(\n (updates: ColumnConfig[]) => {\n const newVisibilityState: VisibilityState = {};\n for (const update of updates) {\n newVisibilityState[update.columnId] = update.isVisible;\n }\n\n setColumnOrder(updates.map(col => col.columnId));\n setColumnVisibility(newVisibilityState);\n },\n [setColumnOrder, setColumnVisibility],\n );\n\n const columnOptions: ColumnOption[] = useMemo(() => {\n const allHeaders = table.getHeaderGroups().flatMap(headerGroup =>\n headerGroup.headers\n );\n\n return table\n .getAllColumns()\n .filter((column) => column.id !== SELECTION_COLUMN_ID)\n .map((column) => {\n return {\n id: column.id,\n name: getHeaderName(column, allHeaders),\n canSort: column.getCanSort(),\n };\n });\n }, [table]);\n\n return (\n <>\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={classNames(styles.osdkTableHeaderCell, {\n [styles.osdkTableSelectionHeaderCell]: isSelectColumn,\n })}\n style={columnStyles}\n >\n {header.isPlaceholder\n ? null\n : isSelectColumn\n ? <TableHeaderContent header={header} />\n : (\n <TableHeaderWithPopover\n table={table}\n header={header}\n isColumnPinned={isColumnPinned}\n columnOptions={columnOptions}\n featureFlags={headerMenuFeatureFlags}\n onOpenColumnConfig={handleOpenColumnConfig}\n onOpenMultiSort={handleOpenMultiSort}\n />\n )}\n {header.column.getCanResize()\n && headerMenuFeatureFlags?.showResizeItem !== false && (\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 {!!columnOptions?.length && (\n <ColumnConfigDialog\n isOpen={configDialogOpen}\n onClose={handleCloseColumnConfig}\n columnOptions={columnOptions}\n currentVisibility={currentVisibility}\n currentColumnOrder={currentColumnOrder}\n onApply={handleApplyColumnConfig}\n />\n )}\n {columnOptions?.some(col => col.canSort) && (\n <MultiColumnSortDialog\n isOpen={multiSortDialogOpen}\n onClose={handleCloseMultiSort}\n columnOptions={columnOptions}\n currentSorting={currentSorting}\n onApply={handleApplyMultiSort}\n />\n )}\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -78,8 +78,9 @@
78
78
  border-left: var(--osdk-table-pinned-column-border);
79
79
  }
80
80
 
81
- .osdkTableHeaderCell:has([role="checkbox"]) {
81
+ .osdkTableSelectionHeaderCell {
82
82
  justify-content: center;
83
+ padding: 0;
83
84
  }
84
85
 
85
86
  .osdkTableHeaderResizer {
@@ -3,6 +3,7 @@ const styles = {
3
3
  "osdkTableHeader": "TableHeader-module__osdkTableHeader___4Wzqkog9",
4
4
  "osdkTableHeaderRow": "TableHeader-module__osdkTableHeaderRow___lUjQpm91",
5
5
  "osdkTableHeaderCell": "TableHeader-module__osdkTableHeaderCell___iS9lGU8Z",
6
+ "osdkTableSelectionHeaderCell": "TableHeader-module__osdkTableSelectionHeaderCell___9Zt7O2Pz",
6
7
  "osdkTableHeaderResizer": "TableHeader-module__osdkTableHeaderResizer___qpjGLncF",
7
8
  "osdkLoadingHeaderCell": "TableHeader-module__osdkLoadingHeaderCell___gohWQuYX"
8
9
  };
@@ -22,7 +22,7 @@ export function TableRow({
22
22
  virtualRow,
23
23
  onRowClick,
24
24
  renderCellContextMenu,
25
- focusedRowId,
25
+ isFocused,
26
26
  setFocusedRowId,
27
27
  isInEditMode
28
28
  }) {
@@ -34,7 +34,7 @@ export function TableRow({
34
34
  }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);
35
35
  return /*#__PURE__*/React.createElement("tr", {
36
36
  "data-selected": row.getIsSelected(),
37
- "data-focused": focusedRowId === row.id,
37
+ "data-focused": isFocused,
38
38
  className: styles.osdkTableRow,
39
39
  style: {
40
40
  height: `${virtualRow.size}px`,
@@ -1 +1 @@
1
- {"version":3,"file":"TableRow.js","names":["React","useCallback","TableCell","styles","TableRow","row","virtualRow","onRowClick","renderCellContextMenu","focusedRowId","setFocusedRowId","isInEditMode","handleClick","id","original","createElement","getIsSelected","className","osdkTableRow","style","height","size","transform","start","onClick","getVisibleCells","map","cell","key"],"sources":["TableRow.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 { Cell, Row, RowData } from \"@tanstack/react-table\";\nimport type { VirtualItem } from \"@tanstack/react-virtual\";\nimport React, { useCallback } from \"react\";\nimport { TableCell } from \"./TableCell.js\";\nimport styles from \"./TableRow.module.css\";\n\ninterface TableRowProps<TData extends RowData> {\n row: Row<TData>;\n virtualRow: VirtualItem;\n onRowClick?: (row: TData) => void;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n focusedRowId?: string | null;\n setFocusedRowId?: (rowId: string | null) => void;\n isInEditMode?: boolean;\n}\n\nexport function TableRow<TData extends RowData>({\n row,\n virtualRow,\n onRowClick,\n renderCellContextMenu,\n focusedRowId,\n setFocusedRowId,\n isInEditMode,\n}: TableRowProps<TData>): React.ReactElement {\n const handleClick = useCallback(() => {\n setFocusedRowId?.(row.id);\n\n if (!isInEditMode) {\n onRowClick?.(row.original);\n }\n }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);\n\n return (\n <tr\n data-selected={row.getIsSelected()}\n data-focused={focusedRowId === row.id}\n className={styles.osdkTableRow}\n style={{\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n onClick={handleClick}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n cell={cell}\n renderCellContextMenu={renderCellContextMenu}\n />\n ))}\n </tr>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,OAAOC,MAAM,MAAM,uBAAuB;AAe1C,OAAO,SAASC,QAAQA,CAAwB;EAC9CC,GAAG;EACHC,UAAU;EACVC,UAAU;EACVC,qBAAqB;EACrBC,YAAY;EACZC,eAAe;EACfC;AACoB,CAAC,EAAsB;EAC3C,MAAMC,WAAW,GAAGX,WAAW,CAAC,MAAM;IACpCS,eAAe,GAAGL,GAAG,CAACQ,EAAE,CAAC;IAEzB,IAAI,CAACF,YAAY,EAAE;MACjBJ,UAAU,GAAGF,GAAG,CAACS,QAAQ,CAAC;IAC5B;EACF,CAAC,EAAE,CAACH,YAAY,EAAEJ,UAAU,EAAEF,GAAG,CAACS,QAAQ,EAAET,GAAG,CAACQ,EAAE,EAAEH,eAAe,CAAC,CAAC;EAErE,oBACEV,KAAA,CAAAe,aAAA;IACE,iBAAeV,GAAG,CAACW,aAAa,CAAC,CAAE;IACnC,gBAAcP,YAAY,KAAKJ,GAAG,CAACQ,EAAG;IACtCI,SAAS,EAAEd,MAAM,CAACe,YAAa;IAC/BC,KAAK,EAAE;MACLC,MAAM,EAAE,GAAGd,UAAU,CAACe,IAAI,IAAI;MAC9BC,SAAS,EAAE,cAAchB,UAAU,CAACiB,KAAK;IAC3C,CAAE;IACFC,OAAO,EAAEZ;EAAY,GAEpBP,GAAG,CAACoB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,IAAI,iBAC9B3B,KAAA,CAAAe,aAAA,CAACb,SAAS;IACR0B,GAAG,EAAED,IAAI,CAACd,EAAG;IACbc,IAAI,EAAEA,IAAK;IACXnB,qBAAqB,EAAEA;EAAsB,CAC9C,CACF,CACC,CAAC;AAET","ignoreList":[]}
1
+ {"version":3,"file":"TableRow.js","names":["React","useCallback","TableCell","styles","TableRow","row","virtualRow","onRowClick","renderCellContextMenu","isFocused","setFocusedRowId","isInEditMode","handleClick","id","original","createElement","getIsSelected","className","osdkTableRow","style","height","size","transform","start","onClick","getVisibleCells","map","cell","key"],"sources":["TableRow.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 { Cell, Row, RowData } from \"@tanstack/react-table\";\nimport type { VirtualItem } from \"@tanstack/react-virtual\";\nimport React, { useCallback } from \"react\";\nimport { TableCell } from \"./TableCell.js\";\nimport styles from \"./TableRow.module.css\";\n\ninterface TableRowProps<TData extends RowData> {\n row: Row<TData>;\n virtualRow: VirtualItem;\n onRowClick?: (row: TData) => void;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n isFocused: boolean;\n setFocusedRowId?: (rowId: string | null) => void;\n isInEditMode?: boolean;\n}\n\nexport function TableRow<TData extends RowData>({\n row,\n virtualRow,\n onRowClick,\n renderCellContextMenu,\n isFocused,\n setFocusedRowId,\n isInEditMode,\n}: TableRowProps<TData>): React.ReactElement {\n const handleClick = useCallback(() => {\n setFocusedRowId?.(row.id);\n\n if (!isInEditMode) {\n onRowClick?.(row.original);\n }\n }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);\n\n return (\n <tr\n data-selected={row.getIsSelected()}\n data-focused={isFocused}\n className={styles.osdkTableRow}\n style={{\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n onClick={handleClick}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n cell={cell}\n renderCellContextMenu={renderCellContextMenu}\n />\n ))}\n </tr>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,OAAOC,MAAM,MAAM,uBAAuB;AAe1C,OAAO,SAASC,QAAQA,CAAwB;EAC9CC,GAAG;EACHC,UAAU;EACVC,UAAU;EACVC,qBAAqB;EACrBC,SAAS;EACTC,eAAe;EACfC;AACoB,CAAC,EAAsB;EAC3C,MAAMC,WAAW,GAAGX,WAAW,CAAC,MAAM;IACpCS,eAAe,GAAGL,GAAG,CAACQ,EAAE,CAAC;IAEzB,IAAI,CAACF,YAAY,EAAE;MACjBJ,UAAU,GAAGF,GAAG,CAACS,QAAQ,CAAC;IAC5B;EACF,CAAC,EAAE,CAACH,YAAY,EAAEJ,UAAU,EAAEF,GAAG,CAACS,QAAQ,EAAET,GAAG,CAACQ,EAAE,EAAEH,eAAe,CAAC,CAAC;EAErE,oBACEV,KAAA,CAAAe,aAAA;IACE,iBAAeV,GAAG,CAACW,aAAa,CAAC,CAAE;IACnC,gBAAcP,SAAU;IACxBQ,SAAS,EAAEd,MAAM,CAACe,YAAa;IAC/BC,KAAK,EAAE;MACLC,MAAM,EAAE,GAAGd,UAAU,CAACe,IAAI,IAAI;MAC9BC,SAAS,EAAE,cAAchB,UAAU,CAACiB,KAAK;IAC3C,CAAE;IACFC,OAAO,EAAEZ;EAAY,GAEpBP,GAAG,CAACoB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,IAAI,iBAC9B3B,KAAA,CAAAe,aAAA,CAACb,SAAS;IACR0B,GAAG,EAAED,IAAI,CAACd,EAAG;IACbc,IAAI,EAAEA,IAAK;IACXnB,qBAAqB,EAAEA;EAAsB,CAC9C,CACF,CACC,CAAC;AAET","ignoreList":[]}
@@ -68,7 +68,8 @@ function getColumnsFromColumnDefinitions(columnDefinitions, objectProperties) {
68
68
  columnName: columnName || propertyMetadata?.displayName,
69
69
  isVisible: col.isVisible !== false,
70
70
  editable,
71
- dataType
71
+ dataType,
72
+ validateEdit: col.validateEdit
72
73
  },
73
74
  size: width,
74
75
  ...(minWidth ? {
@@ -1 +1 @@
1
- {"version":3,"file":"useColumnDefs.js","names":["useOsdkMetadata","useMemo","renderDefaultCell","useColumnDefs","objectType","columnDefinitions","metadata","loading","error","columns","objectProperties","properties","getColumnsFromColumnDefinitions","getDefaultColumns","map","col","locator","width","minWidth","maxWidth","resizable","orderable","filterable","editable","renderCell","renderHeader","columnName","propertyMetadata","type","id","undefined","colKey","dataType","colDef","accessorKey","header","displayName","meta","isVisible","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","cell","cellContext","object","row","original","Object","entries","key","property"],"sources":["useColumnDefs.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectMetadata,\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport type { AccessorColumnDef } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { renderDefaultCell } from \"../DefaultCellRenderer.js\";\nimport type { ColumnDefinition } from \"../ObjectTableApi.js\";\n\ninterface UseColumnDefsResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n> {\n columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[];\n\n loading: boolean;\n\n error: string | undefined;\n}\n\n/**\n * Hook which builds column definitions for tanstack-table given the objectSet\n */\nexport function useColumnDefs<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n objectType: Q,\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): UseColumnDefsResult<Q, RDPs> {\n const { metadata, loading, error } = useOsdkMetadata(objectType);\n\n const columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[] = useMemo(() => {\n const objectProperties = metadata?.properties;\n // If columnDefinitions is provided, construct colDefs with it\n if (columnDefinitions) {\n return getColumnsFromColumnDefinitions<Q, RDPs, FunctionColumns>(\n columnDefinitions,\n objectProperties,\n );\n }\n\n // If not, return the default columns from the object properties\n return getDefaultColumns<Q, RDPs>(objectProperties);\n }, [columnDefinitions, metadata?.properties]);\n\n return { columns, loading, error };\n}\n\nfunction getColumnsFromColumnDefinitions<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n return columnDefinitions.map((col) => {\n const {\n locator,\n width,\n minWidth,\n maxWidth,\n resizable,\n orderable,\n filterable,\n editable,\n renderCell,\n renderHeader,\n columnName,\n } = col;\n\n const propertyMetadata = locator.type === \"property\"\n ? objectProperties?.[locator.id]\n : undefined;\n\n const colKey = locator.id as string;\n\n const dataType =\n propertyMetadata?.type && typeof propertyMetadata.type === \"string\"\n ? propertyMetadata.type\n : undefined;\n\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n id: colKey,\n accessorKey: colKey,\n header: renderHeader ?? (columnName || propertyMetadata?.displayName),\n meta: {\n columnName: columnName || propertyMetadata?.displayName,\n isVisible: col.isVisible !== false,\n editable,\n dataType,\n },\n size: width,\n ...(minWidth ? { minSize: minWidth } : {}),\n ...(maxWidth ? { maxSize: maxWidth } : {}),\n enableResizing: resizable,\n enableSorting: orderable,\n enableColumnFilter: filterable,\n cell: (cellContext) => {\n const object: Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n > = cellContext.row.original;\n\n if (renderCell) {\n return renderCell(object, locator);\n }\n\n return renderDefaultCell(cellContext);\n },\n };\n\n return colDef;\n });\n}\n\nfunction getDefaultColumns<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n>(\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n if (!objectProperties) return [];\n\n return Object.entries(objectProperties).map(([key, property]) => {\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n accessorKey: key,\n header: property.displayName ?? key,\n };\n return colDef;\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useColumnDefs.js","names":["useOsdkMetadata","useMemo","renderDefaultCell","useColumnDefs","objectType","columnDefinitions","metadata","loading","error","columns","objectProperties","properties","getColumnsFromColumnDefinitions","getDefaultColumns","map","col","locator","width","minWidth","maxWidth","resizable","orderable","filterable","editable","renderCell","renderHeader","columnName","propertyMetadata","type","id","undefined","colKey","dataType","colDef","accessorKey","header","displayName","meta","isVisible","validateEdit","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","cell","cellContext","object","row","original","Object","entries","key","property"],"sources":["useColumnDefs.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectMetadata,\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport type { AccessorColumnDef } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { renderDefaultCell } from \"../DefaultCellRenderer.js\";\nimport type { ColumnDefinition } from \"../ObjectTableApi.js\";\n\ninterface UseColumnDefsResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n> {\n columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[];\n\n loading: boolean;\n\n error: string | undefined;\n}\n\n/**\n * Hook which builds column definitions for tanstack-table given the objectSet\n */\nexport function useColumnDefs<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n objectType: Q,\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): UseColumnDefsResult<Q, RDPs> {\n const { metadata, loading, error } = useOsdkMetadata(objectType);\n\n const columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[] = useMemo(() => {\n const objectProperties = metadata?.properties;\n // If columnDefinitions is provided, construct colDefs with it\n if (columnDefinitions) {\n return getColumnsFromColumnDefinitions<Q, RDPs, FunctionColumns>(\n columnDefinitions,\n objectProperties,\n );\n }\n\n // If not, return the default columns from the object properties\n return getDefaultColumns<Q, RDPs>(objectProperties);\n }, [columnDefinitions, metadata?.properties]);\n\n return { columns, loading, error };\n}\n\nfunction getColumnsFromColumnDefinitions<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n return columnDefinitions.map((col) => {\n const {\n locator,\n width,\n minWidth,\n maxWidth,\n resizable,\n orderable,\n filterable,\n editable,\n renderCell,\n renderHeader,\n columnName,\n } = col;\n\n const propertyMetadata = locator.type === \"property\"\n ? objectProperties?.[locator.id]\n : undefined;\n\n const colKey = locator.id as string;\n\n const dataType =\n propertyMetadata?.type && typeof propertyMetadata.type === \"string\"\n ? propertyMetadata.type\n : undefined;\n\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n id: colKey,\n accessorKey: colKey,\n header: renderHeader ?? (columnName || propertyMetadata?.displayName),\n meta: {\n columnName: columnName || propertyMetadata?.displayName,\n isVisible: col.isVisible !== false,\n editable,\n dataType,\n validateEdit: col.validateEdit,\n },\n size: width,\n ...(minWidth ? { minSize: minWidth } : {}),\n ...(maxWidth ? { maxSize: maxWidth } : {}),\n enableResizing: resizable,\n enableSorting: orderable,\n enableColumnFilter: filterable,\n cell: (cellContext) => {\n const object: Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n > = cellContext.row.original;\n\n if (renderCell) {\n return renderCell(object, locator);\n }\n\n return renderDefaultCell(cellContext);\n },\n };\n\n return colDef;\n });\n}\n\nfunction getDefaultColumns<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n>(\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n if (!objectProperties) return [];\n\n return Object.entries(objectProperties).map(([key, property]) => {\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n accessorKey: key,\n header: property.displayName ?? key,\n };\n return colDef;\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -22,6 +22,14 @@ export function useEditableTable({
22
22
  }) {
23
23
  const [isActive, setActive] = useState(editMode === "always");
24
24
  const [cellEdits, setCellEdits] = useState({});
25
+ const [validationErrors, setValidationErrors] = useState(new Map());
26
+ const clearCellValidationError = useCallback(cellId => {
27
+ setValidationErrors(prev => {
28
+ const newErrors = new Map(prev);
29
+ newErrors.delete(cellId);
30
+ return newErrors;
31
+ });
32
+ }, []);
25
33
  const handleCellEdit = useCallback((cellId, info) => {
26
34
  // If value is changed back to original, remove it from edits
27
35
  if (info.newValue === info.oldValue) {
@@ -42,12 +50,20 @@ export function useEditableTable({
42
50
  }, [onCellValueChanged]);
43
51
  const clearEdits = useCallback(() => {
44
52
  setCellEdits({});
53
+ setValidationErrors(new Map());
45
54
  }, []);
46
55
  const handleSubmitEdits = useCallback(async () => {
47
56
  const edits = Object.values(cellEdits);
48
57
  return onSubmitEdits ? onSubmitEdits(edits) : false;
49
58
  }, [cellEdits, onSubmitEdits]);
50
- const editModeConfig = editMode === "always" ? {
59
+ const onCellValidationError = useCallback((cellId, error) => {
60
+ setValidationErrors(prev => {
61
+ const newErrors = new Map(prev);
62
+ newErrors.set(cellId, error);
63
+ return newErrors;
64
+ });
65
+ }, []);
66
+ const editModeState = editMode === "always" ? {
51
67
  type: "always",
52
68
  isActive: true
53
69
  } : {
@@ -60,7 +76,10 @@ export function useEditableTable({
60
76
  onCellEdit: handleCellEdit,
61
77
  onSubmitEdits: onSubmitEdits ? handleSubmitEdits : undefined,
62
78
  clearEdits,
63
- editMode: editModeConfig
79
+ editModeState,
80
+ onCellValidationError,
81
+ validationErrors,
82
+ clearCellValidationError
64
83
  };
65
84
  }
66
85
  //# sourceMappingURL=useEditableTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useEditableTable.js","names":["useCallback","useState","useEditableTable","editMode","onCellValueChanged","onSubmitEdits","isActive","setActive","cellEdits","setCellEdits","handleCellEdit","cellId","info","newValue","oldValue","prev","_","rest","clearEdits","handleSubmitEdits","edits","Object","values","editModeConfig","type","onCellEdit","undefined"],"sources":["useEditableTable.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useCallback, useState } from \"react\";\nimport type { ObjectTableProps } from \"../ObjectTableApi.js\";\nimport type { CellEditInfo, EditableConfig, EditMode } from \"../utils/types.js\";\n\nexport interface UseEditableTableProps<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n editMode?: \"always\" | \"manual\";\n\n onCellValueChanged?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onCellValueChanged\"];\n\n onSubmitEdits?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onSubmitEdits\"];\n}\n\nexport function useEditableTable<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>({\n editMode = \"manual\",\n onCellValueChanged,\n onSubmitEdits,\n}: UseEditableTableProps<Q, RDPs, FunctionColumns>): EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n> {\n const [isActive, setActive] = useState(editMode === \"always\");\n const [cellEdits, setCellEdits] = useState<\n Record<\n string,\n CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >\n >\n >(\n {},\n );\n\n const handleCellEdit = useCallback(\n (\n cellId: string,\n info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n // If value is changed back to original, remove it from edits\n if (info.newValue === info.oldValue) {\n setCellEdits(prev => {\n const { [cellId]: _, ...rest } = prev;\n return rest;\n });\n } else {\n setCellEdits(prev => ({\n ...prev,\n [cellId]: info,\n }));\n }\n\n onCellValueChanged?.(info);\n },\n [onCellValueChanged],\n );\n\n const clearEdits = useCallback(() => {\n setCellEdits({});\n }, []);\n\n const handleSubmitEdits = useCallback(async () => {\n const edits = Object.values(cellEdits);\n return onSubmitEdits ? onSubmitEdits(edits) : false;\n }, [cellEdits, onSubmitEdits]);\n\n const editModeConfig: EditMode = editMode === \"always\"\n ? { type: \"always\", isActive: true }\n : { type: \"manual\", isActive, setActive };\n\n return {\n cellEdits,\n onCellEdit: handleCellEdit,\n onSubmitEdits: onSubmitEdits ? handleSubmitEdits : undefined,\n clearEdits,\n editMode: editModeConfig,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AA8B7C,OAAO,SAASC,gBAAgBA,CAU9B;EACAC,QAAQ,GAAG,QAAQ;EACnBC,kBAAkB;EAClBC;AAC+C,CAAC,EAGhD;EACA,MAAM,CAACC,QAAQ,EAAEC,SAAS,CAAC,GAAGN,QAAQ,CAACE,QAAQ,KAAK,QAAQ,CAAC;EAC7D,MAAM,CAACK,SAAS,EAAEC,YAAY,CAAC,GAAGR,QAAQ,CASxC,CAAC,CACH,CAAC;EAED,MAAMS,cAAc,GAAGV,WAAW,CAChC,CACEW,MAAc,EACdC,IAGC,KACE;IACH;IACA,IAAIA,IAAI,CAACC,QAAQ,KAAKD,IAAI,CAACE,QAAQ,EAAE;MACnCL,YAAY,CAACM,IAAI,IAAI;QACnB,MAAM;UAAE,CAACJ,MAAM,GAAGK,CAAC;UAAE,GAAGC;QAAK,CAAC,GAAGF,IAAI;QACrC,OAAOE,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,MAAM;MACLR,YAAY,CAACM,IAAI,KAAK;QACpB,GAAGA,IAAI;QACP,CAACJ,MAAM,GAAGC;MACZ,CAAC,CAAC,CAAC;IACL;IAEAR,kBAAkB,GAAGQ,IAAI,CAAC;EAC5B,CAAC,EACD,CAACR,kBAAkB,CACrB,CAAC;EAED,MAAMc,UAAU,GAAGlB,WAAW,CAAC,MAAM;IACnCS,YAAY,CAAC,CAAC,CAAC,CAAC;EAClB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMU,iBAAiB,GAAGnB,WAAW,CAAC,YAAY;IAChD,MAAMoB,KAAK,GAAGC,MAAM,CAACC,MAAM,CAACd,SAAS,CAAC;IACtC,OAAOH,aAAa,GAAGA,aAAa,CAACe,KAAK,CAAC,GAAG,KAAK;EACrD,CAAC,EAAE,CAACZ,SAAS,EAAEH,aAAa,CAAC,CAAC;EAE9B,MAAMkB,cAAwB,GAAGpB,QAAQ,KAAK,QAAQ,GAClD;IAAEqB,IAAI,EAAE,QAAQ;IAAElB,QAAQ,EAAE;EAAK,CAAC,GAClC;IAAEkB,IAAI,EAAE,QAAQ;IAAElB,QAAQ;IAAEC;EAAU,CAAC;EAE3C,OAAO;IACLC,SAAS;IACTiB,UAAU,EAAEf,cAAc;IAC1BL,aAAa,EAAEA,aAAa,GAAGc,iBAAiB,GAAGO,SAAS;IAC5DR,UAAU;IACVf,QAAQ,EAAEoB;EACZ,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"useEditableTable.js","names":["useCallback","useState","useEditableTable","editMode","onCellValueChanged","onSubmitEdits","isActive","setActive","cellEdits","setCellEdits","validationErrors","setValidationErrors","Map","clearCellValidationError","cellId","prev","newErrors","delete","handleCellEdit","info","newValue","oldValue","_","rest","clearEdits","handleSubmitEdits","edits","Object","values","onCellValidationError","error","set","editModeState","type","onCellEdit","undefined"],"sources":["useEditableTable.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useCallback, useState } from \"react\";\nimport type { ObjectTableProps } from \"../ObjectTableApi.js\";\nimport type {\n CellEditInfo,\n EditableConfig,\n EditModeState,\n} from \"../utils/types.js\";\n\nexport interface UseEditableTableProps<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n editMode?: \"always\" | \"manual\";\n\n onCellValueChanged?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onCellValueChanged\"];\n\n onSubmitEdits?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onSubmitEdits\"];\n}\n\nexport function useEditableTable<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>({\n editMode = \"manual\",\n onCellValueChanged,\n onSubmitEdits,\n}: UseEditableTableProps<Q, RDPs, FunctionColumns>): EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n> {\n const [isActive, setActive] = useState<boolean>(\n editMode === \"always\",\n );\n const [cellEdits, setCellEdits] = useState<\n Record<\n string,\n CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >\n >\n >(\n {},\n );\n const [validationErrors, setValidationErrors] = useState<\n Map<string, string>\n >(\n new Map(),\n );\n\n const clearCellValidationError = useCallback((cellId: string) => {\n setValidationErrors(prev => {\n const newErrors = new Map(prev);\n newErrors.delete(cellId);\n return newErrors;\n });\n }, []);\n\n const handleCellEdit = useCallback(\n (\n cellId: string,\n info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n // If value is changed back to original, remove it from edits\n if (info.newValue === info.oldValue) {\n setCellEdits(prev => {\n const { [cellId]: _, ...rest } = prev;\n return rest;\n });\n } else {\n setCellEdits(prev => ({\n ...prev,\n [cellId]: info,\n }));\n }\n\n onCellValueChanged?.(info);\n },\n [onCellValueChanged],\n );\n\n const clearEdits = useCallback(() => {\n setCellEdits({});\n setValidationErrors(new Map());\n }, []);\n\n const handleSubmitEdits = useCallback(async () => {\n const edits = Object.values(cellEdits);\n return onSubmitEdits ? onSubmitEdits(edits) : false;\n }, [cellEdits, onSubmitEdits]);\n\n const onCellValidationError = useCallback(\n (cellId: string, error: string) => {\n setValidationErrors(prev => {\n const newErrors = new Map(prev);\n newErrors.set(cellId, error);\n return newErrors;\n });\n },\n [],\n );\n\n const editModeState: EditModeState = editMode === \"always\"\n ? { type: \"always\", isActive: true }\n : { type: \"manual\", isActive, setActive };\n\n return {\n cellEdits,\n onCellEdit: handleCellEdit,\n onSubmitEdits: onSubmitEdits ? handleSubmitEdits : undefined,\n clearEdits,\n editModeState,\n onCellValidationError,\n validationErrors,\n clearCellValidationError,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAkC7C,OAAO,SAASC,gBAAgBA,CAU9B;EACAC,QAAQ,GAAG,QAAQ;EACnBC,kBAAkB;EAClBC;AAC+C,CAAC,EAGhD;EACA,MAAM,CAACC,QAAQ,EAAEC,SAAS,CAAC,GAAGN,QAAQ,CACpCE,QAAQ,KAAK,QACf,CAAC;EACD,MAAM,CAACK,SAAS,EAAEC,YAAY,CAAC,GAAGR,QAAQ,CASxC,CAAC,CACH,CAAC;EACD,MAAM,CAACS,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGV,QAAQ,CAGtD,IAAIW,GAAG,CAAC,CACV,CAAC;EAED,MAAMC,wBAAwB,GAAGb,WAAW,CAAEc,MAAc,IAAK;IAC/DH,mBAAmB,CAACI,IAAI,IAAI;MAC1B,MAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACG,IAAI,CAAC;MAC/BC,SAAS,CAACC,MAAM,CAACH,MAAM,CAAC;MACxB,OAAOE,SAAS;IAClB,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,cAAc,GAAGlB,WAAW,CAChC,CACEc,MAAc,EACdK,IAGC,KACE;IACH;IACA,IAAIA,IAAI,CAACC,QAAQ,KAAKD,IAAI,CAACE,QAAQ,EAAE;MACnCZ,YAAY,CAACM,IAAI,IAAI;QACnB,MAAM;UAAE,CAACD,MAAM,GAAGQ,CAAC;UAAE,GAAGC;QAAK,CAAC,GAAGR,IAAI;QACrC,OAAOQ,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,MAAM;MACLd,YAAY,CAACM,IAAI,KAAK;QACpB,GAAGA,IAAI;QACP,CAACD,MAAM,GAAGK;MACZ,CAAC,CAAC,CAAC;IACL;IAEAf,kBAAkB,GAAGe,IAAI,CAAC;EAC5B,CAAC,EACD,CAACf,kBAAkB,CACrB,CAAC;EAED,MAAMoB,UAAU,GAAGxB,WAAW,CAAC,MAAM;IACnCS,YAAY,CAAC,CAAC,CAAC,CAAC;IAChBE,mBAAmB,CAAC,IAAIC,GAAG,CAAC,CAAC,CAAC;EAChC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMa,iBAAiB,GAAGzB,WAAW,CAAC,YAAY;IAChD,MAAM0B,KAAK,GAAGC,MAAM,CAACC,MAAM,CAACpB,SAAS,CAAC;IACtC,OAAOH,aAAa,GAAGA,aAAa,CAACqB,KAAK,CAAC,GAAG,KAAK;EACrD,CAAC,EAAE,CAAClB,SAAS,EAAEH,aAAa,CAAC,CAAC;EAE9B,MAAMwB,qBAAqB,GAAG7B,WAAW,CACvC,CAACc,MAAc,EAAEgB,KAAa,KAAK;IACjCnB,mBAAmB,CAACI,IAAI,IAAI;MAC1B,MAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACG,IAAI,CAAC;MAC/BC,SAAS,CAACe,GAAG,CAACjB,MAAM,EAAEgB,KAAK,CAAC;MAC5B,OAAOd,SAAS;IAClB,CAAC,CAAC;EACJ,CAAC,EACD,EACF,CAAC;EAED,MAAMgB,aAA4B,GAAG7B,QAAQ,KAAK,QAAQ,GACtD;IAAE8B,IAAI,EAAE,QAAQ;IAAE3B,QAAQ,EAAE;EAAK,CAAC,GAClC;IAAE2B,IAAI,EAAE,QAAQ;IAAE3B,QAAQ;IAAEC;EAAU,CAAC;EAE3C,OAAO;IACLC,SAAS;IACT0B,UAAU,EAAEhB,cAAc;IAC1Bb,aAAa,EAAEA,aAAa,GAAGoB,iBAAiB,GAAGU,SAAS;IAC5DX,UAAU;IACVQ,aAAa;IACbH,qBAAqB;IACrBnB,gBAAgB;IAChBG;EACF,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["types.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { RowData } from \"@tanstack/react-table\";\n\nexport interface ColumnOption {\n id: string;\n name: string;\n canSort: boolean;\n}\n\nexport interface CellIdentifier {\n rowId: string;\n columnId: string;\n}\n\nexport interface CellEditInfo<\n TData extends RowData = unknown,\n CellValue = unknown,\n> extends CellIdentifier {\n newValue: CellValue;\n oldValue: CellValue;\n originalRowData: TData;\n}\n\nexport type EditMode =\n | { type: \"always\"; isActive: true }\n | { type: \"manual\"; isActive: boolean; setActive: (value: boolean) => void };\n\nexport interface EditableConfig<\n TData extends RowData = unknown,\n CellValue = unknown,\n> {\n cellEdits: Record<string, CellEditInfo<TData, CellValue>>;\n onCellEdit: (\n cellId: string,\n info: CellEditInfo<TData, CellValue>,\n ) => void;\n onSubmitEdits?: () => Promise<boolean>;\n clearEdits: () => void;\n editMode: EditMode;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["types.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { RowData } from \"@tanstack/react-table\";\n\nexport interface ColumnOption {\n id: string;\n name: string;\n canSort: boolean;\n}\n\nexport interface CellIdentifier {\n rowId: string;\n columnId: string;\n}\n\nexport interface CellEditInfo<\n TData extends RowData = unknown,\n CellValue = unknown,\n> extends CellIdentifier {\n newValue: CellValue | null;\n oldValue: CellValue | null;\n originalRowData: TData;\n}\n\nexport type EditModeState =\n | { type: \"always\"; isActive: true }\n | { type: \"manual\"; isActive: boolean; setActive: (value: boolean) => void };\n\nexport interface EditableConfig<\n TData extends RowData = unknown,\n CellValue = unknown,\n> {\n cellEdits: Record<string, CellEditInfo<TData, CellValue>>;\n onCellEdit: (\n cellId: string,\n info: CellEditInfo<TData, CellValue>,\n ) => void;\n onSubmitEdits?: () => Promise<boolean>;\n clearEdits: () => void;\n editModeState: EditModeState;\n onCellValidationError: (\n cellId: string,\n error: string,\n ) => void;\n validationErrors: Map<string, string>;\n clearCellValidationError: (cellId: string) => void;\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright 2026 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
+ /**
18
+ * Exhaustive type checking helper.
19
+ * Use in default cases of switch statements to ensure all cases are handled.
20
+ * TypeScript will error if a case is missing.
21
+ */
22
+ export function assertUnreachable(value) {
23
+ throw new Error(`Unhandled value: ${String(value)}`);
24
+ }
25
+ //# sourceMappingURL=assertUnreachable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertUnreachable.js","names":["assertUnreachable","value","Error","String"],"sources":["assertUnreachable.ts"],"sourcesContent":["/*\n * Copyright 2026 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\n/**\n * Exhaustive type checking helper.\n * Use in default cases of switch statements to ensure all cases are handled.\n * TypeScript will error if a case is missing.\n */\nexport function assertUnreachable(value: never): never {\n throw new Error(`Unhandled value: ${String(value)}`);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAACC,KAAY,EAAS;EACrD,MAAM,IAAIC,KAAK,CAAC,oBAAoBC,MAAM,CAACF,KAAK,CAAC,EAAE,CAAC;AACtD","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ /*
2
+ * Copyright 2026 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 React from "react";
18
+
19
+ /**
20
+ * TODO: Delete this once `React.memo` is typed to not lose generics to `unknown`
21
+ *
22
+ * Context: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/37087
23
+ */
24
+ export const typedReactMemo = React.memo;
25
+ //# sourceMappingURL=typedMemo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typedMemo.js","names":["React","typedReactMemo","memo"],"sources":["typedMemo.ts"],"sourcesContent":["/*\n * Copyright 2026 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 React from \"react\";\n\n/**\n * TODO: Delete this once `React.memo` is typed to not lose generics to `unknown`\n *\n * Context: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/37087\n */\nexport const typedReactMemo: <T>(component: T) => T = React.memo;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;;AAEzB;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,cAAsC,GAAGD,KAAK,CAACE,IAAI","ignoreList":[]}