@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.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, useLayoutEffect, useCallback, createContext, useContext, cloneElement, PureComponent } from 'react';
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", "onPageChange"];
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
- var Table = function Table(_ref) {
3870
- var _ref$data = _ref.data,
3871
- data = _ref$data === void 0 ? [] : _ref$data,
3872
- _ref$columns = _ref.columns,
3873
- columns = _ref$columns === void 0 ? [] : _ref$columns,
3874
- _ref$sortable = _ref.sortable,
3875
- sortable = _ref$sortable === void 0 ? true : _ref$sortable,
3876
- _ref$filterable = _ref.filterable,
3877
- filterable = _ref$filterable === void 0 ? false : _ref$filterable,
3878
- _ref$selectable = _ref.selectable,
3879
- selectable = _ref$selectable === void 0 ? false : _ref$selectable,
3880
- _ref$pagination = _ref.pagination,
3881
- pagination = _ref$pagination === void 0 ? false : _ref$pagination,
3882
- _ref$pageSize = _ref.pageSize,
3883
- pageSize = _ref$pageSize === void 0 ? 25 : _ref$pageSize,
3884
- onSort = _ref.onSort,
3885
- onFilter = _ref.onFilter,
3886
- onFetch = _ref.onFetch,
3887
- onFilterChange = _ref.onFilterChange,
3888
- onSelectionChange = _ref.onSelectionChange,
3889
- onRowClick = _ref.onRowClick,
3890
- _ref$hasDetails = _ref.hasDetails,
3891
- hasDetails = _ref$hasDetails === void 0 ? false : _ref$hasDetails,
3892
- _ref$DetailsComponent = _ref.DetailsComponent,
3893
- DetailsComponent = _ref$DetailsComponent === void 0 ? null : _ref$DetailsComponent,
3894
- className = _ref.className,
3895
- _ref$withAction = _ref.withAction,
3896
- withAction = _ref$withAction === void 0 ? true : _ref$withAction,
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
- actions = _ref.actions,
3899
- _ref$showSerial = _ref.showSerial,
3900
- showSerial = _ref$showSerial === void 0 ? true : _ref$showSerial,
3901
- cellClass = _ref.cellClass,
3902
- rowClass = _ref.rowClass,
3903
- _ref$globalSearch = _ref.globalSearch,
3904
- globalSearch = _ref$globalSearch === void 0 ? false : _ref$globalSearch,
3905
- _ref$limitOptions = _ref.limitOptions,
3906
- limitOptions = _ref$limitOptions === void 0 ? [10, 25, 50, 100] : _ref$limitOptions,
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
- isMobileView = _useState2[0],
3931
- setIsMobileView = _useState2[1];
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
- // Keep original table data / loading
3934
- var _useState3 = useState(Array.isArray(data) ? data : []),
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
- tableData = _useState4[0],
3937
- setTableData = _useState4[1];
3938
- var _useState5 = useState(false),
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
- loading = _useState6[0],
3941
- setLoading = _useState6[1];
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 visibility state
3944
- var _useState7 = useState(function () {
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
- _useState8 = _slicedToArray(_useState7, 2),
3950
- columnsState = _useState8[0],
3951
- setColumnsState = _useState8[1];
3952
- useEffect(function () {
3953
- // Sync when prop changes
3954
- setColumnsState(Array.isArray(columns) ? columns.map(function (c) {
3955
- return _objectSpread$9({}, c);
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
- // Other states
3972
- var _useState11 = useState({
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
- expandedRows = _useState16[0],
3986
- setExpandedRows = _useState16[1];
3987
- var _useState17 = useState(typeof pageNumber === "number" ? pageNumber : 1),
4133
+ sortConfig = _useState16[0],
4134
+ setSortConfig = _useState16[1];
4135
+ var _useState17 = useState({}),
3988
4136
  _useState18 = _slicedToArray(_useState17, 2),
3989
- currentPage = _useState18[0],
3990
- setCurrentPage = _useState18[1];
3991
- var _useState19 = useState({}),
4137
+ filters = _useState18[0],
4138
+ setFilters = _useState18[1];
4139
+ var _useState19 = useState(""),
3992
4140
  _useState20 = _slicedToArray(_useState19, 2),
3993
- filters = _useState20[0],
3994
- setFilters = _useState20[1];
3995
- var _useState21 = useState(filters.global || ""),
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
- searchInput = _useState22[0],
3998
- setSearchInput = _useState22[1];
3999
- var _useState23 = useState(false),
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
- showMobileFilters = _useState24[0],
4002
- setShowMobileFilters = _useState24[1];
4155
+ expandedRows = _useState24[0],
4156
+ setExpandedRows = _useState24[1];
4003
4157
 
4004
- // Popover per-row
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
- // Per-row action menu open key
4012
- var _useState27 = useState(null),
4013
- _useState28 = _slicedToArray(_useState27, 2),
4014
- openActionKey = _useState28[0],
4015
- setOpenActionKey = _useState28[1];
4016
- var openRef = useRef(null);
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
- // Check if mobile view
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
- // Close column menu when clicking outside
4046
- useEffect(function () {
4047
- var onDocClick = function onDocClick(e) {
4048
- if (showColumnMenu && columnMenuRef.current && !columnMenuRef.current.contains(e.target) && columnToggleBtnRef.current && !columnToggleBtnRef.current.contains(e.target)) {
4049
- setShowColumnMenu(false);
4050
- }
4051
- };
4052
- document.addEventListener("click", onDocClick);
4053
- return function () {
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 derived from columnsState
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
- // Handle actions
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") return direction === "asc" ? av - bv : bv - av;
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
- // Filtering
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
- // Selection handlers
4189
- var handleSelectAll = function handleSelectAll() {
4190
- var newSelection = new Set(selectedRows);
4191
- var pageRowKeys = paginatedData.map(function (r, i) {
4192
- return getRowKey(r, startIndex + i);
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
- var allSelected = pageRowKeys.every(function (k) {
4195
- return newSelection.has(k);
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
- if (allSelected) {
4198
- pageRowKeys.forEach(function (k) {
4199
- return newSelection["delete"](k);
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
- } else {
4202
- pageRowKeys.forEach(function (k) {
4203
- return newSelection.add(k);
4326
+ var allSelected = pageRowKeys.every(function (k) {
4327
+ return newSelection.has(k);
4204
4328
  });
4205
- }
4206
- setSelectedRows(newSelection);
4207
- var keyToRow = new Map(filteredData.map(function (r, i) {
4208
- return [getRowKey(r, i), r];
4209
- }));
4210
- var selectedData = Array.from(newSelection).map(function (k) {
4211
- return keyToRow.get(k);
4212
- }).filter(Boolean);
4213
- onSelectionChange === null || onSelectionChange === void 0 || onSelectionChange(selectedData);
4214
- };
4215
- var handleSelectRow = function handleSelectRow(row, rowIndexInPage) {
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
- var newSelection = new Set(selectedRows);
4219
- if (newSelection.has(key)) newSelection["delete"](key);else newSelection.add(key);
4220
- setSelectedRows(newSelection);
4221
- var keyToRow = new Map(filteredData.map(function (r, i) {
4222
- return [getRowKey(r, i), r];
4223
- }));
4224
- var selectedData = Array.from(newSelection).map(function (k) {
4225
- return keyToRow.get(k);
4226
- }).filter(Boolean);
4227
- onSelectionChange === null || onSelectionChange === void 0 || onSelectionChange(selectedData);
4228
- };
4229
- var toggleExpandRow = function toggleExpandRow(row, rowIndexInPage) {
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
- var newExpanded = new Set(expandedRows);
4233
- if (newExpanded.has(key)) newExpanded["delete"](key);else newExpanded.add(key);
4234
- setExpandedRows(newExpanded);
4235
- };
4236
- var handleFilter = function handleFilter(key, value) {
4237
- var newFilters = _objectSpread$9(_objectSpread$9({}, filters), {}, _defineProperty$4({}, key, value));
4238
- setFilters(newFilters);
4239
- onFilter === null || onFilter === void 0 || onFilter(newFilters);
4240
- onFilterChange === null || onFilterChange === void 0 || onFilterChange(newFilters);
4241
- setCurrentPage(1);
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
- if (actionAnchor && actionAnchor.key === actionCellKey) {
4253
- setOpenActionKey(null);
4254
- setActionAnchor(null);
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
- useEffect(function () {
4265
- if (!actionAnchor) return;
4266
- var onDocClick = function onDocClick(ev) {
4267
- if (actionMenuRef.current && (actionMenuRef.current.contains(ev.target) || actionAnchor.elem && actionAnchor.elem.contains(ev.target))) {
4268
- return;
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
- // Global search
4435
+ // Sync searchInput with filters.global
4308
4436
  useEffect(function () {
4309
4437
  setSearchInput(filters.global || "");
4310
4438
  }, [filters.global]);
4311
- var applyGlobalSearch = function applyGlobalSearch() {
4312
- handleFilter("global", searchInput);
4313
- };
4314
- var onGlobalKeyDown = function onGlobalKeyDown(e) {
4315
- if (e.key === "Enter") {
4316
- e.preventDefault();
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 renderMobileCard(row, rowIndexInPage) {
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 && !selectedRows.has(key) ? stripedColors[globalIndex % stripedColors.length] : undefined;
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": selectedRows.has(key),
4347
- "hover:shadow-md": !selectedRows.has(key)
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": expandedRows.has(key),
4481
+ "aria-expanded": isExpanded,
4362
4482
  className: "p-1 rounded hover:bg-gray-200"
4363
- }, expandedRows.has(key) ? "▾" : "▸"), selectable && /*#__PURE__*/React__default.createElement("input", {
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: selectedRows.has(key),
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.stopPropagation();
4381
- toggleActions(e, actionCellKey, row);
4500
+ return toggleActions(e, actionCellKey, row);
4382
4501
  },
4383
- "aria-expanded": openActionKey === actionCellKey,
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 && actionAnchor.key === actionCellKey && /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement(ActionMenuPortal, {
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 && expandedRows.has(key) && DetailsComponent && /*#__PURE__*/React__default.createElement("div", {
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 renderMobileFilters() {
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(!showMobileFilters);
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", null, /*#__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
- }))), filterable && visibleColumns.map(function (column) {
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
- // Render
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: Array.isArray(limitOptions) && limitOptions.length > 0 ? limitOptions.map(function (opt) {
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: function onChange(e) {
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, " ", "results"), pagination && /*#__PURE__*/React__default.createElement("div", {
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 setCurrentPage(function (p) {
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 setCurrentPage(function (p) {
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
- })))))), globalSearch && /*#__PURE__*/React__default.createElement("div", {
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: paginatedData.length > 0 && paginatedData.every(function (r, i) {
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 && !selectedRows.has(key) ? stripedColors[globalIndex % stripedColors.length] : undefined;
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": selectedRows.has(key)
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": expandedRows.has(key),
4843
+ "aria-expanded": isExpanded,
4730
4844
  className: "p-1 rounded hover:bg-gray-100"
4731
- }, expandedRows.has(key) ? "▾" : "▸")), showSerial && /*#__PURE__*/React__default.createElement("td", {
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: selectedRows.has(key),
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": openActionKey === actionCellKey,
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 && actionAnchor.key === actionCellKey && /*#__PURE__*/createPortal(/*#__PURE__*/React__default.createElement(ActionMenuPortal, {
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 && expandedRows.has(key) && DetailsComponent && /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
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("div", null, /*#__PURE__*/React__default.createElement(DetailsComponent, {
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 setCurrentPage(function (p) {
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 setCurrentPage(pageNum);
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 setCurrentPage(function (p) {
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