@dreamtree-org/twreact-ui 1.0.70 → 1.0.71

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.js CHANGED
@@ -3883,7 +3883,7 @@ var Select = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
3883
3883
  }, error));
3884
3884
  });
3885
3885
 
3886
- 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"];
3886
+ 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"];
3887
3887
  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; }
3888
3888
  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; }
3889
3889
  var Table = function Table(_ref) {
@@ -3937,7 +3937,13 @@ var Table = function Table(_ref) {
3937
3937
  stripedColors = _ref$stripedColors === void 0 ? ["#ffffff", "#f7fafc"] : _ref$stripedColors,
3938
3938
  _ref$responsiveBreakp = _ref.responsiveBreakpoint,
3939
3939
  responsiveBreakpoint = _ref$responsiveBreakp === void 0 ? 768 : _ref$responsiveBreakp,
3940
- props = _objectWithoutProperties$1(_ref, _excluded$k);
3940
+ _ref$serverSide = _ref.serverSide,
3941
+ serverSide = _ref$serverSide === void 0 ? false : _ref$serverSide,
3942
+ _ref$totalRecords = _ref.totalRecords,
3943
+ totalRecords = _ref$totalRecords === void 0 ? 0 : _ref$totalRecords,
3944
+ pageNumber = _ref.pageNumber;
3945
+ _ref.onPageChange;
3946
+ var props = _objectWithoutProperties$1(_ref, _excluded$k);
3941
3947
  // State for responsive view
3942
3948
  var _useState = React.useState(false),
3943
3949
  _useState2 = _slicedToArray(_useState, 2),
@@ -3998,7 +4004,7 @@ var Table = function Table(_ref) {
3998
4004
  _useState16 = _slicedToArray(_useState15, 2),
3999
4005
  expandedRows = _useState16[0],
4000
4006
  setExpandedRows = _useState16[1];
4001
- var _useState17 = React.useState(1),
4007
+ var _useState17 = React.useState(typeof pageNumber === "number" ? pageNumber : 1),
4002
4008
  _useState18 = _slicedToArray(_useState17, 2),
4003
4009
  currentPage = _useState18[0],
4004
4010
  setCurrentPage = _useState18[1];
@@ -4028,6 +4034,14 @@ var Table = function Table(_ref) {
4028
4034
  openActionKey = _useState28[0],
4029
4035
  setOpenActionKey = _useState28[1];
4030
4036
  var openRef = React.useRef(null);
4037
+ React.useEffect(function () {
4038
+ if (typeof pageNumber === "number" && pageNumber !== currentPage) {
4039
+ setCurrentPage(pageNumber);
4040
+ }
4041
+ }, [pageNumber]);
4042
+ React.useEffect(function () {
4043
+ setLimit(pageSize);
4044
+ }, [pageSize]);
4031
4045
 
4032
4046
  // Check if mobile view
4033
4047
  React.useEffect(function () {
@@ -4047,9 +4061,6 @@ var Table = function Table(_ref) {
4047
4061
  var isValidList = function isValidList(d) {
4048
4062
  return Array.isArray(d);
4049
4063
  };
4050
- var setDataForExternal = function setDataForExternal(newData) {
4051
- if (isValidList(newData)) setTableData(newData);else setTableData([]);
4052
- };
4053
4064
 
4054
4065
  // Close column menu when clicking outside
4055
4066
  React.useEffect(function () {
@@ -4146,70 +4157,42 @@ var Table = function Table(_ref) {
4146
4157
 
4147
4158
  // Sorting
4148
4159
  var sortedData = React.useMemo(function () {
4149
- if (!sortConfig.key) return tableData;
4160
+ if (serverSide || !sortConfig.key) return tableData;
4150
4161
  var key = sortConfig.key,
4151
4162
  direction = sortConfig.direction;
4152
4163
  return _toConsumableArray$1(tableData).sort(function (a, b) {
4153
- var aValue = a === null || a === void 0 ? void 0 : a[key];
4154
- var bValue = b === null || b === void 0 ? void 0 : b[key];
4155
- if (aValue == null && bValue == null) return 0;
4156
- if (aValue == null) return direction === "asc" ? -1 : 1;
4157
- if (bValue == null) return direction === "asc" ? 1 : -1;
4158
- if (typeof aValue === "number" && typeof bValue === "number") {
4159
- return direction === "asc" ? aValue - bValue : bValue - aValue;
4160
- }
4161
- var aStr = String(aValue).toLowerCase();
4162
- var bStr = String(bValue).toLowerCase();
4163
- if (aStr < bStr) return direction === "asc" ? -1 : 1;
4164
- if (aStr > bStr) return direction === "asc" ? 1 : -1;
4165
- return 0;
4164
+ var av = a === null || a === void 0 ? void 0 : a[key];
4165
+ var bv = b === null || b === void 0 ? void 0 : b[key];
4166
+ if (av == null || bv == null) return 0;
4167
+ if (typeof av === "number") return direction === "asc" ? av - bv : bv - av;
4168
+ return direction === "asc" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));
4166
4169
  });
4167
- }, [tableData, sortConfig]);
4170
+ }, [tableData, sortConfig, serverSide]);
4168
4171
 
4169
4172
  // Filtering
4170
4173
  var filteredData = React.useMemo(function () {
4171
- if (!filterable || Object.keys(filters).length === 0) return sortedData;
4172
- var globalQuery = String(filters.global || "").trim().toLowerCase();
4174
+ if (serverSide || !filterable || !Object.keys(filters).length) return sortedData;
4175
+ var q = (filters.global || "").toLowerCase();
4173
4176
  return sortedData.filter(function (row) {
4174
- // Per-column filters
4175
- var perColumnOk = Object.entries(filters).every(function (_ref2) {
4176
- var _ref3 = _slicedToArray(_ref2, 2),
4177
- key = _ref3[0],
4178
- value = _ref3[1];
4179
- if (key === "global") return true;
4180
- if (!value) return true;
4181
- var cell = row === null || row === void 0 ? void 0 : row[key];
4182
- if (cell == null) return false;
4183
- return String(cell).toLowerCase().includes(String(value).toLowerCase());
4177
+ return Object.values(row || {}).some(function (v) {
4178
+ return String(v).toLowerCase().includes(q);
4184
4179
  });
4185
- if (!perColumnOk) return false;
4186
-
4187
- // Global filter
4188
- if (globalQuery) {
4189
- var matchesVisible = visibleColumns.some(function (col) {
4190
- var v = row === null || row === void 0 ? void 0 : row[col.key];
4191
- if (v == null) return false;
4192
- return String(v).toLowerCase().includes(globalQuery);
4193
- });
4194
- if (matchesVisible) return true;
4195
- return Object.values(row || {}).some(function (v) {
4196
- return v != null ? String(v).toLowerCase().includes(globalQuery) : false;
4197
- });
4198
- }
4199
- return true;
4200
4180
  });
4201
- }, [sortedData, filters, filterable, visibleColumns]);
4202
-
4181
+ }, [sortedData, filters, filterable, serverSide]);
4203
4182
  // Pagination indices
4204
4183
  var startIndex = pagination ? (currentPage - 1) * limit : 0;
4205
4184
  var endIndex = pagination ? startIndex + limit : filteredData.length;
4206
4185
 
4207
4186
  // Paginated view
4208
4187
  var paginatedData = React.useMemo(function () {
4209
- if (!pagination) return filteredData;
4210
- return filteredData.slice(startIndex, endIndex);
4211
- }, [filteredData, startIndex, endIndex, pagination]);
4212
- var totalPages = Math.max(1, Math.ceil(filteredData.length / limit));
4188
+ if (!pagination || serverSide) return filteredData;
4189
+ var start = (currentPage - 1) * limit;
4190
+ return filteredData.slice(start, start + limit);
4191
+ }, [filteredData, pagination, serverSide, currentPage, limit]);
4192
+ var totalPages = React.useMemo(function () {
4193
+ if (!pagination) return 1;
4194
+ return serverSide ? Math.max(1, Math.ceil((totalRecords || 0) / limit)) : Math.max(1, Math.ceil(filteredData.length / limit));
4195
+ }, [pagination, serverSide, totalRecords, filteredData.length, limit]);
4213
4196
 
4214
4197
  // Sorting handler
4215
4198
  var handleSort = function handleSort(key) {
@@ -4324,17 +4307,19 @@ var Table = function Table(_ref) {
4324
4307
  React.useEffect(function () {
4325
4308
  if (!onFetch) return;
4326
4309
  onFetch({
4327
- setData: setDataForExternal,
4328
- filters: filters,
4310
+ setData: function setData(rows) {
4311
+ return setTableData(Array.isArray(rows) ? rows : []);
4312
+ },
4329
4313
  setLoading: setLoading,
4330
- pagination: {
4331
- currentPage: currentPage,
4332
- limit: limit,
4333
- totalPages: totalPages,
4334
- nextRecords: paginatedData
4335
- }
4314
+ filters: filters,
4315
+ page: currentPage,
4316
+ limit: limit,
4317
+ sort: sortConfig
4336
4318
  });
4337
- }, [filters, currentPage, limit]);
4319
+ }, [onFetch, filters, currentPage, limit, sortConfig]);
4320
+ React.useEffect(function () {
4321
+ if (!serverSide) setTableData(data);
4322
+ }, [data, serverSide]);
4338
4323
  React.useEffect(function () {
4339
4324
  if (!onFetch && isValidList(data)) setTableData(data);
4340
4325
  }, [data, onFetch]);
@@ -4352,13 +4337,11 @@ var Table = function Table(_ref) {
4352
4337
  applyGlobalSearch();
4353
4338
  }
4354
4339
  };
4355
- React.useEffect(function () {
4356
- setLimit(pageSize);
4357
- }, [pageSize]);
4358
4340
  var handleLimitChange = function handleLimitChange(nextLimit) {
4359
4341
  var parsed = Number(nextLimit);
4360
4342
  if (!Number.isFinite(parsed) || parsed <= 0) return;
4361
4343
  setLimit(parsed);
4344
+ setCurrentPage(1);
4362
4345
  onLimitChange === null || onLimitChange === void 0 || onLimitChange(parsed);
4363
4346
  };
4364
4347
 
@@ -4701,7 +4684,7 @@ var Table = function Table(_ref) {
4701
4684
  }, /*#__PURE__*/React.createElement("input", {
4702
4685
  type: "text",
4703
4686
  placeholder: "Filter ".concat(column.label),
4704
- className: "w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm",
4687
+ className: "w-full rounded-md border border-gray-300 px-3 py-1.5 text-sm font-normal",
4705
4688
  value: filters[column.key] || "",
4706
4689
  onChange: function onChange(e) {
4707
4690
  return handleFilter(column.key, e.target.value);
@@ -4901,14 +4884,14 @@ var Table = function Table(_ref) {
4901
4884
  }
4902
4885
  }, "Next")))));
4903
4886
  };
4904
- function ActionMenuPortal(_ref4) {
4905
- var anchorElem = _ref4.anchorElem,
4906
- anchorRow = _ref4.anchorRow,
4907
- _ref4$actions = _ref4.actions,
4908
- actions = _ref4$actions === void 0 ? [] : _ref4$actions;
4909
- _ref4.onClose;
4910
- var onAction = _ref4.onAction,
4911
- menuRef = _ref4.menuRef;
4887
+ function ActionMenuPortal(_ref2) {
4888
+ var anchorElem = _ref2.anchorElem,
4889
+ anchorRow = _ref2.anchorRow,
4890
+ _ref2$actions = _ref2.actions,
4891
+ actions = _ref2$actions === void 0 ? [] : _ref2$actions;
4892
+ _ref2.onClose;
4893
+ var onAction = _ref2.onAction,
4894
+ menuRef = _ref2.menuRef;
4912
4895
  var _useState29 = React.useState({
4913
4896
  left: 0,
4914
4897
  top: 0,