tabler-react-2 0.1.158-alpha.2 → 0.1.158-alpha.3

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.
@@ -52,7 +52,7 @@ var PageSizeSelect = exports.PageSizeSelect = function PageSizeSelect(_ref3) {
52
52
  options = _ref3$options === void 0 ? [10, 25, 50, 100] : _ref3$options,
53
53
  dense = _ref3.dense;
54
54
  return /*#__PURE__*/_react["default"].createElement("select", {
55
- className: dense ? "form-select form-select-sm" : "form-select",
55
+ className: "form-select form-select-sm",
56
56
  value: value,
57
57
  onChange: function onChange(e) {
58
58
  return _onChange(Number(e.target.value));
@@ -109,18 +109,29 @@ var isEmptyRender = function isEmptyRender(node) {
109
109
  if (typeof node === "string" && node.trim() === "") return true;
110
110
  return false;
111
111
  };
112
- var renderCellWithFallback = function renderCellWithFallback(cell) {
112
+ var renderCellWithFallback = function renderCellWithFallback(cell, fallbackText) {
113
113
  var _cell$getValue;
114
114
  var rendered = (0, _reactTable.flexRender)(cell.column.columnDef.cell, cell.getContext());
115
115
  var finalNode = isEmptyRender(rendered) ? (_cell$getValue = cell.getValue) === null || _cell$getValue === void 0 ? void 0 : _cell$getValue.call(cell) : rendered;
116
116
  if (finalNode === null || finalNode === undefined || typeof finalNode === "string" && finalNode.trim() === "") {
117
117
  return /*#__PURE__*/_react["default"].createElement("span", {
118
118
  className: "text-muted"
119
- }, "\u2014");
119
+ }, fallbackText);
120
120
  }
121
121
  return finalNode;
122
122
  };
123
123
 
124
+ /** Skeletons */
125
+
126
+ var SkeletonCSS = function SkeletonCSS() {
127
+ return /*#__PURE__*/_react["default"].createElement("style", null, "\n /* TableV2 skeletons */\n .tblv2-skel {\n display: inline-block;\n vertical-align: middle;\n border-radius: 9999px;\n background: linear-gradient(90deg, #e9ecef 25%, #f1f3f5 37%, #e9ecef 63%);\n background-size: 400% 100%;\n animation: tblv2-shimmer 1.2s ease-in-out infinite;\n }\n @keyframes tblv2-shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: 0 0; }\n }\n ");
128
+ };
129
+ var skeletonWidthAt = function skeletonWidthAt(rowIdx, colIdx) {
130
+ // Cycle through some natural-looking widths
131
+ var widths = [48, 72, 96, 120, 64, 88, 140];
132
+ return widths[(rowIdx + colIdx) % widths.length];
133
+ };
134
+
124
135
  /** Main table */
125
136
 
126
137
  var TableV2 = exports.TableV2 = function TableV2(_ref5) {
@@ -178,8 +189,6 @@ var TableV2 = exports.TableV2 = function TableV2(_ref5) {
178
189
  // IMPORTANT: provide a stable id (e.g., row => row.id) when paginating
179
190
  autoResetRowSelection: false,
180
191
  onSortingChange: onSortingChange,
181
- // Note: renderFallbackValue triggers only when a renderer returns `undefined`.
182
- // We still handle null/"" ourselves in renderCellWithFallback.
183
192
  renderFallbackValue: /*#__PURE__*/_react["default"].createElement("span", {
184
193
  className: "text-muted"
185
194
  }, fallbackText)
@@ -222,10 +231,40 @@ var TableV2 = exports.TableV2 = function TableV2(_ref5) {
222
231
  state: sortState || false
223
232
  }));
224
233
  };
234
+ var total = totalRows !== null && totalRows !== void 0 ? totalRows : 0;
235
+ var leafCols = table.getAllLeafColumns().length;
225
236
  var content = (0, _react.useMemo)(function () {
237
+ if (loading) {
238
+ var rowCount = Math.max(1, size || data.length || 10);
239
+ var rowClass = [dense ? "align-middle" : ""].filter(Boolean).join(" ");
240
+ var cellClass = [dense ? "py-1" : ""].filter(Boolean).join(" ");
241
+ var pillHeight = dense ? 16 : 18;
242
+ return Array.from({
243
+ length: rowCount
244
+ }).map(function (_, r) {
245
+ return /*#__PURE__*/_react["default"].createElement("tr", {
246
+ key: "skel-".concat(r),
247
+ className: rowClass,
248
+ "aria-hidden": "true"
249
+ }, Array.from({
250
+ length: leafCols
251
+ }).map(function (__, c) {
252
+ return /*#__PURE__*/_react["default"].createElement("td", {
253
+ key: "skel-".concat(r, "-").concat(c),
254
+ className: cellClass
255
+ }, /*#__PURE__*/_react["default"].createElement("span", {
256
+ className: "tblv2-skel",
257
+ style: {
258
+ height: pillHeight,
259
+ width: skeletonWidthAt(r, c)
260
+ }
261
+ }));
262
+ }));
263
+ });
264
+ }
226
265
  if (!loading && data.length === 0) {
227
266
  return /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", {
228
- colSpan: table.getAllLeafColumns().length,
267
+ colSpan: leafCols,
229
268
  className: "text-center ".concat(dense ? "py-3 small" : "py-3", " text-muted")
230
269
  }, typeof emptyState === "function" ? emptyState() : emptyState));
231
270
  }
@@ -237,15 +276,14 @@ var TableV2 = exports.TableV2 = function TableV2(_ref5) {
237
276
  return /*#__PURE__*/_react["default"].createElement("td", {
238
277
  key: cell.id,
239
278
  className: [cell.column.columnDef.className || "", dense ? "py-1" : ""].filter(Boolean).join(" ")
240
- }, renderCellWithFallback(cell));
279
+ }, renderCellWithFallback(cell, fallbackText));
241
280
  }));
242
281
  });
243
282
  // Depend on internal table state so selection/sorting changes trigger re-render
244
- }, [data, loading, emptyState, dense, table, rs, currentSorting]);
245
- var total = totalRows !== null && totalRows !== void 0 ? totalRows : 0;
283
+ }, [loading, size, data, dense, table, rs, currentSorting, emptyState, leafCols, fallbackText]);
246
284
  return /*#__PURE__*/_react["default"].createElement("div", {
247
285
  className: parentClassName
248
- }, /*#__PURE__*/_react["default"].createElement("div", {
286
+ }, /*#__PURE__*/_react["default"].createElement(SkeletonCSS, null), /*#__PURE__*/_react["default"].createElement("div", {
249
287
  className: "table-responsive ".concat(nowrap ? "table-nowrap" : "", " ").concat(className)
250
288
  }, /*#__PURE__*/_react["default"].createElement("table", {
251
289
  className: ["table table-vcenter", stickyHeader ? "sticky-top" : "", dense ? "table-sm" : "", tableClassName].filter(Boolean).join(" ")
@@ -257,17 +295,8 @@ var TableV2 = exports.TableV2 = function TableV2(_ref5) {
257
295
  header: h
258
296
  });
259
297
  }));
260
- })), /*#__PURE__*/_react["default"].createElement("tbody", null, loading && /*#__PURE__*/_react["default"].createElement("tr", null, /*#__PURE__*/_react["default"].createElement("td", {
261
- colSpan: table.getAllLeafColumns().length,
262
- className: "text-center ".concat(dense ? "py-2" : "py-3")
263
- }, /*#__PURE__*/_react["default"].createElement("span", {
264
- className: "spinner-border spinner-border-sm me-2",
265
- role: "status",
266
- "aria-hidden": true
267
- }), /*#__PURE__*/_react["default"].createElement("span", {
268
- className: dense ? "small text-muted" : "text-muted"
269
- }, "Loading\u2026"))), content))), showPagination && /*#__PURE__*/_react["default"].createElement("div", {
270
- className: "d-flex justify-content-between align-items-center ".concat(dense ? "mt-1" : "mt-2", " ").concat(paginationClassName)
298
+ })), /*#__PURE__*/_react["default"].createElement("tbody", null, content))), showPagination && /*#__PURE__*/_react["default"].createElement("div", {
299
+ className: "d-flex justify-content-between align-items-center mx-2 ".concat(dense ? "my-1" : "my-2", " ").concat(paginationClassName)
271
300
  }, /*#__PURE__*/_react["default"].createElement("div", {
272
301
  className: "d-flex align-items-center ".concat(dense ? "gap-2" : "")
273
302
  }, /*#__PURE__*/_react["default"].createElement(Pager, {
@@ -342,6 +371,7 @@ TableV2.propTypes = {
342
371
  parentClassName: _propTypes["default"].string,
343
372
  emptyState: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].func]),
344
373
  loading: _propTypes["default"].bool,
374
+ // now shows skeleton pills per cell
345
375
  showPagination: _propTypes["default"].bool,
346
376
  pageSizeOptions: _propTypes["default"].arrayOf(_propTypes["default"].number),
347
377
  dense: _propTypes["default"].bool
@@ -363,7 +393,7 @@ TableV2.propTypes = {
363
393
  * rowSelection={rowSelection} // { [rowId]: true }
364
394
  * onRowSelectionChange={setRowSelection}
365
395
  * getRowId={(row) => row.id} // <<< stable id across pages
366
- * loading={loading}
396
+ * loading={loading} // <<< skeletons instead of spinner row
367
397
  * nowrap
368
398
  * stickyHeader
369
399
  * />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabler-react-2",
3
- "version": "0.1.158-alpha.2",
3
+ "version": "0.1.158-alpha.3",
4
4
  "description": "A react implementation of Tabler ui",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {