@dreamtree-org/twreact-ui 1.0.77 → 1.0.78
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.css +1 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +542 -587
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +541 -586
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import React__default, { forwardRef, createElement, useId, useRef, useState, useEffect, useImperativeHandle, useMemo,
|
|
2
|
+
import React__default, { forwardRef, createElement, useId, useRef, useState, useEffect, useImperativeHandle, useMemo, useCallback, memo, useLayoutEffect, createContext, useContext, cloneElement, PureComponent } from 'react';
|
|
3
3
|
import ReactDOM, { createPortal } from 'react-dom';
|
|
4
4
|
|
|
5
5
|
function _extends() {
|
|
@@ -3863,279 +3863,372 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
|
|
|
3863
3863
|
}, error));
|
|
3864
3864
|
});
|
|
3865
3865
|
|
|
3866
|
-
var _excluded$k = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "stripedColors", "responsiveBreakpoint", "serverSide", "totalRecords", "pageNumber"
|
|
3866
|
+
var _excluded$k = ["data", "columns", "sortable", "filterable", "selectable", "pagination", "pageSize", "onSort", "onFilter", "onFetch", "onFilterChange", "onSelectionChange", "onRowClick", "hasDetails", "DetailsComponent", "className", "withAction", "onAction", "actions", "showSerial", "cellClass", "rowClass", "globalSearch", "limitOptions", "showLimitSelector", "onLimitChange", "showReloadButton", "renderReloadButton", "onReload", "stripedRows", "stripedColors", "responsiveBreakpoint", "serverSide", "totalRecords", "pageNumber"];
|
|
3867
3867
|
function ownKeys$9(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3868
3868
|
function _objectSpread$9(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$9(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$9(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3889
|
-
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3869
|
+
|
|
3870
|
+
// Move static default actions outside component to prevent recreation
|
|
3871
|
+
var DEFAULT_ACTIONS = [{
|
|
3872
|
+
name: "edit",
|
|
3873
|
+
label: "Edit",
|
|
3874
|
+
onClick: function onClick() {
|
|
3875
|
+
return console.log("Edit action clicked");
|
|
3876
|
+
},
|
|
3877
|
+
icon: /*#__PURE__*/React__default.createElement(PenSquare, {
|
|
3878
|
+
size: 16
|
|
3879
|
+
})
|
|
3880
|
+
}, {
|
|
3881
|
+
name: "delete",
|
|
3882
|
+
label: "Delete",
|
|
3883
|
+
onClick: function onClick() {
|
|
3884
|
+
return console.log("Delete action clicked");
|
|
3885
|
+
},
|
|
3886
|
+
icon: /*#__PURE__*/React__default.createElement(Trash, {
|
|
3887
|
+
size: 16
|
|
3888
|
+
})
|
|
3889
|
+
}, {
|
|
3890
|
+
name: "view",
|
|
3891
|
+
label: "View",
|
|
3892
|
+
onClick: function onClick() {
|
|
3893
|
+
return console.log("View action clicked");
|
|
3894
|
+
},
|
|
3895
|
+
icon: /*#__PURE__*/React__default.createElement(Eye, {
|
|
3896
|
+
size: 16
|
|
3897
|
+
})
|
|
3898
|
+
}];
|
|
3899
|
+
|
|
3900
|
+
// Memoized ActionMenuPortal to prevent unnecessary re-renders
|
|
3901
|
+
var ActionMenuPortal = /*#__PURE__*/memo(function ActionMenuPortal(_ref) {
|
|
3902
|
+
var anchorElem = _ref.anchorElem,
|
|
3903
|
+
_ref$actions = _ref.actions,
|
|
3904
|
+
actions = _ref$actions === void 0 ? [] : _ref$actions,
|
|
3905
|
+
anchorRow = _ref.anchorRow,
|
|
3897
3906
|
onAction = _ref.onAction,
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
_ref$showLimitSelecto = _ref.showLimitSelector,
|
|
3908
|
-
showLimitSelector = _ref$showLimitSelecto === void 0 ? true : _ref$showLimitSelecto,
|
|
3909
|
-
onLimitChange = _ref.onLimitChange,
|
|
3910
|
-
_ref$showReloadButton = _ref.showReloadButton,
|
|
3911
|
-
showReloadButton = _ref$showReloadButton === void 0 ? true : _ref$showReloadButton,
|
|
3912
|
-
renderReloadButton = _ref.renderReloadButton,
|
|
3913
|
-
onReload = _ref.onReload,
|
|
3914
|
-
_ref$stripedRows = _ref.stripedRows,
|
|
3915
|
-
stripedRows = _ref$stripedRows === void 0 ? true : _ref$stripedRows,
|
|
3916
|
-
_ref$stripedColors = _ref.stripedColors,
|
|
3917
|
-
stripedColors = _ref$stripedColors === void 0 ? ["#ffffff", "#f7fafc"] : _ref$stripedColors,
|
|
3918
|
-
_ref$responsiveBreakp = _ref.responsiveBreakpoint,
|
|
3919
|
-
responsiveBreakpoint = _ref$responsiveBreakp === void 0 ? 768 : _ref$responsiveBreakp,
|
|
3920
|
-
_ref$serverSide = _ref.serverSide,
|
|
3921
|
-
serverSide = _ref$serverSide === void 0 ? false : _ref$serverSide,
|
|
3922
|
-
_ref$totalRecords = _ref.totalRecords,
|
|
3923
|
-
totalRecords = _ref$totalRecords === void 0 ? 0 : _ref$totalRecords,
|
|
3924
|
-
pageNumber = _ref.pageNumber;
|
|
3925
|
-
_ref.onPageChange;
|
|
3926
|
-
var props = _objectWithoutProperties$1(_ref, _excluded$k);
|
|
3927
|
-
// State for responsive view
|
|
3928
|
-
var _useState = useState(false),
|
|
3907
|
+
menuRef = _ref.menuRef;
|
|
3908
|
+
var _useState = useState({
|
|
3909
|
+
left: 0,
|
|
3910
|
+
top: 0,
|
|
3911
|
+
transformOrigin: "top right",
|
|
3912
|
+
maxHeight: 300,
|
|
3913
|
+
width: 180,
|
|
3914
|
+
opacity: 0
|
|
3915
|
+
}),
|
|
3929
3916
|
_useState2 = _slicedToArray(_useState, 2),
|
|
3930
|
-
|
|
3931
|
-
|
|
3917
|
+
style = _useState2[0],
|
|
3918
|
+
setStyle = _useState2[1];
|
|
3919
|
+
var menuWidth = 180;
|
|
3920
|
+
var maxMenuHeight = 320;
|
|
3921
|
+
var margin = 8;
|
|
3922
|
+
var minMenuHeight = 80;
|
|
3923
|
+
useLayoutEffect(function () {
|
|
3924
|
+
if (!anchorElem) return;
|
|
3925
|
+
var computePosition = function computePosition() {
|
|
3926
|
+
var rect = anchorElem.getBoundingClientRect();
|
|
3927
|
+
var scrollY = window.scrollY || window.pageYOffset;
|
|
3928
|
+
var scrollX = window.scrollX || window.pageXOffset;
|
|
3929
|
+
var spaceBelow = window.innerHeight - rect.bottom;
|
|
3930
|
+
var spaceAbove = rect.top;
|
|
3931
|
+
var placement = "bottom";
|
|
3932
|
+
var allowedMaxHeight;
|
|
3933
|
+
if (spaceBelow < 160 && spaceAbove > spaceBelow) {
|
|
3934
|
+
placement = "top";
|
|
3935
|
+
allowedMaxHeight = Math.min(maxMenuHeight, Math.max(minMenuHeight, spaceAbove - margin));
|
|
3936
|
+
} else {
|
|
3937
|
+
allowedMaxHeight = Math.min(maxMenuHeight, Math.max(minMenuHeight, spaceBelow - margin));
|
|
3938
|
+
}
|
|
3939
|
+
var measuredMenuHeight = allowedMaxHeight;
|
|
3940
|
+
var menuEl = menuRef === null || menuRef === void 0 ? void 0 : menuRef.current;
|
|
3941
|
+
if (menuEl) {
|
|
3942
|
+
var contentHeight = menuEl.scrollHeight || menuEl.offsetHeight || allowedMaxHeight;
|
|
3943
|
+
measuredMenuHeight = Math.min(contentHeight, allowedMaxHeight);
|
|
3944
|
+
}
|
|
3945
|
+
var top = placement === "top" ? rect.top + scrollY - measuredMenuHeight - margin : rect.bottom + scrollY + margin;
|
|
3946
|
+
var minTop = margin + scrollY;
|
|
3947
|
+
var maxTop = window.innerHeight + scrollY - measuredMenuHeight - margin;
|
|
3948
|
+
top = Math.max(minTop, Math.min(top, maxTop));
|
|
3949
|
+
var left = rect.right + scrollX - menuWidth;
|
|
3950
|
+
left = Math.max(margin, Math.min(left, window.innerWidth - menuWidth - margin));
|
|
3951
|
+
setStyle({
|
|
3952
|
+
left: left,
|
|
3953
|
+
top: top,
|
|
3954
|
+
transformOrigin: placement === "bottom" ? "top right" : "bottom right",
|
|
3955
|
+
maxHeight: allowedMaxHeight,
|
|
3956
|
+
width: menuWidth,
|
|
3957
|
+
opacity: 1
|
|
3958
|
+
});
|
|
3959
|
+
};
|
|
3960
|
+
computePosition();
|
|
3961
|
+
var onScrollOrResize = function onScrollOrResize() {
|
|
3962
|
+
window.requestAnimationFrame(computePosition);
|
|
3963
|
+
};
|
|
3964
|
+
window.addEventListener("resize", onScrollOrResize);
|
|
3965
|
+
window.addEventListener("scroll", onScrollOrResize, true);
|
|
3966
|
+
return function () {
|
|
3967
|
+
window.removeEventListener("resize", onScrollOrResize);
|
|
3968
|
+
window.removeEventListener("scroll", onScrollOrResize, true);
|
|
3969
|
+
};
|
|
3970
|
+
}, [anchorElem, menuRef]);
|
|
3971
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
3972
|
+
ref: menuRef,
|
|
3973
|
+
style: {
|
|
3974
|
+
position: "absolute",
|
|
3975
|
+
top: style.top,
|
|
3976
|
+
left: style.left,
|
|
3977
|
+
width: style.width,
|
|
3978
|
+
maxHeight: style.maxHeight,
|
|
3979
|
+
transformOrigin: style.transformOrigin,
|
|
3980
|
+
opacity: style.opacity
|
|
3981
|
+
},
|
|
3982
|
+
className: "absolute z-50 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 overflow-y-auto transition-opacity duration-150 ease-out",
|
|
3983
|
+
onClick: function onClick(e) {
|
|
3984
|
+
return e.stopPropagation();
|
|
3985
|
+
}
|
|
3986
|
+
}, /*#__PURE__*/React__default.createElement("div", {
|
|
3987
|
+
className: "p-1"
|
|
3988
|
+
}, actions.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
|
|
3989
|
+
className: "px-3 py-2 text-sm text-gray-500"
|
|
3990
|
+
}, "No actions") : actions.map(function (action) {
|
|
3991
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
3992
|
+
key: action.name,
|
|
3993
|
+
className: "px-1"
|
|
3994
|
+
}, /*#__PURE__*/React__default.createElement("button", {
|
|
3995
|
+
className: "w-full text-left px-3 py-2 text-sm hover:bg-gray-100 flex items-center gap-2 rounded-md",
|
|
3996
|
+
onClick: function onClick(e) {
|
|
3997
|
+
e.stopPropagation();
|
|
3998
|
+
onAction === null || onAction === void 0 || onAction(action, anchorRow);
|
|
3999
|
+
}
|
|
4000
|
+
}, action.render ? action.render(anchorRow) : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, action.icon && /*#__PURE__*/React__default.createElement("span", {
|
|
4001
|
+
className: "inline-flex"
|
|
4002
|
+
}, action.icon), /*#__PURE__*/React__default.createElement("span", null, action.label))));
|
|
4003
|
+
})));
|
|
4004
|
+
});
|
|
3932
4005
|
|
|
3933
|
-
|
|
3934
|
-
|
|
4006
|
+
// Custom hook for click-outside detection (consolidates 3 handlers into 1)
|
|
4007
|
+
function useClickOutside(refs, isActive, onClickOutside) {
|
|
4008
|
+
useEffect(function () {
|
|
4009
|
+
if (!isActive) return;
|
|
4010
|
+
var handler = function handler(e) {
|
|
4011
|
+
var isOutside = refs.every(function (ref) {
|
|
4012
|
+
return !ref.current || !ref.current.contains(e.target);
|
|
4013
|
+
});
|
|
4014
|
+
if (isOutside) onClickOutside();
|
|
4015
|
+
};
|
|
4016
|
+
document.addEventListener("click", handler);
|
|
4017
|
+
return function () {
|
|
4018
|
+
return document.removeEventListener("click", handler);
|
|
4019
|
+
};
|
|
4020
|
+
}, [refs, isActive, onClickOutside]);
|
|
4021
|
+
}
|
|
4022
|
+
|
|
4023
|
+
// Helper to get row key - stable function
|
|
4024
|
+
var getRowKey = function getRowKey(row, globalIndex) {
|
|
4025
|
+
if (row == null) return String(globalIndex);
|
|
4026
|
+
if (row.id !== undefined && row.id !== null) return String(row.id);
|
|
4027
|
+
if (row._id !== undefined && row._id !== null) return String(row._id);
|
|
4028
|
+
return String(globalIndex);
|
|
4029
|
+
};
|
|
4030
|
+
var Table = function Table(_ref2) {
|
|
4031
|
+
var _ref2$data = _ref2.data,
|
|
4032
|
+
data = _ref2$data === void 0 ? [] : _ref2$data,
|
|
4033
|
+
_ref2$columns = _ref2.columns,
|
|
4034
|
+
columns = _ref2$columns === void 0 ? [] : _ref2$columns,
|
|
4035
|
+
_ref2$sortable = _ref2.sortable,
|
|
4036
|
+
sortable = _ref2$sortable === void 0 ? true : _ref2$sortable,
|
|
4037
|
+
_ref2$filterable = _ref2.filterable,
|
|
4038
|
+
filterable = _ref2$filterable === void 0 ? false : _ref2$filterable,
|
|
4039
|
+
_ref2$selectable = _ref2.selectable,
|
|
4040
|
+
selectable = _ref2$selectable === void 0 ? false : _ref2$selectable,
|
|
4041
|
+
_ref2$pagination = _ref2.pagination,
|
|
4042
|
+
pagination = _ref2$pagination === void 0 ? false : _ref2$pagination,
|
|
4043
|
+
_ref2$pageSize = _ref2.pageSize,
|
|
4044
|
+
pageSize = _ref2$pageSize === void 0 ? 25 : _ref2$pageSize,
|
|
4045
|
+
onSort = _ref2.onSort,
|
|
4046
|
+
onFilter = _ref2.onFilter,
|
|
4047
|
+
onFetch = _ref2.onFetch,
|
|
4048
|
+
onFilterChange = _ref2.onFilterChange,
|
|
4049
|
+
onSelectionChange = _ref2.onSelectionChange,
|
|
4050
|
+
onRowClick = _ref2.onRowClick,
|
|
4051
|
+
_ref2$hasDetails = _ref2.hasDetails,
|
|
4052
|
+
hasDetails = _ref2$hasDetails === void 0 ? false : _ref2$hasDetails,
|
|
4053
|
+
_ref2$DetailsComponen = _ref2.DetailsComponent,
|
|
4054
|
+
DetailsComponent = _ref2$DetailsComponen === void 0 ? null : _ref2$DetailsComponen,
|
|
4055
|
+
className = _ref2.className,
|
|
4056
|
+
_ref2$withAction = _ref2.withAction,
|
|
4057
|
+
withAction = _ref2$withAction === void 0 ? true : _ref2$withAction,
|
|
4058
|
+
onAction = _ref2.onAction,
|
|
4059
|
+
actions = _ref2.actions,
|
|
4060
|
+
_ref2$showSerial = _ref2.showSerial,
|
|
4061
|
+
showSerial = _ref2$showSerial === void 0 ? true : _ref2$showSerial,
|
|
4062
|
+
cellClass = _ref2.cellClass,
|
|
4063
|
+
rowClass = _ref2.rowClass,
|
|
4064
|
+
_ref2$globalSearch = _ref2.globalSearch,
|
|
4065
|
+
globalSearch = _ref2$globalSearch === void 0 ? false : _ref2$globalSearch,
|
|
4066
|
+
_ref2$limitOptions = _ref2.limitOptions,
|
|
4067
|
+
limitOptions = _ref2$limitOptions === void 0 ? [10, 25, 50, 100] : _ref2$limitOptions,
|
|
4068
|
+
_ref2$showLimitSelect = _ref2.showLimitSelector,
|
|
4069
|
+
showLimitSelector = _ref2$showLimitSelect === void 0 ? true : _ref2$showLimitSelect,
|
|
4070
|
+
onLimitChange = _ref2.onLimitChange,
|
|
4071
|
+
_ref2$showReloadButto = _ref2.showReloadButton,
|
|
4072
|
+
showReloadButton = _ref2$showReloadButto === void 0 ? true : _ref2$showReloadButto,
|
|
4073
|
+
renderReloadButton = _ref2.renderReloadButton,
|
|
4074
|
+
onReload = _ref2.onReload,
|
|
4075
|
+
_ref2$stripedRows = _ref2.stripedRows,
|
|
4076
|
+
stripedRows = _ref2$stripedRows === void 0 ? true : _ref2$stripedRows,
|
|
4077
|
+
_ref2$stripedColors = _ref2.stripedColors,
|
|
4078
|
+
stripedColors = _ref2$stripedColors === void 0 ? ["#ffffff", "#f7fafc"] : _ref2$stripedColors,
|
|
4079
|
+
_ref2$responsiveBreak = _ref2.responsiveBreakpoint,
|
|
4080
|
+
responsiveBreakpoint = _ref2$responsiveBreak === void 0 ? 768 : _ref2$responsiveBreak,
|
|
4081
|
+
_ref2$serverSide = _ref2.serverSide,
|
|
4082
|
+
serverSide = _ref2$serverSide === void 0 ? false : _ref2$serverSide,
|
|
4083
|
+
_ref2$totalRecords = _ref2.totalRecords,
|
|
4084
|
+
totalRecords = _ref2$totalRecords === void 0 ? 0 : _ref2$totalRecords,
|
|
4085
|
+
pageNumber = _ref2.pageNumber,
|
|
4086
|
+
props = _objectWithoutProperties$1(_ref2, _excluded$k);
|
|
4087
|
+
// Core state
|
|
4088
|
+
var _useState3 = useState(false),
|
|
3935
4089
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
var _useState5 = useState(
|
|
4090
|
+
isMobileView = _useState4[0],
|
|
4091
|
+
setIsMobileView = _useState4[1];
|
|
4092
|
+
var _useState5 = useState(function () {
|
|
4093
|
+
return Array.isArray(data) ? data : [];
|
|
4094
|
+
}),
|
|
3939
4095
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
3940
|
-
|
|
3941
|
-
|
|
4096
|
+
tableData = _useState6[0],
|
|
4097
|
+
setTableData = _useState6[1];
|
|
4098
|
+
var _useState7 = useState(false),
|
|
4099
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
4100
|
+
loading = _useState8[0],
|
|
4101
|
+
setLoading = _useState8[1];
|
|
4102
|
+
var _useState9 = useState(pageSize),
|
|
4103
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
4104
|
+
limit = _useState0[0],
|
|
4105
|
+
setLimit = _useState0[1];
|
|
4106
|
+
var _useState1 = useState(function () {
|
|
4107
|
+
return typeof pageNumber === "number" ? pageNumber : 1;
|
|
4108
|
+
}),
|
|
4109
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
4110
|
+
currentPage = _useState10[0],
|
|
4111
|
+
setCurrentPage = _useState10[1];
|
|
3942
4112
|
|
|
3943
|
-
// Column
|
|
3944
|
-
var
|
|
4113
|
+
// Column state
|
|
4114
|
+
var _useState11 = useState(function () {
|
|
3945
4115
|
return Array.isArray(columns) ? columns.map(function (c) {
|
|
3946
4116
|
return _objectSpread$9({}, c);
|
|
3947
4117
|
}) : [];
|
|
3948
4118
|
}),
|
|
3949
|
-
|
|
3950
|
-
columnsState =
|
|
3951
|
-
setColumnsState =
|
|
3952
|
-
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3956
|
-
}) : []);
|
|
3957
|
-
}, [columns]);
|
|
3958
|
-
|
|
3959
|
-
// Popover state for column toggler
|
|
3960
|
-
var _useState9 = useState(false),
|
|
3961
|
-
_useState0 = _slicedToArray(_useState9, 2),
|
|
3962
|
-
showColumnMenu = _useState0[0],
|
|
3963
|
-
setShowColumnMenu = _useState0[1];
|
|
3964
|
-
var columnMenuRef = useRef(null);
|
|
3965
|
-
var columnToggleBtnRef = useRef(null);
|
|
3966
|
-
var _useState1 = useState(pageSize),
|
|
3967
|
-
_useState10 = _slicedToArray(_useState1, 2),
|
|
3968
|
-
limit = _useState10[0],
|
|
3969
|
-
setLimit = _useState10[1];
|
|
4119
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
4120
|
+
columnsState = _useState12[0],
|
|
4121
|
+
setColumnsState = _useState12[1];
|
|
4122
|
+
var _useState13 = useState(false),
|
|
4123
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
4124
|
+
showColumnMenu = _useState14[0],
|
|
4125
|
+
setShowColumnMenu = _useState14[1];
|
|
3970
4126
|
|
|
3971
|
-
//
|
|
3972
|
-
var
|
|
4127
|
+
// Sorting/filtering state
|
|
4128
|
+
var _useState15 = useState({
|
|
3973
4129
|
key: null,
|
|
3974
4130
|
direction: "asc"
|
|
3975
4131
|
}),
|
|
3976
|
-
_useState12 = _slicedToArray(_useState11, 2),
|
|
3977
|
-
sortConfig = _useState12[0],
|
|
3978
|
-
setSortConfig = _useState12[1];
|
|
3979
|
-
var _useState13 = useState(new Set()),
|
|
3980
|
-
_useState14 = _slicedToArray(_useState13, 2),
|
|
3981
|
-
selectedRows = _useState14[0],
|
|
3982
|
-
setSelectedRows = _useState14[1];
|
|
3983
|
-
var _useState15 = useState(new Set()),
|
|
3984
4132
|
_useState16 = _slicedToArray(_useState15, 2),
|
|
3985
|
-
|
|
3986
|
-
|
|
3987
|
-
var _useState17 = useState(
|
|
4133
|
+
sortConfig = _useState16[0],
|
|
4134
|
+
setSortConfig = _useState16[1];
|
|
4135
|
+
var _useState17 = useState({}),
|
|
3988
4136
|
_useState18 = _slicedToArray(_useState17, 2),
|
|
3989
|
-
|
|
3990
|
-
|
|
3991
|
-
var _useState19 = useState(
|
|
4137
|
+
filters = _useState18[0],
|
|
4138
|
+
setFilters = _useState18[1];
|
|
4139
|
+
var _useState19 = useState(""),
|
|
3992
4140
|
_useState20 = _slicedToArray(_useState19, 2),
|
|
3993
|
-
|
|
3994
|
-
|
|
3995
|
-
|
|
4141
|
+
searchInput = _useState20[0],
|
|
4142
|
+
setSearchInput = _useState20[1];
|
|
4143
|
+
|
|
4144
|
+
// Selection/expansion state
|
|
4145
|
+
var _useState21 = useState(function () {
|
|
4146
|
+
return new Set();
|
|
4147
|
+
}),
|
|
3996
4148
|
_useState22 = _slicedToArray(_useState21, 2),
|
|
3997
|
-
|
|
3998
|
-
|
|
3999
|
-
var _useState23 = useState(
|
|
4149
|
+
selectedRows = _useState22[0],
|
|
4150
|
+
setSelectedRows = _useState22[1];
|
|
4151
|
+
var _useState23 = useState(function () {
|
|
4152
|
+
return new Set();
|
|
4153
|
+
}),
|
|
4000
4154
|
_useState24 = _slicedToArray(_useState23, 2),
|
|
4001
|
-
|
|
4002
|
-
|
|
4155
|
+
expandedRows = _useState24[0],
|
|
4156
|
+
setExpandedRows = _useState24[1];
|
|
4003
4157
|
|
|
4004
|
-
//
|
|
4158
|
+
// Action menu state
|
|
4005
4159
|
var _useState25 = useState(null),
|
|
4006
4160
|
_useState26 = _slicedToArray(_useState25, 2),
|
|
4007
4161
|
actionAnchor = _useState26[0],
|
|
4008
4162
|
setActionAnchor = _useState26[1];
|
|
4163
|
+
var _useState27 = useState(false),
|
|
4164
|
+
_useState28 = _slicedToArray(_useState27, 2),
|
|
4165
|
+
showMobileFilters = _useState28[0],
|
|
4166
|
+
setShowMobileFilters = _useState28[1];
|
|
4167
|
+
|
|
4168
|
+
// Refs
|
|
4169
|
+
var columnMenuRef = useRef(null);
|
|
4170
|
+
var columnToggleBtnRef = useRef(null);
|
|
4009
4171
|
var actionMenuRef = useRef(null);
|
|
4010
4172
|
|
|
4011
|
-
//
|
|
4012
|
-
var
|
|
4013
|
-
|
|
4014
|
-
|
|
4015
|
-
|
|
4016
|
-
|
|
4173
|
+
// Actions to use (memoized)
|
|
4174
|
+
var actionsToUse = useMemo(function () {
|
|
4175
|
+
return actions !== undefined ? actions : DEFAULT_ACTIONS;
|
|
4176
|
+
}, [actions]);
|
|
4177
|
+
|
|
4178
|
+
// Sync external props
|
|
4017
4179
|
useEffect(function () {
|
|
4018
4180
|
if (typeof pageNumber === "number" && pageNumber !== currentPage) {
|
|
4019
4181
|
setCurrentPage(pageNumber);
|
|
4020
4182
|
}
|
|
4021
|
-
}, [pageNumber]);
|
|
4183
|
+
}, [pageNumber]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
4184
|
+
|
|
4022
4185
|
useEffect(function () {
|
|
4023
4186
|
setLimit(pageSize);
|
|
4024
4187
|
}, [pageSize]);
|
|
4188
|
+
useEffect(function () {
|
|
4189
|
+
setColumnsState(Array.isArray(columns) ? columns.map(function (c) {
|
|
4190
|
+
return _objectSpread$9({}, c);
|
|
4191
|
+
}) : []);
|
|
4192
|
+
}, [columns]);
|
|
4025
4193
|
|
|
4026
|
-
//
|
|
4194
|
+
// Single effect for data sync (consolidated from 3 effects)
|
|
4195
|
+
useEffect(function () {
|
|
4196
|
+
if (serverSide || onFetch) return;
|
|
4197
|
+
if (Array.isArray(data)) {
|
|
4198
|
+
setTableData(data);
|
|
4199
|
+
}
|
|
4200
|
+
}, [data, serverSide, onFetch]);
|
|
4201
|
+
|
|
4202
|
+
// Mobile view detection
|
|
4027
4203
|
useEffect(function () {
|
|
4028
4204
|
var checkMobile = function checkMobile() {
|
|
4029
|
-
setIsMobileView(window.innerWidth < responsiveBreakpoint);
|
|
4205
|
+
return setIsMobileView(window.innerWidth < responsiveBreakpoint);
|
|
4030
4206
|
};
|
|
4031
|
-
|
|
4032
|
-
// Initial check
|
|
4033
4207
|
checkMobile();
|
|
4034
|
-
|
|
4035
|
-
// Add event listener
|
|
4036
4208
|
window.addEventListener("resize", checkMobile);
|
|
4037
4209
|
return function () {
|
|
4038
|
-
window.removeEventListener("resize", checkMobile);
|
|
4210
|
+
return window.removeEventListener("resize", checkMobile);
|
|
4039
4211
|
};
|
|
4040
4212
|
}, [responsiveBreakpoint]);
|
|
4041
|
-
var isValidList = function isValidList(d) {
|
|
4042
|
-
return Array.isArray(d);
|
|
4043
|
-
};
|
|
4044
4213
|
|
|
4045
|
-
//
|
|
4046
|
-
|
|
4047
|
-
|
|
4048
|
-
|
|
4049
|
-
|
|
4050
|
-
|
|
4051
|
-
|
|
4052
|
-
|
|
4053
|
-
|
|
4054
|
-
return document.removeEventListener("click", onDocClick);
|
|
4055
|
-
};
|
|
4056
|
-
}, [showColumnMenu]);
|
|
4057
|
-
|
|
4058
|
-
// Close per-row actionmenu when clicking outside
|
|
4059
|
-
useEffect(function () {
|
|
4060
|
-
var handler = function handler(e) {
|
|
4061
|
-
if (openActionKey && openRef.current && !openRef.current.contains(e.target)) {
|
|
4062
|
-
setOpenActionKey(null);
|
|
4063
|
-
}
|
|
4064
|
-
};
|
|
4065
|
-
document.addEventListener("click", handler);
|
|
4066
|
-
return function () {
|
|
4067
|
-
return document.removeEventListener("click", handler);
|
|
4068
|
-
};
|
|
4069
|
-
}, [openActionKey]);
|
|
4214
|
+
// Click-outside handlers (using consolidated hook)
|
|
4215
|
+
var closeColumnMenu = useCallback(function () {
|
|
4216
|
+
return setShowColumnMenu(false);
|
|
4217
|
+
}, []);
|
|
4218
|
+
var closeActionMenu = useCallback(function () {
|
|
4219
|
+
return setActionAnchor(null);
|
|
4220
|
+
}, []);
|
|
4221
|
+
useClickOutside([columnMenuRef, columnToggleBtnRef], showColumnMenu, closeColumnMenu);
|
|
4222
|
+
useClickOutside([actionMenuRef], !!actionAnchor, closeActionMenu);
|
|
4070
4223
|
|
|
4071
|
-
// Visible columns
|
|
4224
|
+
// Visible columns (memoized)
|
|
4072
4225
|
var visibleColumns = useMemo(function () {
|
|
4073
4226
|
return columnsState.filter(function (col) {
|
|
4074
4227
|
return col.isVisible !== false;
|
|
4075
4228
|
});
|
|
4076
4229
|
}, [columnsState]);
|
|
4077
|
-
var toggleColumnVisibility = function toggleColumnVisibility(key) {
|
|
4078
|
-
setColumnsState(function (prev) {
|
|
4079
|
-
return prev.map(function (c) {
|
|
4080
|
-
return c.key === key ? _objectSpread$9(_objectSpread$9({}, c), {}, {
|
|
4081
|
-
isVisible: !(c.isVisible !== false)
|
|
4082
|
-
}) : c;
|
|
4083
|
-
});
|
|
4084
|
-
});
|
|
4085
|
-
setCurrentPage(1);
|
|
4086
|
-
};
|
|
4087
4230
|
|
|
4088
|
-
//
|
|
4089
|
-
var handleOnAction = function handleOnAction(action, row) {
|
|
4090
|
-
var _action$onClick;
|
|
4091
|
-
(_action$onClick = action.onClick) === null || _action$onClick === void 0 || _action$onClick.call(action, {
|
|
4092
|
-
action: action,
|
|
4093
|
-
row: row
|
|
4094
|
-
});
|
|
4095
|
-
onAction && onAction({
|
|
4096
|
-
action: action,
|
|
4097
|
-
row: row
|
|
4098
|
-
});
|
|
4099
|
-
setOpenActionKey(null);
|
|
4100
|
-
setActionAnchor(null);
|
|
4101
|
-
};
|
|
4102
|
-
var defaultActions = [{
|
|
4103
|
-
name: "edit",
|
|
4104
|
-
label: "Edit",
|
|
4105
|
-
onClick: function onClick() {
|
|
4106
|
-
console.log("Edit action clicked");
|
|
4107
|
-
},
|
|
4108
|
-
icon: /*#__PURE__*/React__default.createElement(PenSquare, {
|
|
4109
|
-
size: 16
|
|
4110
|
-
})
|
|
4111
|
-
}, {
|
|
4112
|
-
name: "delete",
|
|
4113
|
-
label: "Delete",
|
|
4114
|
-
onClick: function onClick() {
|
|
4115
|
-
console.log("Delete action clicked");
|
|
4116
|
-
},
|
|
4117
|
-
icon: /*#__PURE__*/React__default.createElement(Trash, {
|
|
4118
|
-
size: 16
|
|
4119
|
-
})
|
|
4120
|
-
}, {
|
|
4121
|
-
name: "view",
|
|
4122
|
-
label: "View",
|
|
4123
|
-
onClick: function onClick() {
|
|
4124
|
-
console.log("View action clicked");
|
|
4125
|
-
},
|
|
4126
|
-
icon: /*#__PURE__*/React__default.createElement(Eye, {
|
|
4127
|
-
size: 16
|
|
4128
|
-
})
|
|
4129
|
-
}];
|
|
4130
|
-
var actionsToUse = actions !== undefined ? actions : defaultActions;
|
|
4131
|
-
var getRowKey = function getRowKey(row, globalIndex) {
|
|
4132
|
-
if (row == null) return String(globalIndex);
|
|
4133
|
-
if (row.id !== undefined && row.id !== null) return String(row.id);
|
|
4134
|
-
if (row._id !== undefined && row._id !== null) return String(row._id);
|
|
4135
|
-
return String(globalIndex);
|
|
4136
|
-
};
|
|
4137
|
-
|
|
4138
|
-
// Sorting
|
|
4231
|
+
// Sorted data (memoized)
|
|
4139
4232
|
var sortedData = useMemo(function () {
|
|
4140
4233
|
if (serverSide || !sortConfig.key) return tableData;
|
|
4141
4234
|
var key = sortConfig.key,
|
|
@@ -4144,12 +4237,14 @@ var Table = function Table(_ref) {
|
|
|
4144
4237
|
var av = a === null || a === void 0 ? void 0 : a[key];
|
|
4145
4238
|
var bv = b === null || b === void 0 ? void 0 : b[key];
|
|
4146
4239
|
if (av == null || bv == null) return 0;
|
|
4147
|
-
if (typeof av === "number")
|
|
4240
|
+
if (typeof av === "number") {
|
|
4241
|
+
return direction === "asc" ? av - bv : bv - av;
|
|
4242
|
+
}
|
|
4148
4243
|
return direction === "asc" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));
|
|
4149
4244
|
});
|
|
4150
4245
|
}, [tableData, sortConfig, serverSide]);
|
|
4151
4246
|
|
|
4152
|
-
//
|
|
4247
|
+
// Filtered data (memoized)
|
|
4153
4248
|
var filteredData = useMemo(function () {
|
|
4154
4249
|
if (serverSide || !filterable || !Object.keys(filters).length) return sortedData;
|
|
4155
4250
|
var q = (filters.global || "").toLowerCase();
|
|
@@ -4159,131 +4254,170 @@ var Table = function Table(_ref) {
|
|
|
4159
4254
|
});
|
|
4160
4255
|
});
|
|
4161
4256
|
}, [sortedData, filters, filterable, serverSide]);
|
|
4162
|
-
// Pagination indices
|
|
4163
|
-
var startIndex = pagination ? (currentPage - 1) * limit : 0;
|
|
4164
|
-
var endIndex = pagination ? startIndex + limit : filteredData.length;
|
|
4165
|
-
|
|
4166
|
-
// Paginated view
|
|
4167
|
-
var paginatedData = useMemo(function () {
|
|
4168
|
-
if (!pagination || serverSide) return filteredData;
|
|
4169
|
-
var start = (currentPage - 1) * limit;
|
|
4170
|
-
return filteredData.slice(start, start + limit);
|
|
4171
|
-
}, [filteredData, pagination, serverSide, currentPage, limit]);
|
|
4172
|
-
var totalPages = useMemo(function () {
|
|
4173
|
-
if (!pagination) return 1;
|
|
4174
|
-
return serverSide ? Math.max(1, Math.ceil((totalRecords || 0) / limit)) : Math.max(1, Math.ceil(filteredData.length / limit));
|
|
4175
|
-
}, [pagination, serverSide, totalRecords, filteredData.length, limit]);
|
|
4176
|
-
|
|
4177
|
-
// Sorting handler
|
|
4178
|
-
var handleSort = function handleSort(key) {
|
|
4179
|
-
if (!sortable) return;
|
|
4180
|
-
var direction = sortConfig.key === key && sortConfig.direction === "asc" ? "desc" : "asc";
|
|
4181
|
-
setSortConfig({
|
|
4182
|
-
key: key,
|
|
4183
|
-
direction: direction
|
|
4184
|
-
});
|
|
4185
|
-
onSort === null || onSort === void 0 || onSort(key, direction);
|
|
4186
|
-
};
|
|
4187
4257
|
|
|
4188
|
-
//
|
|
4189
|
-
var
|
|
4190
|
-
|
|
4191
|
-
|
|
4192
|
-
|
|
4258
|
+
// Pagination calculations (memoized)
|
|
4259
|
+
var _useMemo = useMemo(function () {
|
|
4260
|
+
var start = pagination ? (currentPage - 1) * limit : 0;
|
|
4261
|
+
var end = pagination ? start + limit : filteredData.length;
|
|
4262
|
+
var paginated = !pagination || serverSide ? filteredData : filteredData.slice(start, start + limit);
|
|
4263
|
+
var pages = !pagination ? 1 : serverSide ? Math.max(1, Math.ceil((totalRecords || 0) / limit)) : Math.max(1, Math.ceil(filteredData.length / limit));
|
|
4264
|
+
return {
|
|
4265
|
+
startIndex: start,
|
|
4266
|
+
endIndex: end,
|
|
4267
|
+
paginatedData: paginated,
|
|
4268
|
+
totalPages: pages
|
|
4269
|
+
};
|
|
4270
|
+
}, [filteredData, pagination, serverSide, currentPage, limit, totalRecords]),
|
|
4271
|
+
startIndex = _useMemo.startIndex,
|
|
4272
|
+
endIndex = _useMemo.endIndex,
|
|
4273
|
+
paginatedData = _useMemo.paginatedData,
|
|
4274
|
+
totalPages = _useMemo.totalPages;
|
|
4275
|
+
|
|
4276
|
+
// Column count for colspan (memoized)
|
|
4277
|
+
var visibleCount = useMemo(function () {
|
|
4278
|
+
return (showSerial ? 1 : 0) + visibleColumns.length + (selectable ? 1 : 0) + (hasDetails ? 1 : 0) + (withAction ? 1 : 0) + 1;
|
|
4279
|
+
},
|
|
4280
|
+
// column toggler
|
|
4281
|
+
[showSerial, visibleColumns.length, selectable, hasDetails, withAction]);
|
|
4282
|
+
|
|
4283
|
+
// Row key map for selection (memoized per filtered data)
|
|
4284
|
+
var rowKeyMap = useMemo(function () {
|
|
4285
|
+
return new Map(filteredData.map(function (r, i) {
|
|
4286
|
+
return [getRowKey(r, i), r];
|
|
4287
|
+
}));
|
|
4288
|
+
}, [filteredData]);
|
|
4289
|
+
|
|
4290
|
+
// Callbacks (memoized to prevent child re-renders)
|
|
4291
|
+
var toggleColumnVisibility = useCallback(function (key) {
|
|
4292
|
+
setColumnsState(function (prev) {
|
|
4293
|
+
return prev.map(function (c) {
|
|
4294
|
+
return c.key === key ? _objectSpread$9(_objectSpread$9({}, c), {}, {
|
|
4295
|
+
isVisible: !(c.isVisible !== false)
|
|
4296
|
+
}) : c;
|
|
4297
|
+
});
|
|
4298
|
+
});
|
|
4299
|
+
}, []);
|
|
4300
|
+
var handleSort = useCallback(function (key) {
|
|
4301
|
+
if (!sortable) return;
|
|
4302
|
+
setSortConfig(function (prev) {
|
|
4303
|
+
var direction = prev.key === key && prev.direction === "asc" ? "desc" : "asc";
|
|
4304
|
+
onSort === null || onSort === void 0 || onSort(key, direction);
|
|
4305
|
+
return {
|
|
4306
|
+
key: key,
|
|
4307
|
+
direction: direction
|
|
4308
|
+
};
|
|
4193
4309
|
});
|
|
4194
|
-
|
|
4195
|
-
|
|
4310
|
+
}, [sortable, onSort]);
|
|
4311
|
+
var handleFilter = useCallback(function (key, value) {
|
|
4312
|
+
setFilters(function (prev) {
|
|
4313
|
+
var newFilters = _objectSpread$9(_objectSpread$9({}, prev), {}, _defineProperty$4({}, key, value));
|
|
4314
|
+
onFilter === null || onFilter === void 0 || onFilter(newFilters);
|
|
4315
|
+
onFilterChange === null || onFilterChange === void 0 || onFilterChange(newFilters);
|
|
4316
|
+
return newFilters;
|
|
4196
4317
|
});
|
|
4197
|
-
|
|
4198
|
-
|
|
4199
|
-
|
|
4318
|
+
setCurrentPage(1);
|
|
4319
|
+
}, [onFilter, onFilterChange]);
|
|
4320
|
+
var handleSelectAll = useCallback(function () {
|
|
4321
|
+
setSelectedRows(function (prev) {
|
|
4322
|
+
var newSelection = new Set(prev);
|
|
4323
|
+
var pageRowKeys = paginatedData.map(function (r, i) {
|
|
4324
|
+
return getRowKey(r, startIndex + i);
|
|
4200
4325
|
});
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
return newSelection.add(k);
|
|
4326
|
+
var allSelected = pageRowKeys.every(function (k) {
|
|
4327
|
+
return newSelection.has(k);
|
|
4204
4328
|
});
|
|
4205
|
-
|
|
4206
|
-
|
|
4207
|
-
|
|
4208
|
-
|
|
4209
|
-
|
|
4210
|
-
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
|
|
4215
|
-
|
|
4329
|
+
if (allSelected) {
|
|
4330
|
+
pageRowKeys.forEach(function (k) {
|
|
4331
|
+
return newSelection["delete"](k);
|
|
4332
|
+
});
|
|
4333
|
+
} else {
|
|
4334
|
+
pageRowKeys.forEach(function (k) {
|
|
4335
|
+
return newSelection.add(k);
|
|
4336
|
+
});
|
|
4337
|
+
}
|
|
4338
|
+
|
|
4339
|
+
// Notify parent
|
|
4340
|
+
var selectedData = Array.from(newSelection).map(function (k) {
|
|
4341
|
+
return rowKeyMap.get(k);
|
|
4342
|
+
}).filter(Boolean);
|
|
4343
|
+
onSelectionChange === null || onSelectionChange === void 0 || onSelectionChange(selectedData);
|
|
4344
|
+
return newSelection;
|
|
4345
|
+
});
|
|
4346
|
+
}, [paginatedData, startIndex, rowKeyMap, onSelectionChange]);
|
|
4347
|
+
var handleSelectRow = useCallback(function (row, rowIndexInPage) {
|
|
4216
4348
|
var globalIndex = startIndex + rowIndexInPage;
|
|
4217
4349
|
var key = getRowKey(row, globalIndex);
|
|
4218
|
-
|
|
4219
|
-
|
|
4220
|
-
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4225
|
-
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4350
|
+
setSelectedRows(function (prev) {
|
|
4351
|
+
var newSelection = new Set(prev);
|
|
4352
|
+
if (newSelection.has(key)) {
|
|
4353
|
+
newSelection["delete"](key);
|
|
4354
|
+
} else {
|
|
4355
|
+
newSelection.add(key);
|
|
4356
|
+
}
|
|
4357
|
+
var selectedData = Array.from(newSelection).map(function (k) {
|
|
4358
|
+
return rowKeyMap.get(k);
|
|
4359
|
+
}).filter(Boolean);
|
|
4360
|
+
onSelectionChange === null || onSelectionChange === void 0 || onSelectionChange(selectedData);
|
|
4361
|
+
return newSelection;
|
|
4362
|
+
});
|
|
4363
|
+
}, [startIndex, rowKeyMap, onSelectionChange]);
|
|
4364
|
+
var toggleExpandRow = useCallback(function (row, rowIndexInPage) {
|
|
4230
4365
|
var globalIndex = startIndex + rowIndexInPage;
|
|
4231
4366
|
var key = getRowKey(row, globalIndex);
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
|
|
4236
|
-
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
var renderCell = function renderCell(column, row, globalIndex) {
|
|
4244
|
-
if (column.render) return column.render(row, globalIndex);
|
|
4245
|
-
return row === null || row === void 0 ? void 0 : row[column.key];
|
|
4246
|
-
};
|
|
4247
|
-
|
|
4248
|
-
// UI counts
|
|
4249
|
-
var visibleCount = (showSerial ? 1 : 0) + visibleColumns.length + (selectable ? 1 : 0) + (hasDetails ? 1 : 0) + (withAction ? 1 : 0);
|
|
4250
|
-
var toggleActions = function toggleActions(e, actionCellKey, row) {
|
|
4367
|
+
setExpandedRows(function (prev) {
|
|
4368
|
+
var newExpanded = new Set(prev);
|
|
4369
|
+
if (newExpanded.has(key)) {
|
|
4370
|
+
newExpanded["delete"](key);
|
|
4371
|
+
} else {
|
|
4372
|
+
newExpanded.add(key);
|
|
4373
|
+
}
|
|
4374
|
+
return newExpanded;
|
|
4375
|
+
});
|
|
4376
|
+
}, [startIndex]);
|
|
4377
|
+
var toggleActions = useCallback(function (e, actionCellKey, row) {
|
|
4251
4378
|
e.stopPropagation();
|
|
4252
|
-
|
|
4253
|
-
|
|
4254
|
-
|
|
4255
|
-
} else {
|
|
4256
|
-
setOpenActionKey(actionCellKey);
|
|
4257
|
-
setActionAnchor({
|
|
4379
|
+
setActionAnchor(function (prev) {
|
|
4380
|
+
if (prev && prev.key === actionCellKey) return null;
|
|
4381
|
+
return {
|
|
4258
4382
|
elem: e.currentTarget,
|
|
4259
4383
|
key: actionCellKey,
|
|
4260
4384
|
row: row
|
|
4261
|
-
}
|
|
4385
|
+
};
|
|
4386
|
+
});
|
|
4387
|
+
}, []);
|
|
4388
|
+
var handleOnAction = useCallback(function (action, row) {
|
|
4389
|
+
var _action$onClick;
|
|
4390
|
+
(_action$onClick = action.onClick) === null || _action$onClick === void 0 || _action$onClick.call(action, {
|
|
4391
|
+
action: action,
|
|
4392
|
+
row: row
|
|
4393
|
+
});
|
|
4394
|
+
onAction === null || onAction === void 0 || onAction({
|
|
4395
|
+
action: action,
|
|
4396
|
+
row: row
|
|
4397
|
+
});
|
|
4398
|
+
setActionAnchor(null);
|
|
4399
|
+
}, [onAction]);
|
|
4400
|
+
var handleLimitChange = useCallback(function (nextLimit) {
|
|
4401
|
+
var parsed = Number(nextLimit);
|
|
4402
|
+
if (!Number.isFinite(parsed) || parsed <= 0) return;
|
|
4403
|
+
setLimit(parsed);
|
|
4404
|
+
setCurrentPage(1);
|
|
4405
|
+
onLimitChange === null || onLimitChange === void 0 || onLimitChange(parsed);
|
|
4406
|
+
}, [onLimitChange]);
|
|
4407
|
+
var applyGlobalSearch = useCallback(function () {
|
|
4408
|
+
handleFilter("global", searchInput);
|
|
4409
|
+
}, [handleFilter, searchInput]);
|
|
4410
|
+
var onGlobalKeyDown = useCallback(function (e) {
|
|
4411
|
+
if (e.key === "Enter") {
|
|
4412
|
+
e.preventDefault();
|
|
4413
|
+
applyGlobalSearch();
|
|
4262
4414
|
}
|
|
4263
|
-
};
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
}
|
|
4270
|
-
setOpenActionKey(null);
|
|
4271
|
-
setActionAnchor(null);
|
|
4272
|
-
};
|
|
4273
|
-
var onScrollResize = function onScrollResize() {
|
|
4274
|
-
setOpenActionKey(function (k) {
|
|
4275
|
-
return k ? k : null;
|
|
4276
|
-
});
|
|
4277
|
-
};
|
|
4278
|
-
window.addEventListener("click", onDocClick);
|
|
4279
|
-
window.addEventListener("scroll", onScrollResize, true);
|
|
4280
|
-
window.addEventListener("resize", onScrollResize);
|
|
4281
|
-
return function () {
|
|
4282
|
-
window.removeEventListener("click", onDocClick);
|
|
4283
|
-
window.removeEventListener("scroll", onScrollResize, true);
|
|
4284
|
-
window.removeEventListener("resize", onScrollResize);
|
|
4285
|
-
};
|
|
4286
|
-
}, [actionAnchor]);
|
|
4415
|
+
}, [applyGlobalSearch]);
|
|
4416
|
+
var handlePageChange = useCallback(function (newPage) {
|
|
4417
|
+
setCurrentPage(newPage);
|
|
4418
|
+
}, []);
|
|
4419
|
+
|
|
4420
|
+
// Data fetching effect
|
|
4287
4421
|
useEffect(function () {
|
|
4288
4422
|
if (!onFetch) return;
|
|
4289
4423
|
onFetch({
|
|
@@ -4297,45 +4431,31 @@ var Table = function Table(_ref) {
|
|
|
4297
4431
|
sort: sortConfig
|
|
4298
4432
|
});
|
|
4299
4433
|
}, [onFetch, filters, currentPage, limit, sortConfig]);
|
|
4300
|
-
useEffect(function () {
|
|
4301
|
-
if (!serverSide) setTableData(data);
|
|
4302
|
-
}, [data, serverSide]);
|
|
4303
|
-
useEffect(function () {
|
|
4304
|
-
if (!onFetch && isValidList(data)) setTableData(data);
|
|
4305
|
-
}, [data, onFetch]);
|
|
4306
4434
|
|
|
4307
|
-
//
|
|
4435
|
+
// Sync searchInput with filters.global
|
|
4308
4436
|
useEffect(function () {
|
|
4309
4437
|
setSearchInput(filters.global || "");
|
|
4310
4438
|
}, [filters.global]);
|
|
4311
|
-
|
|
4312
|
-
|
|
4313
|
-
|
|
4314
|
-
|
|
4315
|
-
|
|
4316
|
-
|
|
4317
|
-
applyGlobalSearch();
|
|
4318
|
-
}
|
|
4319
|
-
};
|
|
4320
|
-
var handleLimitChange = function handleLimitChange(nextLimit) {
|
|
4321
|
-
var parsed = Number(nextLimit);
|
|
4322
|
-
if (!Number.isFinite(parsed) || parsed <= 0) return;
|
|
4323
|
-
setLimit(parsed);
|
|
4324
|
-
setCurrentPage(1);
|
|
4325
|
-
onLimitChange === null || onLimitChange === void 0 || onLimitChange(parsed);
|
|
4326
|
-
};
|
|
4439
|
+
|
|
4440
|
+
// Render cell helper
|
|
4441
|
+
var renderCell = useCallback(function (column, row, globalIndex) {
|
|
4442
|
+
if (column.render) return column.render(row, globalIndex);
|
|
4443
|
+
return row === null || row === void 0 ? void 0 : row[column.key];
|
|
4444
|
+
}, []);
|
|
4327
4445
|
|
|
4328
4446
|
// Render mobile card
|
|
4329
|
-
var renderMobileCard = function
|
|
4447
|
+
var renderMobileCard = useCallback(function (row, rowIndexInPage) {
|
|
4330
4448
|
var globalIndex = startIndex + rowIndexInPage;
|
|
4331
4449
|
var key = getRowKey(row, globalIndex);
|
|
4332
4450
|
var actionCellKey = "actions-".concat(key);
|
|
4451
|
+
var isSelected = selectedRows.has(key);
|
|
4452
|
+
var isExpanded = expandedRows.has(key);
|
|
4333
4453
|
var extraRowClass = typeof rowClass === "function" ? rowClass({
|
|
4334
4454
|
row: row,
|
|
4335
4455
|
rowIndex: globalIndex
|
|
4336
4456
|
}) : "";
|
|
4337
4457
|
var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
|
|
4338
|
-
var stripeBg = stripedRows && !
|
|
4458
|
+
var stripeBg = stripedRows && !isSelected ? stripedColors[globalIndex % stripedColors.length] : undefined;
|
|
4339
4459
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
4340
4460
|
key: key,
|
|
4341
4461
|
style: stripeBg ? {
|
|
@@ -4343,8 +4463,8 @@ var Table = function Table(_ref) {
|
|
|
4343
4463
|
} : undefined,
|
|
4344
4464
|
className: cn$1("border rounded-lg mb-3 shadow-sm overflow-hidden transition-all duration-200", {
|
|
4345
4465
|
"cursor-pointer": !!onRowClick,
|
|
4346
|
-
"bg-primary-50 border-primary-200":
|
|
4347
|
-
"hover:shadow-md": !
|
|
4466
|
+
"bg-primary-50 border-primary-200": isSelected,
|
|
4467
|
+
"hover:shadow-md": !isSelected
|
|
4348
4468
|
}, safeExtraRowClass),
|
|
4349
4469
|
onClick: function onClick() {
|
|
4350
4470
|
return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
|
|
@@ -4358,12 +4478,12 @@ var Table = function Table(_ref) {
|
|
|
4358
4478
|
e.stopPropagation();
|
|
4359
4479
|
toggleExpandRow(row, rowIndexInPage);
|
|
4360
4480
|
},
|
|
4361
|
-
"aria-expanded":
|
|
4481
|
+
"aria-expanded": isExpanded,
|
|
4362
4482
|
className: "p-1 rounded hover:bg-gray-200"
|
|
4363
|
-
},
|
|
4483
|
+
}, isExpanded ? "▾" : "▸"), selectable && /*#__PURE__*/React__default.createElement("input", {
|
|
4364
4484
|
type: "checkbox",
|
|
4365
4485
|
className: "rounded border-gray-300 h-4 w-4",
|
|
4366
|
-
checked:
|
|
4486
|
+
checked: isSelected,
|
|
4367
4487
|
onChange: function onChange(e) {
|
|
4368
4488
|
e.stopPropagation();
|
|
4369
4489
|
handleSelectRow(row, rowIndexInPage);
|
|
@@ -4377,26 +4497,19 @@ var Table = function Table(_ref) {
|
|
|
4377
4497
|
className: "relative"
|
|
4378
4498
|
}, /*#__PURE__*/React__default.createElement("button", {
|
|
4379
4499
|
onClick: function onClick(e) {
|
|
4380
|
-
e
|
|
4381
|
-
toggleActions(e, actionCellKey, row);
|
|
4500
|
+
return toggleActions(e, actionCellKey, row);
|
|
4382
4501
|
},
|
|
4383
|
-
"aria-expanded":
|
|
4502
|
+
"aria-expanded": (actionAnchor === null || actionAnchor === void 0 ? void 0 : actionAnchor.key) === actionCellKey,
|
|
4384
4503
|
className: "p-1.5 rounded hover:bg-gray-200",
|
|
4385
4504
|
title: "Actions"
|
|
4386
4505
|
}, /*#__PURE__*/React__default.createElement(MoreVertical, {
|
|
4387
4506
|
className: "h-4 w-4"
|
|
4388
|
-
})), actionAnchor
|
|
4507
|
+
})), (actionAnchor === null || actionAnchor === void 0 ? void 0 : actionAnchor.key) === actionCellKey && /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement(ActionMenuPortal, {
|
|
4389
4508
|
anchorElem: actionAnchor.elem,
|
|
4390
4509
|
anchorRow: actionAnchor.row,
|
|
4391
4510
|
actions: actionsToUse,
|
|
4392
|
-
onClose: function onClose() {
|
|
4393
|
-
setOpenActionKey(null);
|
|
4394
|
-
setActionAnchor(null);
|
|
4395
|
-
},
|
|
4396
4511
|
onAction: function onAction(action) {
|
|
4397
|
-
handleOnAction(action, row);
|
|
4398
|
-
setOpenActionKey(null);
|
|
4399
|
-
setActionAnchor(null);
|
|
4512
|
+
return handleOnAction(action, row);
|
|
4400
4513
|
},
|
|
4401
4514
|
menuRef: actionMenuRef
|
|
4402
4515
|
}), document.body))), /*#__PURE__*/React__default.createElement("div", {
|
|
@@ -4417,16 +4530,16 @@ var Table = function Table(_ref) {
|
|
|
4417
4530
|
}, column.label), /*#__PURE__*/React__default.createElement("div", {
|
|
4418
4531
|
className: "text-sm text-gray-900 sm:w-2/3 sm:pl-2 break-words"
|
|
4419
4532
|
}, renderCell(column, row, globalIndex)));
|
|
4420
|
-
})), hasDetails &&
|
|
4533
|
+
})), hasDetails && isExpanded && DetailsComponent && /*#__PURE__*/React__default.createElement("div", {
|
|
4421
4534
|
className: "border-t bg-gray-50 p-4"
|
|
4422
4535
|
}, /*#__PURE__*/React__default.createElement(DetailsComponent, {
|
|
4423
4536
|
row: row,
|
|
4424
4537
|
index: globalIndex
|
|
4425
4538
|
})));
|
|
4426
|
-
};
|
|
4539
|
+
}, [startIndex, selectedRows, expandedRows, rowClass, stripedRows, stripedColors, onRowClick, hasDetails, selectable, showSerial, withAction, visibleColumns, cellClass, DetailsComponent, actionsToUse, actionAnchor, toggleExpandRow, handleSelectRow, toggleActions, handleOnAction, renderCell]);
|
|
4427
4540
|
|
|
4428
4541
|
// Render mobile filters
|
|
4429
|
-
var renderMobileFilters = function
|
|
4542
|
+
var renderMobileFilters = useCallback(function () {
|
|
4430
4543
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
4431
4544
|
className: "mb-4 p-3 bg-gray-50 rounded-lg"
|
|
4432
4545
|
}, /*#__PURE__*/React__default.createElement("div", {
|
|
@@ -4435,12 +4548,14 @@ var Table = function Table(_ref) {
|
|
|
4435
4548
|
className: "text-sm font-medium text-gray-700"
|
|
4436
4549
|
}, "Filters"), /*#__PURE__*/React__default.createElement("button", {
|
|
4437
4550
|
onClick: function onClick() {
|
|
4438
|
-
return setShowMobileFilters(
|
|
4551
|
+
return setShowMobileFilters(function (s) {
|
|
4552
|
+
return !s;
|
|
4553
|
+
});
|
|
4439
4554
|
},
|
|
4440
4555
|
className: "text-xs text-gray-500 hover:text-gray-700"
|
|
4441
4556
|
}, showMobileFilters ? "Hide" : "Show")), showMobileFilters && /*#__PURE__*/React__default.createElement("div", {
|
|
4442
4557
|
className: "space-y-3"
|
|
4443
|
-
}, globalSearch && /*#__PURE__*/React__default.createElement("div",
|
|
4558
|
+
}, globalSearch && /*#__PURE__*/React__default.createElement("div", {
|
|
4444
4559
|
className: "relative"
|
|
4445
4560
|
}, /*#__PURE__*/React__default.createElement("input", {
|
|
4446
4561
|
type: "text",
|
|
@@ -4453,7 +4568,7 @@ var Table = function Table(_ref) {
|
|
|
4453
4568
|
onKeyDown: onGlobalKeyDown
|
|
4454
4569
|
}), /*#__PURE__*/React__default.createElement(Search, {
|
|
4455
4570
|
className: "absolute right-3 top-2.5 h-4 w-4 text-gray-400"
|
|
4456
|
-
}))
|
|
4571
|
+
})), filterable && visibleColumns.map(function (column) {
|
|
4457
4572
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
4458
4573
|
key: column.key
|
|
4459
4574
|
}, /*#__PURE__*/React__default.createElement("label", {
|
|
@@ -4468,9 +4583,26 @@ var Table = function Table(_ref) {
|
|
|
4468
4583
|
}
|
|
4469
4584
|
}));
|
|
4470
4585
|
})));
|
|
4471
|
-
};
|
|
4586
|
+
}, [showMobileFilters, globalSearch, searchInput, onGlobalKeyDown, filterable, visibleColumns, filters, handleFilter]);
|
|
4587
|
+
|
|
4588
|
+
// Check if all page rows are selected
|
|
4589
|
+
var allPageSelected = useMemo(function () {
|
|
4590
|
+
if (paginatedData.length === 0) return false;
|
|
4591
|
+
return paginatedData.every(function (r, i) {
|
|
4592
|
+
return selectedRows.has(getRowKey(r, startIndex + i));
|
|
4593
|
+
});
|
|
4594
|
+
}, [paginatedData, selectedRows, startIndex]);
|
|
4472
4595
|
|
|
4473
|
-
//
|
|
4596
|
+
// Limit options for selector
|
|
4597
|
+
var limitOptionsForSelect = useMemo(function () {
|
|
4598
|
+
var opts = Array.isArray(limitOptions) && limitOptions.length > 0 ? limitOptions : [25, 50, 100];
|
|
4599
|
+
return opts.map(function (opt) {
|
|
4600
|
+
return {
|
|
4601
|
+
label: String(opt),
|
|
4602
|
+
value: opt
|
|
4603
|
+
};
|
|
4604
|
+
});
|
|
4605
|
+
}, [limitOptions]);
|
|
4474
4606
|
return /*#__PURE__*/React__default.createElement("div", {
|
|
4475
4607
|
className: "w-full border rounded-lg md:rounded-md bg-white"
|
|
4476
4608
|
}, /*#__PURE__*/React__default.createElement("div", {
|
|
@@ -4491,23 +4623,11 @@ var Table = function Table(_ref) {
|
|
|
4491
4623
|
htmlFor: "pagination-limit",
|
|
4492
4624
|
className: "text-sm text-gray-600 whitespace-nowrap"
|
|
4493
4625
|
}, "Show"), /*#__PURE__*/React__default.createElement(Select, {
|
|
4494
|
-
options:
|
|
4495
|
-
return {
|
|
4496
|
-
label: String(opt),
|
|
4497
|
-
value: opt
|
|
4498
|
-
};
|
|
4499
|
-
}) : [25, 50, 100].map(function (opt) {
|
|
4500
|
-
return {
|
|
4501
|
-
label: String(opt),
|
|
4502
|
-
value: opt
|
|
4503
|
-
};
|
|
4504
|
-
}),
|
|
4626
|
+
options: limitOptionsForSelect,
|
|
4505
4627
|
value: limit,
|
|
4506
4628
|
allowClear: false,
|
|
4507
4629
|
placeholder: "",
|
|
4508
|
-
onChange:
|
|
4509
|
-
return handleLimitChange(e);
|
|
4510
|
-
},
|
|
4630
|
+
onChange: handleLimitChange,
|
|
4511
4631
|
className: "w-20 md:w-30"
|
|
4512
4632
|
}), /*#__PURE__*/React__default.createElement("p", {
|
|
4513
4633
|
className: "text-sm text-gray-600 whitespace-nowrap"
|
|
@@ -4515,17 +4635,13 @@ var Table = function Table(_ref) {
|
|
|
4515
4635
|
className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 w-full md:w-auto"
|
|
4516
4636
|
}, /*#__PURE__*/React__default.createElement("div", {
|
|
4517
4637
|
className: "text-sm text-gray-700 whitespace-nowrap"
|
|
4518
|
-
}, filteredData.length === 0 ? 0 : startIndex + 1, " -", " ", Math.min(endIndex, filteredData.length), " of ", filteredData.length, "
|
|
4638
|
+
}, filteredData.length === 0 ? 0 : startIndex + 1, " -", " ", Math.min(endIndex, filteredData.length), " of ", filteredData.length, " results"), pagination && /*#__PURE__*/React__default.createElement("div", {
|
|
4519
4639
|
className: "flex items-center gap-1"
|
|
4520
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
4521
|
-
className: "flex gap-1"
|
|
4522
4640
|
}, /*#__PURE__*/React__default.createElement("button", {
|
|
4523
4641
|
className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
|
|
4524
4642
|
disabled: currentPage === 1,
|
|
4525
4643
|
onClick: function onClick() {
|
|
4526
|
-
return
|
|
4527
|
-
return Math.max(1, p - 1);
|
|
4528
|
-
});
|
|
4644
|
+
return handlePageChange(Math.max(1, currentPage - 1));
|
|
4529
4645
|
},
|
|
4530
4646
|
"aria-label": "Previous page"
|
|
4531
4647
|
}, /*#__PURE__*/React__default.createElement(ChevronLeft, {
|
|
@@ -4534,14 +4650,12 @@ var Table = function Table(_ref) {
|
|
|
4534
4650
|
className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
|
|
4535
4651
|
disabled: currentPage === totalPages,
|
|
4536
4652
|
onClick: function onClick() {
|
|
4537
|
-
return
|
|
4538
|
-
return Math.min(totalPages, p + 1);
|
|
4539
|
-
});
|
|
4653
|
+
return handlePageChange(Math.min(totalPages, currentPage + 1));
|
|
4540
4654
|
},
|
|
4541
4655
|
"aria-label": "Next page"
|
|
4542
4656
|
}, /*#__PURE__*/React__default.createElement(ChevronRight, {
|
|
4543
4657
|
className: "size-4 md:size-5 text-gray-800"
|
|
4544
|
-
})))))
|
|
4658
|
+
}))))), globalSearch && /*#__PURE__*/React__default.createElement("div", {
|
|
4545
4659
|
className: "p-4 border-b"
|
|
4546
4660
|
}, /*#__PURE__*/React__default.createElement("div", {
|
|
4547
4661
|
className: "flex flex-col sm:flex-row items-start sm:items-center gap-2"
|
|
@@ -4607,9 +4721,7 @@ var Table = function Table(_ref) {
|
|
|
4607
4721
|
}, /*#__PURE__*/React__default.createElement("input", {
|
|
4608
4722
|
type: "checkbox",
|
|
4609
4723
|
className: "rounded border-gray-300",
|
|
4610
|
-
checked:
|
|
4611
|
-
return selectedRows.has(getRowKey(r, startIndex + i));
|
|
4612
|
-
}),
|
|
4724
|
+
checked: allPageSelected,
|
|
4613
4725
|
onChange: handleSelectAll
|
|
4614
4726
|
})), visibleColumns.map(function (column) {
|
|
4615
4727
|
return /*#__PURE__*/React__default.createElement("th", {
|
|
@@ -4700,12 +4812,14 @@ var Table = function Table(_ref) {
|
|
|
4700
4812
|
var globalIndex = startIndex + rowIndexInPage;
|
|
4701
4813
|
var key = getRowKey(row, globalIndex);
|
|
4702
4814
|
var actionCellKey = "actions-".concat(key);
|
|
4815
|
+
var isSelected = selectedRows.has(key);
|
|
4816
|
+
var isExpanded = expandedRows.has(key);
|
|
4703
4817
|
var extraRowClass = typeof rowClass === "function" ? rowClass({
|
|
4704
4818
|
row: row,
|
|
4705
4819
|
rowIndex: globalIndex
|
|
4706
4820
|
}) : "";
|
|
4707
4821
|
var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
|
|
4708
|
-
var stripeBg = stripedRows && !
|
|
4822
|
+
var stripeBg = stripedRows && !isSelected ? stripedColors[globalIndex % stripedColors.length] : undefined;
|
|
4709
4823
|
return /*#__PURE__*/React__default.createElement(React__default.Fragment, {
|
|
4710
4824
|
key: key
|
|
4711
4825
|
}, /*#__PURE__*/React__default.createElement("tr", {
|
|
@@ -4714,7 +4828,7 @@ var Table = function Table(_ref) {
|
|
|
4714
4828
|
} : undefined,
|
|
4715
4829
|
className: cn$1("hover:bg-gray-50", {
|
|
4716
4830
|
"cursor-pointer": !!onRowClick,
|
|
4717
|
-
"bg-primary-50":
|
|
4831
|
+
"bg-primary-50": isSelected
|
|
4718
4832
|
}, safeExtraRowClass),
|
|
4719
4833
|
onClick: function onClick() {
|
|
4720
4834
|
return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
|
|
@@ -4726,19 +4840,19 @@ var Table = function Table(_ref) {
|
|
|
4726
4840
|
e.stopPropagation();
|
|
4727
4841
|
toggleExpandRow(row, rowIndexInPage);
|
|
4728
4842
|
},
|
|
4729
|
-
"aria-expanded":
|
|
4843
|
+
"aria-expanded": isExpanded,
|
|
4730
4844
|
className: "p-1 rounded hover:bg-gray-100"
|
|
4731
|
-
},
|
|
4845
|
+
}, isExpanded ? "▾" : "▸")), showSerial && /*#__PURE__*/React__default.createElement("td", {
|
|
4732
4846
|
className: "px-4 py-4 whitespace-nowrap text-sm text-gray-900"
|
|
4733
4847
|
}, globalIndex + 1), selectable && /*#__PURE__*/React__default.createElement("td", {
|
|
4734
4848
|
className: "px-6 py-4",
|
|
4735
4849
|
onClick: function onClick(e) {
|
|
4736
|
-
e.stopPropagation();
|
|
4850
|
+
return e.stopPropagation();
|
|
4737
4851
|
}
|
|
4738
4852
|
}, /*#__PURE__*/React__default.createElement("input", {
|
|
4739
4853
|
type: "checkbox",
|
|
4740
4854
|
className: "rounded border-gray-300",
|
|
4741
|
-
checked:
|
|
4855
|
+
checked: isSelected,
|
|
4742
4856
|
onChange: function onChange() {
|
|
4743
4857
|
return handleSelectRow(row, rowIndexInPage);
|
|
4744
4858
|
}
|
|
@@ -4754,6 +4868,8 @@ var Table = function Table(_ref) {
|
|
|
4754
4868
|
key: column.key,
|
|
4755
4869
|
className: cn$1("px-6 py-4 whitespace-nowrap text-sm text-gray-900", safeExtraCellClass)
|
|
4756
4870
|
}, renderCell(column, row, globalIndex));
|
|
4871
|
+
}), /*#__PURE__*/React__default.createElement("td", {
|
|
4872
|
+
className: "px-4 py-4"
|
|
4757
4873
|
}), withAction && /*#__PURE__*/React__default.createElement("td", {
|
|
4758
4874
|
className: "px-4 py-4 text-sm text-right",
|
|
4759
4875
|
onClick: function onClick(e) {
|
|
@@ -4765,32 +4881,26 @@ var Table = function Table(_ref) {
|
|
|
4765
4881
|
onClick: function onClick(e) {
|
|
4766
4882
|
return toggleActions(e, actionCellKey, row);
|
|
4767
4883
|
},
|
|
4768
|
-
"aria-expanded":
|
|
4884
|
+
"aria-expanded": (actionAnchor === null || actionAnchor === void 0 ? void 0 : actionAnchor.key) === actionCellKey,
|
|
4769
4885
|
className: "p-1 rounded hover:bg-gray-100",
|
|
4770
4886
|
title: "Actions"
|
|
4771
4887
|
}, /*#__PURE__*/React__default.createElement(MoreVertical, {
|
|
4772
4888
|
className: "h-4 w-4"
|
|
4773
|
-
}))), actionAnchor
|
|
4889
|
+
}))), (actionAnchor === null || actionAnchor === void 0 ? void 0 : actionAnchor.key) === actionCellKey && /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement(ActionMenuPortal, {
|
|
4774
4890
|
anchorElem: actionAnchor.elem,
|
|
4775
4891
|
anchorRow: actionAnchor.row,
|
|
4776
4892
|
actions: actionsToUse,
|
|
4777
|
-
onClose: function onClose() {
|
|
4778
|
-
setOpenActionKey(null);
|
|
4779
|
-
setActionAnchor(null);
|
|
4780
|
-
},
|
|
4781
4893
|
onAction: function onAction(action) {
|
|
4782
|
-
handleOnAction(action, row);
|
|
4783
|
-
setOpenActionKey(null);
|
|
4784
|
-
setActionAnchor(null);
|
|
4894
|
+
return handleOnAction(action, row);
|
|
4785
4895
|
},
|
|
4786
4896
|
menuRef: actionMenuRef
|
|
4787
|
-
}), document.body))), hasDetails &&
|
|
4897
|
+
}), document.body))), hasDetails && isExpanded && DetailsComponent && /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
|
|
4788
4898
|
colSpan: visibleCount,
|
|
4789
4899
|
className: "px-6 py-4 bg-gray-50"
|
|
4790
|
-
}, /*#__PURE__*/React__default.createElement(
|
|
4900
|
+
}, /*#__PURE__*/React__default.createElement(DetailsComponent, {
|
|
4791
4901
|
row: row,
|
|
4792
4902
|
index: globalIndex
|
|
4793
|
-
}))))
|
|
4903
|
+
}))));
|
|
4794
4904
|
})))), isMobileView && /*#__PURE__*/React__default.createElement("div", {
|
|
4795
4905
|
className: "p-4"
|
|
4796
4906
|
}, loading ? /*#__PURE__*/React__default.createElement("div", {
|
|
@@ -4825,9 +4935,7 @@ var Table = function Table(_ref) {
|
|
|
4825
4935
|
className: "rounded-lg md:rounded-md border border-gray-300 px-4 py-2 text-sm disabled:opacity-50 hover:bg-gray-50",
|
|
4826
4936
|
disabled: currentPage === 1,
|
|
4827
4937
|
onClick: function onClick() {
|
|
4828
|
-
return
|
|
4829
|
-
return Math.max(1, p - 1);
|
|
4830
|
-
});
|
|
4938
|
+
return handlePageChange(Math.max(1, currentPage - 1));
|
|
4831
4939
|
}
|
|
4832
4940
|
}, "Previous"), /*#__PURE__*/React__default.createElement("div", {
|
|
4833
4941
|
className: "flex items-center gap-1"
|
|
@@ -4851,170 +4959,17 @@ var Table = function Table(_ref) {
|
|
|
4851
4959
|
"border border-gray-300 hover:bg-gray-50": pageNum !== currentPage
|
|
4852
4960
|
}),
|
|
4853
4961
|
onClick: function onClick() {
|
|
4854
|
-
return
|
|
4962
|
+
return handlePageChange(pageNum);
|
|
4855
4963
|
}
|
|
4856
4964
|
}, pageNum);
|
|
4857
4965
|
})), /*#__PURE__*/React__default.createElement("button", {
|
|
4858
4966
|
className: "rounded-lg md:rounded-md border border-gray-300 px-4 py-2 text-sm disabled:opacity-50 hover:bg-gray-50",
|
|
4859
4967
|
disabled: currentPage === totalPages,
|
|
4860
4968
|
onClick: function onClick() {
|
|
4861
|
-
return
|
|
4862
|
-
return Math.min(totalPages, p + 1);
|
|
4863
|
-
});
|
|
4969
|
+
return handlePageChange(Math.min(totalPages, currentPage + 1));
|
|
4864
4970
|
}
|
|
4865
4971
|
}, "Next")))));
|
|
4866
4972
|
};
|
|
4867
|
-
function ActionMenuPortal(_ref2) {
|
|
4868
|
-
var anchorElem = _ref2.anchorElem,
|
|
4869
|
-
anchorRow = _ref2.anchorRow,
|
|
4870
|
-
_ref2$actions = _ref2.actions,
|
|
4871
|
-
actions = _ref2$actions === void 0 ? [] : _ref2$actions;
|
|
4872
|
-
_ref2.onClose;
|
|
4873
|
-
var onAction = _ref2.onAction,
|
|
4874
|
-
menuRef = _ref2.menuRef;
|
|
4875
|
-
var _useState29 = useState({
|
|
4876
|
-
left: 0,
|
|
4877
|
-
top: 0,
|
|
4878
|
-
transformOrigin: "top right",
|
|
4879
|
-
maxHeight: 300,
|
|
4880
|
-
width: 180,
|
|
4881
|
-
opacity: 0
|
|
4882
|
-
}),
|
|
4883
|
-
_useState30 = _slicedToArray(_useState29, 2),
|
|
4884
|
-
style = _useState30[0],
|
|
4885
|
-
setStyle = _useState30[1];
|
|
4886
|
-
var menuWidth = 180;
|
|
4887
|
-
var maxMenuHeight = 320;
|
|
4888
|
-
var margin = 8;
|
|
4889
|
-
var minMenuHeight = 80;
|
|
4890
|
-
|
|
4891
|
-
// compute position using actual menu height (if available) and layout measurements
|
|
4892
|
-
var computePosition = function computePosition() {
|
|
4893
|
-
if (!anchorElem) return;
|
|
4894
|
-
var rect = anchorElem.getBoundingClientRect();
|
|
4895
|
-
var scrollY = window.scrollY || window.pageYOffset;
|
|
4896
|
-
var scrollX = window.scrollX || window.pageXOffset;
|
|
4897
|
-
var spaceBelow = window.innerHeight - rect.bottom;
|
|
4898
|
-
var spaceAbove = rect.top;
|
|
4899
|
-
|
|
4900
|
-
// allowed max height based on available space
|
|
4901
|
-
var allowedMaxHeight = Math.min(maxMenuHeight, Math.max(minMenuHeight, Math.max(spaceBelow - margin, spaceAbove - margin)));
|
|
4902
|
-
|
|
4903
|
-
// choose placement by comparing actual available spaces
|
|
4904
|
-
var placement = "bottom";
|
|
4905
|
-
if (spaceBelow < 160 && spaceAbove > spaceBelow) {
|
|
4906
|
-
placement = "top";
|
|
4907
|
-
// when placing on top we should cap allowedMaxHeight by spaceAbove
|
|
4908
|
-
allowedMaxHeight = Math.min(maxMenuHeight, Math.max(minMenuHeight, spaceAbove - margin));
|
|
4909
|
-
} else {
|
|
4910
|
-
// placing bottom: cap by spaceBelow
|
|
4911
|
-
allowedMaxHeight = Math.min(maxMenuHeight, Math.max(minMenuHeight, spaceBelow - margin));
|
|
4912
|
-
}
|
|
4913
|
-
|
|
4914
|
-
// measure the menu's content height if we can, and compute the actual menu height we'll use.
|
|
4915
|
-
var measuredMenuHeight = allowedMaxHeight;
|
|
4916
|
-
var menuEl = menuRef === null || menuRef === void 0 ? void 0 : menuRef.current;
|
|
4917
|
-
if (menuEl) {
|
|
4918
|
-
// scrollHeight is the content height; offsetHeight may reflect current rendered height.
|
|
4919
|
-
var contentHeight = menuEl.scrollHeight || menuEl.offsetHeight || allowedMaxHeight;
|
|
4920
|
-
// actual height will be min(contentHeight, allowedMaxHeight)
|
|
4921
|
-
measuredMenuHeight = Math.min(contentHeight, allowedMaxHeight);
|
|
4922
|
-
}
|
|
4923
|
-
|
|
4924
|
-
// compute top according to placement and measuredMenuHeight
|
|
4925
|
-
var top;
|
|
4926
|
-
if (placement === "top") {
|
|
4927
|
-
// place menu so its bottom sits just above the anchor (rect.top - margin)
|
|
4928
|
-
top = rect.top + scrollY - measuredMenuHeight - margin;
|
|
4929
|
-
} else {
|
|
4930
|
-
// place menu just below the anchor (rect.bottom + margin)
|
|
4931
|
-
top = rect.bottom + scrollY + margin;
|
|
4932
|
-
}
|
|
4933
|
-
|
|
4934
|
-
// clamp top to viewport (so it never goes off-screen)
|
|
4935
|
-
var minTop = margin + scrollY;
|
|
4936
|
-
var maxTop = window.innerHeight + scrollY - measuredMenuHeight - margin;
|
|
4937
|
-
if (top < minTop) top = minTop;
|
|
4938
|
-
if (top > maxTop) top = maxTop;
|
|
4939
|
-
|
|
4940
|
-
// compute left and clamp horizontally
|
|
4941
|
-
var left = rect.right + scrollX - menuWidth;
|
|
4942
|
-
if (left < margin) left = margin;
|
|
4943
|
-
if (left + menuWidth > window.innerWidth - margin) {
|
|
4944
|
-
left = Math.max(margin, window.innerWidth - menuWidth - margin);
|
|
4945
|
-
}
|
|
4946
|
-
var transformOrigin = placement === "bottom" ? "top right" : "bottom right";
|
|
4947
|
-
|
|
4948
|
-
// set style (opacity 1 to fade-in)
|
|
4949
|
-
setStyle({
|
|
4950
|
-
left: left,
|
|
4951
|
-
top: top,
|
|
4952
|
-
transformOrigin: transformOrigin,
|
|
4953
|
-
maxHeight: allowedMaxHeight,
|
|
4954
|
-
width: menuWidth,
|
|
4955
|
-
opacity: 1
|
|
4956
|
-
});
|
|
4957
|
-
};
|
|
4958
|
-
|
|
4959
|
-
// useLayoutEffect so the position is measured & applied before paint
|
|
4960
|
-
useLayoutEffect(function () {
|
|
4961
|
-
// compute once after mount
|
|
4962
|
-
computePosition();
|
|
4963
|
-
var onScrollOrResize = function onScrollOrResize() {
|
|
4964
|
-
// using requestAnimationFrame to avoid layout thrash on fast scroll/resize
|
|
4965
|
-
window.requestAnimationFrame(function () {
|
|
4966
|
-
return computePosition();
|
|
4967
|
-
});
|
|
4968
|
-
};
|
|
4969
|
-
window.addEventListener("resize", onScrollOrResize);
|
|
4970
|
-
// capture scrolls (true) so position updates even when scrolling ancestor elements
|
|
4971
|
-
window.addEventListener("scroll", onScrollOrResize, true);
|
|
4972
|
-
return function () {
|
|
4973
|
-
window.removeEventListener("resize", onScrollOrResize);
|
|
4974
|
-
window.removeEventListener("scroll", onScrollOrResize, true);
|
|
4975
|
-
};
|
|
4976
|
-
// Recompute when anchor element changes or actions change (content height may change).
|
|
4977
|
-
}, [anchorElem, actions, menuRef]);
|
|
4978
|
-
return /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement("div", {
|
|
4979
|
-
ref: menuRef,
|
|
4980
|
-
style: {
|
|
4981
|
-
position: "absolute",
|
|
4982
|
-
top: style.top,
|
|
4983
|
-
left: style.left,
|
|
4984
|
-
width: style.width,
|
|
4985
|
-
maxHeight: style.maxHeight,
|
|
4986
|
-
transformOrigin: style.transformOrigin,
|
|
4987
|
-
opacity: style.opacity
|
|
4988
|
-
},
|
|
4989
|
-
className: "absolute z-50 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 overflow-y-auto transition-opacity duration-150 ease-out",
|
|
4990
|
-
onClick: function onClick(e) {
|
|
4991
|
-
return e.stopPropagation();
|
|
4992
|
-
}
|
|
4993
|
-
}, /*#__PURE__*/React__default.createElement("div", {
|
|
4994
|
-
className: "p-1"
|
|
4995
|
-
}, actions.length === 0 ? /*#__PURE__*/React__default.createElement("div", {
|
|
4996
|
-
className: "px-3 py-2 text-sm text-gray-500"
|
|
4997
|
-
}, "No actions") : actions.map(function (action) {
|
|
4998
|
-
return /*#__PURE__*/React__default.createElement("div", {
|
|
4999
|
-
key: action.name,
|
|
5000
|
-
className: "px-1"
|
|
5001
|
-
}, action.render ? /*#__PURE__*/React__default.createElement("button", {
|
|
5002
|
-
className: "w-full text-left px-3 py-2 text-sm hover:bg-gray-100 flex items-center gap-2 rounded-md",
|
|
5003
|
-
onClick: function onClick(e) {
|
|
5004
|
-
e.stopPropagation();
|
|
5005
|
-
onAction === null || onAction === void 0 || onAction(action, anchorRow);
|
|
5006
|
-
}
|
|
5007
|
-
}, action.render(anchorRow)) : /*#__PURE__*/React__default.createElement("button", {
|
|
5008
|
-
className: "w-full text-left px-3 py-2 text-sm hover:bg-gray-100 flex items-center gap-2 rounded-md",
|
|
5009
|
-
onClick: function onClick(e) {
|
|
5010
|
-
e.stopPropagation();
|
|
5011
|
-
onAction === null || onAction === void 0 || onAction(action, anchorRow);
|
|
5012
|
-
}
|
|
5013
|
-
}, action.icon && /*#__PURE__*/React__default.createElement("span", {
|
|
5014
|
-
className: "inline-flex"
|
|
5015
|
-
}, action.icon), /*#__PURE__*/React__default.createElement("span", null, action.label)));
|
|
5016
|
-
}))), document.body);
|
|
5017
|
-
}
|
|
5018
4973
|
|
|
5019
4974
|
var isCheckBoxInput = (element) => element.type === 'checkbox';
|
|
5020
4975
|
|