@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
@@ -2217,8 +2217,36 @@
2217
2217
 
2218
2218
 
2219
2219
  /* object-table/EditableCell.module.css */
2220
- .EditableCell-module__osdkEditableInput___2BjN5Q4P:focus {
2221
- outline: none;
2220
+ .EditableCell-module__osdkEditableInput___2BjN5Q4P {
2221
+ overflow: hidden;
2222
+ text-overflow: ellipsis;
2223
+ white-space: nowrap;
2224
+ text-align: left;
2225
+ padding: var(--osdk-surface-spacing) calc(var(--osdk-surface-spacing) * 3);
2226
+ width: 100%;
2227
+ border-radius: var(--osdk-surface-border-radius);
2228
+ border: var(--osdk-surface-border-width) solid transparent;
2229
+ background: inherit;
2230
+
2231
+ tr[data-focused="true"] & {
2232
+ border: var(--osdk-table-cell-editable-border);
2233
+ background: var(--osdk-table-cell-editable-bg);
2234
+
2235
+ &.EditableCell-module__osdkEditedInput___HxzrAqJz {
2236
+ border: var(--osdk-table-cell-edited-border);
2237
+ }
2238
+
2239
+ &:focus,
2240
+ &.EditableCell-module__osdkEditedInput___HxzrAqJz:focus {
2241
+ border: var(--osdk-emphasis-focus-width) solid
2242
+ var(--osdk-emphasis-focus-color);
2243
+ }
2244
+ }
2245
+ }
2246
+
2247
+ .EditableCell-module__osdkEditedInput___HxzrAqJz {
2248
+ border: var(--osdk-table-cell-edited-border);
2249
+ background: var(--osdk-table-cell-editable-bg);
2222
2250
  }
2223
2251
 
2224
2252
 
@@ -2540,14 +2568,6 @@
2540
2568
  min-width: 100%;
2541
2569
  }
2542
2570
 
2543
- .Table-module__submitButtonContainer___2UgcHhXl {
2544
- background-color: var(--osdk-surface-background-color-default-rest);
2545
- border-top: var(--osdk-table-border);
2546
- padding: var(--osdk-table-button-container-padding);
2547
- display: flex;
2548
- justify-content: flex-end;
2549
- }
2550
-
2551
2571
 
2552
2572
  /* object-table/TableBody.module.css */
2553
2573
  /*
@@ -2636,14 +2656,6 @@
2636
2656
  padding: 0;
2637
2657
  }
2638
2658
 
2639
- /* Show focus state for editable cells */
2640
- .TableCell-module__osdkTableCell___gVl6jToJ:not(:has([role="checkbox"])):has(input):focus-within {
2641
- border: var(--osdk-emphasis-focus-width) solid
2642
- var(--osdk-emphasis-focus-color);
2643
- border-radius: var(--osdk-surface-border-radius);
2644
- background-color: var(--osdk-table-cell-editable-bg);
2645
- }
2646
-
2647
2659
  .TableCell-module__osdkTableCellContent___tcj6DRaU:not(:has([role="checkbox"])) {
2648
2660
  overflow: hidden;
2649
2661
  text-overflow: ellipsis;
@@ -2660,6 +2672,53 @@
2660
2672
  }
2661
2673
 
2662
2674
 
2675
+ /* object-table/TableEditContainer.module.css */
2676
+ /*
2677
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
2678
+ *
2679
+ * Licensed under the Apache License, Version 2.0 (the "License");
2680
+ * you may not use this file except in compliance with the License.
2681
+ * You may obtain a copy of the License at
2682
+ *
2683
+ * http://www.apache.org/licenses/LICENSE-2.0
2684
+ *
2685
+ * Unless required by applicable law or agreed to in writing, software
2686
+ * distributed under the License is distributed on an "AS IS" BASIS,
2687
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2688
+ * See the License for the specific language governing permissions and
2689
+ * limitations under the License.
2690
+ */
2691
+
2692
+ .TableEditContainer-module__tableEditContainer___cIVjgtld {
2693
+ display: flex;
2694
+ justify-content: space-between;
2695
+ align-items: center;
2696
+ background-color: var(--osdk-surface-background-color-default-rest);
2697
+ border-top: var(--osdk-table-border);
2698
+ padding: var(--osdk-table-edit-container-padding);
2699
+ min-height: var(--osdk-table-edit-container-min-height);
2700
+ }
2701
+
2702
+ .TableEditContainer-module__placeholder___ggxoxvTp {
2703
+ color: var(--osdk-typography-color-muted);
2704
+ font-size: var(--osdk-typography-size-body-small);
2705
+ padding: calc(var(--osdk-surface-spacing) * 2) 0;
2706
+ }
2707
+
2708
+ .TableEditContainer-module__modificationCount___sLN93v77 {
2709
+ color: var(--osdk-intent-primary-rest);
2710
+ font-size: var(--osdk-typography-size-body-small);
2711
+ padding: calc(var(--osdk-surface-spacing) * 2) 0;
2712
+ }
2713
+
2714
+ .TableEditContainer-module__editButtons___xI-Z7kz1 {
2715
+ display: flex;
2716
+ justify-content: flex-end;
2717
+ gap: 8px;
2718
+ flex: 1;
2719
+ }
2720
+
2721
+
2663
2722
  /* object-table/TableHeader.module.css */
2664
2723
  /*
2665
2724
  * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
@@ -2996,7 +3055,8 @@
2996
3055
  border-bottom-color: var(--osdk-table-row-border-color-hover);
2997
3056
  }
2998
3057
 
2999
- &[data-selected="true"] {
3058
+ &[data-selected="true"],
3059
+ &[data-focused="true"] {
3000
3060
  z-index: 2;
3001
3061
  background-color: var(--osdk-table-row-bg-active);
3002
3062
  border-top-color: var(--osdk-table-row-border-color-active);
@@ -2780,12 +2780,15 @@ function parseValueByType(value, dataType) {
2780
2780
  }
2781
2781
  return parsedNumber;
2782
2782
  }
2783
- function EditableCell({
2783
+ function EditableCellInner({
2784
2784
  initialValue,
2785
2785
  currentValue,
2786
2786
  cellId,
2787
2787
  dataType,
2788
- onCellEdit
2788
+ onCellEdit,
2789
+ originalRowData,
2790
+ rowId,
2791
+ columnId
2789
2792
  }) {
2790
2793
  const [inputValue, setInputValue] = React21.useState(valueToString(currentValue));
2791
2794
  const isCancelled = React21.useRef(false);
@@ -2798,11 +2801,14 @@ function EditableCell({
2798
2801
  return;
2799
2802
  }
2800
2803
  const parsedValue = parseValueByType(inputValue, dataType);
2801
- onCellEdit?.(cellId, {
2804
+ onCellEdit(cellId, {
2805
+ rowId,
2806
+ columnId,
2802
2807
  newValue: parsedValue,
2803
- oldValue: initialValue
2808
+ oldValue: initialValue,
2809
+ originalRowData
2804
2810
  });
2805
- }, [inputValue, initialValue, onCellEdit, cellId, dataType]);
2811
+ }, [inputValue, initialValue, onCellEdit, cellId, dataType, rowId, columnId, originalRowData]);
2806
2812
  const handleChange = React21.useCallback((value) => {
2807
2813
  setInputValue(value);
2808
2814
  }, []);
@@ -2817,8 +2823,11 @@ function EditableCell({
2817
2823
  }
2818
2824
  }, [currentValue]);
2819
2825
  const inputType = dataType && NUMBER_TYPES.includes(dataType) ? "number" : "text";
2826
+ const isEdited = currentValue !== initialValue;
2820
2827
  return /* @__PURE__ */ React21__default.default.createElement(input.Input, {
2821
- className: EditableCell_default.osdkEditableInput,
2828
+ className: classnames7__default.default(EditableCell_default.osdkEditableInput, {
2829
+ [EditableCell_default.osdkEditedInput]: isEdited
2830
+ }),
2822
2831
  type: inputType,
2823
2832
  value: inputValue,
2824
2833
  onValueChange: handleChange,
@@ -2826,24 +2835,18 @@ function EditableCell({
2826
2835
  onKeyDown: handleKeyDown
2827
2836
  });
2828
2837
  }
2838
+ var EditableCell = /* @__PURE__ */ React21__default.default.memo(EditableCellInner);
2829
2839
 
2830
2840
  // src/object-table/utils/getCellId.ts
2831
2841
  function getCellId(cellIdentifier) {
2832
2842
  return JSON.stringify(cellIdentifier);
2833
2843
  }
2834
- function getCellIdentifier(cellId) {
2835
- const parsed = JSON.parse(cellId);
2836
- if (typeof parsed === "object" && parsed != null && "rowId" in parsed && "columnId" in parsed) {
2837
- return parsed;
2838
- }
2839
- throw new Error("Parsed cellId does not have required properties");
2840
- }
2841
2844
 
2842
2845
  // src/object-table/DefaultCellRenderer.tsx
2843
2846
  function renderDefaultCell(cellContext) {
2844
2847
  const meta = cellContext.table.options.meta;
2845
2848
  const columnMeta = cellContext.column.columnDef.meta;
2846
- if (!columnMeta?.editable || !meta?.onCellEdit) {
2849
+ if (!columnMeta?.editable || !meta?.onCellEdit || !meta?.isInEditMode) {
2847
2850
  return /* @__PURE__ */ React21__default.default.createElement(React21__default.default.Fragment, null, cellContext.getValue());
2848
2851
  }
2849
2852
  const rowId = cellContext.row.id;
@@ -2860,7 +2863,10 @@ function renderDefaultCell(cellContext) {
2860
2863
  currentValue,
2861
2864
  cellId,
2862
2865
  dataType: columnMeta?.dataType,
2863
- onCellEdit: meta.onCellEdit
2866
+ onCellEdit: meta.onCellEdit,
2867
+ originalRowData: cellContext.row.original,
2868
+ rowId,
2869
+ columnId
2864
2870
  });
2865
2871
  }
2866
2872
 
@@ -3100,13 +3106,14 @@ var getColumnOrder = (allColumns) => {
3100
3106
  return allColumns.map((col) => col.id ?? col.accessorKey).filter((id) => id != null);
3101
3107
  };
3102
3108
  function useEditableTable({
3109
+ editMode = "manual",
3103
3110
  onCellValueChanged,
3104
3111
  onSubmitEdits
3105
3112
  }) {
3113
+ const [isActive, setActive] = React21.useState(editMode === "always");
3106
3114
  const [cellEdits, setCellEdits] = React21.useState({});
3107
- const handleCellEdit = React21.useCallback((cellId, state) => {
3108
- const cellIdentifier = getCellIdentifier(cellId);
3109
- if (state.newValue === state.oldValue) {
3115
+ const handleCellEdit = React21.useCallback((cellId, info) => {
3116
+ if (info.newValue === info.oldValue) {
3110
3117
  setCellEdits((prev) => {
3111
3118
  const {
3112
3119
  [cellId]: _,
@@ -3117,22 +3124,32 @@ function useEditableTable({
3117
3124
  } else {
3118
3125
  setCellEdits((prev) => ({
3119
3126
  ...prev,
3120
- [cellId]: state
3127
+ [cellId]: info
3121
3128
  }));
3122
3129
  }
3123
- onCellValueChanged?.(cellIdentifier, state);
3130
+ onCellValueChanged?.(info);
3124
3131
  }, [onCellValueChanged]);
3125
3132
  const clearEdits = React21.useCallback(() => {
3126
3133
  setCellEdits({});
3127
3134
  }, []);
3128
3135
  const handleSubmitEdits = React21.useCallback(async () => {
3129
- await onSubmitEdits?.(cellEdits);
3136
+ const edits = Object.values(cellEdits);
3137
+ return onSubmitEdits ? onSubmitEdits(edits) : false;
3130
3138
  }, [cellEdits, onSubmitEdits]);
3139
+ const editModeConfig = editMode === "always" ? {
3140
+ type: "always",
3141
+ isActive: true
3142
+ } : {
3143
+ type: "manual",
3144
+ isActive,
3145
+ setActive
3146
+ };
3131
3147
  return {
3132
3148
  cellEdits,
3133
- handleCellEdit,
3134
- handleSubmitEdits,
3135
- clearEdits
3149
+ onCellEdit: handleCellEdit,
3150
+ onSubmitEdits: onSubmitEdits ? handleSubmitEdits : void 0,
3151
+ clearEdits,
3152
+ editMode: editModeConfig
3136
3153
  };
3137
3154
  }
3138
3155
  var PAGE_SIZE = 50;
@@ -3181,7 +3198,6 @@ function useObjectTableData(objectOrInterfaceType, columnDefinitions, filter, so
3181
3198
  enabled: !shouldUseObjectSet
3182
3199
  });
3183
3200
  if (shouldUseObjectSet) {
3184
- console.debug("Using useObjectSet for data fetching in ObjectTable because objectSet is provided and objectType is an object.");
3185
3201
  return {
3186
3202
  data: objectSetResult.data,
3187
3203
  fetchMore: objectSetResult.fetchMore,
@@ -3192,7 +3208,6 @@ function useObjectTableData(objectOrInterfaceType, columnDefinitions, filter, so
3192
3208
  // ObjectSet doesn't support optimistic updates
3193
3209
  };
3194
3210
  }
3195
- console.debug("Using useOsdkObjects for data fetching in ObjectTable because objectSet is not provided or objectType is an interface.");
3196
3211
  return osdkObjectsResult;
3197
3212
  }
3198
3213
 
@@ -3474,29 +3489,6 @@ function convertSortingStateToOrderBy(sorting) {
3474
3489
  }));
3475
3490
  }
3476
3491
 
3477
- // src/base-components/action-button/ActionButton.module.css
3478
- var ActionButton_default = {};
3479
-
3480
- // src/base-components/action-button/ActionButton.tsx
3481
- function _extends8() {
3482
- return _extends8 = Object.assign ? Object.assign.bind() : function(n) {
3483
- for (var e = 1; e < arguments.length; e++) {
3484
- var t = arguments[e];
3485
- for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
3486
- }
3487
- return n;
3488
- }, _extends8.apply(null, arguments);
3489
- }
3490
- function ActionButton({
3491
- variant = "secondary",
3492
- className,
3493
- ...rest
3494
- }) {
3495
- return /* @__PURE__ */ React21__default.default.createElement(button.Button, _extends8({
3496
- className: classnames7__default.default(ActionButton_default.button, variant === "primary" ? ActionButton_default.primaryButton : ActionButton_default.secondaryButton, className)
3497
- }, rest));
3498
- }
3499
-
3500
3492
  // src/object-table/LoadingCell.module.css
3501
3493
  var LoadingCell_default = {};
3502
3494
 
@@ -3548,6 +3540,29 @@ function LoadingRow({
3548
3540
  // src/object-table/TableBody.module.css
3549
3541
  var TableBody_default = {};
3550
3542
 
3543
+ // src/base-components/action-button/ActionButton.module.css
3544
+ var ActionButton_default = {};
3545
+
3546
+ // src/base-components/action-button/ActionButton.tsx
3547
+ function _extends8() {
3548
+ return _extends8 = Object.assign ? Object.assign.bind() : function(n) {
3549
+ for (var e = 1; e < arguments.length; e++) {
3550
+ var t = arguments[e];
3551
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
3552
+ }
3553
+ return n;
3554
+ }, _extends8.apply(null, arguments);
3555
+ }
3556
+ function ActionButton({
3557
+ variant = "secondary",
3558
+ className,
3559
+ ...rest
3560
+ }) {
3561
+ return /* @__PURE__ */ React21__default.default.createElement(button.Button, _extends8({
3562
+ className: classnames7__default.default(ActionButton_default.button, variant === "primary" ? ActionButton_default.primaryButton : ActionButton_default.secondaryButton, className)
3563
+ }, rest));
3564
+ }
3565
+
3551
3566
  // src/base-components/dialog/Dialog.module.css
3552
3567
  var Dialog_default = {};
3553
3568
 
@@ -4646,17 +4661,24 @@ function TableCell({
4646
4661
  }
4647
4662
 
4648
4663
  // src/object-table/TableRow.tsx
4649
- function TableRow({
4664
+ function TableRowInner({
4650
4665
  row,
4651
4666
  virtualRow,
4652
4667
  onRowClick,
4653
- renderCellContextMenu
4668
+ renderCellContextMenu,
4669
+ focusedRowId,
4670
+ setFocusedRowId,
4671
+ isInEditMode
4654
4672
  }) {
4655
4673
  const handleClick = React21.useCallback(() => {
4656
- onRowClick?.(row.original);
4657
- }, [onRowClick, row.original]);
4674
+ setFocusedRowId?.(row.id);
4675
+ if (!isInEditMode) {
4676
+ onRowClick?.(row.original);
4677
+ }
4678
+ }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);
4658
4679
  return /* @__PURE__ */ React21__default.default.createElement("tr", {
4659
4680
  "data-selected": row.getIsSelected(),
4681
+ "data-focused": focusedRowId === row.id,
4660
4682
  className: TableRow_default.osdkTableRow,
4661
4683
  style: {
4662
4684
  height: `${virtualRow.size}px`,
@@ -4669,6 +4691,7 @@ function TableRow({
4669
4691
  renderCellContextMenu
4670
4692
  })));
4671
4693
  }
4694
+ var TableRow = /* @__PURE__ */ React21__default.default.memo(TableRowInner);
4672
4695
 
4673
4696
  // src/object-table/TableBody.tsx
4674
4697
  function TableBody({
@@ -4678,7 +4701,10 @@ function TableBody({
4678
4701
  renderCellContextMenu,
4679
4702
  rowHeight = 40,
4680
4703
  isLoadingMore = false,
4681
- headerGroups = []
4704
+ headerGroups = [],
4705
+ focusedRowId,
4706
+ setFocusedRowId,
4707
+ isInEditMode
4682
4708
  }) {
4683
4709
  const rowVirtualizer = reactVirtual.useVirtualizer({
4684
4710
  count: rows.length,
@@ -4704,7 +4730,10 @@ function TableBody({
4704
4730
  row,
4705
4731
  virtualRow,
4706
4732
  onRowClick,
4707
- renderCellContextMenu
4733
+ renderCellContextMenu,
4734
+ focusedRowId,
4735
+ setFocusedRowId,
4736
+ isInEditMode
4708
4737
  });
4709
4738
  }), isLoadingMore && /* @__PURE__ */ React21__default.default.createElement(LoadingRow, {
4710
4739
  headers,
@@ -4714,6 +4743,70 @@ function TableBody({
4714
4743
  }));
4715
4744
  }
4716
4745
 
4746
+ // src/object-table/TableEditContainer.module.css
4747
+ var TableEditContainer_default = {};
4748
+
4749
+ // src/object-table/TableEditContainer.tsx
4750
+ function TableEditContainer({
4751
+ editableConfig,
4752
+ focusedRowId
4753
+ }) {
4754
+ const {
4755
+ cellEdits,
4756
+ onSubmitEdits,
4757
+ clearEdits,
4758
+ editMode
4759
+ } = editableConfig ?? {};
4760
+ const hasEdits = Object.keys(cellEdits ?? {}).length > 0;
4761
+ const [isSubmitting, setIsSubmitting] = React21.useState(false);
4762
+ const isInEditMode = editMode?.isActive;
4763
+ const canToggleEditMode = editMode?.type === "manual";
4764
+ const handleSubmitEdits = React21.useCallback(async () => {
4765
+ setIsSubmitting(true);
4766
+ try {
4767
+ const success = await onSubmitEdits?.();
4768
+ if (success) {
4769
+ clearEdits?.();
4770
+ if (editMode?.type === "manual") {
4771
+ editMode.setActive(false);
4772
+ }
4773
+ }
4774
+ } finally {
4775
+ setIsSubmitting(false);
4776
+ }
4777
+ }, [editMode, onSubmitEdits, clearEdits]);
4778
+ const handleCancelEdits = React21.useCallback(() => {
4779
+ clearEdits?.();
4780
+ if (editMode?.type === "manual") {
4781
+ editMode.setActive(false);
4782
+ }
4783
+ }, [clearEdits, editMode]);
4784
+ const handleEnterEditMode = React21.useCallback(() => {
4785
+ if (editMode?.type === "manual") {
4786
+ editMode.setActive(true);
4787
+ }
4788
+ }, [editMode]);
4789
+ return /* @__PURE__ */ React21__default.default.createElement("div", {
4790
+ className: TableEditContainer_default.tableEditContainer
4791
+ }, hasEdits ? /* @__PURE__ */ React21__default.default.createElement("div", {
4792
+ className: TableEditContainer_default.modificationCount
4793
+ }, `${cellEdits ? Object.keys(cellEdits).length : 0} modifications`) : isInEditMode && !focusedRowId && /* @__PURE__ */ React21__default.default.createElement("div", {
4794
+ className: TableEditContainer_default.placeholder
4795
+ }, "Select a row to edit data\u2026"), /* @__PURE__ */ React21__default.default.createElement("div", {
4796
+ className: TableEditContainer_default.editButtons
4797
+ }, !isInEditMode && canToggleEditMode && /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4798
+ variant: "primary",
4799
+ onClick: handleEnterEditMode
4800
+ }, "Edit Table"), isInEditMode && canToggleEditMode && /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4801
+ variant: "secondary",
4802
+ onClick: handleCancelEdits
4803
+ }, "Cancel"), isInEditMode && !!onSubmitEdits && /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4804
+ variant: "primary",
4805
+ onClick: handleSubmitEdits,
4806
+ disabled: !hasEdits || isSubmitting
4807
+ }, "Submit Edits")));
4808
+ }
4809
+
4717
4810
  // src/object-table/Table.tsx
4718
4811
  function BaseTable({
4719
4812
  table,
@@ -4729,6 +4822,7 @@ function BaseTable({
4729
4822
  }) {
4730
4823
  const tableContainerRef = React21.useRef(null);
4731
4824
  const [isLoadingMore, setIsLoadingMore] = React21.useState(false);
4825
+ const [focusedRowId, setFocusedRowId] = React21.useState(null);
4732
4826
  const fetchingRef = React21.useRef(false);
4733
4827
  React21.useEffect(() => {
4734
4828
  if (!isLoading || fetchNextPage == null) {
@@ -4759,16 +4853,23 @@ function BaseTable({
4759
4853
  const rows = table.getRowModel().rows;
4760
4854
  const headerGroups = table.getHeaderGroups();
4761
4855
  const hasData = rows.length > 0;
4762
- const hasEdits = Object.keys(editableConfig?.cellEdits ?? {}).length > 0;
4763
- const handleSubmitEdits = React21.useCallback(async () => {
4764
- await editableConfig?.onSubmitEdits?.();
4765
- editableConfig?.clearEdits?.();
4766
- }, [editableConfig]);
4856
+ const hasEditableColumns = table.getAllColumns().some((column) => column.columnDef.meta?.editable === true);
4857
+ React21.useEffect(() => {
4858
+ const handleClickOutside = (event) => {
4859
+ if (tableContainerRef.current && !tableContainerRef.current.contains(event.target)) {
4860
+ setFocusedRowId(null);
4861
+ }
4862
+ };
4863
+ document.addEventListener("click", handleClickOutside);
4864
+ return () => {
4865
+ document.removeEventListener("click", handleClickOutside);
4866
+ };
4867
+ }, []);
4767
4868
  return /* @__PURE__ */ React21__default.default.createElement("div", {
4768
4869
  className: classnames7__default.default(Table_default.osdkTableWrapper, className)
4769
4870
  }, /* @__PURE__ */ React21__default.default.createElement("div", {
4770
4871
  ref: tableContainerRef,
4771
- className: classnames7__default.default(Table_default.osdkTableContainer, editableConfig && Table_default.osdkTableContainerWithButton),
4872
+ className: Table_default.osdkTableContainer,
4772
4873
  onScroll: handleScroll
4773
4874
  }, /* @__PURE__ */ React21__default.default.createElement("table", null, isLoading && !hasData ? /* @__PURE__ */ React21__default.default.createElement(LoadingStateTable, {
4774
4875
  table,
@@ -4785,18 +4886,18 @@ function BaseTable({
4785
4886
  rowHeight,
4786
4887
  renderCellContextMenu,
4787
4888
  isLoadingMore,
4788
- headerGroups
4889
+ headerGroups,
4890
+ focusedRowId,
4891
+ setFocusedRowId,
4892
+ isInEditMode: editableConfig?.editMode.isActive
4789
4893
  }))), !hasData && error == null && /* @__PURE__ */ React21__default.default.createElement(NonIdealState, {
4790
4894
  message: "No Data"
4791
4895
  }), error != null && /* @__PURE__ */ React21__default.default.createElement(NonIdealState, {
4792
4896
  message: `Error Loading Data: ${error.message}`
4793
- })), editableConfig && /* @__PURE__ */ React21__default.default.createElement("div", {
4794
- className: Table_default.submitButtonContainer
4795
- }, /* @__PURE__ */ React21__default.default.createElement(ActionButton, {
4796
- variant: "primary",
4797
- onClick: handleSubmitEdits,
4798
- disabled: !hasEdits
4799
- }, "Submit Edits")));
4897
+ })), hasEditableColumns && /* @__PURE__ */ React21__default.default.createElement(TableEditContainer, {
4898
+ editableConfig,
4899
+ focusedRowId
4900
+ }));
4800
4901
  }
4801
4902
 
4802
4903
  // src/object-table/ObjectTable.tsx
@@ -4822,6 +4923,7 @@ function ObjectTable({
4822
4923
  enableColumnPinning = true,
4823
4924
  enableColumnResizing = true,
4824
4925
  enableColumnConfig = true,
4926
+ editMode = "manual",
4825
4927
  ...props
4826
4928
  }) {
4827
4929
  const {
@@ -4830,15 +4932,6 @@ function ObjectTable({
4830
4932
  } = useColumnResize({
4831
4933
  onColumnResize
4832
4934
  });
4833
- const {
4834
- cellEdits,
4835
- clearEdits,
4836
- handleCellEdit,
4837
- handleSubmitEdits
4838
- } = useEditableTable({
4839
- onCellValueChanged,
4840
- onSubmitEdits
4841
- });
4842
4935
  const {
4843
4936
  sorting,
4844
4937
  onSortingChange
@@ -4897,6 +4990,11 @@ function ObjectTable({
4897
4990
  const allColumns = React21.useMemo(() => {
4898
4991
  return selectionColumn ? [selectionColumn, ...columns] : columns;
4899
4992
  }, [selectionColumn, columns]);
4993
+ const editableConfig = useEditableTable({
4994
+ editMode,
4995
+ onCellValueChanged,
4996
+ onSubmitEdits
4997
+ });
4900
4998
  const table = reactTable.useReactTable({
4901
4999
  data: data ?? [],
4902
5000
  columns: allColumns,
@@ -4925,8 +5023,9 @@ function ObjectTable({
4925
5023
  },
4926
5024
  getRowId,
4927
5025
  meta: {
4928
- onCellEdit: handleCellEdit,
4929
- cellEdits
5026
+ onCellEdit: editableConfig.onCellEdit,
5027
+ cellEdits: editableConfig.cellEdits,
5028
+ isInEditMode: editableConfig.editMode.isActive
4930
5029
  }
4931
5030
  });
4932
5031
  const onRenderCellContextMenu = React21.useCallback((row, cell) => {
@@ -4939,16 +5038,6 @@ function ObjectTable({
4939
5038
  showResizeItem: enableColumnResizing,
4940
5039
  showConfigItem: enableColumnConfig
4941
5040
  }), [enableOrdering, enableColumnPinning, enableColumnResizing, enableColumnConfig]);
4942
- const editableConfig = React21.useMemo(() => {
4943
- if (!onSubmitEdits) {
4944
- return;
4945
- }
4946
- return {
4947
- onSubmitEdits: handleSubmitEdits,
4948
- clearEdits,
4949
- cellEdits
4950
- };
4951
- }, [onSubmitEdits, handleSubmitEdits, clearEdits, cellEdits]);
4952
5041
  return /* @__PURE__ */ React21__default.default.createElement(BaseTable, {
4953
5042
  table,
4954
5043
  isLoading: isTableLoading,