trotl-table 1.0.68 → 1.0.69
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/Table.cjs.js +130 -2
- package/dist/Table.cjs.js.map +1 -1
- package/dist/Table.esm.js +131 -3
- package/dist/Table.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/Table.cjs.js
CHANGED
|
@@ -9672,6 +9672,7 @@ function TableInner({
|
|
|
9672
9672
|
enableExternalRowDrop = false,
|
|
9673
9673
|
onExternalRowDrop = () => {},
|
|
9674
9674
|
useExternalDndContext = false,
|
|
9675
|
+
enableMouseRightClick = null,
|
|
9675
9676
|
customColumns = [],
|
|
9676
9677
|
groupDefaultOpen = false,
|
|
9677
9678
|
showIcons = true,
|
|
@@ -9730,9 +9731,49 @@ function TableInner({
|
|
|
9730
9731
|
onCellChangeRef.current = onCellChange;
|
|
9731
9732
|
cellCallbackRef.current = cellCallback;
|
|
9732
9733
|
});
|
|
9734
|
+
|
|
9735
|
+
// Context menu right click state
|
|
9736
|
+
const [contextMenu, setContextMenu] = React.useState({
|
|
9737
|
+
visible: false,
|
|
9738
|
+
x: 0,
|
|
9739
|
+
y: 0,
|
|
9740
|
+
row: null
|
|
9741
|
+
});
|
|
9742
|
+
const [contextMenuModal, setContextMenuModal] = React.useState({
|
|
9743
|
+
visible: false,
|
|
9744
|
+
title: '',
|
|
9745
|
+
component: null
|
|
9746
|
+
});
|
|
9733
9747
|
React.useEffect(() => {
|
|
9734
9748
|
shareCallbackRef.current = shareCallback;
|
|
9735
9749
|
}, [shareCallback]);
|
|
9750
|
+
React.useEffect(() => {
|
|
9751
|
+
if (!contextMenu.visible) return;
|
|
9752
|
+
const handleClick = () => setContextMenu({
|
|
9753
|
+
visible: false,
|
|
9754
|
+
x: 0,
|
|
9755
|
+
y: 0,
|
|
9756
|
+
row: null
|
|
9757
|
+
});
|
|
9758
|
+
const handleEscape = event => {
|
|
9759
|
+
if (event.key === 'Escape') {
|
|
9760
|
+
setContextMenu({
|
|
9761
|
+
visible: false,
|
|
9762
|
+
x: 0,
|
|
9763
|
+
y: 0,
|
|
9764
|
+
row: null
|
|
9765
|
+
});
|
|
9766
|
+
}
|
|
9767
|
+
};
|
|
9768
|
+
window.addEventListener('click', handleClick);
|
|
9769
|
+
window.addEventListener('contextmenu', handleClick);
|
|
9770
|
+
window.addEventListener('keydown', handleEscape);
|
|
9771
|
+
return () => {
|
|
9772
|
+
window.removeEventListener('click', handleClick);
|
|
9773
|
+
window.removeEventListener('contextmenu', handleClick);
|
|
9774
|
+
window.removeEventListener('keydown', handleEscape);
|
|
9775
|
+
};
|
|
9776
|
+
}, [contextMenu.visible]);
|
|
9736
9777
|
React.useEffect(() => {
|
|
9737
9778
|
duplicateCallbackRef.current = duplicateCallback;
|
|
9738
9779
|
}, [duplicateCallback]);
|
|
@@ -9845,6 +9886,43 @@ function TableInner({
|
|
|
9845
9886
|
setSelectedRows(prev => prev.includes(rowId) ? prev.filter(r => r !== rowId) : [...prev, rowId]);
|
|
9846
9887
|
}, []);
|
|
9847
9888
|
const clearSelection = React.useCallback(() => setSelectedRows([]), []);
|
|
9889
|
+
const performContextMenuAction = React.useCallback((action, row) => {
|
|
9890
|
+
setContextMenu({
|
|
9891
|
+
visible: false,
|
|
9892
|
+
x: 0,
|
|
9893
|
+
y: 0,
|
|
9894
|
+
row: null
|
|
9895
|
+
});
|
|
9896
|
+
if (!action) return;
|
|
9897
|
+
if (action.onClick && typeof action.onClick === "function") {
|
|
9898
|
+
action.onClick(row, action);
|
|
9899
|
+
return;
|
|
9900
|
+
}
|
|
9901
|
+
if (action.isModal) {
|
|
9902
|
+
setContextMenuModal({
|
|
9903
|
+
visible: true,
|
|
9904
|
+
title: action.label || "",
|
|
9905
|
+
component: action.component || null
|
|
9906
|
+
});
|
|
9907
|
+
return;
|
|
9908
|
+
}
|
|
9909
|
+
if (action.link) {
|
|
9910
|
+
window.open(action.link, action.target || "_blank");
|
|
9911
|
+
return;
|
|
9912
|
+
}
|
|
9913
|
+
|
|
9914
|
+
// fallback: provide simple event for the row itself.
|
|
9915
|
+
if (action.label) {
|
|
9916
|
+
console.log(`context action ${action.label} invoked`, row);
|
|
9917
|
+
}
|
|
9918
|
+
}, []);
|
|
9919
|
+
const closeContextMenuModal = React.useCallback(() => {
|
|
9920
|
+
setContextMenuModal({
|
|
9921
|
+
visible: false,
|
|
9922
|
+
title: '',
|
|
9923
|
+
component: null
|
|
9924
|
+
});
|
|
9925
|
+
}, []);
|
|
9848
9926
|
const setSort = column => {
|
|
9849
9927
|
setSorting(prev => {
|
|
9850
9928
|
if (!prev || prev.column !== column) return {
|
|
@@ -10772,7 +10850,18 @@ function TableInner({
|
|
|
10772
10850
|
const content = /*#__PURE__*/React.createElement("div", {
|
|
10773
10851
|
key: key,
|
|
10774
10852
|
style: style,
|
|
10775
|
-
className: "table-row"
|
|
10853
|
+
className: "table-row",
|
|
10854
|
+
onContextMenu: e => {
|
|
10855
|
+
if (!Array.isArray(enableMouseRightClick) || enableMouseRightClick.length === 0) return;
|
|
10856
|
+
e.preventDefault();
|
|
10857
|
+
e.stopPropagation();
|
|
10858
|
+
setContextMenu({
|
|
10859
|
+
visible: true,
|
|
10860
|
+
x: e.clientX,
|
|
10861
|
+
y: e.clientY,
|
|
10862
|
+
row
|
|
10863
|
+
});
|
|
10864
|
+
}
|
|
10776
10865
|
}, /*#__PURE__*/React.createElement("div", {
|
|
10777
10866
|
className: "row-main",
|
|
10778
10867
|
onDoubleClick: doubleClickEnable ? handleRowDoubleClick : undefined,
|
|
@@ -10887,6 +10976,7 @@ function TableInner({
|
|
|
10887
10976
|
}
|
|
10888
10977
|
return content;
|
|
10889
10978
|
}, [tableDataFlat, columns, selectedRows, toggleRowSelection, groupRowsById, renderCell, showActions, showDelete, showEdit, showKey, showView, translate, enableDragRow, moveRow, enableMultiSelect, rowHeight, tableId, customColumns, doubleClickEnable, keyWidth, actionColumnStyle, showDuplicate, showDownload, showIcons, showShare, triggerCellCallback, getAccessorKey, getAccessorValue]);
|
|
10979
|
+
const rightClickActions = Array.isArray(enableMouseRightClick) ? enableMouseRightClick : [];
|
|
10890
10980
|
const rowHeightGetter = ({
|
|
10891
10981
|
index
|
|
10892
10982
|
}) => tableDataFlat[index]?.type === "group" ? groupHeaderHeight : rowHeight;
|
|
@@ -11015,7 +11105,45 @@ function TableInner({
|
|
|
11015
11105
|
showCancel: true,
|
|
11016
11106
|
showConfirm: true
|
|
11017
11107
|
}, /*#__PURE__*/React.createElement("p", null, translate("areYouSureYouWantToDelete"), " ", /*#__PURE__*/React.createElement("strong", null, pendingDelete ? pendingDelete[deleteLabelKey] ?? pendingDelete.name ?? pendingDelete.id : ''), "?")));
|
|
11018
|
-
|
|
11108
|
+
const contextMenuMarkup = contextMenu.visible && rightClickActions.length > 0 ? /*#__PURE__*/React.createElement("div", {
|
|
11109
|
+
style: {
|
|
11110
|
+
position: 'fixed',
|
|
11111
|
+
top: contextMenu.y,
|
|
11112
|
+
left: contextMenu.x,
|
|
11113
|
+
backgroundColor: '#fff',
|
|
11114
|
+
border: '1px solid #ccc',
|
|
11115
|
+
boxShadow: '0 2px 8px rgba(0,0,0,.15)',
|
|
11116
|
+
zIndex: 9999,
|
|
11117
|
+
minWidth: 160,
|
|
11118
|
+
padding: 0,
|
|
11119
|
+
borderRadius: 4
|
|
11120
|
+
},
|
|
11121
|
+
onContextMenu: e => e.preventDefault()
|
|
11122
|
+
}, rightClickActions.map((action, i) => /*#__PURE__*/React.createElement("div", {
|
|
11123
|
+
key: i,
|
|
11124
|
+
style: {
|
|
11125
|
+
padding: '8px 12px',
|
|
11126
|
+
cursor: 'pointer',
|
|
11127
|
+
borderBottom: i < rightClickActions.length - 1 ? '1px solid #eee' : 'none'
|
|
11128
|
+
},
|
|
11129
|
+
onClick: () => performContextMenuAction(action, contextMenu.row)
|
|
11130
|
+
}, action.label || action.text || `Action ${i + 1}`))) : null;
|
|
11131
|
+
const contextMenuModalMarkup = contextMenuModal.visible && contextMenuModal.component ? /*#__PURE__*/React.createElement(Modal.default, {
|
|
11132
|
+
isOpen: true,
|
|
11133
|
+
title: contextMenuModal.title || '',
|
|
11134
|
+
onConfirm: () => setContextMenuModal({
|
|
11135
|
+
visible: false,
|
|
11136
|
+
title: '',
|
|
11137
|
+
component: null
|
|
11138
|
+
}),
|
|
11139
|
+
onCancel: () => closeContextMenuModal(),
|
|
11140
|
+
showConfirm: false,
|
|
11141
|
+
showCancel: true,
|
|
11142
|
+
cancelLabel: translate('cancel')
|
|
11143
|
+
}, typeof contextMenuModal.component === 'function' ? /*#__PURE__*/React.createElement(contextMenuModal.component, {
|
|
11144
|
+
row: contextMenu.row
|
|
11145
|
+
}) : contextMenuModal.component) : null;
|
|
11146
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, tableMarkup, contextMenuMarkup, contextMenuModalMarkup);
|
|
11019
11147
|
}
|
|
11020
11148
|
function Table(props) {
|
|
11021
11149
|
const {
|