react-pivottable-plus 1.0.14 → 1.0.18

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.
Files changed (59) hide show
  1. package/README.md +2 -0
  2. package/dist/PivotTableUI.js +147 -213
  3. package/dist/PivotTableUI.js.map +1 -1
  4. package/dist/TableRenderers.js +273 -49
  5. package/dist/TableRenderers.js.map +1 -1
  6. package/dist/core/CellPipeline.js +167 -0
  7. package/dist/core/CellPipeline.js.map +1 -0
  8. package/dist/core/ColumnEngine.js +299 -0
  9. package/dist/core/ColumnEngine.js.map +1 -0
  10. package/dist/core/EventBus.js +109 -0
  11. package/dist/core/EventBus.js.map +1 -0
  12. package/dist/core/ModuleRegistry.js +140 -0
  13. package/dist/core/ModuleRegistry.js.map +1 -0
  14. package/dist/core/PivotCore.js +254 -0
  15. package/dist/core/PivotCore.js.map +1 -0
  16. package/dist/core/PivotEngine.js +151 -0
  17. package/dist/core/PivotEngine.js.map +1 -0
  18. package/dist/core/StateManager.js +142 -0
  19. package/dist/core/StateManager.js.map +1 -0
  20. package/dist/core/VirtualScroller.js +138 -0
  21. package/dist/core/VirtualScroller.js.map +1 -0
  22. package/dist/core/api/ColumnApi.js +162 -0
  23. package/dist/core/api/ColumnApi.js.map +1 -0
  24. package/dist/core/api/GridApi.js +208 -0
  25. package/dist/core/api/GridApi.js.map +1 -0
  26. package/dist/core/index.js +89 -0
  27. package/dist/core/index.js.map +1 -0
  28. package/dist/core/rowModels/ClientSideRowModel.js +177 -0
  29. package/dist/core/rowModels/ClientSideRowModel.js.map +1 -0
  30. package/dist/core/rowModels/index.js +13 -0
  31. package/dist/core/rowModels/index.js.map +1 -0
  32. package/dist/hooks/useColumnResize.js +112 -0
  33. package/dist/hooks/useColumnResize.js.map +1 -0
  34. package/dist/hooks/usePivot.js +68 -155
  35. package/dist/hooks/usePivot.js.map +1 -1
  36. package/dist/modules/FilterModule.js +156 -0
  37. package/dist/modules/FilterModule.js.map +1 -0
  38. package/dist/modules/PaginationModule.js +115 -0
  39. package/dist/modules/PaginationModule.js.map +1 -0
  40. package/dist/modules/SortModule.js +88 -0
  41. package/dist/modules/SortModule.js.map +1 -0
  42. package/dist/modules/ThemeModule.js +83 -0
  43. package/dist/modules/ThemeModule.js.map +1 -0
  44. package/dist/modules/VirtualizationModule.js +89 -0
  45. package/dist/modules/VirtualizationModule.js.map +1 -0
  46. package/dist/modules/index.js +41 -0
  47. package/dist/modules/index.js.map +1 -0
  48. package/dist/react/index.js +13 -0
  49. package/dist/react/index.js.map +1 -0
  50. package/dist/react/usePivotGrid.js +116 -0
  51. package/dist/react/usePivotGrid.js.map +1 -0
  52. package/dist/renderers/RadixUI.js +1 -1
  53. package/dist/renderers/RadixUI.js.map +1 -1
  54. package/dist/renderers/ShadcnDashboardUI.js +1 -1
  55. package/dist/renderers/ShadcnDashboardUI.js.map +1 -1
  56. package/dist/renderers/TailwindUI.js +1 -1
  57. package/dist/renderers/TailwindUI.js.map +1 -1
  58. package/package.json +8 -5
  59. package/pivottable.css +69 -12
@@ -8,7 +8,14 @@ exports["default"] = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _Utilities = require("./Utilities");
11
+ var _CellPipeline = require("./core/CellPipeline");
12
+ var _VirtualScroller = require("./core/VirtualScroller");
13
+ var _useColumnResize2 = require("./hooks/useColumnResize");
11
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
15
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
16
+ function ownKeys(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; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
12
19
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
13
20
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
14
21
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -85,13 +92,14 @@ var toggle = function toggle(set, arr) {
85
92
  };
86
93
  function makeRenderer() {
87
94
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
88
- var TableRenderer = /*#__PURE__*/function (_React$PureComponent) {
89
- function TableRenderer() {
90
- _classCallCheck(this, TableRenderer);
91
- return _callSuper(this, TableRenderer, arguments);
95
+ // ─── Inner class (toda la lógica de render) ──────────────────────
96
+ var TableRendererInner = /*#__PURE__*/function (_React$PureComponent) {
97
+ function TableRendererInner() {
98
+ _classCallCheck(this, TableRendererInner);
99
+ return _callSuper(this, TableRendererInner, arguments);
92
100
  }
93
- _inherits(TableRenderer, _React$PureComponent);
94
- return _createClass(TableRenderer, [{
101
+ _inherits(TableRendererInner, _React$PureComponent);
102
+ return _createClass(TableRendererInner, [{
95
103
  key: "render",
96
104
  value: function render() {
97
105
  var _this = this;
@@ -102,6 +110,22 @@ function makeRenderer() {
102
110
  var rowKeys = pivotData.getRowKeys(true);
103
111
  var colKeys = pivotData.getColKeys(true);
104
112
  var grandTotalAggregator = pivotData.getAggregator([], []);
113
+
114
+ // ─── Cell Pipeline ────────────────────────────────────────────────
115
+ var pipeline = this.props.cellPipeline ? new _CellPipeline.CellPipeline(this.props.cellPipeline) : _CellPipeline.CellPipeline["default"]();
116
+
117
+ // ─── Virtualización ───────────────────────────────────────────────
118
+ var virtConfig = this.props.virtualization || {};
119
+ var scroller = new _VirtualScroller.VirtualScroller({
120
+ enabled: virtConfig.enabled !== undefined ? virtConfig.enabled : false,
121
+ rowHeight: virtConfig.rowHeight || 32,
122
+ colWidth: virtConfig.colWidth || 100,
123
+ overscanRows: virtConfig.overscanRows || 5,
124
+ overscanCols: virtConfig.overscanCols || 3,
125
+ containerHeight: virtConfig.containerHeight || 400,
126
+ containerWidth: virtConfig.containerWidth || 800,
127
+ threshold: virtConfig.threshold || 100
128
+ });
105
129
  var grouping = pivotData.props.grouping;
106
130
  var compactRows = grouping && this.props.compactRows;
107
131
  // speacial case for spanSize counting (no_loop)
@@ -137,6 +161,10 @@ function makeRenderer() {
137
161
  _iterator.f();
138
162
  }
139
163
  }
164
+
165
+ // Guardar todos los colKeys para totales (SIEMPRE calcula sobre todo)
166
+ var allColKeys = colKeys;
167
+ var allRowKeys = rowKeys;
140
168
  var totalRows = rowKeys.length;
141
169
  var startOffset = 0;
142
170
  if (this.props.pagination) {
@@ -145,7 +173,33 @@ function makeRenderer() {
145
173
  var end = start + this.props.pageSize;
146
174
  rowKeys = rowKeys.slice(start, end);
147
175
  }
176
+
177
+ // Aplicar virtualización bidireccional
178
+ var shouldVirt = scroller.shouldVirtualize(rowKeys.length, colKeys.length);
179
+ var scrollTop = (this.state || {}).scrollTop || 0;
180
+ var scrollLeft = (this.state || {}).scrollLeft || 0;
181
+ var visibleRowKeys = rowKeys;
182
+ var rowTopPad = 0;
183
+ var rowBottomPad = 0;
184
+ var virtualRowStartOffset = 0;
185
+ if (shouldVirt.rows) {
186
+ var rowRange = scroller.getVisibleRowRange(scrollTop, rowKeys.length);
187
+ visibleRowKeys = rowKeys.slice(rowRange.startIndex, rowRange.endIndex + 1);
188
+ rowTopPad = rowRange.topPadding;
189
+ rowBottomPad = rowRange.bottomPadding;
190
+ virtualRowStartOffset = rowRange.startIndex;
191
+ }
192
+ var visibleColKeys = colKeys;
193
+ var colLeftPad = 0;
194
+ var colRightPad = 0;
195
+ if (shouldVirt.cols) {
196
+ var colRange = scroller.getVisibleColRange(scrollLeft, colKeys.length);
197
+ visibleColKeys = colKeys.slice(colRange.startIndex, colRange.endIndex + 1);
198
+ colLeftPad = colRange.leftPadding;
199
+ colRightPad = colRange.rightPadding;
200
+ }
148
201
  var showRowNumbers = this.props.showRowNumbers !== false;
202
+ var isVirtualized = shouldVirt.rows || shouldVirt.cols;
149
203
  var valueCellColors = function valueCellColors() {};
150
204
  var rowTotalColors = function rowTotalColors() {};
151
205
  var colTotalColors = function colTotalColors() {};
@@ -219,12 +273,73 @@ function makeRenderer() {
219
273
  var clickClass = function clickClass(pred, closed) {
220
274
  return pred ? " pvtClickable" + (closed ? " closed" : "") : "";
221
275
  };
222
- return /*#__PURE__*/_react["default"].createElement("table", {
276
+ // ─── Render de la tabla ────────────────────────────────────────────
277
+ var handleScroll = isVirtualized ? function (e) {
278
+ _this.setState({
279
+ scrollTop: e.currentTarget.scrollTop,
280
+ scrollLeft: e.currentTarget.scrollLeft
281
+ });
282
+ } : null;
283
+
284
+ // ─── Column widths (resize) ────────────────────────────────
285
+ var resizeWidths = this.props._resizeWidths || {};
286
+ var onStartResize = this.props._onStartResize || null;
287
+
288
+ // Construir colgroup con anchos de todas las columnas de datos
289
+ var buildColgroup = function buildColgroup() {
290
+ var cols = [];
291
+ // Col para row numbers
292
+ if (showRowNumbers) cols.push(/*#__PURE__*/_react["default"].createElement("col", {
293
+ key: "col-rownum",
294
+ style: {
295
+ width: '40px',
296
+ minWidth: '40px'
297
+ }
298
+ }));
299
+ // Cols para rowAttrs
300
+ rowAttrs.forEach(function (_, i) {
301
+ return cols.push(/*#__PURE__*/_react["default"].createElement("col", {
302
+ key: "col-rowattr-".concat(i)
303
+ }));
304
+ });
305
+ // Col padding virtual izquierdo
306
+ if (shouldVirt.cols && colLeftPad > 0) cols.push(/*#__PURE__*/_react["default"].createElement("col", {
307
+ key: "col-virt-left",
308
+ style: {
309
+ width: colLeftPad
310
+ }
311
+ }));
312
+ // Cols para cada columna de datos
313
+ visibleColKeys.forEach(function (colKey) {
314
+ var label = colKey.join("\0");
315
+ var w = resizeWidths[label];
316
+ cols.push(/*#__PURE__*/_react["default"].createElement("col", {
317
+ key: "col-data-".concat(label),
318
+ style: w ? {
319
+ width: w,
320
+ minWidth: w
321
+ } : undefined
322
+ }));
323
+ });
324
+ // Col padding virtual derecho
325
+ if (shouldVirt.cols && colRightPad > 0) cols.push(/*#__PURE__*/_react["default"].createElement("col", {
326
+ key: "col-virt-right",
327
+ style: {
328
+ width: colRightPad
329
+ }
330
+ }));
331
+ // Col para totales
332
+ cols.push(/*#__PURE__*/_react["default"].createElement("col", {
333
+ key: "col-totals"
334
+ }));
335
+ return /*#__PURE__*/_react["default"].createElement("colgroup", null, cols);
336
+ };
337
+ var tableContent = /*#__PURE__*/_react["default"].createElement("table", {
223
338
  id: id,
224
- className: "pvtTable ".concat(rbClass, " ").concat(cbClass)
225
- }, /*#__PURE__*/_react["default"].createElement("thead", null, colAttrs.map(function (c, j) {
339
+ className: "pvtTable ".concat(rbClass, " ").concat(cbClass).concat(onStartResize ? ' pvtResizable' : '')
340
+ }, buildColgroup(), /*#__PURE__*/_react["default"].createElement("thead", null, colAttrs.map(function (c, j) {
226
341
  var clickable = grouping && colAttrs.length > j + 1;
227
- var levelKeys = colKeys.filter(function (x) {
342
+ var levelKeys = allColKeys.filter(function (x) {
228
343
  return x.length === j + 1;
229
344
  });
230
345
  return /*#__PURE__*/_react["default"].createElement("tr", {
@@ -240,20 +355,38 @@ function makeRenderer() {
240
355
  onClick: clickable ? function (_) {
241
356
  return fold(levelKeys);
242
357
  } : null
243
- }, c), colKeys.map(function (colKey, i) {
244
- var x = spanSize(colKeys, i, j);
358
+ }, c), shouldVirt.cols && colLeftPad > 0 && j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
359
+ key: "col-pad-left",
360
+ style: {
361
+ minWidth: colLeftPad
362
+ }
363
+ }), visibleColKeys.map(function (colKey, i) {
364
+ var x = spanSize(visibleColKeys, i, j);
245
365
  if (x === -1) {
246
366
  return null;
247
367
  }
368
+ // Usar el colKey completo como clave de resize solo en la última fila de headers
369
+ var isLastHeaderRow = j === colAttrs.length - 1;
370
+ var colLabel = colKey.join("\0");
248
371
  return /*#__PURE__*/_react["default"].createElement("th", {
249
372
  className: "pvtColLabel" + clickClass(clickable && colKey[j], isFolded([colKey.slice(0, j + 1)])),
250
373
  key: "colKey-".concat(i, "-").concat(j, "-").concat(colKey[j]),
251
374
  colSpan: x,
252
- rowSpan: j === colAttrs.length - 1 && rowAttrs.length !== 0 ? 2 : 1,
375
+ rowSpan: isLastHeaderRow && rowAttrs.length !== 0 ? 2 : 1,
253
376
  onClick: clickable && colKey[j] ? function (_) {
254
377
  return fold([colKey.slice(0, j + 1)]);
255
378
  } : null
256
- }, colKey[j]);
379
+ }, colKey[j], onStartResize && isLastHeaderRow && /*#__PURE__*/_react["default"].createElement("span", {
380
+ className: "pvtResizeHandle",
381
+ onPointerDown: function onPointerDown(e) {
382
+ return onStartResize(colLabel, e);
383
+ }
384
+ }));
385
+ }), shouldVirt.cols && colRightPad > 0 && j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
386
+ key: "col-pad-right",
387
+ style: {
388
+ minWidth: colRightPad
389
+ }
257
390
  }), j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
258
391
  className: "pvtTotalLabel",
259
392
  rowSpan: colAttrs.length + (rowAttrs.length === 0 ? 0 : 1)
@@ -263,7 +396,7 @@ function makeRenderer() {
263
396
  rowSpan: "1"
264
397
  }, "#"), rowAttrs.map(function (r, i) {
265
398
  var clickable = grouping && rowAttrs.length > i + 1;
266
- var levelKeys = rowKeys.filter(function (x) {
399
+ var levelKeys = allRowKeys.filter(function (x) {
267
400
  return x.length === i + 1;
268
401
  });
269
402
  return /*#__PURE__*/_react["default"].createElement("th", {
@@ -275,26 +408,41 @@ function makeRenderer() {
275
408
  }, r);
276
409
  }), /*#__PURE__*/_react["default"].createElement("th", {
277
410
  className: "pvtTotalLabel"
278
- }, colAttrs.length === 0 ? 'Totals' : null))), /*#__PURE__*/_react["default"].createElement("tbody", null, rowKeys.map(function (rowKey, i) {
411
+ }, colAttrs.length === 0 ? 'Totals' : null))), /*#__PURE__*/_react["default"].createElement("tbody", null, shouldVirt.rows && rowTopPad > 0 && /*#__PURE__*/_react["default"].createElement("tr", {
412
+ key: "virt-top-spacer",
413
+ style: {
414
+ height: rowTopPad
415
+ }
416
+ }, /*#__PURE__*/_react["default"].createElement("td", {
417
+ colSpan: 999
418
+ })), visibleRowKeys.map(function (rowKey, localI) {
419
+ var globalI = shouldVirt.rows ? virtualRowStartOffset + localI : localI;
279
420
  var totalAggregator = pivotData.getAggregator(rowKey, []);
280
421
  var rowGap = rowAttrs.length - rowKey.length;
281
- var rowTotalValue = totalAggregator.value();
422
+ var rowTotalResult = pipeline.processTotal({
423
+ aggregator: totalAggregator,
424
+ rowKey: rowKey,
425
+ type: 'row'
426
+ });
282
427
  return /*#__PURE__*/_react["default"].createElement("tr", {
283
- key: "rowKeyRow".concat(i),
284
- className: (rowGap ? "pvtLevel" + rowGap : "pvtData") + " pvtRow-data"
428
+ key: "rowKeyRow".concat(globalI),
429
+ className: (rowGap ? "pvtLevel" + rowGap : "pvtData") + " pvtRow-data",
430
+ style: shouldVirt.rows ? {
431
+ height: scroller.rowHeight
432
+ } : undefined
285
433
  }, showRowNumbers && /*#__PURE__*/_react["default"].createElement("th", {
286
434
  className: "pvtRowNumber"
287
- }, startOffset + i + 1), rowKey.map(function (txt, j) {
435
+ }, startOffset + globalI + 1), rowKey.map(function (txt, j) {
288
436
  if (compactRows && j < rowKey.length - 1) {
289
437
  return null;
290
438
  }
291
439
  var clickable = grouping && rowAttrs.length > j + 1;
292
- var x = compactRows ? 1 : spanSize(rowKeys, i, j, specialCase);
440
+ var x = compactRows ? 1 : spanSize(visibleRowKeys, localI, j, specialCase);
293
441
  if (x === -1) {
294
442
  return null;
295
443
  }
296
444
  return /*#__PURE__*/_react["default"].createElement("th", {
297
- key: "rowKeyLabel-".concat(i, "-").concat(j, "-").concat(txt),
445
+ key: "rowKeyLabel-".concat(globalI, "-").concat(j, "-").concat(txt),
298
446
  className: "pvtRowLabel" + clickClass(clickable && rowKey[j], isFolded([rowKey.slice(0, j + 1)])),
299
447
  rowSpan: x,
300
448
  colSpan: compactRows ? rowAttrs.length + 1 : j === rowAttrs.length - 1 && colAttrs.length !== 0 ? 2 : 1,
@@ -308,34 +456,57 @@ function makeRenderer() {
308
456
  }), !compactRows && rowGap ? /*#__PURE__*/_react["default"].createElement("th", {
309
457
  className: "pvtRowLabel",
310
458
  colSpan: rowGap + 1
311
- }, "Total (" + rowKey[rowKey.length - 1] + ")") : null, colKeys.map(function (colKey, j) {
459
+ }, "Total (" + rowKey[rowKey.length - 1] + ")") : null, shouldVirt.cols && colLeftPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
460
+ key: "col-pad-left",
461
+ style: {
462
+ minWidth: colLeftPad
463
+ }
464
+ }), visibleColKeys.map(function (colKey, j) {
312
465
  var aggregator = pivotData.getAggregator(rowKey, colKey);
313
466
  var colGap = colAttrs.length - colKey.length;
314
- var val = aggregator.value();
315
- var isNumeric = typeof val === 'number';
467
+ var cellResult = pipeline.process({
468
+ aggregator: aggregator,
469
+ rowKey: rowKey,
470
+ colKey: colKey,
471
+ pivotData: pivotData
472
+ });
473
+ var isNumeric = typeof cellResult.value === 'number';
474
+ var mergedStyle = _objectSpread(_objectSpread({}, valueCellColors(rowKey, colKey, cellResult.value)), cellResult.style || {});
316
475
  return /*#__PURE__*/_react["default"].createElement("td", {
317
- className: "pvtVal" + (colGap ? " pvtLevel" + colGap : "") + (isNumeric ? " pvtVal-numeric" : ""),
318
- key: "pvtVal".concat(i, "-").concat(j),
319
- onClick: getClickHandler && getClickHandler(val, rowKey, colKey),
320
- style: valueCellColors(rowKey, colKey, val)
321
- }, aggregator.format(val));
476
+ className: "pvtVal" + (colGap ? " pvtLevel" + colGap : "") + (isNumeric ? " pvtVal-numeric" : "") + (cellResult.className ? " " + cellResult.className : ""),
477
+ key: "pvtVal".concat(globalI, "-").concat(j),
478
+ onClick: getClickHandler && getClickHandler(cellResult.value, rowKey, colKey),
479
+ style: Object.keys(mergedStyle).length > 0 ? mergedStyle : undefined
480
+ }, cellResult.rendered);
481
+ }), shouldVirt.cols && colRightPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
482
+ key: "col-pad-right",
483
+ style: {
484
+ minWidth: colRightPad
485
+ }
322
486
  }), /*#__PURE__*/_react["default"].createElement("td", {
323
- className: "pvtTotal" + (typeof rowTotalValue === 'number' ? " pvtVal-numeric" : ""),
324
- onClick: getClickHandler && getClickHandler(rowTotalValue, rowKey, [null]),
325
- style: colTotalColors(rowTotalValue)
326
- }, totalAggregator.format(rowTotalValue)));
327
- }), showRowNumbers && this.props.pagination && rowKeys.length < this.props.pageSize && Array.from({
328
- length: this.props.pageSize - rowKeys.length
487
+ className: "pvtTotal" + (typeof rowTotalResult.value === 'number' ? " pvtVal-numeric" : ""),
488
+ onClick: getClickHandler && getClickHandler(rowTotalResult.value, rowKey, [null]),
489
+ style: colTotalColors(rowTotalResult.value) || rowTotalResult.style
490
+ }, rowTotalResult.rendered));
491
+ }), shouldVirt.rows && rowBottomPad > 0 && /*#__PURE__*/_react["default"].createElement("tr", {
492
+ key: "virt-bottom-spacer",
493
+ style: {
494
+ height: rowBottomPad
495
+ }
496
+ }, /*#__PURE__*/_react["default"].createElement("td", {
497
+ colSpan: 999
498
+ })), showRowNumbers && this.props.pagination && visibleRowKeys.length < this.props.pageSize && !shouldVirt.rows && Array.from({
499
+ length: this.props.pageSize - visibleRowKeys.length
329
500
  }).map(function (_, padIdx) {
330
501
  return /*#__PURE__*/_react["default"].createElement("tr", {
331
502
  key: "padRow".concat(padIdx),
332
503
  className: "pvtRow-data pvtEmptyRow"
333
504
  }, /*#__PURE__*/_react["default"].createElement("th", {
334
505
  className: "pvtRowNumber"
335
- }, startOffset + rowKeys.length + padIdx + 1), /*#__PURE__*/_react["default"].createElement("th", {
506
+ }, startOffset + visibleRowKeys.length + padIdx + 1), /*#__PURE__*/_react["default"].createElement("th", {
336
507
  className: "pvtRowLabel",
337
508
  colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)
338
- }), colKeys.map(function (colKey, j) {
509
+ }), visibleColKeys.map(function (colKey, j) {
339
510
  return /*#__PURE__*/_react["default"].createElement("td", {
340
511
  key: "padVal".concat(padIdx, "-").concat(j),
341
512
  className: "pvtVal pvtEmptyCell"
@@ -350,7 +521,12 @@ function makeRenderer() {
350
521
  }), /*#__PURE__*/_react["default"].createElement("th", {
351
522
  className: "pvtTotalLabel",
352
523
  colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)
353
- }, "Totals"), colKeys.map(function (colKey, i) {
524
+ }, "Totals"), shouldVirt.cols && colLeftPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
525
+ key: "total-col-pad-left",
526
+ style: {
527
+ minWidth: colLeftPad
528
+ }
529
+ }), visibleColKeys.map(function (colKey, i) {
354
530
  var totalAggregator = pivotData.getAggregator([], colKey);
355
531
  var colGap = colAttrs.length - colKey.length;
356
532
  var totalVal = totalAggregator.value();
@@ -361,23 +537,71 @@ function makeRenderer() {
361
537
  onClick: getClickHandler && getClickHandler(totalVal, [null], colKey),
362
538
  style: rowTotalColors(totalVal)
363
539
  }, totalAggregator.format(totalVal));
540
+ }), shouldVirt.cols && colRightPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
541
+ key: "total-col-pad-right",
542
+ style: {
543
+ minWidth: colRightPad
544
+ }
364
545
  }), /*#__PURE__*/_react["default"].createElement("td", {
365
546
  onClick: getClickHandler && getClickHandler(grandTotalAggregator.value(), [null], [null]),
366
547
  className: "pvtGrandTotal" + (typeof grandTotalAggregator.value() === 'number' ? " pvtVal-numeric" : "")
367
548
  }, grandTotalAggregator.format(grandTotalAggregator.value())))));
549
+
550
+ // Wrappear en container con scroll si virtualización está activa
551
+ if (isVirtualized) {
552
+ return /*#__PURE__*/_react["default"].createElement("div", {
553
+ className: "pvtVirtualContainer",
554
+ style: {
555
+ maxHeight: scroller.containerHeight,
556
+ maxWidth: scroller.containerWidth,
557
+ overflow: 'auto',
558
+ position: 'relative'
559
+ },
560
+ onScroll: handleScroll
561
+ }, tableContent);
562
+ }
563
+ return tableContent;
368
564
  }
369
565
  }]);
370
566
  }(_react["default"].PureComponent);
371
- TableRenderer.defaultProps = _Utilities.PivotData.defaultProps;
372
- TableRenderer.propTypes = _Utilities.PivotData.propTypes;
373
- TableRenderer.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;
374
- TableRenderer.defaultProps.tableOptions = {};
375
- TableRenderer.propTypes.tableColorScaleGenerator = _propTypes["default"].func;
376
- TableRenderer.propTypes.tableOptions = _propTypes["default"].object;
377
- TableRenderer.defaultProps.compactRows = true;
378
- TableRenderer.propTypes.compactRows = _propTypes["default"].bool;
379
- TableRenderer.defaultProps.showRowNumbers = true;
380
- TableRenderer.propTypes.showRowNumbers = _propTypes["default"].bool;
567
+ TableRendererInner.defaultProps = _Utilities.PivotData.defaultProps;
568
+ TableRendererInner.propTypes = _Utilities.PivotData.propTypes;
569
+ TableRendererInner.defaultProps.tableColorScaleGenerator = redColorScaleGenerator;
570
+ TableRendererInner.defaultProps.tableOptions = {};
571
+ TableRendererInner.propTypes.tableColorScaleGenerator = _propTypes["default"].func;
572
+ TableRendererInner.propTypes.tableOptions = _propTypes["default"].object;
573
+ TableRendererInner.defaultProps.compactRows = true;
574
+ TableRendererInner.propTypes.compactRows = _propTypes["default"].bool;
575
+ TableRendererInner.defaultProps.showRowNumbers = true;
576
+ TableRendererInner.propTypes.showRowNumbers = _propTypes["default"].bool;
577
+ // Resize props (pasadas internamente desde el wrapper)
578
+ TableRendererInner.propTypes._resizeWidths = _propTypes["default"].object;
579
+ TableRendererInner.propTypes._onStartResize = _propTypes["default"].func;
580
+
581
+ // ─── Wrapper funcional para poder usar hooks ─────────────────────
582
+ function TableRenderer(props) {
583
+ var resizing = props.columnResizing === true;
584
+ var _useColumnResize = (0, _useColumnResize2.useColumnResize)({
585
+ initialWidths: props.columnWidths || {},
586
+ minWidth: 50,
587
+ onWidthChange: props.onColumnWidthChange
588
+ }),
589
+ widths = _useColumnResize.widths,
590
+ startResize = _useColumnResize.startResize;
591
+ return /*#__PURE__*/_react["default"].createElement(TableRendererInner, _extends({}, props, {
592
+ _resizeWidths: resizing ? widths : {},
593
+ _onStartResize: resizing ? startResize : null
594
+ }));
595
+ }
596
+ TableRenderer.defaultProps = _objectSpread(_objectSpread({}, TableRendererInner.defaultProps), {}, {
597
+ columnResizing: false,
598
+ columnWidths: {}
599
+ });
600
+ TableRenderer.propTypes = _objectSpread(_objectSpread({}, TableRendererInner.propTypes), {}, {
601
+ columnResizing: _propTypes["default"].bool,
602
+ columnWidths: _propTypes["default"].object,
603
+ onColumnWidthChange: _propTypes["default"].func
604
+ });
381
605
  return TableRenderer;
382
606
  }
383
607
  var TSVExportRenderer = /*#__PURE__*/function (_React$PureComponent2) {