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 +40 -9
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +41 -10
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
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 =>
|
|
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,
|
|
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(() =>
|
|
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 (
|
|
10119
|
-
const res = await
|
|
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
|
-
|
|
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: () =>
|
|
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: () =>
|
|
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,
|
|
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;
|