trotl-table 1.0.28 → 1.0.29

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.
package/dist/index.cjs.js CHANGED
@@ -9795,10 +9795,37 @@ function TableInner({
9795
9795
  };
9796
9796
  }
9797
9797
 
9798
+ // Use refs for callbacks to prevent infinite loops from dependency changes
9799
+ const selectedRowsCallbackRef = React.useRef(selectedRowsCallback);
9800
+ const refreshTriggerRef = React.useRef(refreshTrigger);
9801
+ const viewCallbackRef = React.useRef(viewCallback);
9802
+ const editCallbackRef = React.useRef(editCallback);
9803
+ const deleteCallbackRef = React.useRef(deleteCallback);
9804
+
9805
+ // Update refs when callbacks change
9806
+ React.useEffect(() => {
9807
+ selectedRowsCallbackRef.current = selectedRowsCallback;
9808
+ }, [selectedRowsCallback]);
9809
+ React.useEffect(() => {
9810
+ refreshTriggerRef.current = refreshTrigger;
9811
+ }, [refreshTrigger]);
9812
+ React.useEffect(() => {
9813
+ viewCallbackRef.current = viewCallback;
9814
+ }, [viewCallback]);
9815
+ React.useEffect(() => {
9816
+ editCallbackRef.current = editCallback;
9817
+ }, [editCallback]);
9818
+ React.useEffect(() => {
9819
+ deleteCallbackRef.current = deleteCallback;
9820
+ }, [deleteCallback]);
9821
+
9798
9822
  // Local selection & sorting state (removed TableContext dependency)
9799
9823
  const [selectedRows, setSelectedRows] = React.useState([]);
9800
9824
  const [sorting, setSorting] = React.useState(null);
9801
9825
 
9826
+ // Memoize columns to prevent filter dependency issues
9827
+ const memoizedColumns = React.useMemo(() => columns, [JSON.stringify(columns)]);
9828
+
9802
9829
  // Option to read search param from URL
9803
9830
  const [searchTerm, setSearchTerm] = React.useState(extraSearchTerm);
9804
9831
  // Track current URL search so date filters rerun when params change
@@ -9950,12 +9977,12 @@ function TableInner({
9950
9977
  // Then apply text search filter
9951
9978
  if (!searchTerm) return dateFiltered;
9952
9979
  const query = searchTerm.toLowerCase();
9953
- return dateFiltered.filter(row => columns.some(col => {
9980
+ return dateFiltered.filter(row => memoizedColumns.some(col => {
9954
9981
  const val = row[col.accessor];
9955
9982
  if (val == null) return false;
9956
9983
  return String(val).toLowerCase().includes(query);
9957
9984
  }));
9958
- }, [searchTerm, columns, urlSearchString]);
9985
+ }, [searchTerm, memoizedColumns, urlSearchString]);
9959
9986
 
9960
9987
  // Natural-ish comparator: handles nulls, numbers, strings, ISO dates
9961
9988
  const compare = (x, y, dir = "asc") => {
@@ -10108,15 +10135,19 @@ function TableInner({
10108
10135
  }, [listRef, tableDataFlat.length]);
10109
10136
 
10110
10137
  // useEffect(() => setTableDataFlat(flattened), [flattened]);
10111
- React.useEffect(() => selectedRowsCallback(selectedRows), [selectedRows, selectedRowsCallback]);
10138
+ React.useEffect(() => {
10139
+ // Only call the callback if selectedRows actually changed
10140
+ // Use the ref to avoid infinite loops from callback changing on every render
10141
+ selectedRowsCallbackRef.current?.(selectedRows);
10142
+ }, [selectedRows]);
10112
10143
 
10113
10144
  // DELETE
10114
10145
  const [showConfirm, setShowConfirm] = React.useState(false);
10115
10146
  const [pendingDelete, setPendingDelete] = React.useState(null);
10116
10147
  const confirmDelete = async () => {
10117
10148
  if (!pendingDelete) return;
10118
- if (deleteCallback) {
10119
- const res = await deleteCallback(pendingDelete);
10149
+ if (deleteCallbackRef.current) {
10150
+ const res = await deleteCallbackRef.current(pendingDelete);
10120
10151
  if (!res?.success) return;
10121
10152
  }
10122
10153
  setLocalData(prev => {
@@ -10129,7 +10160,7 @@ function TableInner({
10129
10160
  return (prev || []).filter(r => r.id !== pendingDelete.id);
10130
10161
  }
10131
10162
  });
10132
- refreshTrigger?.();
10163
+ refreshTriggerRef.current?.();
10133
10164
  setShowConfirm(false);
10134
10165
  setPendingDelete(null);
10135
10166
  };
@@ -10458,13 +10489,13 @@ function TableInner({
10458
10489
  style: {
10459
10490
  background: "#646cffaa"
10460
10491
  },
10461
- onClick: () => viewCallback(row)
10492
+ onClick: () => viewCallbackRef.current(row)
10462
10493
  }, translate("view")), showEdit && /*#__PURE__*/React.createElement("button", {
10463
10494
  className: "action-btn-table",
10464
10495
  style: {
10465
10496
  background: "#4caf50"
10466
10497
  },
10467
- onClick: () => editCallback(row)
10498
+ onClick: () => editCallbackRef.current(row)
10468
10499
  }, translate("edit")), showDelete && /*#__PURE__*/React.createElement("button", {
10469
10500
  className: "action-btn-table",
10470
10501
  style: {
@@ -10488,7 +10519,7 @@ function TableInner({
10488
10519
  }, content);
10489
10520
  }
10490
10521
  return content;
10491
- }, [tableDataFlat, columns, selectedRows, toggleRowSelection, groupRowsById, renderCell, showActions, showDelete, showEdit, showKey, showView, viewCallback, editCallback, enableDragRow, moveRow, enableMultiSelect, rowHeight, tableId, customColumns]);
10522
+ }, [tableDataFlat, memoizedColumns, selectedRows, toggleRowSelection, groupRowsById, renderCell, showActions, showDelete, showEdit, showKey, showView, enableDragRow, moveRow, enableMultiSelect, rowHeight, tableId, customColumns]);
10492
10523
  const rowHeightGetter = ({
10493
10524
  index
10494
10525
  }) => tableDataFlat[index]?.type === "group" ? groupHeaderHeight : rowHeight;