@osdk/react-components 0.2.0-beta.10 → 0.2.0-beta.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/AGENTS.md +105 -0
  2. package/CHANGELOG.md +22 -0
  3. package/build/browser/object-table/DefaultCellRenderer.js +5 -2
  4. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
  5. package/build/browser/object-table/EditableCell.js +16 -6
  6. package/build/browser/object-table/EditableCell.js.map +1 -1
  7. package/build/browser/object-table/EditableCell.module.css +30 -2
  8. package/build/browser/object-table/EditableCell.module.css.js +2 -1
  9. package/build/browser/object-table/ObjectTable.js +9 -22
  10. package/build/browser/object-table/ObjectTable.js.map +1 -1
  11. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  12. package/build/browser/object-table/Table.js +23 -15
  13. package/build/browser/object-table/Table.js.map +1 -1
  14. package/build/browser/object-table/Table.module.css +0 -8
  15. package/build/browser/object-table/Table.module.css.js +1 -2
  16. package/build/browser/object-table/TableBody.js +8 -2
  17. package/build/browser/object-table/TableBody.js.map +1 -1
  18. package/build/browser/object-table/TableCell.module.css +0 -8
  19. package/build/browser/object-table/TableEditContainer.js +79 -0
  20. package/build/browser/object-table/TableEditContainer.js.map +1 -0
  21. package/build/browser/object-table/TableEditContainer.module.css +44 -0
  22. package/build/browser/object-table/TableEditContainer.module.css.js +9 -0
  23. package/build/browser/object-table/TableRow.js +12 -4
  24. package/build/browser/object-table/TableRow.js.map +1 -1
  25. package/build/browser/object-table/TableRow.module.css +2 -1
  26. package/build/browser/object-table/hooks/useEditableTable.js +20 -11
  27. package/build/browser/object-table/hooks/useEditableTable.js.map +1 -1
  28. package/build/browser/object-table/hooks/useObjectTableData.js +0 -5
  29. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  30. package/build/browser/object-table/utils/getCellId.js +0 -7
  31. package/build/browser/object-table/utils/getCellId.js.map +1 -1
  32. package/build/browser/object-table/utils/types.js.map +1 -1
  33. package/build/browser/public/experimental.js.map +1 -1
  34. package/build/browser/styles.css +79 -19
  35. package/build/cjs/public/experimental.cjs +179 -90
  36. package/build/cjs/public/experimental.cjs.map +1 -1
  37. package/build/cjs/public/experimental.css +96 -57
  38. package/build/cjs/public/experimental.css.map +1 -1
  39. package/build/cjs/public/experimental.d.cts +40 -18
  40. package/build/esm/object-table/DefaultCellRenderer.js +5 -2
  41. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
  42. package/build/esm/object-table/EditableCell.js +16 -6
  43. package/build/esm/object-table/EditableCell.js.map +1 -1
  44. package/build/esm/object-table/EditableCell.module.css +30 -2
  45. package/build/esm/object-table/ObjectTable.js +9 -22
  46. package/build/esm/object-table/ObjectTable.js.map +1 -1
  47. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  48. package/build/esm/object-table/Table.js +23 -15
  49. package/build/esm/object-table/Table.js.map +1 -1
  50. package/build/esm/object-table/Table.module.css +0 -8
  51. package/build/esm/object-table/TableBody.js +8 -2
  52. package/build/esm/object-table/TableBody.js.map +1 -1
  53. package/build/esm/object-table/TableCell.module.css +0 -8
  54. package/build/esm/object-table/TableEditContainer.js +79 -0
  55. package/build/esm/object-table/TableEditContainer.js.map +1 -0
  56. package/build/esm/object-table/TableEditContainer.module.css +44 -0
  57. package/build/esm/object-table/TableRow.js +12 -4
  58. package/build/esm/object-table/TableRow.js.map +1 -1
  59. package/build/esm/object-table/TableRow.module.css +2 -1
  60. package/build/esm/object-table/hooks/useEditableTable.js +20 -11
  61. package/build/esm/object-table/hooks/useEditableTable.js.map +1 -1
  62. package/build/esm/object-table/hooks/useObjectTableData.js +0 -5
  63. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  64. package/build/esm/object-table/utils/getCellId.js +0 -7
  65. package/build/esm/object-table/utils/getCellId.js.map +1 -1
  66. package/build/esm/object-table/utils/types.js.map +1 -1
  67. package/build/esm/public/experimental.js.map +1 -1
  68. package/build/types/object-table/DefaultCellRenderer.d.ts +2 -2
  69. package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
  70. package/build/types/object-table/EditableCell.d.ts +18 -6
  71. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  72. package/build/types/object-table/ObjectTable.d.ts +1 -1
  73. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  74. package/build/types/object-table/ObjectTableApi.d.ts +16 -6
  75. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  76. package/build/types/object-table/Table.d.ts +5 -10
  77. package/build/types/object-table/Table.d.ts.map +1 -1
  78. package/build/types/object-table/TableBody.d.ts +4 -1
  79. package/build/types/object-table/TableBody.d.ts.map +1 -1
  80. package/build/types/object-table/TableEditContainer.d.ts +9 -0
  81. package/build/types/object-table/TableEditContainer.d.ts.map +1 -0
  82. package/build/types/object-table/TableRow.d.ts +5 -1
  83. package/build/types/object-table/TableRow.d.ts.map +1 -1
  84. package/build/types/object-table/hooks/useEditableTable.d.ts +4 -9
  85. package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -1
  86. package/build/types/object-table/utils/getCellId.d.ts +0 -1
  87. package/build/types/object-table/utils/getCellId.d.ts.map +1 -1
  88. package/build/types/object-table/utils/types.d.ts +25 -3
  89. package/build/types/object-table/utils/types.d.ts.map +1 -1
  90. package/build/types/public/experimental.d.ts +1 -1
  91. package/build/types/public/experimental.d.ts.map +1 -1
  92. package/package.json +7 -6
  93. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
  94. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
  95. package/build/browser/filter-list/__tests__/dateUtils.test.js +0 -55
  96. package/build/browser/filter-list/__tests__/dateUtils.test.js.map +0 -1
  97. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
  98. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
  99. package/build/browser/filter-list/__tests__/getFilterKey.test.js +0 -53
  100. package/build/browser/filter-list/__tests__/getFilterKey.test.js.map +0 -1
  101. package/build/browser/filter-list/__tests__/testUtils.js +0 -203
  102. package/build/browser/filter-list/__tests__/testUtils.js.map +0 -1
  103. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
  104. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
  105. package/build/browser/object-table/__tests__/useEditableTable.test.js +0 -197
  106. package/build/browser/object-table/__tests__/useEditableTable.test.js.map +0 -1
  107. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
  108. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
  109. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
  110. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
  111. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
  112. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
  113. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
  114. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
  115. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
  116. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
  117. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
  118. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
  119. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
  120. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
  121. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
  122. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
  123. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
  124. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
  125. package/build/esm/filter-list/__tests__/dateUtils.test.js +0 -55
  126. package/build/esm/filter-list/__tests__/dateUtils.test.js.map +0 -1
  127. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
  128. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
  129. package/build/esm/filter-list/__tests__/getFilterKey.test.js +0 -53
  130. package/build/esm/filter-list/__tests__/getFilterKey.test.js.map +0 -1
  131. package/build/esm/filter-list/__tests__/testUtils.js +0 -203
  132. package/build/esm/filter-list/__tests__/testUtils.js.map +0 -1
  133. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
  134. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
  135. package/build/esm/object-table/__tests__/useEditableTable.test.js +0 -197
  136. package/build/esm/object-table/__tests__/useEditableTable.test.js.map +0 -1
  137. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
  138. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
  139. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
  140. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
  141. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
  142. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
  143. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
  144. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
  145. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
  146. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
  147. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
  148. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
  149. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
  150. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
  151. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
  152. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
  153. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts +0 -1
  154. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts.map +0 -1
  155. package/build/types/filter-list/__tests__/dateUtils.test.d.ts +0 -1
  156. package/build/types/filter-list/__tests__/dateUtils.test.d.ts.map +0 -1
  157. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts +0 -1
  158. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts.map +0 -1
  159. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts +0 -1
  160. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts.map +0 -1
  161. package/build/types/filter-list/__tests__/testUtils.d.ts +0 -65
  162. package/build/types/filter-list/__tests__/testUtils.d.ts.map +0 -1
  163. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts +0 -1
  164. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts.map +0 -1
  165. package/build/types/object-table/__tests__/useEditableTable.test.d.ts +0 -1
  166. package/build/types/object-table/__tests__/useEditableTable.test.d.ts.map +0 -1
  167. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +0 -1
  168. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +0 -1
  169. package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts +0 -1
  170. package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts.map +0 -1
  171. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts +0 -1
  172. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +0 -1
  173. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +0 -1
  174. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +0 -1
  175. package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts +0 -1
  176. package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts.map +0 -1
  177. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +0 -1
  178. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +0 -1
  179. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +0 -1
  180. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +0 -1
  181. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +0 -1
  182. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +0 -1
@@ -445,9 +445,25 @@ interface CellIdentifier {
445
445
  rowId: string;
446
446
  columnId: string;
447
447
  }
448
- interface CellValueState<TData extends RowData = unknown> {
449
- newValue: TData;
450
- oldValue: TData;
448
+ interface CellEditInfo<TData extends RowData = unknown, CellValue = unknown> extends CellIdentifier {
449
+ newValue: CellValue;
450
+ oldValue: CellValue;
451
+ originalRowData: TData;
452
+ }
453
+ type EditMode = {
454
+ type: "always";
455
+ isActive: true;
456
+ } | {
457
+ type: "manual";
458
+ isActive: boolean;
459
+ setActive: (value: boolean) => void;
460
+ };
461
+ interface EditableConfig<TData extends RowData = unknown, CellValue = unknown> {
462
+ cellEdits: Record<string, CellEditInfo<TData, CellValue>>;
463
+ onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;
464
+ onSubmitEdits?: () => Promise<boolean>;
465
+ clearEdits: () => void;
466
+ editMode: EditMode;
451
467
  }
452
468
 
453
469
  type ColumnDefinition<Q extends ObjectOrInterfaceDefinition, RDPs extends Record<string, SimplePropertyDef> = Record<string, never>, FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<string, never>> = {
@@ -558,6 +574,14 @@ interface ObjectTableProps<Q extends ObjectOrInterfaceDefinition, RDPs extends R
558
574
  * @default true
559
575
  */
560
576
  enableColumnConfig?: boolean;
577
+ /**
578
+ * Controls the edit mode behavior of the table.
579
+ * - "always": Editable cells are immediately in edit mode on row clicked.
580
+ * - "manual": User can toggle edit mode on/off via the Edit Table button.
581
+ *
582
+ * @default "manual"
583
+ */
584
+ editMode?: "always" | "manual";
561
585
  /**
562
586
  * The default order by clause to sort the objects in the table.
563
587
  * If provided without orderBy prop, the sorting is uncontrolled.
@@ -589,16 +613,18 @@ interface ObjectTableProps<Q extends ObjectOrInterfaceDefinition, RDPs extends R
589
613
  /**
590
614
  * Called after the value of a cell is edited and committed by the user.
591
615
  *
592
- * @param cell The cell that was edited, identified by its row and column IDs
593
- * @param state The new and old values of the cell
616
+ * @param info An object containing details about the cell that was edited,
617
+ * including the rowId, columnId, new and old values, and the row data before the edit
594
618
  */
595
- onCellValueChanged?: (cell: CellIdentifier, state: CellValueState) => void;
619
+ onCellValueChanged?: (info: CellEditInfo<Osdk.Instance<Q, "$allBaseProperties", PropertyKeys<Q>, RDPs>, unknown>) => void;
596
620
  /**
597
621
  * If provided, the button Submit Edits will be shown in the table
598
622
  *
599
- * @param edits a map of cellId (stringified CellIdentifier) to the new and old values of the cell
623
+ * @param edits an array of edit info containing details about the edited cells
624
+ * including the rowId, columnId, new and old values, and the row data before the edit
625
+ * @return a promise that resolves to true if the edits were successfully submitted
600
626
  */
601
- onSubmitEdits?: (edits: Record<string, CellValueState>) => Promise<void>;
627
+ onSubmitEdits?: (edits: CellEditInfo<Osdk.Instance<Q, "$allBaseProperties", PropertyKeys<Q>, RDPs>, unknown>[]) => Promise<boolean>;
602
628
  /**
603
629
  * Called when the column visibility or ordering changed.
604
630
  *
@@ -690,7 +716,7 @@ interface ObjectSetOptions<Q extends ObjectOrInterfaceDefinition> {
690
716
  * <ObjectTable objectType={MyObjectType} />
691
717
  * ```
692
718
  */
693
- declare function ObjectTable<Q extends ObjectOrInterfaceDefinition, RDPs extends Record<string, SimplePropertyDef> = Record<string, never>, FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<string, never>>({ objectType, objectSet, columnDefinitions, filter, objectSetOptions, orderBy, defaultOrderBy, onOrderByChanged, onColumnsPinnedChanged, onColumnResize, onRowSelection, renderCellContextMenu, selectionMode, selectedRows, onColumnVisibilityChanged, onCellValueChanged, onSubmitEdits, enableOrdering, enableColumnPinning, enableColumnResizing, enableColumnConfig, ...props }: ObjectTableProps<Q, RDPs, FunctionColumns>): React__default.ReactElement;
719
+ declare function ObjectTable<Q extends ObjectOrInterfaceDefinition, RDPs extends Record<string, SimplePropertyDef> = Record<string, never>, FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<string, never>>({ objectType, objectSet, columnDefinitions, filter, objectSetOptions, orderBy, defaultOrderBy, onOrderByChanged, onColumnsPinnedChanged, onColumnResize, onRowSelection, renderCellContextMenu, selectionMode, selectedRows, onColumnVisibilityChanged, onCellValueChanged, onSubmitEdits, enableOrdering, enableColumnPinning, enableColumnResizing, enableColumnConfig, editMode, ...props }: ObjectTableProps<Q, RDPs, FunctionColumns>): React__default.ReactElement;
694
720
 
695
721
  interface HeaderMenuFeatureFlags {
696
722
  /**
@@ -723,15 +749,11 @@ declare module "@tanstack/react-table" {
723
749
  dataType?: string;
724
750
  }
725
751
  interface TableMeta<TData extends RowData = unknown> {
726
- onCellEdit?: (cellId: string, state: CellValueState) => void;
727
- cellEdits?: Record<string, CellValueState>;
752
+ onCellEdit?: (cellId: string, info: CellEditInfo<TData, unknown>) => void;
753
+ cellEdits?: Record<string, CellEditInfo<TData, unknown>>;
754
+ isInEditMode?: boolean;
728
755
  }
729
756
  }
730
- interface EditableConfig {
731
- onSubmitEdits?: () => Promise<void>;
732
- clearEdits?: () => void;
733
- cellEdits?: Record<string, CellValueState>;
734
- }
735
757
  interface BaseTableProps<TData extends RowData> {
736
758
  table: Table<TData>;
737
759
  isLoading?: boolean;
@@ -742,7 +764,7 @@ interface BaseTableProps<TData extends RowData> {
742
764
  className?: string;
743
765
  error?: Error;
744
766
  headerMenuFeatureFlags?: HeaderMenuFeatureFlags;
745
- editableConfig?: EditableConfig;
767
+ editableConfig?: EditableConfig<TData, unknown>;
746
768
  }
747
769
  declare function BaseTable<TData extends RowData>({ table, isLoading, fetchNextPage, onRowClick, rowHeight, renderCellContextMenu, className, error, headerMenuFeatureFlags, editableConfig, }: BaseTableProps<TData>): ReactElement;
748
770
 
@@ -762,4 +784,4 @@ interface ColumnConfigDialogProps {
762
784
  }
763
785
  declare function ColumnConfigDialog({ isOpen, onClose, columnOptions, currentVisibility, currentColumnOrder, onApply, isValidConfig, }: ColumnConfigDialogProps): React__default.ReactElement | null;
764
786
 
765
- export { BaseTable, type BaseTableProps, type CellIdentifier, type CellValueState, ColumnConfigDialog, type ColumnConfigDialogProps, type ColumnConfigOptions, type ColumnDefinition, type ColumnDefinitionLocator, type FilterComponentType, type FilterDefinitionUnion, FilterList, type FilterListItemProps, type FilterListProps, type FilterState, ObjectTable, type ObjectTableProps, type PropertyFilterDefinition };
787
+ export { BaseTable, type BaseTableProps, type CellEditInfo, ColumnConfigDialog, type ColumnConfigDialogProps, type ColumnConfigOptions, type ColumnDefinition, type ColumnDefinitionLocator, type FilterComponentType, type FilterDefinitionUnion, FilterList, type FilterListItemProps, type FilterListProps, type FilterState, ObjectTable, type ObjectTableProps, type PropertyFilterDefinition };
@@ -20,7 +20,7 @@ import { getCellId } from "./utils/getCellId.js";
20
20
  export function renderDefaultCell(cellContext) {
21
21
  const meta = cellContext.table.options.meta;
22
22
  const columnMeta = cellContext.column.columnDef.meta;
23
- if (!columnMeta?.editable || !meta?.onCellEdit) {
23
+ if (!columnMeta?.editable || !meta?.onCellEdit || !meta?.isInEditMode) {
24
24
  return /*#__PURE__*/React.createElement(React.Fragment, null, cellContext.getValue());
25
25
  }
26
26
  const rowId = cellContext.row.id;
@@ -37,7 +37,10 @@ export function renderDefaultCell(cellContext) {
37
37
  currentValue: currentValue,
38
38
  cellId: cellId,
39
39
  dataType: columnMeta?.dataType,
40
- onCellEdit: meta.onCellEdit
40
+ onCellEdit: meta.onCellEdit,
41
+ originalRowData: cellContext.row.original,
42
+ rowId: rowId,
43
+ columnId: columnId
41
44
  });
42
45
  }
43
46
  //# sourceMappingURL=DefaultCellRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultCellRenderer.js","names":["React","EditableCell","getCellId","renderDefaultCell","cellContext","meta","table","options","columnMeta","column","columnDef","editable","onCellEdit","createElement","Fragment","getValue","rowId","row","id","columnId","cellId","cellEdits","editedValue","currentValue","newValue","initialValue","dataType"],"sources":["DefaultCellRenderer.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 { CellContext } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport { EditableCell } from \"./EditableCell.js\";\nimport { getCellId } from \"./utils/getCellId.js\";\n\nexport function renderDefaultCell<TData>(\n cellContext: CellContext<TData, unknown>,\n): React.ReactNode {\n const meta = cellContext.table.options.meta;\n const columnMeta = cellContext.column.columnDef.meta;\n\n if (!columnMeta?.editable || !meta?.onCellEdit) {\n return <>{cellContext.getValue()}</>;\n }\n\n const rowId = cellContext.row.id;\n const columnId = cellContext.column.id;\n const cellId = getCellId({ rowId, columnId });\n\n const cellEdits = meta.cellEdits;\n const editedValue = cellEdits?.[cellId];\n const currentValue = editedValue?.newValue ?? cellContext.getValue();\n\n return (\n <EditableCell\n initialValue={cellContext.getValue()}\n currentValue={currentValue}\n cellId={cellId}\n dataType={columnMeta?.dataType}\n onCellEdit={meta.onCellEdit}\n />\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,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,SAAS,QAAQ,sBAAsB;AAEhD,OAAO,SAASC,iBAAiBA,CAC/BC,WAAwC,EACvB;EACjB,MAAMC,IAAI,GAAGD,WAAW,CAACE,KAAK,CAACC,OAAO,CAACF,IAAI;EAC3C,MAAMG,UAAU,GAAGJ,WAAW,CAACK,MAAM,CAACC,SAAS,CAACL,IAAI;EAEpD,IAAI,CAACG,UAAU,EAAEG,QAAQ,IAAI,CAACN,IAAI,EAAEO,UAAU,EAAE;IAC9C,oBAAOZ,KAAA,CAAAa,aAAA,CAAAb,KAAA,CAAAc,QAAA,QAAGV,WAAW,CAACW,QAAQ,CAAC,CAAI,CAAC;EACtC;EAEA,MAAMC,KAAK,GAAGZ,WAAW,CAACa,GAAG,CAACC,EAAE;EAChC,MAAMC,QAAQ,GAAGf,WAAW,CAACK,MAAM,CAACS,EAAE;EACtC,MAAME,MAAM,GAAGlB,SAAS,CAAC;IAAEc,KAAK;IAAEG;EAAS,CAAC,CAAC;EAE7C,MAAME,SAAS,GAAGhB,IAAI,CAACgB,SAAS;EAChC,MAAMC,WAAW,GAAGD,SAAS,GAAGD,MAAM,CAAC;EACvC,MAAMG,YAAY,GAAGD,WAAW,EAAEE,QAAQ,IAAIpB,WAAW,CAACW,QAAQ,CAAC,CAAC;EAEpE,oBACEf,KAAA,CAAAa,aAAA,CAACZ,YAAY;IACXwB,YAAY,EAAErB,WAAW,CAACW,QAAQ,CAAC,CAAE;IACrCQ,YAAY,EAAEA,YAAa;IAC3BH,MAAM,EAAEA,MAAO;IACfM,QAAQ,EAAElB,UAAU,EAAEkB,QAAS;IAC/Bd,UAAU,EAAEP,IAAI,CAACO;EAAW,CAC7B,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"file":"DefaultCellRenderer.js","names":["React","EditableCell","getCellId","renderDefaultCell","cellContext","meta","table","options","columnMeta","column","columnDef","editable","onCellEdit","isInEditMode","createElement","Fragment","getValue","rowId","row","id","columnId","cellId","cellEdits","editedValue","currentValue","newValue","initialValue","dataType","originalRowData","original"],"sources":["DefaultCellRenderer.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 { CellContext, RowData } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport { EditableCell } from \"./EditableCell.js\";\nimport { getCellId } from \"./utils/getCellId.js\";\n\nexport function renderDefaultCell<TData extends RowData>(\n cellContext: CellContext<TData, unknown>,\n): React.ReactNode {\n const meta = cellContext.table.options.meta;\n const columnMeta = cellContext.column.columnDef.meta;\n\n if (!columnMeta?.editable || !meta?.onCellEdit || !meta?.isInEditMode) {\n return <>{cellContext.getValue()}</>;\n }\n\n const rowId = cellContext.row.id;\n const columnId = cellContext.column.id;\n const cellId = getCellId({ rowId, columnId });\n\n const cellEdits = meta.cellEdits;\n const editedValue = cellEdits?.[cellId];\n const currentValue = editedValue?.newValue ?? cellContext.getValue();\n\n return (\n <EditableCell<TData>\n initialValue={cellContext.getValue()}\n currentValue={currentValue}\n cellId={cellId}\n dataType={columnMeta?.dataType}\n onCellEdit={meta.onCellEdit}\n originalRowData={cellContext.row.original}\n rowId={rowId}\n columnId={columnId}\n />\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,SAASC,YAAY,QAAQ,mBAAmB;AAChD,SAASC,SAAS,QAAQ,sBAAsB;AAEhD,OAAO,SAASC,iBAAiBA,CAC/BC,WAAwC,EACvB;EACjB,MAAMC,IAAI,GAAGD,WAAW,CAACE,KAAK,CAACC,OAAO,CAACF,IAAI;EAC3C,MAAMG,UAAU,GAAGJ,WAAW,CAACK,MAAM,CAACC,SAAS,CAACL,IAAI;EAEpD,IAAI,CAACG,UAAU,EAAEG,QAAQ,IAAI,CAACN,IAAI,EAAEO,UAAU,IAAI,CAACP,IAAI,EAAEQ,YAAY,EAAE;IACrE,oBAAOb,KAAA,CAAAc,aAAA,CAAAd,KAAA,CAAAe,QAAA,QAAGX,WAAW,CAACY,QAAQ,CAAC,CAAI,CAAC;EACtC;EAEA,MAAMC,KAAK,GAAGb,WAAW,CAACc,GAAG,CAACC,EAAE;EAChC,MAAMC,QAAQ,GAAGhB,WAAW,CAACK,MAAM,CAACU,EAAE;EACtC,MAAME,MAAM,GAAGnB,SAAS,CAAC;IAAEe,KAAK;IAAEG;EAAS,CAAC,CAAC;EAE7C,MAAME,SAAS,GAAGjB,IAAI,CAACiB,SAAS;EAChC,MAAMC,WAAW,GAAGD,SAAS,GAAGD,MAAM,CAAC;EACvC,MAAMG,YAAY,GAAGD,WAAW,EAAEE,QAAQ,IAAIrB,WAAW,CAACY,QAAQ,CAAC,CAAC;EAEpE,oBACEhB,KAAA,CAAAc,aAAA,CAACb,YAAY;IACXyB,YAAY,EAAEtB,WAAW,CAACY,QAAQ,CAAC,CAAE;IACrCQ,YAAY,EAAEA,YAAa;IAC3BH,MAAM,EAAEA,MAAO;IACfM,QAAQ,EAAEnB,UAAU,EAAEmB,QAAS;IAC/Bf,UAAU,EAAEP,IAAI,CAACO,UAAW;IAC5BgB,eAAe,EAAExB,WAAW,CAACc,GAAG,CAACW,QAAS;IAC1CZ,KAAK,EAAEA,KAAM;IACbG,QAAQ,EAAEA;EAAS,CACpB,CAAC;AAEN","ignoreList":[]}
@@ -15,6 +15,7 @@
15
15
  */
16
16
 
17
17
  import { Input } from "@base-ui/react/input";
18
+ import classNames from "classnames";
18
19
  import React, { useCallback, useEffect, useRef, useState } from "react";
19
20
  import styles from "./EditableCell.module.css";
20
21
  const NUMBER_TYPES = ["double", "integer", "long", "float", "decimal", "byte", "short"];
@@ -41,12 +42,15 @@ function parseValueByType(value, dataType) {
41
42
  }
42
43
  return parsedNumber;
43
44
  }
44
- export function EditableCell({
45
+ function EditableCellInner({
45
46
  initialValue,
46
47
  currentValue,
47
48
  cellId,
48
49
  dataType,
49
- onCellEdit
50
+ onCellEdit,
51
+ originalRowData,
52
+ rowId,
53
+ columnId
50
54
  }) {
51
55
  const [inputValue, setInputValue] = useState(valueToString(currentValue));
52
56
  const isCancelled = useRef(false);
@@ -60,11 +64,14 @@ export function EditableCell({
60
64
  return;
61
65
  }
62
66
  const parsedValue = parseValueByType(inputValue, dataType);
63
- onCellEdit?.(cellId, {
67
+ onCellEdit(cellId, {
68
+ rowId,
69
+ columnId,
64
70
  newValue: parsedValue,
65
- oldValue: initialValue
71
+ oldValue: initialValue,
72
+ originalRowData
66
73
  });
67
- }, [inputValue, initialValue, onCellEdit, cellId, dataType]);
74
+ }, [inputValue, initialValue, onCellEdit, cellId, dataType, rowId, columnId, originalRowData]);
68
75
  const handleChange = useCallback(value => {
69
76
  setInputValue(value);
70
77
  }, []);
@@ -80,7 +87,9 @@ export function EditableCell({
80
87
  }, [currentValue]);
81
88
  const inputType = dataType && NUMBER_TYPES.includes(dataType) ? "number" : "text";
82
89
  return /*#__PURE__*/React.createElement(Input, {
83
- className: styles.osdkEditableInput,
90
+ className: classNames(styles.osdkEditableInput, {
91
+ [styles.osdkEditedInput]: currentValue !== initialValue
92
+ }),
84
93
  type: inputType,
85
94
  value: inputValue,
86
95
  onValueChange: handleChange,
@@ -88,4 +97,5 @@ export function EditableCell({
88
97
  onKeyDown: handleKeyDown
89
98
  });
90
99
  }
100
+ export const EditableCell = /*#__PURE__*/React.memo(EditableCellInner);
91
101
  //# sourceMappingURL=EditableCell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditableCell.js","names":["Input","React","useCallback","useEffect","useRef","useState","styles","NUMBER_TYPES","valueToString","value","JSON","stringify","String","parseValueByType","dataType","includes","parsedNumber","Number","isNaN","EditableCell","initialValue","currentValue","cellId","onCellEdit","inputValue","setInputValue","isCancelled","handleBlur","current","parsedValue","newValue","oldValue","handleChange","handleKeyDown","e","key","currentTarget","blur","inputType","createElement","className","osdkEditableInput","type","onValueChange","onBlur","onKeyDown"],"sources":["EditableCell.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 { Input } from \"@base-ui/react/input\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styles from \"./EditableCell.module.css\";\nimport type { CellValueState } from \"./utils/types.js\";\n\nexport interface EditableCellProps {\n initialValue: unknown;\n currentValue: unknown;\n cellId: string;\n dataType?: string;\n onCellEdit?: (cellId: string, state: CellValueState) => void;\n}\n\nconst NUMBER_TYPES: string[] = [\n \"double\",\n \"integer\",\n \"long\",\n \"float\",\n \"decimal\",\n \"byte\",\n \"short\",\n];\n\nfunction valueToString(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n // At this point, value is a primitive (string, number, boolean, symbol, bigint)\n return String(value as string | number | boolean | symbol | bigint);\n}\n\nfunction parseValueByType(\n value: string,\n dataType?: string,\n): unknown {\n if (!dataType || !NUMBER_TYPES.includes(dataType)) {\n return value;\n }\n\n if (value === \"\") {\n return null;\n }\n\n const parsedNumber = Number(value);\n\n if (isNaN(parsedNumber)) {\n return value;\n }\n\n return parsedNumber;\n}\n\nexport function EditableCell({\n initialValue,\n currentValue,\n cellId,\n dataType,\n onCellEdit,\n}: EditableCellProps): React.ReactElement {\n const [inputValue, setInputValue] = useState<string>(\n valueToString(currentValue),\n );\n const isCancelled = useRef(false);\n\n useEffect(() => {\n setInputValue(valueToString(currentValue));\n }, [currentValue]);\n\n const handleBlur = useCallback(() => {\n // Do not commit the edit if it was cancelled with Escape key\n if (isCancelled.current) {\n isCancelled.current = false;\n return;\n }\n const parsedValue = parseValueByType(inputValue, dataType);\n onCellEdit?.(cellId, { newValue: parsedValue, oldValue: initialValue });\n }, [inputValue, initialValue, onCellEdit, cellId, dataType]);\n\n const handleChange = useCallback((value: string) => {\n setInputValue(value);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n if (e.key === \"Escape\") {\n isCancelled.current = true;\n setInputValue(valueToString(currentValue));\n e.currentTarget.blur();\n }\n },\n [currentValue],\n );\n\n const inputType = dataType && NUMBER_TYPES.includes(dataType)\n ? \"number\"\n : \"text\";\n\n return (\n <Input\n className={styles.osdkEditableInput}\n type={inputType}\n value={inputValue}\n onValueChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,QAAQ,sBAAsB;AAC5C,OAAOC,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACvE,OAAOC,MAAM,MAAM,2BAA2B;AAW9C,MAAMC,YAAsB,GAAG,CAC7B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,MAAM,EACN,OAAO,CACR;AAED,SAASC,aAAaA,CAACC,KAAc,EAAU;EAC7C,IAAIA,KAAK,IAAI,IAAI,EAAE;IACjB,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAOC,IAAI,CAACC,SAAS,CAACF,KAAK,CAAC;EAC9B;EACA;EACA,OAAOG,MAAM,CAACH,KAAoD,CAAC;AACrE;AAEA,SAASI,gBAAgBA,CACvBJ,KAAa,EACbK,QAAiB,EACR;EACT,IAAI,CAACA,QAAQ,IAAI,CAACP,YAAY,CAACQ,QAAQ,CAACD,QAAQ,CAAC,EAAE;IACjD,OAAOL,KAAK;EACd;EAEA,IAAIA,KAAK,KAAK,EAAE,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,MAAMO,YAAY,GAAGC,MAAM,CAACR,KAAK,CAAC;EAElC,IAAIS,KAAK,CAACF,YAAY,CAAC,EAAE;IACvB,OAAOP,KAAK;EACd;EAEA,OAAOO,YAAY;AACrB;AAEA,OAAO,SAASG,YAAYA,CAAC;EAC3BC,YAAY;EACZC,YAAY;EACZC,MAAM;EACNR,QAAQ;EACRS;AACiB,CAAC,EAAsB;EACxC,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGpB,QAAQ,CAC1CG,aAAa,CAACa,YAAY,CAC5B,CAAC;EACD,MAAMK,WAAW,GAAGtB,MAAM,CAAC,KAAK,CAAC;EAEjCD,SAAS,CAAC,MAAM;IACdsB,aAAa,CAACjB,aAAa,CAACa,YAAY,CAAC,CAAC;EAC5C,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;EAElB,MAAMM,UAAU,GAAGzB,WAAW,CAAC,MAAM;IACnC;IACA,IAAIwB,WAAW,CAACE,OAAO,EAAE;MACvBF,WAAW,CAACE,OAAO,GAAG,KAAK;MAC3B;IACF;IACA,MAAMC,WAAW,GAAGhB,gBAAgB,CAACW,UAAU,EAAEV,QAAQ,CAAC;IAC1DS,UAAU,GAAGD,MAAM,EAAE;MAAEQ,QAAQ,EAAED,WAAW;MAAEE,QAAQ,EAAEX;IAAa,CAAC,CAAC;EACzE,CAAC,EAAE,CAACI,UAAU,EAAEJ,YAAY,EAAEG,UAAU,EAAED,MAAM,EAAER,QAAQ,CAAC,CAAC;EAE5D,MAAMkB,YAAY,GAAG9B,WAAW,CAAEO,KAAa,IAAK;IAClDgB,aAAa,CAAChB,KAAK,CAAC;EACtB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMwB,aAAa,GAAG/B,WAAW,CAC9BgC,CAAwC,IAAK;IAC5C,IAAIA,CAAC,CAACC,GAAG,KAAK,OAAO,EAAE;MACrBD,CAAC,CAACE,aAAa,CAACC,IAAI,CAAC,CAAC;IACxB;IACA,IAAIH,CAAC,CAACC,GAAG,KAAK,QAAQ,EAAE;MACtBT,WAAW,CAACE,OAAO,GAAG,IAAI;MAC1BH,aAAa,CAACjB,aAAa,CAACa,YAAY,CAAC,CAAC;MAC1Ca,CAAC,CAACE,aAAa,CAACC,IAAI,CAAC,CAAC;IACxB;EACF,CAAC,EACD,CAAChB,YAAY,CACf,CAAC;EAED,MAAMiB,SAAS,GAAGxB,QAAQ,IAAIP,YAAY,CAACQ,QAAQ,CAACD,QAAQ,CAAC,GACzD,QAAQ,GACR,MAAM;EAEV,oBACEb,KAAA,CAAAsC,aAAA,CAACvC,KAAK;IACJwC,SAAS,EAAElC,MAAM,CAACmC,iBAAkB;IACpCC,IAAI,EAAEJ,SAAU;IAChB7B,KAAK,EAAEe,UAAW;IAClBmB,aAAa,EAAEX,YAAa;IAC5BY,MAAM,EAAEjB,UAAW;IACnBkB,SAAS,EAAEZ;EAAc,CAC1B,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"file":"EditableCell.js","names":["Input","classNames","React","useCallback","useEffect","useRef","useState","styles","NUMBER_TYPES","valueToString","value","JSON","stringify","String","parseValueByType","dataType","includes","parsedNumber","Number","isNaN","EditableCellInner","initialValue","currentValue","cellId","onCellEdit","originalRowData","rowId","columnId","inputValue","setInputValue","isCancelled","handleBlur","current","parsedValue","newValue","oldValue","handleChange","handleKeyDown","e","key","currentTarget","blur","inputType","createElement","className","osdkEditableInput","osdkEditedInput","type","onValueChange","onBlur","onKeyDown","EditableCell","memo"],"sources":["EditableCell.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 { Input } from \"@base-ui/react/input\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styles from \"./EditableCell.module.css\";\nimport type { CellEditInfo } from \"./utils/types.js\";\n\nexport interface EditableCellProps<TData extends RowData, CellValue = unknown> {\n initialValue: CellValue;\n currentValue: CellValue;\n cellId: string;\n dataType?: string;\n onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;\n originalRowData: TData;\n rowId: string;\n columnId: string;\n}\n\nconst NUMBER_TYPES: string[] = [\n \"double\",\n \"integer\",\n \"long\",\n \"float\",\n \"decimal\",\n \"byte\",\n \"short\",\n];\n\nfunction valueToString(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n // At this point, value is a primitive (string, number, boolean, symbol, bigint)\n return String(value as string | number | boolean | symbol | bigint);\n}\n\nfunction parseValueByType(\n value: string,\n dataType?: string,\n): unknown {\n if (!dataType || !NUMBER_TYPES.includes(dataType)) {\n return value;\n }\n\n if (value === \"\") {\n return null;\n }\n\n const parsedNumber = Number(value);\n\n if (isNaN(parsedNumber)) {\n return value;\n }\n\n return parsedNumber;\n}\n\nfunction EditableCellInner<TData extends RowData, CellValue = unknown>({\n initialValue,\n currentValue,\n cellId,\n dataType,\n onCellEdit,\n originalRowData,\n rowId,\n columnId,\n}: EditableCellProps<TData, CellValue>): React.ReactElement {\n const [inputValue, setInputValue] = useState<string>(\n valueToString(currentValue),\n );\n const isCancelled = useRef(false);\n\n useEffect(() => {\n setInputValue(valueToString(currentValue));\n }, [currentValue]);\n\n const handleBlur = useCallback(() => {\n // Do not commit the edit if it was cancelled with Escape key\n if (isCancelled.current) {\n isCancelled.current = false;\n return;\n }\n const parsedValue = parseValueByType(inputValue, dataType);\n onCellEdit(cellId, {\n rowId,\n columnId,\n newValue: parsedValue as CellValue,\n oldValue: initialValue,\n originalRowData,\n });\n }, [\n inputValue,\n initialValue,\n onCellEdit,\n cellId,\n dataType,\n rowId,\n columnId,\n originalRowData,\n ]);\n\n const handleChange = useCallback((value: string) => {\n setInputValue(value);\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n if (e.key === \"Escape\") {\n isCancelled.current = true;\n setInputValue(valueToString(currentValue));\n e.currentTarget.blur();\n }\n },\n [currentValue],\n );\n\n const inputType = dataType && NUMBER_TYPES.includes(dataType)\n ? \"number\"\n : \"text\";\n\n const isEdited = currentValue !== initialValue;\n\n return (\n <Input\n className={classNames(styles.osdkEditableInput, {\n [styles.osdkEditedInput]: isEdited,\n })}\n type={inputType}\n value={inputValue}\n onValueChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n );\n}\n\nexport const EditableCell = React.memo(\n EditableCellInner,\n) as typeof EditableCellInner;\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,31 @@
1
- .osdkEditableInput:focus {
2
- outline: none;
1
+ .osdkEditableInput {
2
+ overflow: hidden;
3
+ text-overflow: ellipsis;
4
+ white-space: nowrap;
5
+ text-align: left;
6
+ padding: var(--osdk-surface-spacing) calc(var(--osdk-surface-spacing) * 3);
7
+ width: 100%;
8
+ border-radius: var(--osdk-surface-border-radius);
9
+ border: var(--osdk-surface-border-width) solid transparent;
10
+ background: inherit;
11
+
12
+ tr[data-focused="true"] & {
13
+ border: var(--osdk-table-cell-editable-border);
14
+ background: var(--osdk-table-cell-editable-bg);
15
+
16
+ &.osdkEditedInput {
17
+ border: var(--osdk-table-cell-edited-border);
18
+ }
19
+
20
+ &:focus,
21
+ &.osdkEditedInput:focus {
22
+ border: var(--osdk-emphasis-focus-width) solid
23
+ var(--osdk-emphasis-focus-color);
24
+ }
25
+ }
26
+ }
27
+
28
+ .osdkEditedInput {
29
+ border: var(--osdk-table-cell-edited-border);
30
+ background: var(--osdk-table-cell-editable-bg);
3
31
  }
@@ -27,7 +27,6 @@ import { useSelectionColumn } from "./hooks/useSelectionColumn.js";
27
27
  import { useTableSorting } from "./hooks/useTableSorting.js";
28
28
  import { BaseTable } from "./Table.js";
29
29
  import { getRowId } from "./utils/getRowId.js";
30
-
31
30
  /**
32
31
  * ObjectTable - A headless table component for displaying OSDK object sets
33
32
  *
@@ -59,6 +58,7 @@ export function ObjectTable({
59
58
  enableColumnPinning = true,
60
59
  enableColumnResizing = true,
61
60
  enableColumnConfig = true,
61
+ editMode = "manual",
62
62
  ...props
63
63
  }) {
64
64
  const {
@@ -67,15 +67,6 @@ export function ObjectTable({
67
67
  } = useColumnResize({
68
68
  onColumnResize
69
69
  });
70
- const {
71
- cellEdits,
72
- clearEdits,
73
- handleCellEdit,
74
- handleSubmitEdits
75
- } = useEditableTable({
76
- onCellValueChanged,
77
- onSubmitEdits
78
- });
79
70
  const {
80
71
  sorting,
81
72
  onSortingChange
@@ -134,6 +125,11 @@ export function ObjectTable({
134
125
  const allColumns = useMemo(() => {
135
126
  return selectionColumn ? [selectionColumn, ...columns] : columns;
136
127
  }, [selectionColumn, columns]);
128
+ const editableConfig = useEditableTable({
129
+ editMode,
130
+ onCellValueChanged,
131
+ onSubmitEdits
132
+ });
137
133
  const table = useReactTable({
138
134
  data: data ?? [],
139
135
  columns: allColumns,
@@ -162,8 +158,9 @@ export function ObjectTable({
162
158
  },
163
159
  getRowId,
164
160
  meta: {
165
- onCellEdit: handleCellEdit,
166
- cellEdits
161
+ onCellEdit: editableConfig.onCellEdit,
162
+ cellEdits: editableConfig.cellEdits,
163
+ isInEditMode: editableConfig.editMode.isActive
167
164
  }
168
165
  });
169
166
  const onRenderCellContextMenu = useCallback((row, cell) => {
@@ -175,16 +172,6 @@ export function ObjectTable({
175
172
  showResizeItem: enableColumnResizing,
176
173
  showConfigItem: enableColumnConfig
177
174
  }), [enableOrdering, enableColumnPinning, enableColumnResizing, enableColumnConfig]);
178
- const editableConfig = useMemo(() => {
179
- if (!onSubmitEdits) {
180
- return;
181
- }
182
- return {
183
- onSubmitEdits: handleSubmitEdits,
184
- clearEdits,
185
- cellEdits
186
- };
187
- }, [onSubmitEdits, handleSubmitEdits, clearEdits, cellEdits]);
188
175
  return /*#__PURE__*/React.createElement(BaseTable, {
189
176
  table: table,
190
177
  isLoading: isLoading || isColumnsLoading,
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectTable.js","names":["getCoreRowModel","useReactTable","React","useCallback","useMemo","useColumnDefs","useColumnPinning","useColumnResize","useColumnVisibility","useEditableTable","useObjectTableData","useRowSelection","useSelectionColumn","useTableSorting","BaseTable","getRowId","ObjectTable","objectType","objectSet","columnDefinitions","filter","objectSetOptions","orderBy","defaultOrderBy","onOrderByChanged","onColumnsPinnedChanged","onColumnResize","onRowSelection","renderCellContextMenu","selectionMode","selectedRows","onColumnVisibilityChanged","onCellValueChanged","onSubmitEdits","enableOrdering","enableColumnPinning","enableColumnResizing","enableColumnConfig","props","columnSizing","onColumnSizingChange","cellEdits","clearEdits","handleCellEdit","handleSubmitEdits","sorting","onSortingChange","data","fetchMore","isLoading","error","columns","loading","isColumnsLoading","rowSelection","isAllSelected","hasSelection","onToggleAll","onToggleRow","enableRowSelection","selectionColumn","columnVisibility","onColumnVisibilityChange","columnOrder","onColumnOrderChange","allColumns","columnPinning","onColumnPinningChange","hasSelectionColumn","table","state","enableSorting","columnResizeMode","columnResizeDirection","manualSorting","defaultColumn","minSize","meta","onCellEdit","onRenderCellContextMenu","row","cell","getValue","headerMenuFeatureFlags","showSortingItems","showPinningItems","showResizeItem","showConfigItem","editableConfig","createElement","fetchNextPage","onRowClick","rowHeight","className"],"sources":["ObjectTable.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 ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { Cell } from \"@tanstack/react-table\";\nimport { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { useColumnDefs } from \"./hooks/useColumnDefs.js\";\nimport { useColumnPinning } from \"./hooks/useColumnPinning.js\";\nimport { useColumnResize } from \"./hooks/useColumnResize.js\";\nimport { useColumnVisibility } from \"./hooks/useColumnVisibility.js\";\nimport { useEditableTable } from \"./hooks/useEditableTable.js\";\nimport { useObjectTableData } from \"./hooks/useObjectTableData.js\";\nimport { useRowSelection } from \"./hooks/useRowSelection.js\";\nimport { useSelectionColumn } from \"./hooks/useSelectionColumn.js\";\nimport { useTableSorting } from \"./hooks/useTableSorting.js\";\nimport type { ObjectTableProps } from \"./ObjectTableApi.js\";\nimport { BaseTable } from \"./Table.js\";\nimport type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport { getRowId } from \"./utils/getRowId.js\";\n\n/**\n * ObjectTable - A headless table component for displaying OSDK object sets\n *\n * @example\n * ```tsx\n * <ObjectTable objectType={MyObjectType} />\n * ```\n */\n\nexport function ObjectTable<\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,\n objectSet,\n columnDefinitions,\n filter,\n objectSetOptions,\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n onColumnsPinnedChanged,\n onColumnResize,\n onRowSelection,\n renderCellContextMenu,\n selectionMode = \"none\",\n selectedRows,\n onColumnVisibilityChanged,\n onCellValueChanged,\n onSubmitEdits,\n enableOrdering = true,\n enableColumnPinning = true,\n enableColumnResizing = true,\n enableColumnConfig = true,\n ...props\n}: ObjectTableProps<Q, RDPs, FunctionColumns>): React.ReactElement {\n const { columnSizing, onColumnSizingChange } = useColumnResize({\n onColumnResize,\n });\n\n const {\n cellEdits,\n clearEdits,\n handleCellEdit,\n handleSubmitEdits,\n } = useEditableTable({\n onCellValueChanged,\n onSubmitEdits,\n });\n\n const { sorting, onSortingChange } = useTableSorting<\n Q,\n RDPs,\n FunctionColumns\n >(\n {\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n },\n );\n\n const { data, fetchMore, isLoading, error } = useObjectTableData<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n filter,\n sorting,\n objectSet,\n objectSetOptions,\n );\n\n const { columns, loading: isColumnsLoading } = useColumnDefs<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n );\n\n const {\n rowSelection,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n enableRowSelection,\n } = useRowSelection<Q, RDPs>({\n selectionMode,\n selectedRows,\n onRowSelection,\n data,\n });\n\n const selectionColumn = useSelectionColumn<Q, RDPs>(\n { selectionMode, isAllSelected, hasSelection, onToggleAll, onToggleRow },\n );\n\n const {\n columnVisibility,\n onColumnVisibilityChange,\n columnOrder,\n onColumnOrderChange,\n } = useColumnVisibility({\n allColumns: columns,\n onColumnVisibilityChanged,\n });\n\n const { columnPinning, onColumnPinningChange } = useColumnPinning({\n columnDefinitions,\n hasSelectionColumn: enableRowSelection,\n onColumnsPinnedChanged,\n });\n\n const allColumns = useMemo(() => {\n return selectionColumn ? [selectionColumn, ...columns] : columns;\n }, [selectionColumn, columns]);\n\n const table = useReactTable<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >({\n data: data ?? [],\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n columnVisibility,\n columnOrder,\n rowSelection,\n sorting,\n columnSizing,\n columnPinning,\n },\n onSortingChange,\n onColumnSizingChange,\n onColumnPinningChange,\n onColumnVisibilityChange,\n onColumnOrderChange,\n enableRowSelection,\n enableSorting: enableOrdering,\n columnResizeMode: \"onChange\",\n columnResizeDirection: \"ltr\",\n manualSorting: true, // Enable manual sorting to indicate server-side sorting\n defaultColumn: {\n minSize: 80,\n },\n getRowId,\n meta: {\n onCellEdit: handleCellEdit,\n cellEdits,\n },\n });\n\n const onRenderCellContextMenu = useCallback(\n (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cell: Cell<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n return renderCellContextMenu?.(row, cell.getValue());\n },\n [renderCellContextMenu],\n );\n\n const isTableLoading = isLoading || isColumnsLoading;\n\n const headerMenuFeatureFlags: HeaderMenuFeatureFlags = useMemo(() => ({\n showSortingItems: enableOrdering,\n showPinningItems: enableColumnPinning,\n showResizeItem: enableColumnResizing,\n showConfigItem: enableColumnConfig,\n }), [\n enableOrdering,\n enableColumnPinning,\n enableColumnResizing,\n enableColumnConfig,\n ]);\n\n const editableConfig = useMemo(() => {\n if (!onSubmitEdits) {\n return;\n }\n\n return {\n onSubmitEdits: handleSubmitEdits,\n clearEdits,\n cellEdits,\n };\n }, [onSubmitEdits, handleSubmitEdits, clearEdits, cellEdits]);\n\n return (\n <BaseTable<Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>>\n table={table}\n isLoading={isTableLoading}\n fetchNextPage={fetchMore}\n onRowClick={props.onRowClick}\n rowHeight={props.rowHeight}\n renderCellContextMenu={onRenderCellContextMenu}\n className={props.className}\n error={error}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n editableConfig={editableConfig}\n />\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,eAAe,EAAEC,aAAa,QAAQ,uBAAuB;AACtE,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACnD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SAASC,mBAAmB,QAAQ,gCAAgC;AACpE,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,eAAe,QAAQ,4BAA4B;AAE5D,SAASC,SAAS,QAAQ,YAAY;AAEtC,SAASC,QAAQ,QAAQ,qBAAqB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,SAASC,WAAWA,CAUzB;EACAC,UAAU;EACVC,SAAS;EACTC,iBAAiB;EACjBC,MAAM;EACNC,gBAAgB;EAChBC,OAAO;EACPC,cAAc;EACdC,gBAAgB;EAChBC,sBAAsB;EACtBC,cAAc;EACdC,cAAc;EACdC,qBAAqB;EACrBC,aAAa,GAAG,MAAM;EACtBC,YAAY;EACZC,yBAAyB;EACzBC,kBAAkB;EAClBC,aAAa;EACbC,cAAc,GAAG,IAAI;EACrBC,mBAAmB,GAAG,IAAI;EAC1BC,oBAAoB,GAAG,IAAI;EAC3BC,kBAAkB,GAAG,IAAI;EACzB,GAAGC;AACuC,CAAC,EAAsB;EACjE,MAAM;IAAEC,YAAY;IAAEC;EAAqB,CAAC,GAAGjC,eAAe,CAAC;IAC7DmB;EACF,CAAC,CAAC;EAEF,MAAM;IACJe,SAAS;IACTC,UAAU;IACVC,cAAc;IACdC;EACF,CAAC,GAAGnC,gBAAgB,CAAC;IACnBuB,kBAAkB;IAClBC;EACF,CAAC,CAAC;EAEF,MAAM;IAAEY,OAAO;IAAEC;EAAgB,CAAC,GAAGjC,eAAe,CAKlD;IACES,OAAO;IACPC,cAAc;IACdC;EACF,CACF,CAAC;EAED,MAAM;IAAEuB,IAAI;IAAEC,SAAS;IAAEC,SAAS;IAAEC;EAAM,CAAC,GAAGxC,kBAAkB,CAK9DO,UAAU,EACVE,iBAAiB,EACjBC,MAAM,EACNyB,OAAO,EACP3B,SAAS,EACTG,gBACF,CAAC;EAED,MAAM;IAAE8B,OAAO;IAAEC,OAAO,EAAEC;EAAiB,CAAC,GAAGhD,aAAa,CAK1DY,UAAU,EACVE,iBACF,CAAC;EAED,MAAM;IACJmC,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,WAAW;IACXC,WAAW;IACXC;EACF,CAAC,GAAGhD,eAAe,CAAU;IAC3BkB,aAAa;IACbC,YAAY;IACZH,cAAc;IACdoB;EACF,CAAC,CAAC;EAEF,MAAMa,eAAe,GAAGhD,kBAAkB,CACxC;IAAEiB,aAAa;IAAE0B,aAAa;IAAEC,YAAY;IAAEC,WAAW;IAAEC;EAAY,CACzE,CAAC;EAED,MAAM;IACJG,gBAAgB;IAChBC,wBAAwB;IACxBC,WAAW;IACXC;EACF,CAAC,GAAGxD,mBAAmB,CAAC;IACtByD,UAAU,EAAEd,OAAO;IACnBpB;EACF,CAAC,CAAC;EAEF,MAAM;IAAEmC,aAAa;IAAEC;EAAsB,CAAC,GAAG7D,gBAAgB,CAAC;IAChEa,iBAAiB;IACjBiD,kBAAkB,EAAET,kBAAkB;IACtClC;EACF,CAAC,CAAC;EAEF,MAAMwC,UAAU,GAAG7D,OAAO,CAAC,MAAM;IAC/B,OAAOwD,eAAe,GAAG,CAACA,eAAe,EAAE,GAAGT,OAAO,CAAC,GAAGA,OAAO;EAClE,CAAC,EAAE,CAACS,eAAe,EAAET,OAAO,CAAC,CAAC;EAE9B,MAAMkB,KAAK,GAAGpE,aAAa,CAEzB;IACA8C,IAAI,EAAEA,IAAI,IAAI,EAAE;IAChBI,OAAO,EAAEc,UAAU;IACnBjE,eAAe,EAAEA,eAAe,CAAC,CAAC;IAClCsE,KAAK,EAAE;MACLT,gBAAgB;MAChBE,WAAW;MACXT,YAAY;MACZT,OAAO;MACPN,YAAY;MACZ2B;IACF,CAAC;IACDpB,eAAe;IACfN,oBAAoB;IACpB2B,qBAAqB;IACrBL,wBAAwB;IACxBE,mBAAmB;IACnBL,kBAAkB;IAClBY,aAAa,EAAErC,cAAc;IAC7BsC,gBAAgB,EAAE,UAAU;IAC5BC,qBAAqB,EAAE,KAAK;IAC5BC,aAAa,EAAE,IAAI;IAAE;IACrBC,aAAa,EAAE;MACbC,OAAO,EAAE;IACX,CAAC;IACD7D,QAAQ;IACR8D,IAAI,EAAE;MACJC,UAAU,EAAEnC,cAAc;MAC1BF;IACF;EACF,CAAC,CAAC;EAEF,MAAMsC,uBAAuB,GAAG5E,WAAW,CACzC,CACE6E,GAAkE,EAClEC,IAGC,KACE;IACH,OAAOrD,qBAAqB,GAAGoD,GAAG,EAAEC,IAAI,CAACC,QAAQ,CAAC,CAAC,CAAC;EACtD,CAAC,EACD,CAACtD,qBAAqB,CACxB,CAAC;EAID,MAAMuD,sBAA8C,GAAG/E,OAAO,CAAC,OAAO;IACpEgF,gBAAgB,EAAElD,cAAc;IAChCmD,gBAAgB,EAAElD,mBAAmB;IACrCmD,cAAc,EAAElD,oBAAoB;IACpCmD,cAAc,EAAElD;EAClB,CAAC,CAAC,EAAE,CACFH,cAAc,EACdC,mBAAmB,EACnBC,oBAAoB,EACpBC,kBAAkB,CACnB,CAAC;EAEF,MAAMmD,cAAc,GAAGpF,OAAO,CAAC,MAAM;IACnC,IAAI,CAAC6B,aAAa,EAAE;MAClB;IACF;IAEA,OAAO;MACLA,aAAa,EAAEW,iBAAiB;MAChCF,UAAU;MACVD;IACF,CAAC;EACH,CAAC,EAAE,CAACR,aAAa,EAAEW,iBAAiB,EAAEF,UAAU,EAAED,SAAS,CAAC,CAAC;EAE7D,oBACEvC,KAAA,CAAAuF,aAAA,CAAC3E,SAAS;IACRuD,KAAK,EAAEA,KAAM;IACbpB,SAAS,EA7BUA,SAAS,IAAII,gBA6BN;IAC1BqC,aAAa,EAAE1C,SAAU;IACzB2C,UAAU,EAAErD,KAAK,CAACqD,UAAW;IAC7BC,SAAS,EAAEtD,KAAK,CAACsD,SAAU;IAC3BhE,qBAAqB,EAAEmD,uBAAwB;IAC/Cc,SAAS,EAAEvD,KAAK,CAACuD,SAAU;IAC3B3C,KAAK,EAAEA,KAAM;IACbiC,sBAAsB,EAAEA,sBAAuB;IAC/CK,cAAc,EAAEA;EAAe,CAChC,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"file":"ObjectTable.js","names":["getCoreRowModel","useReactTable","React","useCallback","useMemo","useColumnDefs","useColumnPinning","useColumnResize","useColumnVisibility","useEditableTable","useObjectTableData","useRowSelection","useSelectionColumn","useTableSorting","BaseTable","getRowId","ObjectTable","objectType","objectSet","columnDefinitions","filter","objectSetOptions","orderBy","defaultOrderBy","onOrderByChanged","onColumnsPinnedChanged","onColumnResize","onRowSelection","renderCellContextMenu","selectionMode","selectedRows","onColumnVisibilityChanged","onCellValueChanged","onSubmitEdits","enableOrdering","enableColumnPinning","enableColumnResizing","enableColumnConfig","editMode","props","columnSizing","onColumnSizingChange","sorting","onSortingChange","data","fetchMore","isLoading","error","columns","loading","isColumnsLoading","rowSelection","isAllSelected","hasSelection","onToggleAll","onToggleRow","enableRowSelection","selectionColumn","columnVisibility","onColumnVisibilityChange","columnOrder","onColumnOrderChange","allColumns","columnPinning","onColumnPinningChange","hasSelectionColumn","editableConfig","table","state","enableSorting","columnResizeMode","columnResizeDirection","manualSorting","defaultColumn","minSize","meta","onCellEdit","cellEdits","isInEditMode","isActive","onRenderCellContextMenu","row","cell","getValue","headerMenuFeatureFlags","showSortingItems","showPinningItems","showResizeItem","showConfigItem","createElement","fetchNextPage","onRowClick","rowHeight","className"],"sources":["ObjectTable.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 ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { Cell } from \"@tanstack/react-table\";\nimport { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { useColumnDefs } from \"./hooks/useColumnDefs.js\";\nimport { useColumnPinning } from \"./hooks/useColumnPinning.js\";\nimport { useColumnResize } from \"./hooks/useColumnResize.js\";\nimport { useColumnVisibility } from \"./hooks/useColumnVisibility.js\";\nimport { useEditableTable } from \"./hooks/useEditableTable.js\";\nimport { useObjectTableData } from \"./hooks/useObjectTableData.js\";\nimport { useRowSelection } from \"./hooks/useRowSelection.js\";\nimport { useSelectionColumn } from \"./hooks/useSelectionColumn.js\";\nimport { useTableSorting } from \"./hooks/useTableSorting.js\";\nimport type { ObjectTableProps } from \"./ObjectTableApi.js\";\nimport { BaseTable } from \"./Table.js\";\nimport type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport { getRowId } from \"./utils/getRowId.js\";\nimport type { EditableConfig } from \"./utils/types.js\";\n\n/**\n * ObjectTable - A headless table component for displaying OSDK object sets\n *\n * @example\n * ```tsx\n * <ObjectTable objectType={MyObjectType} />\n * ```\n */\n\nexport function ObjectTable<\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,\n objectSet,\n columnDefinitions,\n filter,\n objectSetOptions,\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n onColumnsPinnedChanged,\n onColumnResize,\n onRowSelection,\n renderCellContextMenu,\n selectionMode = \"none\",\n selectedRows,\n onColumnVisibilityChanged,\n onCellValueChanged,\n onSubmitEdits,\n enableOrdering = true,\n enableColumnPinning = true,\n enableColumnResizing = true,\n enableColumnConfig = true,\n editMode = \"manual\",\n ...props\n}: ObjectTableProps<Q, RDPs, FunctionColumns>): React.ReactElement {\n const { columnSizing, onColumnSizingChange } = useColumnResize({\n onColumnResize,\n });\n\n const { sorting, onSortingChange } = useTableSorting<\n Q,\n RDPs,\n FunctionColumns\n >(\n {\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n },\n );\n\n const { data, fetchMore, isLoading, error } = useObjectTableData<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n filter,\n sorting,\n objectSet,\n objectSetOptions,\n );\n\n const { columns, loading: isColumnsLoading } = useColumnDefs<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n );\n\n const {\n rowSelection,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n enableRowSelection,\n } = useRowSelection<Q, RDPs>({\n selectionMode,\n selectedRows,\n onRowSelection,\n data,\n });\n\n const selectionColumn = useSelectionColumn<Q, RDPs>(\n { selectionMode, isAllSelected, hasSelection, onToggleAll, onToggleRow },\n );\n\n const {\n columnVisibility,\n onColumnVisibilityChange,\n columnOrder,\n onColumnOrderChange,\n } = useColumnVisibility({\n allColumns: columns,\n onColumnVisibilityChanged,\n });\n\n const { columnPinning, onColumnPinningChange } = useColumnPinning({\n columnDefinitions,\n hasSelectionColumn: enableRowSelection,\n onColumnsPinnedChanged,\n });\n\n const allColumns = useMemo(() => {\n return selectionColumn ? [selectionColumn, ...columns] : columns;\n }, [selectionColumn, columns]);\n\n const editableConfig: EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n > = useEditableTable({\n editMode,\n onCellValueChanged,\n onSubmitEdits,\n });\n\n const table = useReactTable<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >({\n data: data ?? [],\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n columnVisibility,\n columnOrder,\n rowSelection,\n sorting,\n columnSizing,\n columnPinning,\n },\n onSortingChange,\n onColumnSizingChange,\n onColumnPinningChange,\n onColumnVisibilityChange,\n onColumnOrderChange,\n enableRowSelection,\n enableSorting: enableOrdering,\n columnResizeMode: \"onChange\",\n columnResizeDirection: \"ltr\",\n manualSorting: true, // Enable manual sorting to indicate server-side sorting\n defaultColumn: {\n minSize: 80,\n },\n getRowId,\n meta: {\n onCellEdit: editableConfig.onCellEdit,\n cellEdits: editableConfig.cellEdits,\n isInEditMode: editableConfig.editMode.isActive,\n },\n });\n\n const onRenderCellContextMenu = useCallback(\n (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cell: Cell<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n return renderCellContextMenu?.(row, cell.getValue());\n },\n [renderCellContextMenu],\n );\n\n const isTableLoading = isLoading || isColumnsLoading;\n\n const headerMenuFeatureFlags: HeaderMenuFeatureFlags = useMemo(() => ({\n showSortingItems: enableOrdering,\n showPinningItems: enableColumnPinning,\n showResizeItem: enableColumnResizing,\n showConfigItem: enableColumnConfig,\n }), [\n enableOrdering,\n enableColumnPinning,\n enableColumnResizing,\n enableColumnConfig,\n ]);\n\n return (\n <BaseTable<Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>>\n table={table}\n isLoading={isTableLoading}\n fetchNextPage={fetchMore}\n onRowClick={props.onRowClick}\n rowHeight={props.rowHeight}\n renderCellContextMenu={onRenderCellContextMenu}\n className={props.className}\n error={error}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n editableConfig={editableConfig}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectTableApi.js","names":[],"sources":["ObjectTableApi.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 DerivedProperty,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type * as React from \"react\";\nimport type { CellIdentifier, CellValueState } from \"./utils/types.js\";\n\nexport type ColumnDefinition<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> = {\n locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>;\n\n /**\n * @default true\n */\n isVisible?: boolean;\n\n /**\n * @default none\n */\n pinned?: \"left\" | \"right\" | \"none\";\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n orderable?: boolean;\n filterable?: boolean;\n editable?: boolean;\n\n renderCell?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>,\n ) => React.ReactNode;\n\n /**\n * If provided, this will be used in the column header.\n * If both columnName and renderHeader are provided, renderHeader will take precedence in the table header.\n * columnName will still be used in other parts where the column name is displayed.\n *\n * If not provided,\n * for a property column, the property displayName will be used\n * for other columns, the id will be used.\n */\n columnName?: string;\n\n /**\n * If provided, this will be used to render the header component.\n * When both columnName and renderHeader are provided, renderHeader will take precedence in the table header.\n */\n renderHeader?: () => React.ReactNode;\n};\n\nexport type ColumnDefinitionLocator<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> =\n | {\n type: \"property\";\n id: PropertyKeys<Q>;\n }\n | {\n type: \"function\";\n id: keyof FunctionColumns;\n }\n | {\n type: \"rdp\";\n id: keyof RDPs;\n creator: DerivedProperty.Creator<Q, RDPs[keyof RDPs]>;\n }\n | {\n type: \"custom\";\n id: string;\n };\n\nexport interface ObjectTableProps<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n /**\n * The object or interface type of the object\n * If objectSet is not provided, objects will be fetched based on this type.\n */\n objectType: Q;\n\n /**\n * The set of objects to show in the table.\n * If provided and the objectType is not an interface, the table will use objectSet to fetch objects instead of fetching based on objectType.\n */\n objectSet?: ObjectSet<Q>;\n\n objectSetOptions?: ObjectSetOptions<Q>;\n\n /**\n * Ordered list of column definitions to show in the table\n *\n * If not provided, all of the properties of the object type will be shown in default order.\n */\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>;\n\n /**\n * Whether the table is filterable by the user.\n *\n * @default true\n */\n enableFiltering?: boolean;\n\n /**\n * The current where clause to filter the objects in the table.\n * If provided, the filter is controlled.\n */\n filter?: WhereClause<Q, RDPs>;\n\n /**\n * Called when the where clause is changed.\n * Required when filter is controlled.\n *\n * @param newWhere The new where clause\n */\n onFilterChanged?: (newWhere: WhereClause<Q, RDPs>) => void;\n\n /**\n * Whether the table is sortable by the user.\n *\n * @default true\n */\n enableOrdering?: boolean;\n\n /**\n * Whether columns can be pinned by the user.\n *\n * @default true\n */\n enableColumnPinning?: boolean;\n\n /**\n * Whether columns can be resized by the user.\n *\n * @default true\n */\n enableColumnResizing?: boolean;\n\n /**\n * Whether the column configuration dialog for column visibility and ordering is available to the user.\n *\n * @default true\n */\n enableColumnConfig?: boolean;\n\n /**\n * The default order by clause to sort the objects in the table.\n * If provided without orderBy prop, the sorting is uncontrolled.\n * If both orderBy and defaultOrderBy are provided, orderBy takes precedence.\n */\n defaultOrderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * The current order by clause to sort the objects in the table.\n * If provided, the sorting is controlled.\n * If both orderBy and defaultOrderBy are provided, orderBy takes precedence.\n */\n orderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * Called when the order by clause is changed.\n * Required when sorting is controlled.\n *\n * @param newOrderBy The new order by clause\n */\n onOrderByChanged?: (\n newOrderBy: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>,\n ) => void;\n\n /**\n * Called after the value of a cell is edited and committed by the user.\n *\n * @param cell The cell that was edited, identified by its row and column IDs\n * @param state The new and old values of the cell\n */\n onCellValueChanged?: (\n cell: CellIdentifier,\n state: CellValueState,\n ) => void;\n\n /**\n * If provided, the button Submit Edits will be shown in the table\n *\n * @param edits a map of cellId (stringified CellIdentifier) to the new and old values of the cell\n */\n onSubmitEdits?: (edits: Record<string, CellValueState>) => Promise<void>;\n\n /**\n * Called when the column visibility or ordering changed.\n *\n * If provided, the table will allow the user to show/hide columns.\n *\n * @param newStates The columns sorted in their display order in the table and their visibility state.\n */\n onColumnVisibilityChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n isVisible: boolean;\n }>,\n ) => void;\n\n /**\n * Called when the pinned columns change.\n *\n * If provided, the table will allow the user to pin/unpin columns.\n *\n * @param newStates The new list of column pin states\n */\n onColumnsPinnedChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n pinned: \"left\" | \"right\" | \"none\";\n }>,\n ) => void;\n\n /**\n * Called when a column is resized.\n *\n * @param columnId The ID of the resized column\n * @param newWidth The new width of the column. When newWidth = null, the column size is reset.\n */\n onColumnResize?: (\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns,\n newWidth: number | null,\n ) => void;\n\n /**\n * Called when a row is clicked.\n *\n * @param object The object representing the clicked row\n */\n onRowClick?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n ) => void;\n\n /**\n * Selection mode for the table rows.\n *\n * If multiple, a checkbox will be shown for each row to allow selecting multiple rows\n * as well as a top-level checkbox in the header to select all rows.\n *\n * @default \"none\"\n */\n selectionMode?: \"single\" | \"multiple\" | \"none\";\n\n /**\n * The currently selected rows in the table.\n * If provided, the row selection is controlled.\n */\n selectedRows?: PrimaryKeyType<Q>[];\n\n /**\n * Called when the row selection changes.\n * Required when row selection is controlled.\n *\n * @param selectedRowIds The primary keys of currently selected rows\n */\n\n onRowSelection?: (selectedRowIds: PrimaryKeyType<Q>[]) => void;\n\n /**\n * If provided, will render this context menu when right clicking on a cell\n */\n renderCellContextMenu?: (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cellValue: unknown,\n ) => React.ReactNode;\n\n /**\n * The height of each row in pixels.\n *\n * @default 40\n */\n rowHeight?: number;\n\n className?: string;\n}\n\nexport interface ObjectSetOptions<\n Q extends ObjectOrInterfaceDefinition,\n> {\n /**\n * Object sets to union with\n */\n union?: ObjectSet<Q>[];\n\n /**\n * Object sets to intersect with\n */\n intersect?: ObjectSet<Q>[];\n\n /**\n * Object sets to subtract from\n */\n subtract?: ObjectSet<Q>[];\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"ObjectTableApi.js","names":[],"sources":["ObjectTableApi.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 DerivedProperty,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type * as React from \"react\";\nimport type { CellEditInfo } from \"./utils/types.js\";\n\nexport type ColumnDefinition<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> = {\n locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>;\n\n /**\n * @default true\n */\n isVisible?: boolean;\n\n /**\n * @default none\n */\n pinned?: \"left\" | \"right\" | \"none\";\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n orderable?: boolean;\n filterable?: boolean;\n editable?: boolean;\n\n renderCell?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>,\n ) => React.ReactNode;\n\n /**\n * If provided, this will be used in the column header.\n * If both columnName and renderHeader are provided, renderHeader will take precedence in the table header.\n * columnName will still be used in other parts where the column name is displayed.\n *\n * If not provided,\n * for a property column, the property displayName will be used\n * for other columns, the id will be used.\n */\n columnName?: string;\n\n /**\n * If provided, this will be used to render the header component.\n * When both columnName and renderHeader are provided, renderHeader will take precedence in the table header.\n */\n renderHeader?: () => React.ReactNode;\n};\n\nexport type ColumnDefinitionLocator<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> =\n | {\n type: \"property\";\n id: PropertyKeys<Q>;\n }\n | {\n type: \"function\";\n id: keyof FunctionColumns;\n }\n | {\n type: \"rdp\";\n id: keyof RDPs;\n creator: DerivedProperty.Creator<Q, RDPs[keyof RDPs]>;\n }\n | {\n type: \"custom\";\n id: string;\n };\n\nexport interface ObjectTableProps<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n /**\n * The object or interface type of the object\n * If objectSet is not provided, objects will be fetched based on this type.\n */\n objectType: Q;\n\n /**\n * The set of objects to show in the table.\n * If provided and the objectType is not an interface, the table will use objectSet to fetch objects instead of fetching based on objectType.\n */\n objectSet?: ObjectSet<Q>;\n\n objectSetOptions?: ObjectSetOptions<Q>;\n\n /**\n * Ordered list of column definitions to show in the table\n *\n * If not provided, all of the properties of the object type will be shown in default order.\n */\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>;\n\n /**\n * Whether the table is filterable by the user.\n *\n * @default true\n */\n enableFiltering?: boolean;\n\n /**\n * The current where clause to filter the objects in the table.\n * If provided, the filter is controlled.\n */\n filter?: WhereClause<Q, RDPs>;\n\n /**\n * Called when the where clause is changed.\n * Required when filter is controlled.\n *\n * @param newWhere The new where clause\n */\n onFilterChanged?: (newWhere: WhereClause<Q, RDPs>) => void;\n\n /**\n * Whether the table is sortable by the user.\n *\n * @default true\n */\n enableOrdering?: boolean;\n\n /**\n * Whether columns can be pinned by the user.\n *\n * @default true\n */\n enableColumnPinning?: boolean;\n\n /**\n * Whether columns can be resized by the user.\n *\n * @default true\n */\n enableColumnResizing?: boolean;\n\n /**\n * Whether the column configuration dialog for column visibility and ordering is available to the user.\n *\n * @default true\n */\n enableColumnConfig?: boolean;\n\n /**\n * Controls the edit mode behavior of the table.\n * - \"always\": Editable cells are immediately in edit mode on row clicked.\n * - \"manual\": User can toggle edit mode on/off via the Edit Table button.\n *\n * @default \"manual\"\n */\n editMode?: \"always\" | \"manual\";\n\n /**\n * The default order by clause to sort the objects in the table.\n * If provided without orderBy prop, the sorting is uncontrolled.\n * If both orderBy and defaultOrderBy are provided, orderBy takes precedence.\n */\n defaultOrderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * The current order by clause to sort the objects in the table.\n * If provided, the sorting is controlled.\n * If both orderBy and defaultOrderBy are provided, orderBy takes precedence.\n */\n orderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * Called when the order by clause is changed.\n * Required when sorting is controlled.\n *\n * @param newOrderBy The new order by clause\n */\n onOrderByChanged?: (\n newOrderBy: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>,\n ) => void;\n\n /**\n * Called after the value of a cell is edited and committed by the user.\n *\n * @param info An object containing details about the cell that was edited,\n * including the rowId, columnId, new and old values, and the row data before the edit\n */\n onCellValueChanged?: (\n info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => void;\n\n /**\n * If provided, the button Submit Edits will be shown in the table\n *\n * @param edits an array of edit info containing details about the edited cells\n * including the rowId, columnId, new and old values, and the row data before the edit\n * @return a promise that resolves to true if the edits were successfully submitted\n */\n onSubmitEdits?: (edits: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >[]) => Promise<boolean>;\n\n /**\n * Called when the column visibility or ordering changed.\n *\n * If provided, the table will allow the user to show/hide columns.\n *\n * @param newStates The columns sorted in their display order in the table and their visibility state.\n */\n onColumnVisibilityChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n isVisible: boolean;\n }>,\n ) => void;\n\n /**\n * Called when the pinned columns change.\n *\n * If provided, the table will allow the user to pin/unpin columns.\n *\n * @param newStates The new list of column pin states\n */\n onColumnsPinnedChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n pinned: \"left\" | \"right\" | \"none\";\n }>,\n ) => void;\n\n /**\n * Called when a column is resized.\n *\n * @param columnId The ID of the resized column\n * @param newWidth The new width of the column. When newWidth = null, the column size is reset.\n */\n onColumnResize?: (\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns,\n newWidth: number | null,\n ) => void;\n\n /**\n * Called when a row is clicked.\n *\n * @param object The object representing the clicked row\n */\n onRowClick?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n ) => void;\n\n /**\n * Selection mode for the table rows.\n *\n * If multiple, a checkbox will be shown for each row to allow selecting multiple rows\n * as well as a top-level checkbox in the header to select all rows.\n *\n * @default \"none\"\n */\n selectionMode?: \"single\" | \"multiple\" | \"none\";\n\n /**\n * The currently selected rows in the table.\n * If provided, the row selection is controlled.\n */\n selectedRows?: PrimaryKeyType<Q>[];\n\n /**\n * Called when the row selection changes.\n * Required when row selection is controlled.\n *\n * @param selectedRowIds The primary keys of currently selected rows\n */\n\n onRowSelection?: (selectedRowIds: PrimaryKeyType<Q>[]) => void;\n\n /**\n * If provided, will render this context menu when right clicking on a cell\n */\n renderCellContextMenu?: (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cellValue: unknown,\n ) => React.ReactNode;\n\n /**\n * The height of each row in pixels.\n *\n * @default 40\n */\n rowHeight?: number;\n\n className?: string;\n}\n\nexport interface ObjectSetOptions<\n Q extends ObjectOrInterfaceDefinition,\n> {\n /**\n * Object sets to union with\n */\n union?: ObjectSet<Q>[];\n\n /**\n * Object sets to intersect with\n */\n intersect?: ObjectSet<Q>[];\n\n /**\n * Object sets to subtract from\n */\n subtract?: ObjectSet<Q>[];\n}\n"],"mappings":"","ignoreList":[]}
@@ -16,11 +16,11 @@
16
16
 
17
17
  import classNames from "classnames";
18
18
  import React, { useCallback, useEffect, useRef, useState } from "react";
19
- import { ActionButton } from "../base-components/action-button/ActionButton.js";
20
19
  import { LoadingStateTable } from "./LoadingStateTable.js";
21
20
  import { NonIdealState } from "./NonIdealState.js";
22
21
  import styles from "./Table.module.css";
23
22
  import { TableBody } from "./TableBody.js";
23
+ import { TableEditContainer } from "./TableEditContainer.js";
24
24
  import { TableHeader } from "./TableHeader.js";
25
25
  export function BaseTable({
26
26
  table,
@@ -36,6 +36,7 @@ export function BaseTable({
36
36
  }) {
37
37
  const tableContainerRef = useRef(null);
38
38
  const [isLoadingMore, setIsLoadingMore] = useState(false);
39
+ const [focusedRowId, setFocusedRowId] = useState(null);
39
40
 
40
41
  // Using a ref to prevent duplicate fetches from rapid scroll events while a fetch is in-flight
41
42
  const fetchingRef = useRef(false);
@@ -68,16 +69,23 @@ export function BaseTable({
68
69
  const rows = table.getRowModel().rows;
69
70
  const headerGroups = table.getHeaderGroups();
70
71
  const hasData = rows.length > 0;
71
- const hasEdits = Object.keys(editableConfig?.cellEdits ?? {}).length > 0;
72
- const handleSubmitEdits = useCallback(async () => {
73
- await editableConfig?.onSubmitEdits?.();
74
- editableConfig?.clearEdits?.();
75
- }, [editableConfig]);
72
+ const hasEditableColumns = table.getAllColumns().some(column => column.columnDef.meta?.editable === true);
73
+ useEffect(() => {
74
+ const handleClickOutside = event => {
75
+ if (tableContainerRef.current && !tableContainerRef.current.contains(event.target)) {
76
+ setFocusedRowId(null);
77
+ }
78
+ };
79
+ document.addEventListener("click", handleClickOutside);
80
+ return () => {
81
+ document.removeEventListener("click", handleClickOutside);
82
+ };
83
+ }, []);
76
84
  return /*#__PURE__*/React.createElement("div", {
77
85
  className: classNames(styles.osdkTableWrapper, className)
78
86
  }, /*#__PURE__*/React.createElement("div", {
79
87
  ref: tableContainerRef,
80
- className: classNames(styles.osdkTableContainer, editableConfig && styles.osdkTableContainerWithButton),
88
+ className: styles.osdkTableContainer,
81
89
  onScroll: handleScroll
82
90
  }, /*#__PURE__*/React.createElement("table", null, isLoading && !hasData ? /*#__PURE__*/React.createElement(LoadingStateTable, {
83
91
  table: table,
@@ -94,17 +102,17 @@ export function BaseTable({
94
102
  rowHeight: rowHeight,
95
103
  renderCellContextMenu: renderCellContextMenu,
96
104
  isLoadingMore: isLoadingMore,
97
- headerGroups: headerGroups
105
+ headerGroups: headerGroups,
106
+ focusedRowId: focusedRowId,
107
+ setFocusedRowId: setFocusedRowId,
108
+ isInEditMode: editableConfig?.editMode.isActive
98
109
  }))), !hasData && error == null && /*#__PURE__*/React.createElement(NonIdealState, {
99
110
  message: "No Data"
100
111
  }), error != null && /*#__PURE__*/React.createElement(NonIdealState, {
101
112
  message: `Error Loading Data: ${error.message}`
102
- })), editableConfig && /*#__PURE__*/React.createElement("div", {
103
- className: styles.submitButtonContainer
104
- }, /*#__PURE__*/React.createElement(ActionButton, {
105
- variant: "primary",
106
- onClick: handleSubmitEdits,
107
- disabled: !hasEdits
108
- }, "Submit Edits")));
113
+ })), hasEditableColumns && /*#__PURE__*/React.createElement(TableEditContainer, {
114
+ editableConfig: editableConfig,
115
+ focusedRowId: focusedRowId
116
+ }));
109
117
  }
110
118
  //# sourceMappingURL=Table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","names":["classNames","React","useCallback","useEffect","useRef","useState","ActionButton","LoadingStateTable","NonIdealState","styles","TableBody","TableHeader","BaseTable","table","isLoading","fetchNextPage","onRowClick","rowHeight","renderCellContextMenu","className","error","headerMenuFeatureFlags","editableConfig","tableContainerRef","isLoadingMore","setIsLoadingMore","fetchingRef","fetchMoreOnEndReached","containerRefElement","current","scrollHeight","scrollTop","clientHeight","handleScroll","e","currentTarget","rows","getRowModel","headerGroups","getHeaderGroups","hasData","length","hasEdits","Object","keys","cellEdits","handleSubmitEdits","onSubmitEdits","clearEdits","createElement","osdkTableWrapper","ref","osdkTableContainer","osdkTableContainerWithButton","onScroll","Fragment","message","submitButtonContainer","variant","onClick","disabled"],"sources":["Table.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, RowData, Table } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, {\n type ReactElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ActionButton } from \"../base-components/action-button/ActionButton.js\";\nimport { LoadingStateTable } from \"./LoadingStateTable.js\";\nimport { NonIdealState } from \"./NonIdealState.js\";\nimport styles from \"./Table.module.css\";\nimport { TableBody } from \"./TableBody.js\";\nimport { TableHeader } from \"./TableHeader.js\";\nimport type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport type { CellValueState } from \"./utils/types.js\";\n\ndeclare module \"@tanstack/react-table\" {\n interface ColumnMeta<TData extends RowData = unknown, TValue = unknown> {\n columnName?: string;\n isVisible?: boolean;\n editable?: boolean;\n dataType?: string;\n }\n interface TableMeta<TData extends RowData = unknown> {\n onCellEdit?: (\n cellId: string,\n state: CellValueState,\n ) => void;\n cellEdits?: Record<string, CellValueState>;\n }\n}\n\ninterface EditableConfig {\n onSubmitEdits?: () => Promise<void>;\n clearEdits?: () => void;\n cellEdits?: Record<string, CellValueState>;\n}\n\nexport interface BaseTableProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n isLoading?: boolean;\n fetchNextPage?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n rowHeight?: number;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n className?: string;\n error?: Error;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n editableConfig?: EditableConfig;\n}\n\nexport function BaseTable<\n TData extends RowData,\n>(\n {\n table,\n isLoading,\n fetchNextPage,\n onRowClick,\n rowHeight,\n renderCellContextMenu,\n className,\n error,\n headerMenuFeatureFlags,\n editableConfig,\n }: BaseTableProps<TData>,\n): ReactElement {\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n // Using a ref to prevent duplicate fetches from rapid scroll events while a fetch is in-flight\n const fetchingRef = useRef(false);\n\n useEffect(() => {\n if (!isLoading || fetchNextPage == null) {\n setIsLoadingMore(false);\n }\n }, [isLoading, fetchNextPage]);\n\n const fetchMoreOnEndReached = useCallback(\n async (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement && !fetchingRef.current && !isLoadingMore) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n if (\n scrollHeight - scrollTop - clientHeight < 100\n && !isLoading && fetchNextPage != null\n ) {\n fetchingRef.current = true;\n setIsLoadingMore(true);\n try {\n await fetchNextPage();\n } finally {\n fetchingRef.current = false;\n }\n }\n }\n },\n [fetchNextPage, isLoading, isLoadingMore],\n );\n\n const handleScroll = useCallback(\n async (e: React.UIEvent<HTMLDivElement>) => {\n await fetchMoreOnEndReached(e.currentTarget);\n },\n [fetchMoreOnEndReached],\n );\n\n const rows = table.getRowModel().rows;\n const headerGroups = table.getHeaderGroups();\n const hasData = rows.length > 0;\n const hasEdits = Object.keys(editableConfig?.cellEdits ?? {}).length > 0;\n\n const handleSubmitEdits = useCallback(async () => {\n await editableConfig?.onSubmitEdits?.();\n editableConfig?.clearEdits?.();\n }, [editableConfig]);\n\n return (\n <div className={classNames(styles.osdkTableWrapper, className)}>\n <div\n ref={tableContainerRef}\n className={classNames(\n styles.osdkTableContainer,\n editableConfig && styles.osdkTableContainerWithButton,\n )}\n onScroll={handleScroll}\n >\n <table>\n {isLoading && !hasData\n ? (\n <LoadingStateTable\n table={table}\n headerGroups={headerGroups}\n rowHeight={rowHeight}\n tableContainerRef={tableContainerRef}\n />\n )\n : (\n <>\n <TableHeader\n table={table}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n />\n <TableBody\n rows={rows}\n tableContainerRef={tableContainerRef}\n onRowClick={onRowClick}\n rowHeight={rowHeight}\n renderCellContextMenu={renderCellContextMenu}\n isLoadingMore={isLoadingMore}\n headerGroups={headerGroups}\n />\n </>\n )}\n </table>\n {!hasData && error == null && <NonIdealState message={\"No Data\"} />}\n {error != null && (\n <NonIdealState message={`Error Loading Data: ${error.message}`} />\n )}\n </div>\n {editableConfig && (\n <div className={styles.submitButtonContainer}>\n <ActionButton\n variant=\"primary\"\n onClick={handleSubmitEdits}\n disabled={!hasEdits}\n >\n Submit Edits\n </ActionButton>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Table.js","names":["classNames","React","useCallback","useEffect","useRef","useState","LoadingStateTable","NonIdealState","styles","TableBody","TableEditContainer","TableHeader","BaseTable","table","isLoading","fetchNextPage","onRowClick","rowHeight","renderCellContextMenu","className","error","headerMenuFeatureFlags","editableConfig","tableContainerRef","isLoadingMore","setIsLoadingMore","focusedRowId","setFocusedRowId","fetchingRef","fetchMoreOnEndReached","containerRefElement","current","scrollHeight","scrollTop","clientHeight","handleScroll","e","currentTarget","rows","getRowModel","headerGroups","getHeaderGroups","hasData","length","hasEditableColumns","getAllColumns","some","column","columnDef","meta","editable","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","createElement","osdkTableWrapper","ref","osdkTableContainer","onScroll","Fragment","isInEditMode","editMode","isActive","message"],"sources":["Table.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, RowData, Table } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, {\n type ReactElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { LoadingStateTable } from \"./LoadingStateTable.js\";\nimport { NonIdealState } from \"./NonIdealState.js\";\nimport styles from \"./Table.module.css\";\nimport { TableBody } from \"./TableBody.js\";\nimport { TableEditContainer } from \"./TableEditContainer.js\";\nimport { TableHeader } from \"./TableHeader.js\";\nimport type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport type { CellEditInfo, EditableConfig } from \"./utils/types.js\";\n\ndeclare module \"@tanstack/react-table\" {\n interface ColumnMeta<TData extends RowData = unknown, TValue = unknown> {\n columnName?: string;\n isVisible?: boolean;\n editable?: boolean;\n dataType?: string;\n }\n interface TableMeta<TData extends RowData = unknown> {\n onCellEdit?: (\n cellId: string,\n info: CellEditInfo<TData, unknown>,\n ) => void;\n cellEdits?: Record<string, CellEditInfo<TData, unknown>>;\n isInEditMode?: boolean;\n }\n}\n\nexport interface BaseTableProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n isLoading?: boolean;\n fetchNextPage?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n rowHeight?: number;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n className?: string;\n error?: Error;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n editableConfig?: EditableConfig<TData, unknown>;\n}\n\nexport function BaseTable<\n TData extends RowData,\n>(\n {\n table,\n isLoading,\n fetchNextPage,\n onRowClick,\n rowHeight,\n renderCellContextMenu,\n className,\n error,\n headerMenuFeatureFlags,\n editableConfig,\n }: BaseTableProps<TData>,\n): ReactElement {\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [focusedRowId, setFocusedRowId] = useState<string | null>(null);\n\n // Using a ref to prevent duplicate fetches from rapid scroll events while a fetch is in-flight\n const fetchingRef = useRef(false);\n\n useEffect(() => {\n if (!isLoading || fetchNextPage == null) {\n setIsLoadingMore(false);\n }\n }, [isLoading, fetchNextPage]);\n\n const fetchMoreOnEndReached = useCallback(\n async (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement && !fetchingRef.current && !isLoadingMore) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n if (\n scrollHeight - scrollTop - clientHeight < 100\n && !isLoading && fetchNextPage != null\n ) {\n fetchingRef.current = true;\n setIsLoadingMore(true);\n try {\n await fetchNextPage();\n } finally {\n fetchingRef.current = false;\n }\n }\n }\n },\n [fetchNextPage, isLoading, isLoadingMore],\n );\n\n const handleScroll = useCallback(\n async (e: React.UIEvent<HTMLDivElement>) => {\n await fetchMoreOnEndReached(e.currentTarget);\n },\n [fetchMoreOnEndReached],\n );\n\n const rows = table.getRowModel().rows;\n const headerGroups = table.getHeaderGroups();\n const hasData = rows.length > 0;\n\n const hasEditableColumns = table\n .getAllColumns()\n .some(column => column.columnDef.meta?.editable === true);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n tableContainerRef.current\n && !tableContainerRef.current.contains(event.target as Node)\n ) {\n setFocusedRowId(null);\n }\n };\n\n document.addEventListener(\"click\", handleClickOutside);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside);\n };\n }, []);\n\n return (\n <div className={classNames(styles.osdkTableWrapper, className)}>\n <div\n ref={tableContainerRef}\n className={styles.osdkTableContainer}\n onScroll={handleScroll}\n >\n <table>\n {isLoading && !hasData\n ? (\n <LoadingStateTable\n table={table}\n headerGroups={headerGroups}\n rowHeight={rowHeight}\n tableContainerRef={tableContainerRef}\n />\n )\n : (\n <>\n <TableHeader\n table={table}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n />\n <TableBody\n rows={rows}\n tableContainerRef={tableContainerRef}\n onRowClick={onRowClick}\n rowHeight={rowHeight}\n renderCellContextMenu={renderCellContextMenu}\n isLoadingMore={isLoadingMore}\n headerGroups={headerGroups}\n focusedRowId={focusedRowId}\n setFocusedRowId={setFocusedRowId}\n isInEditMode={editableConfig?.editMode.isActive}\n />\n </>\n )}\n </table>\n {!hasData && error == null && <NonIdealState message={\"No Data\"} />}\n {error != null && (\n <NonIdealState message={`Error Loading Data: ${error.message}`} />\n )}\n </div>\n {hasEditableColumns && (\n <TableEditContainer\n editableConfig={editableConfig}\n focusedRowId={focusedRowId}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -35,11 +35,3 @@
35
35
  width: max-content;
36
36
  min-width: 100%;
37
37
  }
38
-
39
- .submitButtonContainer {
40
- background-color: var(--osdk-surface-background-color-default-rest);
41
- border-top: var(--osdk-table-border);
42
- padding: var(--osdk-table-button-container-padding);
43
- display: flex;
44
- justify-content: flex-end;
45
- }