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

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 (102) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/browser/object-table/DefaultCellRenderer.js +5 -2
  3. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
  4. package/build/browser/object-table/EditableCell.js +16 -6
  5. package/build/browser/object-table/EditableCell.js.map +1 -1
  6. package/build/browser/object-table/EditableCell.module.css +30 -2
  7. package/build/browser/object-table/EditableCell.module.css.js +2 -1
  8. package/build/browser/object-table/ObjectTable.js +9 -22
  9. package/build/browser/object-table/ObjectTable.js.map +1 -1
  10. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  11. package/build/browser/object-table/Table.js +23 -15
  12. package/build/browser/object-table/Table.js.map +1 -1
  13. package/build/browser/object-table/Table.module.css +0 -8
  14. package/build/browser/object-table/Table.module.css.js +1 -2
  15. package/build/browser/object-table/TableBody.js +8 -2
  16. package/build/browser/object-table/TableBody.js.map +1 -1
  17. package/build/browser/object-table/TableCell.module.css +0 -8
  18. package/build/browser/object-table/TableEditContainer.js +79 -0
  19. package/build/browser/object-table/TableEditContainer.js.map +1 -0
  20. package/build/browser/object-table/TableEditContainer.module.css +44 -0
  21. package/build/browser/object-table/TableEditContainer.module.css.js +9 -0
  22. package/build/browser/object-table/TableRow.js +12 -4
  23. package/build/browser/object-table/TableRow.js.map +1 -1
  24. package/build/browser/object-table/TableRow.module.css +2 -1
  25. package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js +292 -0
  26. package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js.map +1 -0
  27. package/build/browser/object-table/hooks/useEditableTable.js +20 -11
  28. package/build/browser/object-table/hooks/useEditableTable.js.map +1 -1
  29. package/build/browser/object-table/hooks/useObjectTableData.js +0 -5
  30. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  31. package/build/browser/object-table/utils/getCellId.js +0 -7
  32. package/build/browser/object-table/utils/getCellId.js.map +1 -1
  33. package/build/browser/object-table/utils/types.js.map +1 -1
  34. package/build/browser/public/experimental.js.map +1 -1
  35. package/build/browser/styles.css +79 -19
  36. package/build/cjs/public/experimental.cjs +179 -90
  37. package/build/cjs/public/experimental.cjs.map +1 -1
  38. package/build/cjs/public/experimental.css +96 -57
  39. package/build/cjs/public/experimental.css.map +1 -1
  40. package/build/cjs/public/experimental.d.cts +40 -18
  41. package/build/esm/object-table/DefaultCellRenderer.js +5 -2
  42. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
  43. package/build/esm/object-table/EditableCell.js +16 -6
  44. package/build/esm/object-table/EditableCell.js.map +1 -1
  45. package/build/esm/object-table/EditableCell.module.css +30 -2
  46. package/build/esm/object-table/ObjectTable.js +9 -22
  47. package/build/esm/object-table/ObjectTable.js.map +1 -1
  48. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  49. package/build/esm/object-table/Table.js +23 -15
  50. package/build/esm/object-table/Table.js.map +1 -1
  51. package/build/esm/object-table/Table.module.css +0 -8
  52. package/build/esm/object-table/TableBody.js +8 -2
  53. package/build/esm/object-table/TableBody.js.map +1 -1
  54. package/build/esm/object-table/TableCell.module.css +0 -8
  55. package/build/esm/object-table/TableEditContainer.js +79 -0
  56. package/build/esm/object-table/TableEditContainer.js.map +1 -0
  57. package/build/esm/object-table/TableEditContainer.module.css +44 -0
  58. package/build/esm/object-table/TableRow.js +12 -4
  59. package/build/esm/object-table/TableRow.js.map +1 -1
  60. package/build/esm/object-table/TableRow.module.css +2 -1
  61. package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js +292 -0
  62. package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js.map +1 -0
  63. package/build/esm/object-table/hooks/useEditableTable.js +20 -11
  64. package/build/esm/object-table/hooks/useEditableTable.js.map +1 -1
  65. package/build/esm/object-table/hooks/useObjectTableData.js +0 -5
  66. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  67. package/build/esm/object-table/utils/getCellId.js +0 -7
  68. package/build/esm/object-table/utils/getCellId.js.map +1 -1
  69. package/build/esm/object-table/utils/types.js.map +1 -1
  70. package/build/esm/public/experimental.js.map +1 -1
  71. package/build/types/object-table/DefaultCellRenderer.d.ts +2 -2
  72. package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
  73. package/build/types/object-table/EditableCell.d.ts +18 -6
  74. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  75. package/build/types/object-table/ObjectTable.d.ts +1 -1
  76. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  77. package/build/types/object-table/ObjectTableApi.d.ts +16 -6
  78. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  79. package/build/types/object-table/Table.d.ts +5 -10
  80. package/build/types/object-table/Table.d.ts.map +1 -1
  81. package/build/types/object-table/TableBody.d.ts +4 -1
  82. package/build/types/object-table/TableBody.d.ts.map +1 -1
  83. package/build/types/object-table/TableEditContainer.d.ts +9 -0
  84. package/build/types/object-table/TableEditContainer.d.ts.map +1 -0
  85. package/build/types/object-table/TableRow.d.ts +5 -1
  86. package/build/types/object-table/TableRow.d.ts.map +1 -1
  87. package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts.map +1 -0
  88. package/build/types/object-table/hooks/useEditableTable.d.ts +4 -9
  89. package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -1
  90. package/build/types/object-table/utils/getCellId.d.ts +0 -1
  91. package/build/types/object-table/utils/getCellId.d.ts.map +1 -1
  92. package/build/types/object-table/utils/types.d.ts +25 -3
  93. package/build/types/object-table/utils/types.d.ts.map +1 -1
  94. package/build/types/public/experimental.d.ts +1 -1
  95. package/build/types/public/experimental.d.ts.map +1 -1
  96. package/package.json +5 -5
  97. package/build/browser/object-table/__tests__/useEditableTable.test.js +0 -197
  98. package/build/browser/object-table/__tests__/useEditableTable.test.js.map +0 -1
  99. package/build/esm/object-table/__tests__/useEditableTable.test.js +0 -197
  100. package/build/esm/object-table/__tests__/useEditableTable.test.js.map +0 -1
  101. package/build/types/object-table/__tests__/useEditableTable.test.d.ts.map +0 -1
  102. /package/build/types/object-table/{__tests__ → hooks/__tests__}/useEditableTable.test.d.ts +0 -0
@@ -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,