react-pivottable-plus 1.0.20 → 1.1.1

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.
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
@@ -12,18 +11,10 @@ var _CellPipeline = require("./core/CellPipeline");
12
11
  var _VirtualScroller = require("./core/VirtualScroller");
13
12
  var _useColumnResize2 = require("./hooks/useColumnResize");
14
13
  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; }
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; } } }; }
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; } }
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; }
14
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
22
15
  function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
23
16
  function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
24
17
  function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
25
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
26
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
27
18
  function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
28
19
  function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
29
20
  function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
@@ -31,7 +22,20 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
31
22
  function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
32
23
  function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
33
24
  function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
34
- // helper function for setting row/col-span in pivotTableRenderer
25
+ 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); }
26
+ 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; } } }; }
27
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
28
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
29
+ 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; } }
30
+ 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; }
31
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
32
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
33
+ 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; }
34
+ 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; }
35
+ 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; }
36
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
37
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
38
+ // ─── Helper: spanSize ──────────────────────────────────────────────────────────
35
39
  var spanSize = function spanSize(arr, i, j) {
36
40
  var no_loop = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
37
41
  var x;
@@ -90,495 +94,617 @@ var remove = function remove(set, arr) {
90
94
  var toggle = function toggle(set, arr) {
91
95
  return (has(set, arr) ? remove : add)(set, arr);
92
96
  };
93
- function makeRenderer() {
94
- var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
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);
97
+
98
+ // ─── Sub-render: Column Headers (thead) ────────────────────────────────────────
99
+ function renderColHeaders(_ref) {
100
+ var colAttrs = _ref.colAttrs,
101
+ rowAttrs = _ref.rowAttrs,
102
+ visibleColKeys = _ref.visibleColKeys,
103
+ allColKeys = _ref.allColKeys,
104
+ allRowKeys = _ref.allRowKeys,
105
+ showRowNumbers = _ref.showRowNumbers,
106
+ grouping = _ref.grouping,
107
+ isFolded = _ref.isFolded,
108
+ fold = _ref.fold,
109
+ clickClass = _ref.clickClass,
110
+ shouldVirt = _ref.shouldVirt,
111
+ colLeftPad = _ref.colLeftPad,
112
+ colRightPad = _ref.colRightPad,
113
+ onStartResize = _ref.onStartResize;
114
+ return colAttrs.map(function (c, j) {
115
+ var clickable = grouping && colAttrs.length > j + 1;
116
+ var levelKeys = allColKeys.filter(function (x) {
117
+ return x.length === j + 1;
118
+ });
119
+ return /*#__PURE__*/_react["default"].createElement("tr", {
120
+ key: "colAttr".concat(j)
121
+ }, showRowNumbers && j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
122
+ className: "pvtRowNumber pvtAxisLabel",
123
+ rowSpan: colAttrs.length + (rowAttrs.length === 0 ? 0 : 1)
124
+ }, "#"), j === 0 && rowAttrs.length !== 0 && /*#__PURE__*/_react["default"].createElement("th", {
125
+ colSpan: rowAttrs.length,
126
+ rowSpan: colAttrs.length
127
+ }), /*#__PURE__*/_react["default"].createElement("th", {
128
+ className: "pvtAxisLabel" + clickClass(clickable, isFolded(levelKeys)),
129
+ onClick: clickable ? function (_) {
130
+ return fold(levelKeys);
131
+ } : null
132
+ }, c), shouldVirt.cols && colLeftPad > 0 && j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
133
+ key: "col-pad-left",
134
+ style: {
135
+ minWidth: colLeftPad
136
+ }
137
+ }), visibleColKeys.map(function (colKey, i) {
138
+ var x = spanSize(visibleColKeys, i, j);
139
+ if (x === -1) {
140
+ return null;
141
+ }
142
+ var isLastHeaderRow = j === colAttrs.length - 1;
143
+ var colLabel = colKey.join("\0");
144
+ return /*#__PURE__*/_react["default"].createElement("th", {
145
+ className: "pvtColLabel" + clickClass(clickable && colKey[j], isFolded([colKey.slice(0, j + 1)])),
146
+ key: "colKey-".concat(i, "-").concat(j, "-").concat(colKey[j]),
147
+ colSpan: x,
148
+ rowSpan: isLastHeaderRow && rowAttrs.length !== 0 ? 2 : 1,
149
+ onClick: clickable && colKey[j] ? function (_) {
150
+ return fold([colKey.slice(0, j + 1)]);
151
+ } : null
152
+ }, colKey[j], onStartResize && isLastHeaderRow && /*#__PURE__*/_react["default"].createElement("span", {
153
+ className: "pvtResizeHandle",
154
+ onPointerDown: function onPointerDown(e) {
155
+ return onStartResize(colLabel, e);
156
+ }
157
+ }));
158
+ }), shouldVirt.cols && colRightPad > 0 && j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
159
+ key: "col-pad-right",
160
+ style: {
161
+ minWidth: colRightPad
162
+ }
163
+ }), j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
164
+ className: "pvtTotalLabel",
165
+ rowSpan: colAttrs.length + (rowAttrs.length === 0 ? 0 : 1)
166
+ }, "Totals"));
167
+ });
168
+ }
169
+
170
+ // ─── Sub-render: Row Attrs Header Row ──────────────────────────────────────────
171
+ function renderRowAttrsHeader(_ref2) {
172
+ var rowAttrs = _ref2.rowAttrs,
173
+ colAttrs = _ref2.colAttrs,
174
+ showRowNumbers = _ref2.showRowNumbers,
175
+ grouping = _ref2.grouping,
176
+ allRowKeys = _ref2.allRowKeys,
177
+ isFolded = _ref2.isFolded,
178
+ fold = _ref2.fold,
179
+ clickClass = _ref2.clickClass;
180
+ if (rowAttrs.length === 0) return null;
181
+ return /*#__PURE__*/_react["default"].createElement("tr", null, showRowNumbers && colAttrs.length === 0 && /*#__PURE__*/_react["default"].createElement("th", {
182
+ className: "pvtRowNumber pvtAxisLabel",
183
+ rowSpan: "1"
184
+ }, "#"), rowAttrs.map(function (r, i) {
185
+ var clickable = grouping && rowAttrs.length > i + 1;
186
+ var levelKeys = allRowKeys.filter(function (x) {
187
+ return x.length === i + 1;
188
+ });
189
+ return /*#__PURE__*/_react["default"].createElement("th", {
190
+ className: "pvtAxisLabel" + clickClass(clickable, isFolded(levelKeys)),
191
+ onClick: clickable ? function (_) {
192
+ return fold(levelKeys);
193
+ } : null,
194
+ key: "rowAttr".concat(i)
195
+ }, r);
196
+ }), /*#__PURE__*/_react["default"].createElement("th", {
197
+ className: "pvtTotalLabel"
198
+ }, colAttrs.length === 0 ? 'Totals' : null));
199
+ }
200
+
201
+ // ─── Sub-render: Body Rows ─────────────────────────────────────────────────────
202
+ function renderBodyRows(_ref3) {
203
+ var visibleRowKeys = _ref3.visibleRowKeys,
204
+ visibleColKeys = _ref3.visibleColKeys,
205
+ rowAttrs = _ref3.rowAttrs,
206
+ colAttrs = _ref3.colAttrs,
207
+ pivotData = _ref3.pivotData,
208
+ pipeline = _ref3.pipeline,
209
+ compactRows = _ref3.compactRows,
210
+ specialCase = _ref3.specialCase,
211
+ grouping = _ref3.grouping,
212
+ isFolded = _ref3.isFolded,
213
+ fold = _ref3.fold,
214
+ clickClass = _ref3.clickClass,
215
+ showRowNumbers = _ref3.showRowNumbers,
216
+ startOffset = _ref3.startOffset,
217
+ shouldVirt = _ref3.shouldVirt,
218
+ scroller = _ref3.scroller,
219
+ virtualRowStartOffset = _ref3.virtualRowStartOffset,
220
+ colLeftPad = _ref3.colLeftPad,
221
+ colRightPad = _ref3.colRightPad,
222
+ valueCellColors = _ref3.valueCellColors,
223
+ colTotalColors = _ref3.colTotalColors,
224
+ getClickHandler = _ref3.getClickHandler;
225
+ return visibleRowKeys.map(function (rowKey, localI) {
226
+ var globalI = shouldVirt.rows ? virtualRowStartOffset + localI : localI;
227
+ var totalAggregator = pivotData.getAggregator(rowKey, []);
228
+ var rowGap = rowAttrs.length - rowKey.length;
229
+ var rowTotalResult = pipeline.processTotal({
230
+ aggregator: totalAggregator,
231
+ rowKey: rowKey,
232
+ type: 'row'
233
+ });
234
+ return /*#__PURE__*/_react["default"].createElement("tr", {
235
+ key: "rowKeyRow".concat(globalI),
236
+ className: (rowGap ? "pvtLevel" + rowGap : "pvtData") + " pvtRow-data",
237
+ style: shouldVirt.rows ? {
238
+ height: scroller.rowHeight
239
+ } : undefined
240
+ }, showRowNumbers && /*#__PURE__*/_react["default"].createElement("th", {
241
+ className: "pvtRowNumber"
242
+ }, startOffset + globalI + 1), rowKey.map(function (txt, j) {
243
+ if (compactRows && j < rowKey.length - 1) {
244
+ return null;
245
+ }
246
+ var clickable = grouping && rowAttrs.length > j + 1;
247
+ var x = compactRows ? 1 : spanSize(visibleRowKeys, localI, j, specialCase);
248
+ if (x === -1) {
249
+ return null;
250
+ }
251
+ return /*#__PURE__*/_react["default"].createElement("th", {
252
+ key: "rowKeyLabel-".concat(globalI, "-").concat(j, "-").concat(txt),
253
+ className: "pvtRowLabel" + clickClass(clickable && rowKey[j], isFolded([rowKey.slice(0, j + 1)])),
254
+ rowSpan: x,
255
+ colSpan: compactRows ? rowAttrs.length + 1 : j === rowAttrs.length - 1 && colAttrs.length !== 0 ? 2 : 1,
256
+ style: {
257
+ paddingLeft: compactRows ? "calc(var(--pvt-row-padding, 5px) + ".concat(j, " * var(--pvt-row-indent, 20px))") : null
258
+ },
259
+ onClick: clickable && rowKey[j] ? function (_) {
260
+ return fold([rowKey.slice(0, j + 1)]);
261
+ } : null
262
+ }, txt);
263
+ }), !compactRows && rowGap ? /*#__PURE__*/_react["default"].createElement("th", {
264
+ className: "pvtRowLabel",
265
+ colSpan: rowGap + 1
266
+ }, "Total (" + rowKey[rowKey.length - 1] + ")") : null, shouldVirt.cols && colLeftPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
267
+ key: "col-pad-left",
268
+ style: {
269
+ minWidth: colLeftPad
270
+ }
271
+ }), visibleColKeys.map(function (colKey, j) {
272
+ var aggregator = pivotData.getAggregator(rowKey, colKey);
273
+ var colGap = colAttrs.length - colKey.length;
274
+ var cellResult = pipeline.process({
275
+ aggregator: aggregator,
276
+ rowKey: rowKey,
277
+ colKey: colKey,
278
+ pivotData: pivotData
279
+ });
280
+ var isNumeric = typeof cellResult.value === 'number';
281
+ var mergedStyle = _objectSpread(_objectSpread({}, valueCellColors(rowKey, colKey, cellResult.value)), cellResult.style || {});
282
+ return /*#__PURE__*/_react["default"].createElement("td", {
283
+ className: "pvtVal" + (colGap ? " pvtLevel" + colGap : "") + (isNumeric ? " pvtVal-numeric" : "") + (cellResult.className ? " " + cellResult.className : ""),
284
+ key: "pvtVal".concat(globalI, "-").concat(j),
285
+ onClick: getClickHandler && getClickHandler(cellResult.value, rowKey, colKey),
286
+ style: Object.keys(mergedStyle).length > 0 ? mergedStyle : undefined
287
+ }, cellResult.rendered);
288
+ }), shouldVirt.cols && colRightPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
289
+ key: "col-pad-right",
290
+ style: {
291
+ minWidth: colRightPad
292
+ }
293
+ }), /*#__PURE__*/_react["default"].createElement("td", {
294
+ className: "pvtTotal" + (typeof rowTotalResult.value === 'number' ? " pvtVal-numeric" : ""),
295
+ onClick: getClickHandler && getClickHandler(rowTotalResult.value, rowKey, [null]),
296
+ style: colTotalColors(rowTotalResult.value) || rowTotalResult.style
297
+ }, rowTotalResult.rendered));
298
+ });
299
+ }
300
+
301
+ // ─── Sub-render: Totals Row ────────────────────────────────────────────────────
302
+ function renderTotalsRow(_ref4) {
303
+ var visibleColKeys = _ref4.visibleColKeys,
304
+ rowAttrs = _ref4.rowAttrs,
305
+ colAttrs = _ref4.colAttrs,
306
+ pivotData = _ref4.pivotData,
307
+ grandTotalAggregator = _ref4.grandTotalAggregator,
308
+ showRowNumbers = _ref4.showRowNumbers,
309
+ shouldVirt = _ref4.shouldVirt,
310
+ colLeftPad = _ref4.colLeftPad,
311
+ colRightPad = _ref4.colRightPad,
312
+ rowTotalColors = _ref4.rowTotalColors,
313
+ getClickHandler = _ref4.getClickHandler;
314
+ return /*#__PURE__*/_react["default"].createElement("tr", {
315
+ className: "pvtTotalRow"
316
+ }, showRowNumbers && /*#__PURE__*/_react["default"].createElement("th", {
317
+ className: "pvtTotalLabel"
318
+ }), /*#__PURE__*/_react["default"].createElement("th", {
319
+ className: "pvtTotalLabel",
320
+ colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)
321
+ }, "Totals"), shouldVirt.cols && colLeftPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
322
+ key: "total-col-pad-left",
323
+ style: {
324
+ minWidth: colLeftPad
325
+ }
326
+ }), visibleColKeys.map(function (colKey, i) {
327
+ var totalAggregator = pivotData.getAggregator([], colKey);
328
+ var colGap = colAttrs.length - colKey.length;
329
+ var totalVal = totalAggregator.value();
330
+ var isNumeric = typeof totalVal === 'number';
331
+ return /*#__PURE__*/_react["default"].createElement("td", {
332
+ className: "pvtTotal" + (colGap ? " pvtLevel" + colGap : "") + (isNumeric ? " pvtVal-numeric" : ""),
333
+ key: "total".concat(i),
334
+ onClick: getClickHandler && getClickHandler(totalVal, [null], colKey),
335
+ style: rowTotalColors(totalVal)
336
+ }, totalAggregator.format(totalVal));
337
+ }), shouldVirt.cols && colRightPad > 0 && /*#__PURE__*/_react["default"].createElement("td", {
338
+ key: "total-col-pad-right",
339
+ style: {
340
+ minWidth: colRightPad
100
341
  }
101
- _inherits(TableRendererInner, _React$PureComponent);
102
- return _createClass(TableRendererInner, [{
103
- key: "render",
104
- value: function render() {
105
- var _this = this;
106
- var pivotData = new _Utilities.PivotData(this.props);
107
- var id = pivotData.props.id;
108
- var colAttrs = pivotData.props.cols;
109
- var rowAttrs = pivotData.props.rows;
110
- var rowKeys = pivotData.getRowKeys(true);
111
- var colKeys = pivotData.getColKeys(true);
112
- var grandTotalAggregator = pivotData.getAggregator([], []);
342
+ }), /*#__PURE__*/_react["default"].createElement("td", {
343
+ onClick: getClickHandler && getClickHandler(grandTotalAggregator.value(), [null], [null]),
344
+ className: "pvtGrandTotal" + (typeof grandTotalAggregator.value() === 'number' ? " pvtVal-numeric" : "")
345
+ }, grandTotalAggregator.format(grandTotalAggregator.value())));
346
+ }
113
347
 
114
- // ─── Cell Pipeline ────────────────────────────────────────────────
115
- var pipeline = this.props.cellPipeline ? new _CellPipeline.CellPipeline(this.props.cellPipeline) : _CellPipeline.CellPipeline["default"]();
348
+ // ─── Sub-render: Empty Pad Rows (pagination) ───────────────────────────────────
349
+ function renderEmptyPadRows(_ref5) {
350
+ var visibleRowKeys = _ref5.visibleRowKeys,
351
+ visibleColKeys = _ref5.visibleColKeys,
352
+ rowAttrs = _ref5.rowAttrs,
353
+ colAttrs = _ref5.colAttrs,
354
+ showRowNumbers = _ref5.showRowNumbers,
355
+ pageSize = _ref5.pageSize,
356
+ startOffset = _ref5.startOffset,
357
+ shouldVirt = _ref5.shouldVirt;
358
+ if (!showRowNumbers || visibleRowKeys.length >= pageSize || shouldVirt.rows) {
359
+ return null;
360
+ }
361
+ return Array.from({
362
+ length: pageSize - visibleRowKeys.length
363
+ }).map(function (_, padIdx) {
364
+ return /*#__PURE__*/_react["default"].createElement("tr", {
365
+ key: "padRow".concat(padIdx),
366
+ className: "pvtRow-data pvtEmptyRow"
367
+ }, /*#__PURE__*/_react["default"].createElement("th", {
368
+ className: "pvtRowNumber"
369
+ }, startOffset + visibleRowKeys.length + padIdx + 1), /*#__PURE__*/_react["default"].createElement("th", {
370
+ className: "pvtRowLabel",
371
+ colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)
372
+ }), visibleColKeys.map(function (colKey, j) {
373
+ return /*#__PURE__*/_react["default"].createElement("td", {
374
+ key: "padVal".concat(padIdx, "-").concat(j),
375
+ className: "pvtVal pvtEmptyCell"
376
+ });
377
+ }), /*#__PURE__*/_react["default"].createElement("td", {
378
+ className: "pvtTotal pvtEmptyCell"
379
+ }));
380
+ });
381
+ }
116
382
 
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
- });
129
- var grouping = pivotData.props.grouping;
130
- var compactRows = grouping && this.props.compactRows;
131
- // speacial case for spanSize counting (no_loop)
132
- var specialCase = grouping && !this.props.rowGroupBefore;
133
- var folded = (this.state || {}).folded || new Set();
134
- var isFolded = function isFolded(keys) {
135
- return has(folded, keys.map(flatKey));
136
- };
137
- var fold = function fold(keys) {
138
- return _this.setState({
139
- folded: toggle(new Set(folded), keys.map(flatKey))
140
- });
141
- };
142
- if (grouping) {
143
- var _iterator = _createForOfIteratorHelper(folded),
144
- _step;
145
- try {
146
- var _loop = function _loop() {
147
- var key = _step.value;
148
- colKeys = colKeys.filter(function (colKey) {
149
- return !flatKey(colKey).startsWith(key + String.fromCharCode(0));
150
- });
151
- rowKeys = rowKeys.filter(function (rowKey) {
152
- return !flatKey(rowKey).startsWith(key + String.fromCharCode(0));
153
- });
154
- };
155
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
156
- _loop();
157
- }
158
- } catch (err) {
159
- _iterator.e(err);
160
- } finally {
161
- _iterator.f();
162
- }
163
- }
383
+ // ─── Main Renderer Factory ─────────────────────────────────────────────────────
384
+ function makeRenderer() {
385
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
386
+ function TableRendererCore(props) {
387
+ var pivotData = new _Utilities.PivotData(props);
388
+ var id = pivotData.props.id;
389
+ var colAttrs = pivotData.props.cols;
390
+ var rowAttrs = pivotData.props.rows;
391
+ var rowKeys = pivotData.getRowKeys(true);
392
+ var colKeys = pivotData.getColKeys(true);
393
+ var grandTotalAggregator = pivotData.getAggregator([], []);
164
394
 
165
- // Guardar todos los colKeys para totales (SIEMPRE calcula sobre todo)
166
- var allColKeys = colKeys;
167
- var allRowKeys = rowKeys;
168
- var totalRows = rowKeys.length;
169
- var startOffset = 0;
170
- if (this.props.pagination) {
171
- var start = (this.props.page - 1) * this.props.pageSize;
172
- startOffset = start;
173
- var end = start + this.props.pageSize;
174
- rowKeys = rowKeys.slice(start, end);
175
- }
395
+ // ─── Cell Pipeline ────────────────────────────────────────────────
396
+ var pipeline = props.cellPipeline ? new _CellPipeline.CellPipeline(props.cellPipeline) : _CellPipeline.CellPipeline["default"]();
176
397
 
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
- }
201
- var showRowNumbers = this.props.showRowNumbers !== false;
202
- var isVirtualized = shouldVirt.rows || shouldVirt.cols;
203
- var valueCellColors = function valueCellColors() {};
204
- var rowTotalColors = function rowTotalColors() {};
205
- var colTotalColors = function colTotalColors() {};
206
- if (opts.heatmapMode) {
207
- var colorScaleGenerator = this.props.tableColorScaleGenerator;
208
- var rowTotalValues = colKeys.map(function (x) {
209
- return pivotData.getAggregator([], x).value();
398
+ // ─── Virtualización ───────────────────────────────────────────────
399
+ var virtConfig = props.virtualization || {};
400
+ var scroller = new _VirtualScroller.VirtualScroller({
401
+ enabled: virtConfig.enabled !== undefined ? virtConfig.enabled : false,
402
+ rowHeight: virtConfig.rowHeight || 32,
403
+ colWidth: virtConfig.colWidth || 100,
404
+ overscanRows: virtConfig.overscanRows || 5,
405
+ overscanCols: virtConfig.overscanCols || 3,
406
+ containerHeight: virtConfig.containerHeight || 400,
407
+ containerWidth: virtConfig.containerWidth || 800,
408
+ threshold: virtConfig.threshold || 100
409
+ });
410
+ var grouping = pivotData.props.grouping;
411
+ var compactRows = grouping && props.compactRows;
412
+ var specialCase = grouping && !props.rowGroupBefore;
413
+
414
+ // Folding state via React.useState (replaces class this.state)
415
+ var _React$useState = _react["default"].useState(new Set()),
416
+ _React$useState2 = _slicedToArray(_React$useState, 2),
417
+ folded = _React$useState2[0],
418
+ setFolded = _React$useState2[1];
419
+ var _React$useState3 = _react["default"].useState(0),
420
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
421
+ scrollTop = _React$useState4[0],
422
+ setScrollTop = _React$useState4[1];
423
+ var _React$useState5 = _react["default"].useState(0),
424
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
425
+ scrollLeft = _React$useState6[0],
426
+ setScrollLeft = _React$useState6[1];
427
+ var isFolded = function isFolded(keys) {
428
+ return has(folded, keys.map(flatKey));
429
+ };
430
+ var fold = function fold(keys) {
431
+ return setFolded(function (prev) {
432
+ return toggle(new Set(prev), keys.map(flatKey));
433
+ });
434
+ };
435
+ if (grouping) {
436
+ var _iterator = _createForOfIteratorHelper(folded),
437
+ _step;
438
+ try {
439
+ var _loop = function _loop() {
440
+ var key = _step.value;
441
+ colKeys = colKeys.filter(function (colKey) {
442
+ return !flatKey(colKey).startsWith(key + String.fromCharCode(0));
210
443
  });
211
- rowTotalColors = colorScaleGenerator(rowTotalValues);
212
- var colTotalValues = rowKeys.map(function (x) {
213
- return pivotData.getAggregator(x, []).value();
444
+ rowKeys = rowKeys.filter(function (rowKey) {
445
+ return !flatKey(rowKey).startsWith(key + String.fromCharCode(0));
214
446
  });
215
- colTotalColors = colorScaleGenerator(colTotalValues);
216
- if (opts.heatmapMode === 'full') {
217
- var allValues = [];
218
- rowKeys.map(function (r) {
219
- return colKeys.map(function (c) {
220
- return allValues.push(pivotData.getAggregator(r, c).value());
221
- });
222
- });
223
- var colorScale = colorScaleGenerator(allValues);
224
- valueCellColors = function valueCellColors(r, c, v) {
225
- return colorScale(v);
226
- };
227
- } else if (opts.heatmapMode === 'row') {
228
- var rowColorScales = {};
229
- rowKeys.map(function (r) {
230
- var rowValues = colKeys.map(function (x) {
231
- return pivotData.getAggregator(r, x).value();
232
- });
233
- rowColorScales[r] = colorScaleGenerator(rowValues);
234
- });
235
- valueCellColors = function valueCellColors(r, c, v) {
236
- return rowColorScales[r](v);
237
- };
238
- } else if (opts.heatmapMode === 'col') {
239
- var colColorScales = {};
240
- colKeys.map(function (c) {
241
- var colValues = rowKeys.map(function (x) {
242
- return pivotData.getAggregator(x, c).value();
243
- });
244
- colColorScales[c] = colorScaleGenerator(colValues);
245
- });
246
- valueCellColors = function valueCellColors(r, c, v) {
247
- return colColorScales[c](v);
248
- };
249
- }
250
- }
251
- var getClickHandler = this.props.tableOptions && this.props.tableOptions.clickCallback ? function (value, rowValues, colValues) {
252
- var filters = {};
253
- for (var _i = 0, _Object$keys = Object.keys(colAttrs || {}); _i < _Object$keys.length; _i++) {
254
- var i = _Object$keys[_i];
255
- var attr = colAttrs[i];
256
- if (colValues[i] !== null) {
257
- filters[attr] = colValues[i];
258
- }
259
- }
260
- for (var _i2 = 0, _Object$keys2 = Object.keys(rowAttrs || {}); _i2 < _Object$keys2.length; _i2++) {
261
- var _i3 = _Object$keys2[_i2];
262
- var _attr = rowAttrs[_i3];
263
- if (rowValues[_i3] !== null) {
264
- filters[_attr] = rowValues[_i3];
265
- }
266
- }
267
- return function (e) {
268
- return _this.props.tableOptions.clickCallback(e, value, filters, pivotData);
269
- };
270
- } : null;
271
- var rbClass = grouping ? this.props.rowGroupBefore ? "rowGroupBefore" : "rowGroupAfter" : "";
272
- var cbClass = grouping ? this.props.colGroupBefore ? "colGroupBefore" : "colGroupAfter" : "";
273
- var clickClass = function clickClass(pred, closed) {
274
- return pred ? " pvtClickable" + (closed ? " closed" : "") : "";
275
447
  };
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;
448
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
449
+ _loop();
450
+ }
451
+ } catch (err) {
452
+ _iterator.e(err);
453
+ } finally {
454
+ _iterator.f();
455
+ }
456
+ }
457
+ var allColKeys = colKeys;
458
+ var allRowKeys = rowKeys;
459
+ var totalRows = rowKeys.length;
460
+ var startOffset = 0;
461
+ if (props.pagination) {
462
+ var start = (props.page - 1) * props.pageSize;
463
+ startOffset = start;
464
+ var end = start + props.pageSize;
465
+ rowKeys = rowKeys.slice(start, end);
466
+ }
287
467
 
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
- }));
468
+ // Virtualización bidireccional
469
+ var shouldVirt = scroller.shouldVirtualize(rowKeys.length, colKeys.length);
470
+ var visibleRowKeys = rowKeys;
471
+ var rowTopPad = 0;
472
+ var rowBottomPad = 0;
473
+ var virtualRowStartOffset = 0;
474
+ if (shouldVirt.rows) {
475
+ var rowRange = scroller.getVisibleRowRange(scrollTop, rowKeys.length);
476
+ visibleRowKeys = rowKeys.slice(rowRange.startIndex, rowRange.endIndex + 1);
477
+ rowTopPad = rowRange.topPadding;
478
+ rowBottomPad = rowRange.bottomPadding;
479
+ virtualRowStartOffset = rowRange.startIndex;
480
+ }
481
+ var visibleColKeys = colKeys;
482
+ var colLeftPad = 0;
483
+ var colRightPad = 0;
484
+ if (shouldVirt.cols) {
485
+ var colRange = scroller.getVisibleColRange(scrollLeft, colKeys.length);
486
+ visibleColKeys = colKeys.slice(colRange.startIndex, colRange.endIndex + 1);
487
+ colLeftPad = colRange.leftPadding;
488
+ colRightPad = colRange.rightPadding;
489
+ }
490
+ var showRowNumbers = props.showRowNumbers !== false;
491
+ var isVirtualized = shouldVirt.rows || shouldVirt.cols;
492
+ var valueCellColors = function valueCellColors() {};
493
+ var rowTotalColors = function rowTotalColors() {};
494
+ var colTotalColors = function colTotalColors() {};
495
+ if (opts.heatmapMode) {
496
+ var colorScaleGenerator = props.tableColorScaleGenerator;
497
+ var rowTotalValues = colKeys.map(function (x) {
498
+ return pivotData.getAggregator([], x).value();
499
+ });
500
+ rowTotalColors = colorScaleGenerator(rowTotalValues);
501
+ var colTotalValues = rowKeys.map(function (x) {
502
+ return pivotData.getAggregator(x, []).value();
503
+ });
504
+ colTotalColors = colorScaleGenerator(colTotalValues);
505
+ if (opts.heatmapMode === 'full') {
506
+ var allValues = [];
507
+ rowKeys.map(function (r) {
508
+ return colKeys.map(function (c) {
509
+ return allValues.push(pivotData.getAggregator(r, c).value());
323
510
  });
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);
511
+ });
512
+ var colorScale = colorScaleGenerator(allValues);
513
+ valueCellColors = function valueCellColors(r, c, v) {
514
+ return colorScale(v);
336
515
  };
337
- var tableContent = /*#__PURE__*/_react["default"].createElement("table", {
338
- id: id,
339
- className: "pvtTable ".concat(rbClass, " ").concat(cbClass).concat(onStartResize ? ' pvtResizable' : '')
340
- }, buildColgroup(), /*#__PURE__*/_react["default"].createElement("thead", null, colAttrs.map(function (c, j) {
341
- var clickable = grouping && colAttrs.length > j + 1;
342
- var levelKeys = allColKeys.filter(function (x) {
343
- return x.length === j + 1;
344
- });
345
- return /*#__PURE__*/_react["default"].createElement("tr", {
346
- key: "colAttr".concat(j)
347
- }, showRowNumbers && j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
348
- className: "pvtRowNumber pvtAxisLabel",
349
- rowSpan: colAttrs.length + (rowAttrs.length === 0 ? 0 : 1)
350
- }, "#"), j === 0 && rowAttrs.length !== 0 && /*#__PURE__*/_react["default"].createElement("th", {
351
- colSpan: rowAttrs.length,
352
- rowSpan: colAttrs.length
353
- }), /*#__PURE__*/_react["default"].createElement("th", {
354
- className: "pvtAxisLabel" + clickClass(clickable, isFolded(levelKeys)),
355
- onClick: clickable ? function (_) {
356
- return fold(levelKeys);
357
- } : null
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);
365
- if (x === -1) {
366
- return null;
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");
371
- return /*#__PURE__*/_react["default"].createElement("th", {
372
- className: "pvtColLabel" + clickClass(clickable && colKey[j], isFolded([colKey.slice(0, j + 1)])),
373
- key: "colKey-".concat(i, "-").concat(j, "-").concat(colKey[j]),
374
- colSpan: x,
375
- rowSpan: isLastHeaderRow && rowAttrs.length !== 0 ? 2 : 1,
376
- onClick: clickable && colKey[j] ? function (_) {
377
- return fold([colKey.slice(0, j + 1)]);
378
- } : null
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
- }
390
- }), j === 0 && /*#__PURE__*/_react["default"].createElement("th", {
391
- className: "pvtTotalLabel",
392
- rowSpan: colAttrs.length + (rowAttrs.length === 0 ? 0 : 1)
393
- }, "Totals"));
394
- }), rowAttrs.length !== 0 && /*#__PURE__*/_react["default"].createElement("tr", null, showRowNumbers && colAttrs.length === 0 && /*#__PURE__*/_react["default"].createElement("th", {
395
- className: "pvtRowNumber pvtAxisLabel",
396
- rowSpan: "1"
397
- }, "#"), rowAttrs.map(function (r, i) {
398
- var clickable = grouping && rowAttrs.length > i + 1;
399
- var levelKeys = allRowKeys.filter(function (x) {
400
- return x.length === i + 1;
516
+ } else if (opts.heatmapMode === 'row') {
517
+ var rowColorScales = {};
518
+ rowKeys.map(function (r) {
519
+ var rowValues = colKeys.map(function (x) {
520
+ return pivotData.getAggregator(r, x).value();
401
521
  });
402
- return /*#__PURE__*/_react["default"].createElement("th", {
403
- className: "pvtAxisLabel" + clickClass(clickable, isFolded(levelKeys)),
404
- onClick: clickable ? function (_) {
405
- return fold(levelKeys);
406
- } : null,
407
- key: "rowAttr".concat(i)
408
- }, r);
409
- }), /*#__PURE__*/_react["default"].createElement("th", {
410
- className: "pvtTotalLabel"
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;
420
- var totalAggregator = pivotData.getAggregator(rowKey, []);
421
- var rowGap = rowAttrs.length - rowKey.length;
422
- var rowTotalResult = pipeline.processTotal({
423
- aggregator: totalAggregator,
424
- rowKey: rowKey,
425
- type: 'row'
522
+ rowColorScales[r] = colorScaleGenerator(rowValues);
523
+ });
524
+ valueCellColors = function valueCellColors(r, c, v) {
525
+ return rowColorScales[r](v);
526
+ };
527
+ } else if (opts.heatmapMode === 'col') {
528
+ var colColorScales = {};
529
+ colKeys.map(function (c) {
530
+ var colValues = rowKeys.map(function (x) {
531
+ return pivotData.getAggregator(x, c).value();
426
532
  });
427
- return /*#__PURE__*/_react["default"].createElement("tr", {
428
- key: "rowKeyRow".concat(globalI),
429
- className: (rowGap ? "pvtLevel" + rowGap : "pvtData") + " pvtRow-data",
430
- style: shouldVirt.rows ? {
431
- height: scroller.rowHeight
432
- } : undefined
433
- }, showRowNumbers && /*#__PURE__*/_react["default"].createElement("th", {
434
- className: "pvtRowNumber"
435
- }, startOffset + globalI + 1), rowKey.map(function (txt, j) {
436
- if (compactRows && j < rowKey.length - 1) {
437
- return null;
438
- }
439
- var clickable = grouping && rowAttrs.length > j + 1;
440
- var x = compactRows ? 1 : spanSize(visibleRowKeys, localI, j, specialCase);
441
- if (x === -1) {
442
- return null;
443
- }
444
- return /*#__PURE__*/_react["default"].createElement("th", {
445
- key: "rowKeyLabel-".concat(globalI, "-").concat(j, "-").concat(txt),
446
- className: "pvtRowLabel" + clickClass(clickable && rowKey[j], isFolded([rowKey.slice(0, j + 1)])),
447
- rowSpan: x,
448
- colSpan: compactRows ? rowAttrs.length + 1 : j === rowAttrs.length - 1 && colAttrs.length !== 0 ? 2 : 1,
449
- style: {
450
- paddingLeft: compactRows ? "calc(var(--pvt-row-padding, 5px) + ".concat(j, " * var(--pvt-row-indent, 20px))") : null
451
- },
452
- onClick: clickable && rowKey[j] ? function (_) {
453
- return fold([rowKey.slice(0, j + 1)]);
454
- } : null
455
- }, txt);
456
- }), !compactRows && rowGap ? /*#__PURE__*/_react["default"].createElement("th", {
457
- className: "pvtRowLabel",
458
- colSpan: rowGap + 1
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) {
465
- var aggregator = pivotData.getAggregator(rowKey, colKey);
466
- var colGap = colAttrs.length - colKey.length;
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 || {});
475
- return /*#__PURE__*/_react["default"].createElement("td", {
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
- }
486
- }), /*#__PURE__*/_react["default"].createElement("td", {
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
500
- }).map(function (_, padIdx) {
501
- return /*#__PURE__*/_react["default"].createElement("tr", {
502
- key: "padRow".concat(padIdx),
503
- className: "pvtRow-data pvtEmptyRow"
504
- }, /*#__PURE__*/_react["default"].createElement("th", {
505
- className: "pvtRowNumber"
506
- }, startOffset + visibleRowKeys.length + padIdx + 1), /*#__PURE__*/_react["default"].createElement("th", {
507
- className: "pvtRowLabel",
508
- colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)
509
- }), visibleColKeys.map(function (colKey, j) {
510
- return /*#__PURE__*/_react["default"].createElement("td", {
511
- key: "padVal".concat(padIdx, "-").concat(j),
512
- className: "pvtVal pvtEmptyCell"
513
- });
514
- }), /*#__PURE__*/_react["default"].createElement("td", {
515
- className: "pvtTotal pvtEmptyCell"
516
- }));
517
- }), /*#__PURE__*/_react["default"].createElement("tr", {
518
- className: "pvtTotalRow"
519
- }, showRowNumbers && /*#__PURE__*/_react["default"].createElement("th", {
520
- className: "pvtTotalLabel"
521
- }), /*#__PURE__*/_react["default"].createElement("th", {
522
- className: "pvtTotalLabel",
523
- colSpan: rowAttrs.length + (colAttrs.length === 0 ? 0 : 1)
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) {
530
- var totalAggregator = pivotData.getAggregator([], colKey);
531
- var colGap = colAttrs.length - colKey.length;
532
- var totalVal = totalAggregator.value();
533
- var isNumeric = typeof totalVal === 'number';
534
- return /*#__PURE__*/_react["default"].createElement("td", {
535
- className: "pvtTotal" + (colGap ? " pvtLevel" + colGap : "") + (isNumeric ? " pvtVal-numeric" : ""),
536
- key: "total".concat(i),
537
- onClick: getClickHandler && getClickHandler(totalVal, [null], colKey),
538
- style: rowTotalColors(totalVal)
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
- }
545
- }), /*#__PURE__*/_react["default"].createElement("td", {
546
- onClick: getClickHandler && getClickHandler(grandTotalAggregator.value(), [null], [null]),
547
- className: "pvtGrandTotal" + (typeof grandTotalAggregator.value() === 'number' ? " pvtVal-numeric" : "")
548
- }, grandTotalAggregator.format(grandTotalAggregator.value())))));
533
+ colColorScales[c] = colorScaleGenerator(colValues);
534
+ });
535
+ valueCellColors = function valueCellColors(r, c, v) {
536
+ return colColorScales[c](v);
537
+ };
538
+ }
539
+ }
540
+ var getClickHandler = props.tableOptions && props.tableOptions.clickCallback ? function (value, rowValues, colValues) {
541
+ var filters = {};
542
+ for (var _i = 0, _Object$keys = Object.keys(colAttrs || {}); _i < _Object$keys.length; _i++) {
543
+ var i = _Object$keys[_i];
544
+ var attr = colAttrs[i];
545
+ if (colValues[i] !== null) {
546
+ filters[attr] = colValues[i];
547
+ }
548
+ }
549
+ for (var _i2 = 0, _Object$keys2 = Object.keys(rowAttrs || {}); _i2 < _Object$keys2.length; _i2++) {
550
+ var _i3 = _Object$keys2[_i2];
551
+ var _attr = rowAttrs[_i3];
552
+ if (rowValues[_i3] !== null) {
553
+ filters[_attr] = rowValues[_i3];
554
+ }
555
+ }
556
+ return function (e) {
557
+ return props.tableOptions.clickCallback(e, value, filters, pivotData);
558
+ };
559
+ } : null;
560
+ var rbClass = grouping ? props.rowGroupBefore ? "rowGroupBefore" : "rowGroupAfter" : "";
561
+ var cbClass = grouping ? props.colGroupBefore ? "colGroupBefore" : "colGroupAfter" : "";
562
+ var clickClass = function clickClass(pred, closed) {
563
+ return pred ? " pvtClickable" + (closed ? " closed" : "") : "";
564
+ };
565
+ var handleScroll = isVirtualized ? function (e) {
566
+ setScrollTop(e.currentTarget.scrollTop);
567
+ setScrollLeft(e.currentTarget.scrollLeft);
568
+ } : null;
569
+
570
+ // ─── Column widths (resize) ────────────────────────────────
571
+ var resizeWidths = props._resizeWidths || {};
572
+ var onStartResize = props._onStartResize || null;
549
573
 
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);
574
+ // Colgroup con anchos
575
+ var buildColgroup = function buildColgroup() {
576
+ var cols = [];
577
+ if (showRowNumbers) cols.push(/*#__PURE__*/_react["default"].createElement("col", {
578
+ key: "col-rownum",
579
+ style: {
580
+ width: '40px',
581
+ minWidth: '40px'
562
582
  }
563
- return tableContent;
583
+ }));
584
+ rowAttrs.forEach(function (_, i) {
585
+ return cols.push(/*#__PURE__*/_react["default"].createElement("col", {
586
+ key: "col-rowattr-".concat(i)
587
+ }));
588
+ });
589
+ if (shouldVirt.cols && colLeftPad > 0) cols.push(/*#__PURE__*/_react["default"].createElement("col", {
590
+ key: "col-virt-left",
591
+ style: {
592
+ width: colLeftPad
593
+ }
594
+ }));
595
+ visibleColKeys.forEach(function (colKey) {
596
+ var label = colKey.join("\0");
597
+ var w = resizeWidths[label];
598
+ cols.push(/*#__PURE__*/_react["default"].createElement("col", {
599
+ key: "col-data-".concat(label),
600
+ style: w ? {
601
+ width: w,
602
+ minWidth: w
603
+ } : undefined
604
+ }));
605
+ });
606
+ if (shouldVirt.cols && colRightPad > 0) cols.push(/*#__PURE__*/_react["default"].createElement("col", {
607
+ key: "col-virt-right",
608
+ style: {
609
+ width: colRightPad
610
+ }
611
+ }));
612
+ cols.push(/*#__PURE__*/_react["default"].createElement("col", {
613
+ key: "col-totals"
614
+ }));
615
+ return /*#__PURE__*/_react["default"].createElement("colgroup", null, cols);
616
+ };
617
+
618
+ // ─── Shared params for sub-renders ─────────────────────────
619
+ var sharedParams = {
620
+ colAttrs: colAttrs,
621
+ rowAttrs: rowAttrs,
622
+ visibleColKeys: visibleColKeys,
623
+ allColKeys: allColKeys,
624
+ allRowKeys: allRowKeys,
625
+ showRowNumbers: showRowNumbers,
626
+ grouping: grouping,
627
+ isFolded: isFolded,
628
+ fold: fold,
629
+ clickClass: clickClass,
630
+ shouldVirt: shouldVirt,
631
+ colLeftPad: colLeftPad,
632
+ colRightPad: colRightPad,
633
+ onStartResize: onStartResize,
634
+ pivotData: pivotData,
635
+ pipeline: pipeline,
636
+ compactRows: compactRows,
637
+ specialCase: specialCase,
638
+ startOffset: startOffset,
639
+ scroller: scroller,
640
+ virtualRowStartOffset: virtualRowStartOffset,
641
+ valueCellColors: valueCellColors,
642
+ colTotalColors: colTotalColors,
643
+ rowTotalColors: rowTotalColors,
644
+ getClickHandler: getClickHandler,
645
+ grandTotalAggregator: grandTotalAggregator
646
+ };
647
+ var tableContent = /*#__PURE__*/_react["default"].createElement("table", {
648
+ id: id,
649
+ className: "pvtTable ".concat(rbClass, " ").concat(cbClass).concat(onStartResize ? ' pvtResizable' : '')
650
+ }, buildColgroup(), /*#__PURE__*/_react["default"].createElement("thead", null, renderColHeaders(sharedParams), renderRowAttrsHeader(sharedParams)), /*#__PURE__*/_react["default"].createElement("tbody", null, shouldVirt.rows && rowTopPad > 0 && /*#__PURE__*/_react["default"].createElement("tr", {
651
+ key: "virt-top-spacer",
652
+ style: {
653
+ height: rowTopPad
654
+ }
655
+ }, /*#__PURE__*/_react["default"].createElement("td", {
656
+ colSpan: 999
657
+ })), renderBodyRows(_objectSpread(_objectSpread({}, sharedParams), {}, {
658
+ visibleRowKeys: visibleRowKeys
659
+ })), shouldVirt.rows && rowBottomPad > 0 && /*#__PURE__*/_react["default"].createElement("tr", {
660
+ key: "virt-bottom-spacer",
661
+ style: {
662
+ height: rowBottomPad
564
663
  }
565
- }]);
566
- }(_react["default"].PureComponent);
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;
664
+ }, /*#__PURE__*/_react["default"].createElement("td", {
665
+ colSpan: 999
666
+ })), props.pagination && renderEmptyPadRows({
667
+ visibleRowKeys: visibleRowKeys,
668
+ visibleColKeys: visibleColKeys,
669
+ rowAttrs: rowAttrs,
670
+ colAttrs: colAttrs,
671
+ showRowNumbers: showRowNumbers,
672
+ pageSize: props.pageSize,
673
+ startOffset: startOffset,
674
+ shouldVirt: shouldVirt
675
+ }), renderTotalsRow(sharedParams)));
676
+
677
+ // Wrapper con scroll si virtualización está activa
678
+ if (isVirtualized) {
679
+ return /*#__PURE__*/_react["default"].createElement("div", {
680
+ className: "pvtVirtualContainer",
681
+ style: {
682
+ maxHeight: scroller.containerHeight,
683
+ maxWidth: scroller.containerWidth,
684
+ overflow: 'auto',
685
+ position: 'relative'
686
+ },
687
+ onScroll: handleScroll
688
+ }, tableContent);
689
+ }
690
+ return tableContent;
691
+ }
692
+ TableRendererCore.defaultProps = _objectSpread(_objectSpread({}, _Utilities.PivotData.defaultProps), {}, {
693
+ tableColorScaleGenerator: redColorScaleGenerator,
694
+ tableOptions: {},
695
+ compactRows: true,
696
+ showRowNumbers: true
697
+ });
698
+ TableRendererCore.propTypes = _objectSpread(_objectSpread({}, _Utilities.PivotData.propTypes), {}, {
699
+ tableColorScaleGenerator: _propTypes["default"].func,
700
+ tableOptions: _propTypes["default"].object,
701
+ compactRows: _propTypes["default"].bool,
702
+ showRowNumbers: _propTypes["default"].bool,
703
+ _resizeWidths: _propTypes["default"].object,
704
+ _onStartResize: _propTypes["default"].func
705
+ });
580
706
 
581
- // ─── Wrapper funcional para poder usar hooks ─────────────────────
707
+ // ─── Wrapper for column resize hook ─────────────────────────
582
708
  function TableRenderer(props) {
583
709
  var resizing = props.columnResizing === true;
584
710
  var _useColumnResize = (0, _useColumnResize2.useColumnResize)({
@@ -588,28 +714,28 @@ function makeRenderer() {
588
714
  }),
589
715
  widths = _useColumnResize.widths,
590
716
  startResize = _useColumnResize.startResize;
591
- return /*#__PURE__*/_react["default"].createElement(TableRendererInner, _extends({}, props, {
717
+ return /*#__PURE__*/_react["default"].createElement(TableRendererCore, _extends({}, props, {
592
718
  _resizeWidths: resizing ? widths : {},
593
719
  _onStartResize: resizing ? startResize : null
594
720
  }));
595
721
  }
596
- TableRenderer.defaultProps = _objectSpread(_objectSpread({}, TableRendererInner.defaultProps), {}, {
722
+ TableRenderer.defaultProps = _objectSpread(_objectSpread({}, TableRendererCore.defaultProps), {}, {
597
723
  columnResizing: false,
598
724
  columnWidths: {}
599
725
  });
600
- TableRenderer.propTypes = _objectSpread(_objectSpread({}, TableRendererInner.propTypes), {}, {
726
+ TableRenderer.propTypes = _objectSpread(_objectSpread({}, TableRendererCore.propTypes), {}, {
601
727
  columnResizing: _propTypes["default"].bool,
602
728
  columnWidths: _propTypes["default"].object,
603
729
  onColumnWidthChange: _propTypes["default"].func
604
730
  });
605
731
  return TableRenderer;
606
732
  }
607
- var TSVExportRenderer = /*#__PURE__*/function (_React$PureComponent2) {
733
+ var TSVExportRenderer = /*#__PURE__*/function (_React$PureComponent) {
608
734
  function TSVExportRenderer() {
609
735
  _classCallCheck(this, TSVExportRenderer);
610
736
  return _callSuper(this, TSVExportRenderer, arguments);
611
737
  }
612
- _inherits(TSVExportRenderer, _React$PureComponent2);
738
+ _inherits(TSVExportRenderer, _React$PureComponent);
613
739
  return _createClass(TSVExportRenderer, [{
614
740
  key: "render",
615
741
  value: function render() {
@@ -648,8 +774,8 @@ var TSVExportRenderer = /*#__PURE__*/function (_React$PureComponent2) {
648
774
  return r.join('\t');
649
775
  }).join('\n'),
650
776
  style: {
651
- width: window.innerWidth / 2,
652
- height: window.innerHeight / 2
777
+ width: '100%',
778
+ height: '50vh'
653
779
  },
654
780
  readOnly: true
655
781
  });