@dreamtree-org/twreact-ui 1.0.87 → 1.0.89

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
- import * as React from 'react';
2
- import React__default, { forwardRef, createElement, useId, useRef, useState, useEffect, useImperativeHandle, useMemo, useCallback, memo, useLayoutEffect, createContext, useContext, cloneElement, PureComponent } from 'react';
1
+ import * as React$1 from 'react';
2
+ import React__default, { forwardRef, createElement, useId, useRef, useState, useEffect, useImperativeHandle, useMemo, memo, useLayoutEffect, useCallback, createContext, useContext, cloneElement, PureComponent } from 'react';
3
3
  import ReactDOM, { createPortal } from 'react-dom';
4
4
 
5
5
  function _extends() {
@@ -3346,8 +3346,8 @@ function _defineProperty$4(e, r, t) {
3346
3346
  }
3347
3347
 
3348
3348
  var _excluded$l = ["options", "value", "onChange", "placeholder", "label", "error", "disabled", "required", "multiSelect", "searchable", "grouped", "onMenuItemRender", "className", "allowClear", "creatable", "onCreateOption", "onSearch", "loading", "selectAllOption", "closeOnSelect", "maxTagCount", "renderGroupLabel", "name"];
3349
- function ownKeys$a(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; }
3350
- function _objectSpread$a(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$a(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$a(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3349
+ function ownKeys$b(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; }
3350
+ function _objectSpread$b(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$b(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$b(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3351
3351
 
3352
3352
  /**
3353
3353
  * Enhanced Select component (debounce removed)
@@ -3370,7 +3370,7 @@ var flattenGroups = function flattenGroups() {
3370
3370
  return groups.reduce(function (acc, g) {
3371
3371
  var groupLabel = g.label;
3372
3372
  g.options.forEach(function (opt) {
3373
- return acc.push(_objectSpread$a(_objectSpread$a({}, opt), {}, {
3373
+ return acc.push(_objectSpread$b(_objectSpread$b({}, opt), {}, {
3374
3374
  _group: groupLabel
3375
3375
  }));
3376
3376
  });
@@ -3460,7 +3460,7 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3460
3460
  var flatOptions = useMemo(function () {
3461
3461
  if (grouped) return flattenGroups(options);
3462
3462
  return options.map(function (opt) {
3463
- return _objectSpread$a({}, opt);
3463
+ return _objectSpread$b({}, opt);
3464
3464
  });
3465
3465
  }, [options, grouped]);
3466
3466
  var selectedValues = multiSelect ? Array.isArray(value) ? value : [] : value;
@@ -3487,7 +3487,7 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3487
3487
  }
3488
3488
  if (grouped) {
3489
3489
  return options.map(function (g) {
3490
- return _objectSpread$a(_objectSpread$a({}, g), {}, {
3490
+ return _objectSpread$b(_objectSpread$b({}, g), {}, {
3491
3491
  options: g.options.filter(function (o) {
3492
3492
  return o.label.toLowerCase().includes(searchTerm.toLowerCase());
3493
3493
  })
@@ -3714,7 +3714,7 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3714
3714
  className: "text-xs border border-slate-200 p-0.5 rounded-md cursor-pointer hover:bg-gray-100",
3715
3715
  onClick: function onClick() {
3716
3716
  return setCollapsedGroups(function (prev) {
3717
- return _objectSpread$a(_objectSpread$a({}, prev), {}, _defineProperty$4({}, group.label, !prev[group.label]));
3717
+ return _objectSpread$b(_objectSpread$b({}, prev), {}, _defineProperty$4({}, group.label, !prev[group.label]));
3718
3718
  });
3719
3719
  }
3720
3720
  }, /*#__PURE__*/React__default.createElement(ChevronDown, {
@@ -3901,18 +3901,13 @@ var Select = /*#__PURE__*/React__default.forwardRef(function (_ref, forwardedRef
3901
3901
  }, error));
3902
3902
  });
3903
3903
 
3904
- 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"];
3905
- 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; }
3906
- 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; }
3907
-
3908
- // Move static default actions outside component to prevent recreation
3909
3904
  var DEFAULT_ACTIONS = [{
3910
3905
  name: "edit",
3911
3906
  label: "Edit",
3912
3907
  onClick: function onClick() {
3913
3908
  return console.log("Edit action clicked");
3914
3909
  },
3915
- icon: /*#__PURE__*/React__default.createElement(PenSquare, {
3910
+ icon: /*#__PURE__*/React.createElement(PenSquare, {
3916
3911
  size: 16
3917
3912
  })
3918
3913
  }, {
@@ -3921,7 +3916,7 @@ var DEFAULT_ACTIONS = [{
3921
3916
  onClick: function onClick() {
3922
3917
  return console.log("Delete action clicked");
3923
3918
  },
3924
- icon: /*#__PURE__*/React__default.createElement(Trash, {
3919
+ icon: /*#__PURE__*/React.createElement(Trash, {
3925
3920
  size: 16
3926
3921
  })
3927
3922
  }, {
@@ -3930,12 +3925,50 @@ var DEFAULT_ACTIONS = [{
3930
3925
  onClick: function onClick() {
3931
3926
  return console.log("View action clicked");
3932
3927
  },
3933
- icon: /*#__PURE__*/React__default.createElement(Eye, {
3928
+ icon: /*#__PURE__*/React.createElement(Eye, {
3934
3929
  size: 16
3935
3930
  })
3936
3931
  }];
3937
3932
 
3938
- // Simple inline action menu component (no portal)
3933
+ /**
3934
+ * Generate a unique key for a row based on id, _id, or index
3935
+ */
3936
+ var getRowKey = function getRowKey(row, globalIndex) {
3937
+ if (row == null) return String(globalIndex);
3938
+ if (row.id !== undefined && row.id !== null) return String(row.id);
3939
+ if (row._id !== undefined && row._id !== null) return String(row._id);
3940
+ return String(globalIndex);
3941
+ };
3942
+
3943
+ /**
3944
+ * Custom hook to detect clicks outside of specified refs
3945
+ * @param {Array} refs - Array of React refs to check
3946
+ * @param {boolean} isActive - Whether the hook should be active
3947
+ * @param {Function} onClickOutside - Callback when click is detected outside
3948
+ */
3949
+ function useClickOutside(refs, isActive, onClickOutside) {
3950
+ useEffect(function () {
3951
+ if (!isActive) return;
3952
+ var handler = function handler(e) {
3953
+ var isOutside = refs.every(function (ref) {
3954
+ return !ref.current || !ref.current.contains(e.target);
3955
+ });
3956
+ if (isOutside) onClickOutside();
3957
+ };
3958
+ document.addEventListener("mousedown", handler, true);
3959
+ return function () {
3960
+ return document.removeEventListener("mousedown", handler, true);
3961
+ };
3962
+ }, [refs, isActive, onClickOutside]);
3963
+ }
3964
+
3965
+ function ownKeys$a(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; }
3966
+ function _objectSpread$a(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$a(Object(t), true).forEach(function (r) { _defineProperty$4(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$a(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3967
+
3968
+ /**
3969
+ * Action menu dropdown component for table row actions
3970
+ * Uses fixed positioning with smart placement above/below anchor
3971
+ */
3939
3972
  var ActionMenu = /*#__PURE__*/memo(function ActionMenu(_ref) {
3940
3973
  var _ref$actions = _ref.actions,
3941
3974
  actions = _ref$actions === void 0 ? [] : _ref$actions,
@@ -3952,12 +3985,10 @@ var ActionMenu = /*#__PURE__*/memo(function ActionMenu(_ref) {
3952
3985
  _useState2 = _slicedToArray(_useState, 2),
3953
3986
  pos = _useState2[0],
3954
3987
  setPos = _useState2[1];
3955
-
3956
- // compute position after mount / when anchor changes
3957
3988
  useLayoutEffect(function () {
3958
3989
  if (!anchorEl || !(menuRef !== null && menuRef !== void 0 && menuRef.current) || typeof window === "undefined") {
3959
3990
  setPos(function (p) {
3960
- return _objectSpread$9(_objectSpread$9({}, p), {}, {
3991
+ return _objectSpread$a(_objectSpread$a({}, p), {}, {
3961
3992
  visibility: "hidden"
3962
3993
  });
3963
3994
  });
@@ -3965,30 +3996,29 @@ var ActionMenu = /*#__PURE__*/memo(function ActionMenu(_ref) {
3965
3996
  }
3966
3997
  var menu = menuRef.current;
3967
3998
  var rect = anchorEl.getBoundingClientRect();
3968
- var menuWidth = menu.offsetWidth || 176; // w-44 ~ 176px fallback
3999
+ var menuWidth = menu.offsetWidth || 176;
3969
4000
  var menuHeight = menu.offsetHeight || menu.scrollHeight || 200;
3970
4001
  var viewportWidth = window.innerWidth;
3971
4002
  var viewportHeight = window.innerHeight;
3972
4003
  var scrollX = window.scrollX || window.pageXOffset || 0;
3973
4004
  var scrollY = window.scrollY || window.pageYOffset || 0;
3974
-
3975
- // prefer placing below the button
3976
4005
  var preferBelowTop = rect.bottom + scrollY + 6;
3977
4006
  var preferAboveTop = rect.top + scrollY - menuHeight - 6;
3978
4007
 
3979
- // compute left so right-aligned to the button's right edge
4008
+ // Calculate horizontal position
3980
4009
  var left = rect.right + scrollX - menuWidth;
3981
4010
  if (left < 8) left = 8;
3982
- if (left + menuWidth > viewportWidth - 8) left = Math.max(8, viewportWidth - menuWidth - 8);
4011
+ if (left + menuWidth > viewportWidth - 8) {
4012
+ left = Math.max(8, viewportWidth - menuWidth - 8);
4013
+ }
3983
4014
 
3984
- // choose top based on available space
4015
+ // Calculate vertical position
3985
4016
  var top;
3986
4017
  if (preferBelowTop + menuHeight <= scrollY + viewportHeight - 8) {
3987
4018
  top = preferBelowTop;
3988
4019
  } else if (preferAboveTop >= scrollY + 8) {
3989
4020
  top = preferAboveTop;
3990
4021
  } else {
3991
- // fallback: clamp inside viewport
3992
4022
  top = Math.max(scrollY + 8, Math.min(preferBelowTop, scrollY + viewportHeight - menuHeight - 8));
3993
4023
  }
3994
4024
  setPos({
@@ -4004,7 +4034,7 @@ var ActionMenu = /*#__PURE__*/memo(function ActionMenu(_ref) {
4004
4034
  top: pos.top,
4005
4035
  left: pos.left,
4006
4036
  visibility: pos.visibility,
4007
- minWidth: 176 // match w-44 fallback
4037
+ minWidth: 176
4008
4038
  },
4009
4039
  onClick: function onClick(e) {
4010
4040
  return e.stopPropagation();
@@ -4030,240 +4060,703 @@ var ActionMenu = /*#__PURE__*/memo(function ActionMenu(_ref) {
4030
4060
  })));
4031
4061
  });
4032
4062
 
4033
- // Custom hook for click-outside detection (consolidates 3 handlers into 1)
4034
- function useClickOutside(refs, isActive, onClickOutside) {
4035
- useEffect(function () {
4036
- if (!isActive) return;
4037
- var handler = function handler(e) {
4038
- var isOutside = refs.every(function (ref) {
4039
- return !ref.current || !ref.current.contains(e.target);
4040
- });
4041
- if (isOutside) onClickOutside();
4042
- };
4063
+ /**
4064
+ * Pagination controls component for the table
4065
+ * Supports both header (icon-only) and footer (with page numbers) variants
4066
+ */
4043
4067
 
4044
- // Use capture phase to ensure we handle clicks before they bubble
4045
- document.addEventListener("mousedown", handler, true);
4046
- return function () {
4047
- return document.removeEventListener("mousedown", handler, true);
4048
- };
4049
- }, [refs, isActive, onClickOutside]);
4068
+ // Header pagination (compact, icon-based)
4069
+ function PaginationHeader(_ref) {
4070
+ var currentPage = _ref.currentPage,
4071
+ totalPages = _ref.totalPages,
4072
+ onPageChange = _ref.onPageChange;
4073
+ return /*#__PURE__*/React__default.createElement("div", {
4074
+ className: "flex items-center gap-1"
4075
+ }, totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
4076
+ className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4077
+ disabled: currentPage === 1,
4078
+ onClick: function onClick() {
4079
+ return onPageChange(1);
4080
+ },
4081
+ "aria-label": "First page"
4082
+ }, /*#__PURE__*/React__default.createElement(ChevronsLeft, {
4083
+ className: "size-4 md:size-5 text-gray-800"
4084
+ })), /*#__PURE__*/React__default.createElement("button", {
4085
+ className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4086
+ disabled: currentPage === 1,
4087
+ onClick: function onClick() {
4088
+ return onPageChange(Math.max(1, currentPage - 1));
4089
+ },
4090
+ "aria-label": "Previous page"
4091
+ }, /*#__PURE__*/React__default.createElement(ChevronLeft, {
4092
+ className: "size-4 md:size-5 text-gray-800"
4093
+ })), /*#__PURE__*/React__default.createElement("button", {
4094
+ className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4095
+ disabled: currentPage === totalPages,
4096
+ onClick: function onClick() {
4097
+ return onPageChange(Math.min(totalPages, currentPage + 1));
4098
+ },
4099
+ "aria-label": "Next page"
4100
+ }, /*#__PURE__*/React__default.createElement(ChevronRight, {
4101
+ className: "size-4 md:size-5 text-gray-800"
4102
+ })), totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
4103
+ className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4104
+ disabled: currentPage === totalPages,
4105
+ onClick: function onClick() {
4106
+ return onPageChange(totalPages);
4107
+ },
4108
+ "aria-label": "Last page"
4109
+ }, /*#__PURE__*/React__default.createElement(ChevronsRight, {
4110
+ className: "size-4 md:size-5 text-gray-800"
4111
+ })));
4050
4112
  }
4051
4113
 
4052
- // Helper to get row key - stable function
4053
- var getRowKey = function getRowKey(row, globalIndex) {
4054
- if (row == null) return String(globalIndex);
4055
- if (row.id !== undefined && row.id !== null) return String(row.id);
4056
- if (row._id !== undefined && row._id !== null) return String(row._id);
4057
- return String(globalIndex);
4058
- };
4059
- var Table = function Table(_ref2) {
4060
- var _ref2$data = _ref2.data,
4061
- data = _ref2$data === void 0 ? [] : _ref2$data,
4062
- _ref2$columns = _ref2.columns,
4063
- columns = _ref2$columns === void 0 ? [] : _ref2$columns,
4064
- _ref2$sortable = _ref2.sortable,
4065
- sortable = _ref2$sortable === void 0 ? true : _ref2$sortable,
4066
- _ref2$filterable = _ref2.filterable,
4067
- filterable = _ref2$filterable === void 0 ? false : _ref2$filterable,
4068
- _ref2$selectable = _ref2.selectable,
4069
- selectable = _ref2$selectable === void 0 ? false : _ref2$selectable,
4070
- _ref2$pagination = _ref2.pagination,
4071
- pagination = _ref2$pagination === void 0 ? false : _ref2$pagination,
4072
- _ref2$pageSize = _ref2.pageSize,
4073
- pageSize = _ref2$pageSize === void 0 ? 25 : _ref2$pageSize,
4074
- onSort = _ref2.onSort,
4075
- onFilter = _ref2.onFilter,
4076
- onFetch = _ref2.onFetch,
4077
- onFilterChange = _ref2.onFilterChange,
4078
- onSelectionChange = _ref2.onSelectionChange,
4079
- onRowClick = _ref2.onRowClick,
4080
- _ref2$hasDetails = _ref2.hasDetails,
4081
- hasDetails = _ref2$hasDetails === void 0 ? false : _ref2$hasDetails,
4082
- _ref2$DetailsComponen = _ref2.DetailsComponent,
4083
- DetailsComponent = _ref2$DetailsComponen === void 0 ? null : _ref2$DetailsComponen,
4084
- className = _ref2.className,
4085
- _ref2$withAction = _ref2.withAction,
4086
- withAction = _ref2$withAction === void 0 ? true : _ref2$withAction,
4087
- onAction = _ref2.onAction,
4088
- actions = _ref2.actions,
4089
- _ref2$showSerial = _ref2.showSerial,
4090
- showSerial = _ref2$showSerial === void 0 ? true : _ref2$showSerial,
4091
- cellClass = _ref2.cellClass,
4092
- rowClass = _ref2.rowClass,
4093
- _ref2$globalSearch = _ref2.globalSearch,
4094
- globalSearch = _ref2$globalSearch === void 0 ? false : _ref2$globalSearch,
4095
- _ref2$limitOptions = _ref2.limitOptions,
4096
- limitOptions = _ref2$limitOptions === void 0 ? [10, 25, 50, 100] : _ref2$limitOptions,
4097
- _ref2$showLimitSelect = _ref2.showLimitSelector,
4098
- showLimitSelector = _ref2$showLimitSelect === void 0 ? true : _ref2$showLimitSelect,
4099
- onLimitChange = _ref2.onLimitChange,
4100
- _ref2$showReloadButto = _ref2.showReloadButton,
4101
- showReloadButton = _ref2$showReloadButto === void 0 ? true : _ref2$showReloadButto,
4102
- renderReloadButton = _ref2.renderReloadButton,
4103
- onReload = _ref2.onReload,
4104
- _ref2$stripedRows = _ref2.stripedRows,
4105
- stripedRows = _ref2$stripedRows === void 0 ? true : _ref2$stripedRows,
4106
- _ref2$stripedColors = _ref2.stripedColors,
4107
- stripedColors = _ref2$stripedColors === void 0 ? ["#ffffff", "#f7fafc"] : _ref2$stripedColors,
4108
- _ref2$responsiveBreak = _ref2.responsiveBreakpoint,
4109
- responsiveBreakpoint = _ref2$responsiveBreak === void 0 ? 768 : _ref2$responsiveBreak,
4110
- _ref2$serverSide = _ref2.serverSide,
4111
- serverSide = _ref2$serverSide === void 0 ? false : _ref2$serverSide,
4112
- _ref2$totalRecords = _ref2.totalRecords,
4113
- totalRecords = _ref2$totalRecords === void 0 ? 0 : _ref2$totalRecords,
4114
- pageNumber = _ref2.pageNumber,
4115
- props = _objectWithoutProperties$1(_ref2, _excluded$k);
4116
- // Core state
4117
- var _useState3 = useState(false),
4118
- _useState4 = _slicedToArray(_useState3, 2),
4119
- isMobileView = _useState4[0],
4120
- setIsMobileView = _useState4[1];
4121
- var _useState5 = useState(function () {
4122
- return Array.isArray(data) ? data : [];
4123
- }),
4124
- _useState6 = _slicedToArray(_useState5, 2),
4125
- tableData = _useState6[0],
4126
- setTableData = _useState6[1];
4127
- var _useState7 = useState(false),
4128
- _useState8 = _slicedToArray(_useState7, 2),
4129
- loading = _useState8[0],
4130
- setLoading = _useState8[1];
4131
- var _useState9 = useState(pageSize),
4132
- _useState0 = _slicedToArray(_useState9, 2),
4133
- limit = _useState0[0],
4134
- setLimit = _useState0[1];
4135
- var _useState1 = useState(function () {
4136
- return typeof pageNumber === "number" ? pageNumber : 1;
4137
- }),
4138
- _useState10 = _slicedToArray(_useState1, 2),
4139
- currentPage = _useState10[0],
4140
- setCurrentPage = _useState10[1];
4141
-
4142
- // Column state
4143
- var _useState11 = useState(function () {
4144
- return Array.isArray(columns) ? columns.map(function (c) {
4145
- return _objectSpread$9({}, c);
4146
- }) : [];
4147
- }),
4148
- _useState12 = _slicedToArray(_useState11, 2),
4149
- columnsState = _useState12[0],
4150
- setColumnsState = _useState12[1];
4151
- var _useState13 = useState(false),
4152
- _useState14 = _slicedToArray(_useState13, 2),
4153
- showColumnMenu = _useState14[0],
4154
- setShowColumnMenu = _useState14[1];
4155
-
4156
- // Sorting/filtering state
4157
- var _useState15 = useState({
4158
- key: null,
4159
- direction: "asc"
4160
- }),
4161
- _useState16 = _slicedToArray(_useState15, 2),
4162
- sortConfig = _useState16[0],
4163
- setSortConfig = _useState16[1];
4164
- var _useState17 = useState({}),
4165
- _useState18 = _slicedToArray(_useState17, 2),
4166
- filters = _useState18[0],
4167
- setFilters = _useState18[1];
4168
- var _useState19 = useState(""),
4169
- _useState20 = _slicedToArray(_useState19, 2),
4170
- searchInput = _useState20[0],
4171
- setSearchInput = _useState20[1];
4172
-
4173
- // Selection/expansion state
4174
- var _useState21 = useState(function () {
4175
- return new Set();
4176
- }),
4177
- _useState22 = _slicedToArray(_useState21, 2),
4178
- selectedRows = _useState22[0],
4179
- setSelectedRows = _useState22[1];
4180
- var _useState23 = useState(function () {
4181
- return new Set();
4182
- }),
4183
- _useState24 = _slicedToArray(_useState23, 2),
4184
- expandedRows = _useState24[0],
4185
- setExpandedRows = _useState24[1];
4186
-
4187
- // Action menu state - simplified to just store the clicked row key
4188
- var _useState25 = useState(null),
4189
- _useState26 = _slicedToArray(_useState25, 2),
4190
- activeActionRowKey = _useState26[0],
4191
- setActiveActionRowKey = _useState26[1];
4192
- var _useState27 = useState(false),
4193
- _useState28 = _slicedToArray(_useState27, 2),
4194
- showMobileFilters = _useState28[0],
4195
- setShowMobileFilters = _useState28[1];
4196
-
4197
- // Refs
4198
- var columnMenuRef = useRef(null);
4199
- var columnToggleBtnRef = useRef(null);
4200
- var actionMenuRef = useRef(null);
4201
- var actionButtonRefs = useRef({});
4202
-
4203
- // Actions to use (memoized)
4204
- var actionsToUse = useMemo(function () {
4205
- return actions !== undefined ? actions : DEFAULT_ACTIONS;
4206
- }, [actions]);
4207
-
4208
- // Sync external props
4209
- useEffect(function () {
4210
- if (typeof pageNumber === "number" && pageNumber !== currentPage) {
4211
- setCurrentPage(pageNumber);
4114
+ // Footer pagination (with page numbers)
4115
+ function PaginationFooter(_ref2) {
4116
+ var currentPage = _ref2.currentPage,
4117
+ totalPages = _ref2.totalPages,
4118
+ onPageChange = _ref2.onPageChange,
4119
+ isMobileView = _ref2.isMobileView;
4120
+ var visiblePageCount = isMobileView ? 5 : 3;
4121
+ return /*#__PURE__*/React__default.createElement("div", {
4122
+ className: "p-4 border-t"
4123
+ }, /*#__PURE__*/React__default.createElement("div", {
4124
+ className: "flex flex-col sm:flex-row items-center justify-between gap-3"
4125
+ }, /*#__PURE__*/React__default.createElement("div", {
4126
+ className: "text-sm text-gray-600"
4127
+ }, "Page ", currentPage, " of ", totalPages), /*#__PURE__*/React__default.createElement("div", {
4128
+ className: "flex items-center gap-1 sm:gap-2"
4129
+ }, totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
4130
+ className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
4131
+ disabled: currentPage === 1,
4132
+ onClick: function onClick() {
4133
+ return onPageChange(1);
4134
+ },
4135
+ "aria-label": "First page"
4136
+ }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronsLeft, {
4137
+ className: "size-4 text-gray-800"
4138
+ }) : "First"), /*#__PURE__*/React__default.createElement("button", {
4139
+ className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
4140
+ disabled: currentPage === 1,
4141
+ onClick: function onClick() {
4142
+ return onPageChange(Math.max(1, currentPage - 1));
4143
+ },
4144
+ "aria-label": "Previous page"
4145
+ }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronLeft, {
4146
+ className: "size-4 text-gray-800"
4147
+ }) : "Previous"), /*#__PURE__*/React__default.createElement("div", {
4148
+ className: "flex items-center gap-1"
4149
+ }, Array.from({
4150
+ length: Math.min(visiblePageCount, totalPages)
4151
+ }, function (_, i) {
4152
+ var pageNum;
4153
+ if (totalPages <= 5) {
4154
+ pageNum = i + 1;
4155
+ } else if (currentPage <= 3) {
4156
+ pageNum = i + 1;
4157
+ } else if (currentPage >= totalPages - 2) {
4158
+ pageNum = totalPages - 4 + i;
4159
+ } else {
4160
+ pageNum = currentPage - 2 + i;
4212
4161
  }
4213
- }, [pageNumber]); // eslint-disable-line react-hooks/exhaustive-deps
4214
-
4215
- useEffect(function () {
4216
- setLimit(pageSize);
4217
- }, [pageSize]);
4218
- useEffect(function () {
4219
- setColumnsState(Array.isArray(columns) ? columns.map(function (c) {
4220
- return _objectSpread$9({}, c);
4221
- }) : []);
4222
- }, [columns]);
4162
+ return /*#__PURE__*/React__default.createElement("button", {
4163
+ key: pageNum,
4164
+ className: cn$1("h-8 w-8 rounded-lg md:rounded-md text-sm", {
4165
+ "bg-primary-600 text-white": pageNum === currentPage,
4166
+ "border border-gray-300 hover:bg-gray-50": pageNum !== currentPage
4167
+ }),
4168
+ onClick: function onClick() {
4169
+ return onPageChange(pageNum);
4170
+ }
4171
+ }, pageNum);
4172
+ })), /*#__PURE__*/React__default.createElement("button", {
4173
+ className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
4174
+ disabled: currentPage === totalPages,
4175
+ onClick: function onClick() {
4176
+ return onPageChange(Math.min(totalPages, currentPage + 1));
4177
+ },
4178
+ "aria-label": "Next page"
4179
+ }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronRight, {
4180
+ className: "size-4 text-gray-800"
4181
+ }) : "Next"), totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
4182
+ className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
4183
+ disabled: currentPage === totalPages,
4184
+ onClick: function onClick() {
4185
+ return onPageChange(totalPages);
4186
+ },
4187
+ "aria-label": "Last page"
4188
+ }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronsRight, {
4189
+ className: "size-4 text-gray-800"
4190
+ }) : "Last"))));
4191
+ }
4223
4192
 
4224
- // Single effect for data sync (consolidated from 3 effects)
4225
- useEffect(function () {
4226
- if (Array.isArray(data)) {
4227
- setTableData(data);
4193
+ /**
4194
+ * Column visibility toggle menu
4195
+ */
4196
+ function ColumnMenu(_ref) {
4197
+ var columns = _ref.columns,
4198
+ onToggle = _ref.onToggle,
4199
+ menuRef = _ref.menuRef;
4200
+ return /*#__PURE__*/React__default.createElement("div", {
4201
+ ref: menuRef,
4202
+ className: "absolute right-4 mt-2 w-56 z-50 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 p-3 lg:block sm:block hidden",
4203
+ onClick: function onClick(e) {
4204
+ return e.stopPropagation();
4228
4205
  }
4229
- }, [data]);
4230
-
4231
- // Mobile view detection
4232
- useEffect(function () {
4233
- var checkMobile = function checkMobile() {
4234
- return setIsMobileView(window.innerWidth < responsiveBreakpoint);
4235
- };
4236
- checkMobile();
4237
- window.addEventListener("resize", checkMobile);
4238
- return function () {
4239
- return window.removeEventListener("resize", checkMobile);
4240
- };
4241
- }, [responsiveBreakpoint]);
4206
+ }, /*#__PURE__*/React__default.createElement("p", {
4207
+ className: "text-sm font-medium text-center mb-2"
4208
+ }, "Show / hide columns"), /*#__PURE__*/React__default.createElement("div", {
4209
+ className: "max-h-56 overflow-auto"
4210
+ }, columns.map(function (col) {
4211
+ return /*#__PURE__*/React__default.createElement("label", {
4212
+ key: col.key,
4213
+ className: "flex cursor-pointer items-center gap-2 px-2 py-1.5 hover:bg-gray-50 rounded"
4214
+ }, /*#__PURE__*/React__default.createElement("input", {
4215
+ type: "checkbox",
4216
+ checked: col.isVisible !== false,
4217
+ onChange: function onChange() {
4218
+ return onToggle(col.key);
4219
+ },
4220
+ className: "rounded"
4221
+ }), /*#__PURE__*/React__default.createElement("span", {
4222
+ className: "text-sm font-normal"
4223
+ }, col.label));
4224
+ })));
4225
+ }
4242
4226
 
4243
- // Click-outside handlers (using consolidated hook)
4244
- var closeColumnMenu = useCallback(function () {
4245
- return setShowColumnMenu(false);
4246
- }, []);
4247
- var closeActionMenu = useCallback(function () {
4248
- return setActiveActionRowKey(null);
4249
- }, []);
4227
+ /**
4228
+ * Mobile-specific filters panel
4229
+ */
4230
+ function MobileFilters(_ref) {
4231
+ var showMobileFilters = _ref.showMobileFilters,
4232
+ setShowMobileFilters = _ref.setShowMobileFilters,
4233
+ globalSearch = _ref.globalSearch,
4234
+ searchInput = _ref.searchInput,
4235
+ setSearchInput = _ref.setSearchInput,
4236
+ onGlobalKeyDown = _ref.onGlobalKeyDown,
4237
+ filterable = _ref.filterable,
4238
+ visibleColumns = _ref.visibleColumns,
4239
+ filters = _ref.filters,
4240
+ handleFilter = _ref.handleFilter;
4241
+ return /*#__PURE__*/React__default.createElement("div", {
4242
+ className: "mb-4 p-3 bg-gray-50 rounded-lg"
4243
+ }, /*#__PURE__*/React__default.createElement("div", {
4244
+ className: "flex items-center justify-between mb-3"
4245
+ }, /*#__PURE__*/React__default.createElement("h3", {
4246
+ className: "text-sm font-medium text-gray-700"
4247
+ }, "Filters"), /*#__PURE__*/React__default.createElement("button", {
4248
+ onClick: function onClick() {
4249
+ return setShowMobileFilters(function (s) {
4250
+ return !s;
4251
+ });
4252
+ },
4253
+ className: "text-xs text-gray-500 hover:text-gray-700"
4254
+ }, showMobileFilters ? "Hide" : "Show")), showMobileFilters && /*#__PURE__*/React__default.createElement("div", {
4255
+ className: "space-y-3"
4256
+ }, globalSearch && /*#__PURE__*/React__default.createElement("div", {
4257
+ className: "relative"
4258
+ }, /*#__PURE__*/React__default.createElement("input", {
4259
+ type: "text",
4260
+ placeholder: "Search...",
4261
+ className: "w-full rounded-md border border-gray-300 px-4 py-2 text-sm",
4262
+ value: searchInput,
4263
+ onChange: function onChange(e) {
4264
+ return setSearchInput(e.target.value);
4265
+ },
4266
+ onKeyDown: onGlobalKeyDown
4267
+ }), /*#__PURE__*/React__default.createElement(Search, {
4268
+ className: "absolute right-3 top-2.5 h-4 w-4 text-gray-400"
4269
+ })), filterable && visibleColumns.map(function (column) {
4270
+ return /*#__PURE__*/React__default.createElement("div", {
4271
+ key: column.key
4272
+ }, /*#__PURE__*/React__default.createElement("label", {
4273
+ className: "block text-xs font-medium text-gray-600 mb-1"
4274
+ }, column.label), /*#__PURE__*/React__default.createElement("input", {
4275
+ type: "text",
4276
+ placeholder: "Filter ".concat(column.label),
4277
+ className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm",
4278
+ value: filters[column.key] || "",
4279
+ onChange: function onChange(e) {
4280
+ return handleFilter(column.key, e.target.value);
4281
+ }
4282
+ }));
4283
+ })));
4284
+ }
4285
+
4286
+ /**
4287
+ * Desktop table row component
4288
+ */
4289
+ function TableRow(_ref) {
4290
+ var row = _ref.row,
4291
+ rowIndexInPage = _ref.rowIndexInPage,
4292
+ startIndex = _ref.startIndex,
4293
+ selectedRows = _ref.selectedRows,
4294
+ expandedRows = _ref.expandedRows,
4295
+ rowClass = _ref.rowClass,
4296
+ stripedRows = _ref.stripedRows,
4297
+ stripedColors = _ref.stripedColors,
4298
+ onRowClick = _ref.onRowClick,
4299
+ hasDetails = _ref.hasDetails,
4300
+ showSerial = _ref.showSerial,
4301
+ selectable = _ref.selectable,
4302
+ visibleColumns = _ref.visibleColumns,
4303
+ cellClass = _ref.cellClass,
4304
+ withAction = _ref.withAction,
4305
+ visibleCount = _ref.visibleCount,
4306
+ DetailsComponent = _ref.DetailsComponent,
4307
+ actionsToUse = _ref.actionsToUse,
4308
+ activeActionRowKey = _ref.activeActionRowKey,
4309
+ activeAnchorEl = _ref.activeAnchorEl,
4310
+ actionButtonRefs = _ref.actionButtonRefs,
4311
+ actionMenuRef = _ref.actionMenuRef,
4312
+ toggleExpandRow = _ref.toggleExpandRow,
4313
+ handleSelectRow = _ref.handleSelectRow,
4314
+ toggleActions = _ref.toggleActions,
4315
+ handleOnAction = _ref.handleOnAction,
4316
+ closeActionMenu = _ref.closeActionMenu,
4317
+ renderCell = _ref.renderCell;
4318
+ var globalIndex = startIndex + rowIndexInPage;
4319
+ var key = getRowKey(row, globalIndex);
4320
+ var actionCellKey = "actions-".concat(key);
4321
+ var isSelected = selectedRows.has(key);
4322
+ var isExpanded = expandedRows.has(key);
4323
+ var extraRowClass = typeof rowClass === "function" ? rowClass({
4324
+ row: row,
4325
+ rowIndex: globalIndex
4326
+ }) : "";
4327
+ var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
4328
+ var stripeBg = stripedRows && !isSelected ? stripedColors[globalIndex % stripedColors.length] : undefined;
4329
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, {
4330
+ key: key
4331
+ }, /*#__PURE__*/React__default.createElement("tr", {
4332
+ style: stripeBg ? {
4333
+ backgroundColor: stripeBg
4334
+ } : undefined,
4335
+ className: cn$1("hover:bg-gray-50", {
4336
+ "cursor-pointer": !!onRowClick,
4337
+ "bg-primary-50": isSelected
4338
+ }, safeExtraRowClass),
4339
+ onClick: function onClick() {
4340
+ return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
4341
+ }
4342
+ }, hasDetails && /*#__PURE__*/React__default.createElement("td", {
4343
+ className: "px-4 py-4 text-sm"
4344
+ }, /*#__PURE__*/React__default.createElement("button", {
4345
+ onClick: function onClick(e) {
4346
+ e.stopPropagation();
4347
+ toggleExpandRow(row, rowIndexInPage);
4348
+ },
4349
+ "aria-expanded": isExpanded,
4350
+ className: "p-1 rounded hover:bg-gray-100"
4351
+ }, isExpanded ? "▾" : "▸")), showSerial && /*#__PURE__*/React__default.createElement("td", {
4352
+ className: "px-4 py-4 whitespace-nowrap text-sm text-gray-900"
4353
+ }, globalIndex + 1), selectable && /*#__PURE__*/React__default.createElement("td", {
4354
+ className: "px-6 py-4",
4355
+ onClick: function onClick(e) {
4356
+ return e.stopPropagation();
4357
+ }
4358
+ }, /*#__PURE__*/React__default.createElement("input", {
4359
+ type: "checkbox",
4360
+ className: "rounded border-gray-300",
4361
+ checked: isSelected,
4362
+ onChange: function onChange() {
4363
+ return handleSelectRow(row, rowIndexInPage);
4364
+ }
4365
+ })), visibleColumns.map(function (column, columnIndex) {
4366
+ var extraCellClass = typeof cellClass === "function" ? cellClass({
4367
+ row: row,
4368
+ rowIndex: globalIndex,
4369
+ column: column,
4370
+ columnIndex: columnIndex
4371
+ }) : "";
4372
+ var safeExtraCellClass = typeof extraCellClass === "string" ? extraCellClass.trim() : "";
4373
+ return /*#__PURE__*/React__default.createElement("td", {
4374
+ key: column.key,
4375
+ className: cn$1("px-6 py-4 whitespace-nowrap text-sm text-gray-900", safeExtraCellClass)
4376
+ }, renderCell(column, row, globalIndex));
4377
+ }), /*#__PURE__*/React__default.createElement("td", {
4378
+ className: "px-4 py-4"
4379
+ }), withAction && /*#__PURE__*/React__default.createElement("td", {
4380
+ className: "px-4 py-4 text-sm text-right",
4381
+ onClick: function onClick(e) {
4382
+ return e.stopPropagation();
4383
+ }
4384
+ }, /*#__PURE__*/React__default.createElement("div", {
4385
+ className: "relative inline-block"
4386
+ }, /*#__PURE__*/React__default.createElement("button", {
4387
+ ref: function ref(el) {
4388
+ if (el) {
4389
+ actionButtonRefs.current[actionCellKey] = el;
4390
+ }
4391
+ },
4392
+ onClick: function onClick(e) {
4393
+ return toggleActions(e, actionCellKey, row);
4394
+ },
4395
+ "aria-expanded": activeActionRowKey === actionCellKey,
4396
+ className: "p-1 rounded hover:bg-gray-100",
4397
+ title: "Actions"
4398
+ }, /*#__PURE__*/React__default.createElement(MoreVertical, {
4399
+ className: "h-4 w-4"
4400
+ })), activeActionRowKey === actionCellKey && /*#__PURE__*/React__default.createElement(ActionMenu, {
4401
+ actions: actionsToUse,
4402
+ row: row,
4403
+ onAction: function onAction(action) {
4404
+ return handleOnAction(action, row);
4405
+ },
4406
+ menuRef: actionMenuRef,
4407
+ anchorEl: activeAnchorEl,
4408
+ onClose: closeActionMenu
4409
+ })))), hasDetails && isExpanded && DetailsComponent && /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
4410
+ colSpan: visibleCount,
4411
+ className: "px-6 py-4 bg-gray-50"
4412
+ }, /*#__PURE__*/React__default.createElement(DetailsComponent, {
4413
+ row: row,
4414
+ index: globalIndex
4415
+ }))));
4416
+ }
4417
+
4418
+ /**
4419
+ * Mobile card view for a single table row
4420
+ */
4421
+ function MobileCard(_ref) {
4422
+ var row = _ref.row,
4423
+ rowIndexInPage = _ref.rowIndexInPage,
4424
+ startIndex = _ref.startIndex,
4425
+ selectedRows = _ref.selectedRows,
4426
+ expandedRows = _ref.expandedRows,
4427
+ rowClass = _ref.rowClass,
4428
+ stripedRows = _ref.stripedRows,
4429
+ stripedColors = _ref.stripedColors,
4430
+ onRowClick = _ref.onRowClick,
4431
+ hasDetails = _ref.hasDetails,
4432
+ selectable = _ref.selectable,
4433
+ showSerial = _ref.showSerial,
4434
+ withAction = _ref.withAction,
4435
+ visibleColumns = _ref.visibleColumns,
4436
+ cellClass = _ref.cellClass,
4437
+ DetailsComponent = _ref.DetailsComponent,
4438
+ actionsToUse = _ref.actionsToUse,
4439
+ activeActionRowKey = _ref.activeActionRowKey,
4440
+ activeAnchorEl = _ref.activeAnchorEl,
4441
+ actionButtonRefs = _ref.actionButtonRefs,
4442
+ actionMenuRef = _ref.actionMenuRef,
4443
+ toggleExpandRow = _ref.toggleExpandRow,
4444
+ handleSelectRow = _ref.handleSelectRow,
4445
+ toggleActions = _ref.toggleActions,
4446
+ handleOnAction = _ref.handleOnAction,
4447
+ closeActionMenu = _ref.closeActionMenu,
4448
+ renderCell = _ref.renderCell;
4449
+ var globalIndex = startIndex + rowIndexInPage;
4450
+ var key = getRowKey(row, globalIndex);
4451
+ var actionCellKey = "actions-".concat(key);
4452
+ var isSelected = selectedRows.has(key);
4453
+ var isExpanded = expandedRows.has(key);
4454
+ var extraRowClass = typeof rowClass === "function" ? rowClass({
4455
+ row: row,
4456
+ rowIndex: globalIndex
4457
+ }) : "";
4458
+ var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
4459
+ var stripeBg = stripedRows && !isSelected ? stripedColors[globalIndex % stripedColors.length] : undefined;
4460
+ return /*#__PURE__*/React__default.createElement("div", {
4461
+ key: key,
4462
+ style: stripeBg ? {
4463
+ backgroundColor: stripeBg
4464
+ } : undefined,
4465
+ className: cn$1("border rounded-lg mb-3 shadow-sm overflow-hidden transition-all duration-200", {
4466
+ "cursor-pointer": !!onRowClick,
4467
+ "bg-primary-50 border-primary-200": isSelected,
4468
+ "hover:shadow-md": !isSelected
4469
+ }, safeExtraRowClass),
4470
+ onClick: function onClick() {
4471
+ return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
4472
+ }
4473
+ }, /*#__PURE__*/React__default.createElement("div", {
4474
+ className: "flex items-center justify-between p-4 border-b bg-gray-50"
4475
+ }, /*#__PURE__*/React__default.createElement("div", {
4476
+ className: "flex items-center gap-3"
4477
+ }, hasDetails && /*#__PURE__*/React__default.createElement("button", {
4478
+ onClick: function onClick(e) {
4479
+ e.stopPropagation();
4480
+ toggleExpandRow(row, rowIndexInPage);
4481
+ },
4482
+ "aria-expanded": isExpanded,
4483
+ className: "p-1 rounded hover:bg-gray-200"
4484
+ }, isExpanded ? "▾" : "▸"), selectable && /*#__PURE__*/React__default.createElement("input", {
4485
+ type: "checkbox",
4486
+ className: "rounded border-gray-300 h-4 w-4",
4487
+ checked: isSelected,
4488
+ onChange: function onChange(e) {
4489
+ e.stopPropagation();
4490
+ handleSelectRow(row, rowIndexInPage);
4491
+ },
4492
+ onClick: function onClick(e) {
4493
+ return e.stopPropagation();
4494
+ }
4495
+ }), showSerial && /*#__PURE__*/React__default.createElement("span", {
4496
+ className: "text-sm font-medium text-gray-600"
4497
+ }, "#", globalIndex + 1)), withAction && /*#__PURE__*/React__default.createElement("div", {
4498
+ className: "relative"
4499
+ }, /*#__PURE__*/React__default.createElement("button", {
4500
+ ref: function ref(el) {
4501
+ if (el) {
4502
+ actionButtonRefs.current[actionCellKey] = el;
4503
+ }
4504
+ },
4505
+ onClick: function onClick(e) {
4506
+ return toggleActions(e, actionCellKey, row);
4507
+ },
4508
+ "aria-expanded": activeActionRowKey === actionCellKey,
4509
+ className: "p-1.5 rounded hover:bg-gray-200",
4510
+ title: "Actions"
4511
+ }, /*#__PURE__*/React__default.createElement(MoreVertical, {
4512
+ className: "h-4 w-4"
4513
+ })), activeActionRowKey === actionCellKey && /*#__PURE__*/React__default.createElement(ActionMenu, {
4514
+ actions: actionsToUse,
4515
+ row: row,
4516
+ onAction: function onAction(action) {
4517
+ return handleOnAction(action, row);
4518
+ },
4519
+ menuRef: actionMenuRef,
4520
+ anchorEl: activeAnchorEl,
4521
+ onClose: closeActionMenu
4522
+ }))), /*#__PURE__*/React__default.createElement("div", {
4523
+ className: "p-4"
4524
+ }, visibleColumns.map(function (column, colIndex) {
4525
+ var extraCellClass = typeof cellClass === "function" ? cellClass({
4526
+ row: row,
4527
+ rowIndex: globalIndex,
4528
+ column: column,
4529
+ columnIndex: colIndex
4530
+ }) : "";
4531
+ var safeExtraCellClass = typeof extraCellClass === "string" ? extraCellClass.trim() : "";
4532
+ return /*#__PURE__*/React__default.createElement("div", {
4533
+ key: column.key,
4534
+ className: cn$1("flex justify-between items-center flex-row py-2 border-b last:border-b-0", safeExtraCellClass)
4535
+ }, /*#__PURE__*/React__default.createElement("div", {
4536
+ className: "text-xs font-medium text-gray-500 uppercase tracking-wide mb-1 sm:mb-0 sm:w-1/3 sm:pr-2"
4537
+ }, column.label), /*#__PURE__*/React__default.createElement("div", {
4538
+ className: "text-sm text-gray-900 sm:w-2/3 sm:pl-2 break-words"
4539
+ }, renderCell(column, row, globalIndex)));
4540
+ })), hasDetails && isExpanded && DetailsComponent && /*#__PURE__*/React__default.createElement("div", {
4541
+ className: "border-t bg-gray-50 p-4"
4542
+ }, /*#__PURE__*/React__default.createElement(DetailsComponent, {
4543
+ row: row,
4544
+ index: globalIndex
4545
+ })));
4546
+ }
4547
+
4548
+ 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", "TheadComponent", "TfootComponent"];
4549
+ 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; }
4550
+ 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; }
4551
+ var DEFAULT_DATA = [];
4552
+ var DEFAULT_COLUMNS = [];
4553
+ var Table = function Table(_ref) {
4554
+ var _ref$data = _ref.data,
4555
+ initialData = _ref$data === void 0 ? DEFAULT_DATA : _ref$data,
4556
+ _ref$columns = _ref.columns,
4557
+ initialColumns = _ref$columns === void 0 ? DEFAULT_COLUMNS : _ref$columns,
4558
+ _ref$sortable = _ref.sortable,
4559
+ sortable = _ref$sortable === void 0 ? true : _ref$sortable,
4560
+ _ref$filterable = _ref.filterable,
4561
+ filterable = _ref$filterable === void 0 ? false : _ref$filterable,
4562
+ _ref$selectable = _ref.selectable,
4563
+ selectable = _ref$selectable === void 0 ? false : _ref$selectable,
4564
+ _ref$pagination = _ref.pagination,
4565
+ pagination = _ref$pagination === void 0 ? false : _ref$pagination,
4566
+ _ref$pageSize = _ref.pageSize,
4567
+ pageSize = _ref$pageSize === void 0 ? 25 : _ref$pageSize,
4568
+ onSort = _ref.onSort,
4569
+ onFilter = _ref.onFilter,
4570
+ onFetch = _ref.onFetch,
4571
+ onFilterChange = _ref.onFilterChange,
4572
+ onSelectionChange = _ref.onSelectionChange,
4573
+ onRowClick = _ref.onRowClick,
4574
+ _ref$hasDetails = _ref.hasDetails,
4575
+ hasDetails = _ref$hasDetails === void 0 ? false : _ref$hasDetails,
4576
+ _ref$DetailsComponent = _ref.DetailsComponent,
4577
+ DetailsComponent = _ref$DetailsComponent === void 0 ? null : _ref$DetailsComponent,
4578
+ className = _ref.className,
4579
+ _ref$withAction = _ref.withAction,
4580
+ withAction = _ref$withAction === void 0 ? true : _ref$withAction,
4581
+ onAction = _ref.onAction,
4582
+ actions = _ref.actions,
4583
+ _ref$showSerial = _ref.showSerial,
4584
+ showSerial = _ref$showSerial === void 0 ? true : _ref$showSerial,
4585
+ cellClass = _ref.cellClass,
4586
+ rowClass = _ref.rowClass,
4587
+ _ref$globalSearch = _ref.globalSearch,
4588
+ globalSearch = _ref$globalSearch === void 0 ? false : _ref$globalSearch,
4589
+ _ref$limitOptions = _ref.limitOptions,
4590
+ limitOptions = _ref$limitOptions === void 0 ? [10, 25, 50, 100] : _ref$limitOptions,
4591
+ _ref$showLimitSelecto = _ref.showLimitSelector,
4592
+ showLimitSelector = _ref$showLimitSelecto === void 0 ? true : _ref$showLimitSelecto,
4593
+ onLimitChange = _ref.onLimitChange,
4594
+ _ref$showReloadButton = _ref.showReloadButton,
4595
+ showReloadButton = _ref$showReloadButton === void 0 ? true : _ref$showReloadButton,
4596
+ renderReloadButton = _ref.renderReloadButton,
4597
+ onReload = _ref.onReload,
4598
+ _ref$stripedRows = _ref.stripedRows,
4599
+ stripedRows = _ref$stripedRows === void 0 ? true : _ref$stripedRows,
4600
+ _ref$stripedColors = _ref.stripedColors,
4601
+ stripedColors = _ref$stripedColors === void 0 ? ["#ffffff", "#f7fafc"] : _ref$stripedColors,
4602
+ _ref$responsiveBreakp = _ref.responsiveBreakpoint,
4603
+ responsiveBreakpoint = _ref$responsiveBreakp === void 0 ? 768 : _ref$responsiveBreakp,
4604
+ _ref$serverSide = _ref.serverSide,
4605
+ serverSide = _ref$serverSide === void 0 ? false : _ref$serverSide,
4606
+ _ref$totalRecords = _ref.totalRecords,
4607
+ totalRecords = _ref$totalRecords === void 0 ? 0 : _ref$totalRecords,
4608
+ pageNumber = _ref.pageNumber,
4609
+ _ref$TheadComponent = _ref.TheadComponent,
4610
+ TheadComponent = _ref$TheadComponent === void 0 ? null : _ref$TheadComponent,
4611
+ _ref$TfootComponent = _ref.TfootComponent,
4612
+ TfootComponent = _ref$TfootComponent === void 0 ? null : _ref$TfootComponent,
4613
+ props = _objectWithoutProperties$1(_ref, _excluded$k);
4614
+ // State
4615
+ var _useState = useState(false),
4616
+ _useState2 = _slicedToArray(_useState, 2),
4617
+ isMobileView = _useState2[0],
4618
+ setIsMobileView = _useState2[1];
4619
+ var _useState3 = useState(function () {
4620
+ return Array.isArray(initialData) ? initialData : [];
4621
+ }),
4622
+ _useState4 = _slicedToArray(_useState3, 2),
4623
+ tableData = _useState4[0],
4624
+ setTableData = _useState4[1];
4625
+ var _useState5 = useState(false),
4626
+ _useState6 = _slicedToArray(_useState5, 2),
4627
+ loading = _useState6[0],
4628
+ _setLoading = _useState6[1];
4629
+ var _useState7 = useState(pageSize),
4630
+ _useState8 = _slicedToArray(_useState7, 2),
4631
+ limit = _useState8[0],
4632
+ setLimit = _useState8[1];
4633
+ var _useState9 = useState(function () {
4634
+ return typeof pageNumber === "number" ? pageNumber : 1;
4635
+ }),
4636
+ _useState0 = _slicedToArray(_useState9, 2),
4637
+ currentPage = _useState0[0],
4638
+ setCurrentPage = _useState0[1];
4639
+ var _useState1 = useState(function () {
4640
+ return Array.isArray(initialColumns) ? initialColumns.map(function (c) {
4641
+ return _objectSpread$9({}, c);
4642
+ }) : [];
4643
+ }),
4644
+ _useState10 = _slicedToArray(_useState1, 2),
4645
+ columnsState = _useState10[0],
4646
+ setColumnsState = _useState10[1];
4647
+ var _useState11 = useState(false),
4648
+ _useState12 = _slicedToArray(_useState11, 2),
4649
+ showColumnMenu = _useState12[0],
4650
+ setShowColumnMenu = _useState12[1];
4651
+ var _useState13 = useState({
4652
+ key: null,
4653
+ direction: "asc"
4654
+ }),
4655
+ _useState14 = _slicedToArray(_useState13, 2),
4656
+ sortConfig = _useState14[0],
4657
+ setSortConfig = _useState14[1];
4658
+ var _useState15 = useState({}),
4659
+ _useState16 = _slicedToArray(_useState15, 2),
4660
+ filters = _useState16[0],
4661
+ setFilters = _useState16[1];
4662
+ var _useState17 = useState(""),
4663
+ _useState18 = _slicedToArray(_useState17, 2),
4664
+ searchInput = _useState18[0],
4665
+ setSearchInput = _useState18[1];
4666
+ var _useState19 = useState(function () {
4667
+ return new Set();
4668
+ }),
4669
+ _useState20 = _slicedToArray(_useState19, 2),
4670
+ selectedRows = _useState20[0],
4671
+ setSelectedRows = _useState20[1];
4672
+ var _useState21 = useState(function () {
4673
+ return new Set();
4674
+ }),
4675
+ _useState22 = _slicedToArray(_useState21, 2),
4676
+ expandedRows = _useState22[0],
4677
+ setExpandedRows = _useState22[1];
4678
+ var _useState23 = useState(null),
4679
+ _useState24 = _slicedToArray(_useState23, 2),
4680
+ activeActionRowKey = _useState24[0],
4681
+ setActiveActionRowKey = _useState24[1];
4682
+ var _useState25 = useState(false),
4683
+ _useState26 = _slicedToArray(_useState25, 2),
4684
+ showMobileFilters = _useState26[0],
4685
+ setShowMobileFilters = _useState26[1];
4686
+
4687
+ // Refs
4688
+ var columnMenuRef = useRef(null);
4689
+ var columnToggleBtnRef = useRef(null);
4690
+ var actionMenuRef = useRef(null);
4691
+ var actionButtonRefs = useRef({});
4692
+
4693
+ // Memoized values
4694
+ var actionsToUse = useMemo(function () {
4695
+ return actions !== undefined ? actions : DEFAULT_ACTIONS;
4696
+ }, [actions]);
4697
+
4698
+ // Refs for stable initial values
4699
+ var initialPageNumber = useRef(pageNumber);
4700
+ var initialColumnsRef = useRef(initialColumns);
4701
+ var initialDataRef = useRef(initialData);
4702
+ useEffect(function () {
4703
+ setLimit(pageSize);
4704
+ }, [pageSize]);
4705
+ useEffect(function () {
4706
+ var isNotInitialPageNumber = typeof pageNumber === "number" && pageNumber !== initialPageNumber.current;
4707
+ var isNotCurrentPage = typeof pageNumber === "number" && pageNumber !== currentPage;
4708
+ if (isNotInitialPageNumber && isNotCurrentPage) {
4709
+ setCurrentPage(pageNumber);
4710
+ initialPageNumber.current = pageNumber;
4711
+ } else if (isNotCurrentPage) {
4712
+ setCurrentPage(pageNumber);
4713
+ }
4714
+ }, [pageNumber]);
4715
+ useEffect(function () {
4716
+ if (initialColumns !== initialColumnsRef.current) {
4717
+ setColumnsState(Array.isArray(initialColumns) ? initialColumns.map(function (c) {
4718
+ return _objectSpread$9({}, c);
4719
+ }) : []);
4720
+ initialColumnsRef.current = initialColumns;
4721
+ }
4722
+ }, [initialColumns]);
4723
+ useEffect(function () {
4724
+ if (initialData !== initialDataRef.current && Array.isArray(initialData)) {
4725
+ setTableData(initialData);
4726
+ initialDataRef.current = initialData;
4727
+ }
4728
+ }, [initialData]);
4729
+ useEffect(function () {
4730
+ var checkMobile = function checkMobile() {
4731
+ return setIsMobileView(window.innerWidth < responsiveBreakpoint);
4732
+ };
4733
+ checkMobile();
4734
+ window.addEventListener("resize", checkMobile);
4735
+ return function () {
4736
+ return window.removeEventListener("resize", checkMobile);
4737
+ };
4738
+ }, [responsiveBreakpoint]);
4739
+
4740
+ // Click-outside handlers
4741
+ var closeColumnMenu = useCallback(function () {
4742
+ return setShowColumnMenu(false);
4743
+ }, []);
4744
+ var closeActionMenu = useCallback(function () {
4745
+ return setActiveActionRowKey(null);
4746
+ }, []);
4250
4747
  useClickOutside([columnMenuRef, columnToggleBtnRef], showColumnMenu, closeColumnMenu);
4251
4748
  useClickOutside([actionMenuRef], activeActionRowKey !== null, closeActionMenu);
4252
4749
 
4253
- // Get active anchor element
4750
+ // Computed values
4254
4751
  var activeAnchorEl = useMemo(function () {
4255
4752
  if (activeActionRowKey === null) return null;
4256
4753
  return actionButtonRefs.current[activeActionRowKey];
4257
4754
  }, [activeActionRowKey]);
4258
-
4259
- // Visible columns (memoized)
4260
4755
  var visibleColumns = useMemo(function () {
4261
4756
  return columnsState.filter(function (col) {
4262
4757
  return col.isVisible !== false;
4263
4758
  });
4264
4759
  }, [columnsState]);
4265
-
4266
- // Sorted data (memoized)
4267
4760
  var sortedData = useMemo(function () {
4268
4761
  if (serverSide || !sortConfig.key) return tableData;
4269
4762
  var key = sortConfig.key,
@@ -4278,8 +4771,6 @@ var Table = function Table(_ref2) {
4278
4771
  return direction === "asc" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));
4279
4772
  });
4280
4773
  }, [tableData, sortConfig, serverSide]);
4281
-
4282
- // Filtered data (memoized)
4283
4774
  var filteredData = useMemo(function () {
4284
4775
  if (serverSide || !filterable || !Object.keys(filters).length) return sortedData;
4285
4776
  var q = (filters.global || "").toLowerCase();
@@ -4289,8 +4780,6 @@ var Table = function Table(_ref2) {
4289
4780
  });
4290
4781
  });
4291
4782
  }, [sortedData, filters, filterable, serverSide]);
4292
-
4293
- // Pagination calculations (memoized)
4294
4783
  var _useMemo = useMemo(function () {
4295
4784
  var start = pagination ? (currentPage - 1) * limit : 0;
4296
4785
  var end = pagination ? start + limit : filteredData.length;
@@ -4307,22 +4796,31 @@ var Table = function Table(_ref2) {
4307
4796
  endIndex = _useMemo.endIndex,
4308
4797
  paginatedData = _useMemo.paginatedData,
4309
4798
  totalPages = _useMemo.totalPages;
4310
-
4311
- // Column count for colspan (memoized)
4312
4799
  var visibleCount = useMemo(function () {
4313
4800
  return (showSerial ? 1 : 0) + visibleColumns.length + (selectable ? 1 : 0) + (hasDetails ? 1 : 0) + (withAction ? 1 : 0) + 1;
4314
- },
4315
- // column toggler
4316
- [showSerial, visibleColumns.length, selectable, hasDetails, withAction]);
4317
-
4318
- // Row key map for selection (memoized per filtered data)
4801
+ }, [showSerial, visibleColumns.length, selectable, hasDetails, withAction]);
4319
4802
  var rowKeyMap = useMemo(function () {
4320
4803
  return new Map(filteredData.map(function (r, i) {
4321
4804
  return [getRowKey(r, i), r];
4322
4805
  }));
4323
4806
  }, [filteredData]);
4807
+ var allPageSelected = useMemo(function () {
4808
+ if (paginatedData.length === 0) return false;
4809
+ return paginatedData.every(function (r, i) {
4810
+ return selectedRows.has(getRowKey(r, startIndex + i));
4811
+ });
4812
+ }, [paginatedData, selectedRows, startIndex]);
4813
+ var limitOptionsForSelect = useMemo(function () {
4814
+ var opts = Array.isArray(limitOptions) && limitOptions.length > 0 ? limitOptions : [25, 50, 100];
4815
+ return opts.map(function (opt) {
4816
+ return {
4817
+ label: String(opt),
4818
+ value: opt
4819
+ };
4820
+ });
4821
+ }, [limitOptions]);
4324
4822
 
4325
- // Callbacks (memoized to prevent child re-renders)
4823
+ // Callbacks
4326
4824
  var toggleColumnVisibility = useCallback(function (key) {
4327
4825
  setColumnsState(function (prev) {
4328
4826
  return prev.map(function (c) {
@@ -4370,8 +4868,6 @@ var Table = function Table(_ref2) {
4370
4868
  return newSelection.add(k);
4371
4869
  });
4372
4870
  }
4373
-
4374
- // Notify parent
4375
4871
  var selectedData = Array.from(newSelection).map(function (k) {
4376
4872
  return rowKeyMap.get(k);
4377
4873
  }).filter(Boolean);
@@ -4411,17 +4907,15 @@ var Table = function Table(_ref2) {
4411
4907
  }, [startIndex]);
4412
4908
  var toggleActions = useCallback(function (e, actionCellKey, row) {
4413
4909
  e.stopPropagation();
4414
- e.preventDefault(); // Prevent default to avoid any other click handlers
4415
-
4416
- // Store the button reference
4910
+ e.preventDefault();
4417
4911
  if (e.currentTarget) {
4418
4912
  actionButtonRefs.current[actionCellKey] = e.currentTarget;
4419
4913
  }
4420
4914
  setActiveActionRowKey(function (prev) {
4421
4915
  if (prev === actionCellKey) {
4422
- return null; // Close if clicking same button
4916
+ return null;
4423
4917
  }
4424
- return actionCellKey; // Open new menu
4918
+ return actionCellKey;
4425
4919
  });
4426
4920
  }, []);
4427
4921
  var handleOnAction = useCallback(function (action, row) {
@@ -4455,306 +4949,68 @@ var Table = function Table(_ref2) {
4455
4949
  var handlePageChange = useCallback(function (newPage) {
4456
4950
  setCurrentPage(newPage);
4457
4951
  }, []);
4952
+ var renderCell = useCallback(function (column, row, globalIndex) {
4953
+ if (column.render) return column.render(row, globalIndex);
4954
+ return row === null || row === void 0 ? void 0 : row[column.key];
4955
+ }, []);
4458
4956
 
4459
4957
  // Data fetching effect
4460
4958
  useEffect(function () {
4461
4959
  if (!onFetch) return;
4960
+ var mounted = true;
4462
4961
  onFetch({
4463
4962
  setData: function setData(rows) {
4464
- return setTableData(Array.isArray(rows) ? rows : []);
4963
+ if (mounted) setTableData(Array.isArray(rows) ? rows : []);
4964
+ },
4965
+ setLoading: function setLoading(v) {
4966
+ if (mounted) _setLoading(v);
4465
4967
  },
4466
- setLoading: setLoading,
4467
4968
  filters: filters,
4468
4969
  page: currentPage,
4469
4970
  limit: limit,
4470
4971
  sort: sortConfig
4471
4972
  });
4472
- }, [onFetch, filters, currentPage, limit, sortConfig]);
4473
-
4474
- // Sync searchInput with filters.global
4973
+ return function () {
4974
+ mounted = false;
4975
+ };
4976
+ }, [filters, currentPage, limit, sortConfig]);
4475
4977
  useEffect(function () {
4476
4978
  setSearchInput(filters.global || "");
4477
4979
  }, [filters.global]);
4478
4980
 
4479
- // Render cell helper
4480
- var renderCell = useCallback(function (column, row, globalIndex) {
4481
- if (column.render) return column.render(row, globalIndex);
4482
- return row === null || row === void 0 ? void 0 : row[column.key];
4483
- }, []);
4484
-
4485
- // Render mobile card
4486
- var renderMobileCard = useCallback(function (row, rowIndexInPage) {
4487
- var globalIndex = startIndex + rowIndexInPage;
4488
- var key = getRowKey(row, globalIndex);
4489
- var actionCellKey = "actions-".concat(key);
4490
- var isSelected = selectedRows.has(key);
4491
- var isExpanded = expandedRows.has(key);
4492
- var extraRowClass = typeof rowClass === "function" ? rowClass({
4493
- row: row,
4494
- rowIndex: globalIndex
4495
- }) : "";
4496
- var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
4497
- var stripeBg = stripedRows && !isSelected ? stripedColors[globalIndex % stripedColors.length] : undefined;
4498
- return /*#__PURE__*/React__default.createElement("div", {
4499
- key: key,
4500
- style: stripeBg ? {
4501
- backgroundColor: stripeBg
4502
- } : undefined,
4503
- className: cn$1("border rounded-lg mb-3 shadow-sm overflow-hidden transition-all duration-200", {
4504
- "cursor-pointer": !!onRowClick,
4505
- "bg-primary-50 border-primary-200": isSelected,
4506
- "hover:shadow-md": !isSelected
4507
- }, safeExtraRowClass),
4508
- onClick: function onClick() {
4509
- return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
4510
- }
4511
- }, /*#__PURE__*/React__default.createElement("div", {
4512
- className: "flex items-center justify-between p-4 border-b bg-gray-50"
4513
- }, /*#__PURE__*/React__default.createElement("div", {
4514
- className: "flex items-center gap-3"
4515
- }, hasDetails && /*#__PURE__*/React__default.createElement("button", {
4516
- onClick: function onClick(e) {
4517
- e.stopPropagation();
4518
- toggleExpandRow(row, rowIndexInPage);
4519
- },
4520
- "aria-expanded": isExpanded,
4521
- className: "p-1 rounded hover:bg-gray-200"
4522
- }, isExpanded ? "▾" : "▸"), selectable && /*#__PURE__*/React__default.createElement("input", {
4523
- type: "checkbox",
4524
- className: "rounded border-gray-300 h-4 w-4",
4525
- checked: isSelected,
4526
- onChange: function onChange(e) {
4527
- e.stopPropagation();
4528
- handleSelectRow(row, rowIndexInPage);
4529
- },
4530
- onClick: function onClick(e) {
4531
- return e.stopPropagation();
4532
- }
4533
- }), showSerial && /*#__PURE__*/React__default.createElement("span", {
4534
- className: "text-sm font-medium text-gray-600"
4535
- }, "#", globalIndex + 1)), withAction && /*#__PURE__*/React__default.createElement("div", {
4536
- className: "relative"
4537
- }, /*#__PURE__*/React__default.createElement("button", {
4538
- ref: function ref(el) {
4539
- if (el) {
4540
- actionButtonRefs.current[actionCellKey] = el;
4541
- }
4542
- },
4543
- onClick: function onClick(e) {
4544
- return toggleActions(e, actionCellKey, row);
4545
- },
4546
- "aria-expanded": activeActionRowKey === actionCellKey,
4547
- className: "p-1.5 rounded hover:bg-gray-200",
4548
- title: "Actions"
4549
- }, /*#__PURE__*/React__default.createElement(MoreVertical, {
4550
- className: "h-4 w-4"
4551
- })), activeActionRowKey === actionCellKey && /*#__PURE__*/React__default.createElement(ActionMenu, {
4552
- actions: actionsToUse,
4553
- row: row,
4554
- onAction: function onAction(action) {
4555
- return handleOnAction(action, row);
4556
- },
4557
- menuRef: actionMenuRef,
4558
- anchorEl: activeAnchorEl,
4559
- onClose: closeActionMenu
4560
- }))), /*#__PURE__*/React__default.createElement("div", {
4561
- className: "p-4"
4562
- }, visibleColumns.map(function (column, colIndex) {
4563
- var extraCellClass = typeof cellClass === "function" ? cellClass({
4564
- row: row,
4565
- rowIndex: globalIndex,
4566
- column: column,
4567
- columnIndex: colIndex
4568
- }) : "";
4569
- var safeExtraCellClass = typeof extraCellClass === "string" ? extraCellClass.trim() : "";
4570
- return /*#__PURE__*/React__default.createElement("div", {
4571
- key: column.key,
4572
- className: cn$1("flex justify-between items-center flex-row py-2 border-b last:border-b-0", safeExtraCellClass)
4573
- }, /*#__PURE__*/React__default.createElement("div", {
4574
- className: "text-xs font-medium text-gray-500 uppercase tracking-wide mb-1 sm:mb-0 sm:w-1/3 sm:pr-2"
4575
- }, column.label), /*#__PURE__*/React__default.createElement("div", {
4576
- className: "text-sm text-gray-900 sm:w-2/3 sm:pl-2 break-words"
4577
- }, renderCell(column, row, globalIndex)));
4578
- })), hasDetails && isExpanded && DetailsComponent && /*#__PURE__*/React__default.createElement("div", {
4579
- className: "border-t bg-gray-50 p-4"
4580
- }, /*#__PURE__*/React__default.createElement(DetailsComponent, {
4581
- row: row,
4582
- index: globalIndex
4583
- })));
4584
- }, [startIndex, selectedRows, expandedRows, rowClass, stripedRows, stripedColors, onRowClick, hasDetails, selectable, showSerial, withAction, visibleColumns, cellClass, DetailsComponent, actionsToUse, activeActionRowKey, activeAnchorEl, toggleExpandRow, handleSelectRow, toggleActions, handleOnAction, closeActionMenu, renderCell]);
4585
-
4586
- // Render mobile filters
4587
- var renderMobileFilters = useCallback(function () {
4588
- return /*#__PURE__*/React__default.createElement("div", {
4589
- className: "mb-4 p-3 bg-gray-50 rounded-lg"
4590
- }, /*#__PURE__*/React__default.createElement("div", {
4591
- className: "flex items-center justify-between mb-3"
4592
- }, /*#__PURE__*/React__default.createElement("h3", {
4593
- className: "text-sm font-medium text-gray-700"
4594
- }, "Filters"), /*#__PURE__*/React__default.createElement("button", {
4595
- onClick: function onClick() {
4596
- return setShowMobileFilters(function (s) {
4597
- return !s;
4598
- });
4599
- },
4600
- className: "text-xs text-gray-500 hover:text-gray-700"
4601
- }, showMobileFilters ? "Hide" : "Show")), showMobileFilters && /*#__PURE__*/React__default.createElement("div", {
4602
- className: "space-y-3"
4603
- }, globalSearch && /*#__PURE__*/React__default.createElement("div", {
4604
- className: "relative"
4605
- }, /*#__PURE__*/React__default.createElement("input", {
4606
- type: "text",
4607
- placeholder: "Search...",
4608
- className: "w-full rounded-md border border-gray-300 px-4 py-2 text-sm",
4609
- value: searchInput,
4610
- onChange: function onChange(e) {
4611
- return setSearchInput(e.target.value);
4612
- },
4613
- onKeyDown: onGlobalKeyDown
4614
- }), /*#__PURE__*/React__default.createElement(Search, {
4615
- className: "absolute right-3 top-2.5 h-4 w-4 text-gray-400"
4616
- })), filterable && visibleColumns.map(function (column) {
4617
- return /*#__PURE__*/React__default.createElement("div", {
4618
- key: column.key
4619
- }, /*#__PURE__*/React__default.createElement("label", {
4620
- className: "block text-xs font-medium text-gray-600 mb-1"
4621
- }, column.label), /*#__PURE__*/React__default.createElement("input", {
4622
- type: "text",
4623
- placeholder: "Filter ".concat(column.label),
4624
- className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm",
4625
- value: filters[column.key] || "",
4626
- onChange: function onChange(e) {
4627
- return handleFilter(column.key, e.target.value);
4628
- }
4629
- }));
4630
- })));
4631
- }, [showMobileFilters, globalSearch, searchInput, onGlobalKeyDown, filterable, visibleColumns, filters, handleFilter]);
4632
-
4633
- // Check if all page rows are selected
4634
- var allPageSelected = useMemo(function () {
4635
- if (paginatedData.length === 0) return false;
4636
- return paginatedData.every(function (r, i) {
4637
- return selectedRows.has(getRowKey(r, startIndex + i));
4638
- });
4639
- }, [paginatedData, selectedRows, startIndex]);
4640
-
4641
- // Limit options for selector
4642
- var limitOptionsForSelect = useMemo(function () {
4643
- var opts = Array.isArray(limitOptions) && limitOptions.length > 0 ? limitOptions : [25, 50, 100];
4644
- return opts.map(function (opt) {
4645
- return {
4646
- label: String(opt),
4647
- value: opt
4648
- };
4649
- });
4650
- }, [limitOptions]);
4651
-
4652
- // Render desktop table rows
4653
- var renderDesktopTableRows = useCallback(function () {
4654
- return paginatedData.map(function (row, rowIndexInPage) {
4655
- var globalIndex = startIndex + rowIndexInPage;
4656
- var key = getRowKey(row, globalIndex);
4657
- var actionCellKey = "actions-".concat(key);
4658
- var isSelected = selectedRows.has(key);
4659
- var isExpanded = expandedRows.has(key);
4660
- var extraRowClass = typeof rowClass === "function" ? rowClass({
4661
- row: row,
4662
- rowIndex: globalIndex
4663
- }) : "";
4664
- var safeExtraRowClass = typeof extraRowClass === "string" ? extraRowClass.trim() : "";
4665
- var stripeBg = stripedRows && !isSelected ? stripedColors[globalIndex % stripedColors.length] : undefined;
4666
- return /*#__PURE__*/React__default.createElement(React__default.Fragment, {
4667
- key: key
4668
- }, /*#__PURE__*/React__default.createElement("tr", {
4669
- style: stripeBg ? {
4670
- backgroundColor: stripeBg
4671
- } : undefined,
4672
- className: cn$1("hover:bg-gray-50", {
4673
- "cursor-pointer": !!onRowClick,
4674
- "bg-primary-50": isSelected
4675
- }, safeExtraRowClass),
4676
- onClick: function onClick() {
4677
- return onRowClick === null || onRowClick === void 0 ? void 0 : onRowClick(row, globalIndex);
4678
- }
4679
- }, hasDetails && /*#__PURE__*/React__default.createElement("td", {
4680
- className: "px-4 py-4 text-sm"
4681
- }, /*#__PURE__*/React__default.createElement("button", {
4682
- onClick: function onClick(e) {
4683
- e.stopPropagation();
4684
- toggleExpandRow(row, rowIndexInPage);
4685
- },
4686
- "aria-expanded": isExpanded,
4687
- className: "p-1 rounded hover:bg-gray-100"
4688
- }, isExpanded ? "▾" : "▸")), showSerial && /*#__PURE__*/React__default.createElement("td", {
4689
- className: "px-4 py-4 whitespace-nowrap text-sm text-gray-900"
4690
- }, globalIndex + 1), selectable && /*#__PURE__*/React__default.createElement("td", {
4691
- className: "px-6 py-4",
4692
- onClick: function onClick(e) {
4693
- return e.stopPropagation();
4694
- }
4695
- }, /*#__PURE__*/React__default.createElement("input", {
4696
- type: "checkbox",
4697
- className: "rounded border-gray-300",
4698
- checked: isSelected,
4699
- onChange: function onChange() {
4700
- return handleSelectRow(row, rowIndexInPage);
4701
- }
4702
- })), visibleColumns.map(function (column, columnIndex) {
4703
- var extraCellClass = typeof cellClass === "function" ? cellClass({
4704
- row: row,
4705
- rowIndex: globalIndex,
4706
- column: column,
4707
- columnIndex: columnIndex
4708
- }) : "";
4709
- var safeExtraCellClass = typeof extraCellClass === "string" ? extraCellClass.trim() : "";
4710
- return /*#__PURE__*/React__default.createElement("td", {
4711
- key: column.key,
4712
- className: cn$1("px-6 py-4 whitespace-nowrap text-sm text-gray-900", safeExtraCellClass)
4713
- }, renderCell(column, row, globalIndex));
4714
- }), /*#__PURE__*/React__default.createElement("td", {
4715
- className: "px-4 py-4"
4716
- }), withAction && /*#__PURE__*/React__default.createElement("td", {
4717
- className: "px-4 py-4 text-sm text-right",
4718
- onClick: function onClick(e) {
4719
- return e.stopPropagation();
4720
- }
4721
- }, /*#__PURE__*/React__default.createElement("div", {
4722
- className: "relative inline-block"
4723
- }, /*#__PURE__*/React__default.createElement("button", {
4724
- ref: function ref(el) {
4725
- if (el) {
4726
- actionButtonRefs.current[actionCellKey] = el;
4727
- }
4728
- },
4729
- onClick: function onClick(e) {
4730
- return toggleActions(e, actionCellKey, row);
4731
- },
4732
- "aria-expanded": activeActionRowKey === actionCellKey,
4733
- className: "p-1 rounded hover:bg-gray-100",
4734
- title: "Actions"
4735
- }, /*#__PURE__*/React__default.createElement(MoreVertical, {
4736
- className: "h-4 w-4"
4737
- })), activeActionRowKey === actionCellKey && /*#__PURE__*/React__default.createElement(ActionMenu, {
4738
- actions: actionsToUse,
4739
- row: row,
4740
- onAction: function onAction(action) {
4741
- return handleOnAction(action, row);
4742
- },
4743
- menuRef: actionMenuRef,
4744
- anchorEl: activeAnchorEl,
4745
- onClose: closeActionMenu
4746
- })))), hasDetails && isExpanded && DetailsComponent && /*#__PURE__*/React__default.createElement("tr", null, /*#__PURE__*/React__default.createElement("td", {
4747
- colSpan: visibleCount,
4748
- className: "px-6 py-4 bg-gray-50"
4749
- }, /*#__PURE__*/React__default.createElement(DetailsComponent, {
4750
- row: row,
4751
- index: globalIndex
4752
- }))));
4753
- });
4754
- }, [paginatedData, startIndex, selectedRows, expandedRows, rowClass, stripedRows, stripedColors, onRowClick, hasDetails, showSerial, selectable, visibleColumns, cellClass, withAction, visibleCount, DetailsComponent, actionsToUse, activeActionRowKey, activeAnchorEl, toggleExpandRow, handleSelectRow, toggleActions, handleOnAction, closeActionMenu, renderCell]);
4981
+ // Shared props for row components
4982
+ var rowSharedProps = {
4983
+ selectedRows: selectedRows,
4984
+ expandedRows: expandedRows,
4985
+ rowClass: rowClass,
4986
+ stripedRows: stripedRows,
4987
+ stripedColors: stripedColors,
4988
+ onRowClick: onRowClick,
4989
+ hasDetails: hasDetails,
4990
+ showSerial: showSerial,
4991
+ selectable: selectable,
4992
+ visibleColumns: visibleColumns,
4993
+ cellClass: cellClass,
4994
+ withAction: withAction,
4995
+ DetailsComponent: DetailsComponent,
4996
+ actionsToUse: actionsToUse,
4997
+ activeActionRowKey: activeActionRowKey,
4998
+ activeAnchorEl: activeAnchorEl,
4999
+ actionButtonRefs: actionButtonRefs,
5000
+ actionMenuRef: actionMenuRef,
5001
+ toggleExpandRow: toggleExpandRow,
5002
+ handleSelectRow: handleSelectRow,
5003
+ toggleActions: toggleActions,
5004
+ handleOnAction: handleOnAction,
5005
+ closeActionMenu: closeActionMenu,
5006
+ renderCell: renderCell
5007
+ };
4755
5008
  return /*#__PURE__*/React__default.createElement("div", {
4756
5009
  className: "w-full border rounded-lg md:rounded-md bg-white"
4757
- }, /*#__PURE__*/React__default.createElement("div", {
5010
+ }, TheadComponent && typeof TheadComponent === "function" ? /*#__PURE__*/React__default.createElement(TheadComponent, {
5011
+ columns: columnsState,
5012
+ data: filteredData
5013
+ }) : TheadComponent, /*#__PURE__*/React__default.createElement("div", {
4758
5014
  className: "flex flex-col md:flex-row justify-between items-start md:items-center gap-3 p-4 border-b"
4759
5015
  }, /*#__PURE__*/React__default.createElement("div", {
4760
5016
  className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 w-full md:w-auto"
@@ -4784,45 +5040,11 @@ var Table = function Table(_ref2) {
4784
5040
  className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 w-full md:w-auto"
4785
5041
  }, /*#__PURE__*/React__default.createElement("div", {
4786
5042
  className: "text-sm text-gray-700 whitespace-nowrap"
4787
- }, filteredData.length === 0 ? 0 : startIndex + 1, " -", " ", Math.min(endIndex, filteredData.length), " of ", filteredData.length, " ", "results"), pagination && /*#__PURE__*/React__default.createElement("div", {
4788
- className: "flex items-center gap-1"
4789
- }, totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
4790
- className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4791
- disabled: currentPage === 1,
4792
- onClick: function onClick() {
4793
- return handlePageChange(1);
4794
- },
4795
- "aria-label": "First page"
4796
- }, /*#__PURE__*/React__default.createElement(ChevronsLeft, {
4797
- className: "size-4 md:size-5 text-gray-800"
4798
- })), /*#__PURE__*/React__default.createElement("button", {
4799
- className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4800
- disabled: currentPage === 1,
4801
- onClick: function onClick() {
4802
- return handlePageChange(Math.max(1, currentPage - 1));
4803
- },
4804
- "aria-label": "Previous page"
4805
- }, /*#__PURE__*/React__default.createElement(ChevronLeft, {
4806
- className: "size-4 md:size-5 text-gray-800"
4807
- })), /*#__PURE__*/React__default.createElement("button", {
4808
- className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4809
- disabled: currentPage === totalPages,
4810
- onClick: function onClick() {
4811
- return handlePageChange(Math.min(totalPages, currentPage + 1));
4812
- },
4813
- "aria-label": "Next page"
4814
- }, /*#__PURE__*/React__default.createElement(ChevronRight, {
4815
- className: "size-4 md:size-5 text-gray-800"
4816
- })), totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
4817
- className: "rounded-lg md:rounded-md border border-gray-300 p-2 disabled:opacity-50 hover:bg-gray-50",
4818
- disabled: currentPage === totalPages,
4819
- onClick: function onClick() {
4820
- return handlePageChange(totalPages);
4821
- },
4822
- "aria-label": "Last page"
4823
- }, /*#__PURE__*/React__default.createElement(ChevronsRight, {
4824
- className: "size-4 md:size-5 text-gray-800"
4825
- }))))), globalSearch && /*#__PURE__*/React__default.createElement("div", {
5043
+ }, filteredData.length === 0 ? 0 : startIndex + 1, " -", " ", Math.min(endIndex, filteredData.length), " of ", filteredData.length, " ", "results"), pagination && /*#__PURE__*/React__default.createElement(PaginationHeader, {
5044
+ currentPage: currentPage,
5045
+ totalPages: totalPages,
5046
+ onPageChange: handlePageChange
5047
+ }))), globalSearch && /*#__PURE__*/React__default.createElement("div", {
4826
5048
  className: "p-4 border-b"
4827
5049
  }, /*#__PURE__*/React__default.createElement("div", {
4828
5050
  className: "flex flex-col sm:flex-row items-start sm:items-center gap-2"
@@ -4849,31 +5071,22 @@ var Table = function Table(_ref2) {
4849
5071
  handleFilter("global", "");
4850
5072
  },
4851
5073
  className: "whitespace-nowrap rounded-lg md:rounded-md border border-gray-300 px-4 py-3 md:py-2 text-sm hover:bg-gray-100 w-full sm:w-auto"
4852
- }, "Clear"))), filterable && isMobileView && renderMobileFilters(), showColumnMenu && /*#__PURE__*/React__default.createElement("div", {
4853
- ref: columnMenuRef,
4854
- className: "absolute right-4 mt-2 w-56 z-50 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 p-3 lg:block sm:block hidden",
4855
- onClick: function onClick(e) {
4856
- return e.stopPropagation();
4857
- }
4858
- }, /*#__PURE__*/React__default.createElement("p", {
4859
- className: "text-sm font-medium text-center mb-2"
4860
- }, "Show / hide columns"), /*#__PURE__*/React__default.createElement("div", {
4861
- className: "max-h-56 overflow-auto"
4862
- }, columnsState.map(function (col) {
4863
- return /*#__PURE__*/React__default.createElement("label", {
4864
- key: col.key,
4865
- className: "flex cursor-pointer items-center gap-2 px-2 py-1.5 hover:bg-gray-50 rounded"
4866
- }, /*#__PURE__*/React__default.createElement("input", {
4867
- type: "checkbox",
4868
- checked: col.isVisible !== false,
4869
- onChange: function onChange() {
4870
- return toggleColumnVisibility(col.key);
4871
- },
4872
- className: "rounded"
4873
- }), /*#__PURE__*/React__default.createElement("span", {
4874
- className: "text-sm font-normal"
4875
- }, col.label));
4876
- }))), !isMobileView && /*#__PURE__*/React__default.createElement("div", {
5074
+ }, "Clear"))), filterable && isMobileView && /*#__PURE__*/React__default.createElement(MobileFilters, {
5075
+ showMobileFilters: showMobileFilters,
5076
+ setShowMobileFilters: setShowMobileFilters,
5077
+ globalSearch: globalSearch,
5078
+ searchInput: searchInput,
5079
+ setSearchInput: setSearchInput,
5080
+ onGlobalKeyDown: onGlobalKeyDown,
5081
+ filterable: filterable,
5082
+ visibleColumns: visibleColumns,
5083
+ filters: filters,
5084
+ handleFilter: handleFilter
5085
+ }), showColumnMenu && /*#__PURE__*/React__default.createElement(ColumnMenu, {
5086
+ columns: columnsState,
5087
+ onToggle: toggleColumnVisibility,
5088
+ menuRef: columnMenuRef
5089
+ }), !isMobileView && /*#__PURE__*/React__default.createElement("div", {
4877
5090
  className: "overflow-x-auto"
4878
5091
  }, /*#__PURE__*/React__default.createElement("table", _extends({
4879
5092
  className: cn$1("min-w-full divide-y divide-gray-200", className)
@@ -4975,7 +5188,15 @@ var Table = function Table(_ref2) {
4975
5188
  className: "h-8 w-8"
4976
5189
  })), /*#__PURE__*/React__default.createElement("span", {
4977
5190
  className: "text-sm text-gray-500"
4978
- }, "No results found.")))) : renderDesktopTableRows()))), isMobileView && /*#__PURE__*/React__default.createElement("div", {
5191
+ }, "No results found.")))) : paginatedData.map(function (row, rowIndexInPage) {
5192
+ return /*#__PURE__*/React__default.createElement(TableRow, _extends({
5193
+ key: getRowKey(row, startIndex + rowIndexInPage),
5194
+ row: row,
5195
+ rowIndexInPage: rowIndexInPage,
5196
+ startIndex: startIndex,
5197
+ visibleCount: visibleCount
5198
+ }, rowSharedProps));
5199
+ })))), isMobileView && /*#__PURE__*/React__default.createElement("div", {
4979
5200
  className: "p-4"
4980
5201
  }, loading ? /*#__PURE__*/React__default.createElement("div", {
4981
5202
  className: "py-8 text-center"
@@ -4996,77 +5217,21 @@ var Table = function Table(_ref2) {
4996
5217
  })), /*#__PURE__*/React__default.createElement("span", {
4997
5218
  className: "text-sm text-gray-500"
4998
5219
  }, "No results found."))) : paginatedData.map(function (row, rowIndexInPage) {
4999
- return renderMobileCard(row, rowIndexInPage);
5000
- })), pagination && /*#__PURE__*/React__default.createElement("div", {
5001
- className: "p-4 border-t"
5002
- }, /*#__PURE__*/React__default.createElement("div", {
5003
- className: "flex flex-col sm:flex-row items-center justify-between gap-3"
5004
- }, /*#__PURE__*/React__default.createElement("div", {
5005
- className: "text-sm text-gray-600"
5006
- }, "Page ", currentPage, " of ", totalPages), /*#__PURE__*/React__default.createElement("div", {
5007
- className: "flex items-center gap-1 sm:gap-2"
5008
- }, totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
5009
- className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
5010
- disabled: currentPage === 1,
5011
- onClick: function onClick() {
5012
- return handlePageChange(1);
5013
- },
5014
- "aria-label": "First page"
5015
- }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronsLeft, {
5016
- className: "size-4 text-gray-800"
5017
- }) : "First"), /*#__PURE__*/React__default.createElement("button", {
5018
- className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
5019
- disabled: currentPage === 1,
5020
- onClick: function onClick() {
5021
- return handlePageChange(Math.max(1, currentPage - 1));
5022
- },
5023
- "aria-label": "Previous page"
5024
- }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronLeft, {
5025
- className: "size-4 text-gray-800"
5026
- }) : "Previous"), /*#__PURE__*/React__default.createElement("div", {
5027
- className: "flex items-center gap-1"
5028
- }, Array.from({
5029
- length: Math.min(isMobileView ? 5 : 3, totalPages)
5030
- }, function (_, i) {
5031
- var pageNum;
5032
- if (totalPages <= 5) {
5033
- pageNum = i + 1;
5034
- } else if (currentPage <= 3) {
5035
- pageNum = i + 1;
5036
- } else if (currentPage >= totalPages - 2) {
5037
- pageNum = totalPages - 4 + i;
5038
- } else {
5039
- pageNum = currentPage - 2 + i;
5040
- }
5041
- return /*#__PURE__*/React__default.createElement("button", {
5042
- key: pageNum,
5043
- className: cn$1("h-8 w-8 rounded-lg md:rounded-md text-sm", {
5044
- "bg-primary-600 text-white": pageNum === currentPage,
5045
- "border border-gray-300 hover:bg-gray-50": pageNum !== currentPage
5046
- }),
5047
- onClick: function onClick() {
5048
- return handlePageChange(pageNum);
5049
- }
5050
- }, pageNum);
5051
- })), /*#__PURE__*/React__default.createElement("button", {
5052
- className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
5053
- disabled: currentPage === totalPages,
5054
- onClick: function onClick() {
5055
- return handlePageChange(Math.min(totalPages, currentPage + 1));
5056
- },
5057
- "aria-label": "Next page"
5058
- }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronRight, {
5059
- className: "size-4 text-gray-800"
5060
- }) : "Next"), totalPages >= 4 && /*#__PURE__*/React__default.createElement("button", {
5061
- className: cn$1("rounded-lg md:rounded-md border border-gray-300 disabled:opacity-50 hover:bg-gray-50", isMobileView ? "p-2" : "px-4 py-2 text-sm"),
5062
- disabled: currentPage === totalPages,
5063
- onClick: function onClick() {
5064
- return handlePageChange(totalPages);
5065
- },
5066
- "aria-label": "Last page"
5067
- }, isMobileView ? /*#__PURE__*/React__default.createElement(ChevronsRight, {
5068
- className: "size-4 text-gray-800"
5069
- }) : "Last")))));
5220
+ return /*#__PURE__*/React__default.createElement(MobileCard, _extends({
5221
+ key: getRowKey(row, startIndex + rowIndexInPage),
5222
+ row: row,
5223
+ rowIndexInPage: rowIndexInPage,
5224
+ startIndex: startIndex
5225
+ }, rowSharedProps));
5226
+ })), TfootComponent && typeof TfootComponent === "function" ? /*#__PURE__*/React__default.createElement(TfootComponent, {
5227
+ columns: columnsState,
5228
+ data: filteredData
5229
+ }) : TfootComponent, pagination && /*#__PURE__*/React__default.createElement(PaginationFooter, {
5230
+ currentPage: currentPage,
5231
+ totalPages: totalPages,
5232
+ onPageChange: handlePageChange,
5233
+ isMobileView: isMobileView
5234
+ }));
5070
5235
  };
5071
5236
 
5072
5237
  var isCheckBoxInput = (element) => element.type === 'checkbox';
@@ -17595,7 +17760,7 @@ var canUseDOM = () => !!(typeof window !== "undefined" && typeof window.document
17595
17760
  var isDOM = /* @__PURE__ */ canUseDOM();
17596
17761
  var isRunningInReactNative = () => typeof navigator !== "undefined" && navigator.product === "ReactNative";
17597
17762
  var isReactNative = /* @__PURE__ */ isRunningInReactNative();
17598
- var getUseIsomorphicLayoutEffect = () => isDOM || isReactNative ? React.useLayoutEffect : React.useEffect;
17763
+ var getUseIsomorphicLayoutEffect = () => isDOM || isReactNative ? React$1.useLayoutEffect : React$1.useEffect;
17599
17764
  var useIsomorphicLayoutEffect = /* @__PURE__ */ getUseIsomorphicLayoutEffect();
17600
17765
 
17601
17766
  // src/components/Context.ts
@@ -17605,17 +17770,17 @@ var gT = typeof globalThis !== "undefined" ? globalThis : (
17605
17770
  {}
17606
17771
  );
17607
17772
  function getContext() {
17608
- if (!React.createContext) return {};
17773
+ if (!React$1.createContext) return {};
17609
17774
  const contextMap = gT[ContextKey] ??= /* @__PURE__ */ new Map();
17610
- let realContext = contextMap.get(React.createContext);
17775
+ let realContext = contextMap.get(React$1.createContext);
17611
17776
  if (!realContext) {
17612
- realContext = React.createContext(
17777
+ realContext = React$1.createContext(
17613
17778
  null
17614
17779
  );
17615
17780
  if (process.env.NODE_ENV !== "production") {
17616
17781
  realContext.displayName = "ReactRedux";
17617
17782
  }
17618
- contextMap.set(React.createContext, realContext);
17783
+ contextMap.set(React$1.createContext, realContext);
17619
17784
  }
17620
17785
  return realContext;
17621
17786
  }
@@ -17624,7 +17789,7 @@ var ReactReduxContext = /* @__PURE__ */ getContext();
17624
17789
  // src/components/Provider.tsx
17625
17790
  function Provider(providerProps) {
17626
17791
  const { children, context, serverState, store } = providerProps;
17627
- const contextValue = React.useMemo(() => {
17792
+ const contextValue = React$1.useMemo(() => {
17628
17793
  const subscription = createSubscription(store);
17629
17794
  const baseContextValue = {
17630
17795
  store,
@@ -17641,7 +17806,7 @@ function Provider(providerProps) {
17641
17806
  });
17642
17807
  }
17643
17808
  }, [store, serverState]);
17644
- const previousState = React.useMemo(() => store.getState(), [store]);
17809
+ const previousState = React$1.useMemo(() => store.getState(), [store]);
17645
17810
  useIsomorphicLayoutEffect(() => {
17646
17811
  const { subscription } = contextValue;
17647
17812
  subscription.onStateChange = subscription.notifyNestedSubs;
@@ -17655,14 +17820,14 @@ function Provider(providerProps) {
17655
17820
  };
17656
17821
  }, [contextValue, previousState]);
17657
17822
  const Context = context || ReactReduxContext;
17658
- return /* @__PURE__ */ React.createElement(Context.Provider, { value: contextValue }, children);
17823
+ return /* @__PURE__ */ React$1.createElement(Context.Provider, { value: contextValue }, children);
17659
17824
  }
17660
17825
  var Provider_default = Provider;
17661
17826
 
17662
17827
  // src/hooks/useReduxContext.ts
17663
17828
  function createReduxContextHook(context = ReactReduxContext) {
17664
17829
  return function useReduxContext2() {
17665
- const contextValue = React.useContext(context);
17830
+ const contextValue = React$1.useContext(context);
17666
17831
  if (process.env.NODE_ENV !== "production" && !contextValue) {
17667
17832
  throw new Error(
17668
17833
  "could not find react-redux context value; please ensure the component is wrapped in a <Provider>"
@@ -17723,8 +17888,8 @@ function createSelectorHook(context = ReactReduxContext) {
17723
17888
  }
17724
17889
  const reduxContext = useReduxContext2();
17725
17890
  const { store, subscription, getServerState } = reduxContext;
17726
- const firstRun = React.useRef(true);
17727
- const wrappedSelector = React.useCallback(
17891
+ const firstRun = React$1.useRef(true);
17892
+ const wrappedSelector = React$1.useCallback(
17728
17893
  {
17729
17894
  [selector.name](state) {
17730
17895
  const selected = selector(state);
@@ -17787,7 +17952,7 @@ function createSelectorHook(context = ReactReduxContext) {
17787
17952
  wrappedSelector,
17788
17953
  equalityFn
17789
17954
  );
17790
- React.useDebugValue(selectedState);
17955
+ React$1.useDebugValue(selectedState);
17791
17956
  return selectedState;
17792
17957
  };
17793
17958
  Object.assign(useSelector2, {