react-pivottable-plus 1.0.0

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.
@@ -0,0 +1,786 @@
1
+ "use strict";
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
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = exports.Dropdown = exports.DraggableAttribute = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _immutabilityHelper = _interopRequireDefault(require("immutability-helper"));
11
+ var _Utilities = require("./Utilities");
12
+ var _PivotTable = _interopRequireDefault(require("./PivotTable"));
13
+ var _reactDraggable = _interopRequireDefault(require("react-draggable"));
14
+ var _core = require("@dnd-kit/core");
15
+ var _sortable = require("@dnd-kit/sortable");
16
+ var _utilities = require("@dnd-kit/utilities");
17
+ var _excluded = ["id"];
18
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
19
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
20
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
21
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
22
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
23
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
24
+ 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; }
25
+ 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; }
26
+ 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; }
27
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
28
+ 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); }
29
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
30
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
31
+ 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); }
32
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
33
+ 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."); }
34
+ 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; } }
35
+ 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; }
36
+ 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; } }
37
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
38
+ // ─── DraggableAttribute ────────────────────────────────────────────────────────
39
+
40
+ var DraggableAttribute = exports.DraggableAttribute = /*#__PURE__*/_react["default"].forwardRef(function (_ref, ref) {
41
+ var name = _ref.name,
42
+ attrValues = _ref.attrValues,
43
+ valueFilter = _ref.valueFilter,
44
+ sorter = _ref.sorter,
45
+ menuLimit = _ref.menuLimit,
46
+ setValuesInFilter = _ref.setValuesInFilter,
47
+ addValuesToFilter = _ref.addValuesToFilter,
48
+ moveFilterBoxToTop = _ref.moveFilterBoxToTop,
49
+ removeValuesFromFilter = _ref.removeValuesFromFilter,
50
+ zIndex = _ref.zIndex,
51
+ dragHandleProps = _ref.dragHandleProps,
52
+ isDragging = _ref.isDragging;
53
+ var _useState = (0, _react.useState)(false),
54
+ _useState2 = _slicedToArray(_useState, 2),
55
+ open = _useState2[0],
56
+ setOpen = _useState2[1];
57
+ var _useState3 = (0, _react.useState)(''),
58
+ _useState4 = _slicedToArray(_useState3, 2),
59
+ filterText = _useState4[0],
60
+ setFilterText = _useState4[1];
61
+ var nodeRef = (0, _react.useRef)(null);
62
+ var toggleValue = function toggleValue(value) {
63
+ if (value in valueFilter) {
64
+ removeValuesFromFilter(name, [value]);
65
+ } else {
66
+ addValuesToFilter(name, [value]);
67
+ }
68
+ };
69
+ var matchesFilter = function matchesFilter(x) {
70
+ return x.toLowerCase().trim().includes(filterText.toLowerCase().trim());
71
+ };
72
+ var selectOnly = function selectOnly(e, value) {
73
+ e.stopPropagation();
74
+ setValuesInFilter(name, Object.keys(attrValues).filter(function (y) {
75
+ return y !== value;
76
+ }));
77
+ };
78
+ var getFilterBox = function getFilterBox() {
79
+ var showMenu = Object.keys(attrValues).length < menuLimit;
80
+ var values = Object.keys(attrValues);
81
+ var shown = values.filter(matchesFilter).sort(sorter);
82
+ return /*#__PURE__*/_react["default"].createElement(_reactDraggable["default"], {
83
+ handle: ".pvtDragHandle",
84
+ nodeRef: nodeRef
85
+ }, /*#__PURE__*/_react["default"].createElement("div", {
86
+ ref: nodeRef,
87
+ className: "pvtFilterBox",
88
+ style: {
89
+ display: 'block',
90
+ cursor: 'initial',
91
+ zIndex: zIndex
92
+ },
93
+ onClick: function onClick() {
94
+ return moveFilterBoxToTop(name);
95
+ }
96
+ }, /*#__PURE__*/_react["default"].createElement("a", {
97
+ onClick: function onClick() {
98
+ return setOpen(false);
99
+ },
100
+ className: "pvtCloseX"
101
+ }, "\xD7"), /*#__PURE__*/_react["default"].createElement("span", {
102
+ className: "pvtDragHandle"
103
+ }, "\u2630"), /*#__PURE__*/_react["default"].createElement("h4", null, name), showMenu || /*#__PURE__*/_react["default"].createElement("p", null, "(too many values to show)"), showMenu && /*#__PURE__*/_react["default"].createElement("p", null, /*#__PURE__*/_react["default"].createElement("input", {
104
+ type: "text",
105
+ placeholder: "Filter values",
106
+ className: "pvtSearch",
107
+ value: filterText,
108
+ onChange: function onChange(e) {
109
+ return setFilterText(e.target.value);
110
+ }
111
+ }), /*#__PURE__*/_react["default"].createElement("br", null), /*#__PURE__*/_react["default"].createElement("a", {
112
+ role: "button",
113
+ className: "pvtButton",
114
+ onClick: function onClick() {
115
+ return removeValuesFromFilter(name, Object.keys(attrValues).filter(matchesFilter));
116
+ }
117
+ }, "Select ", values.length === shown.length ? 'All' : shown.length), ' ', /*#__PURE__*/_react["default"].createElement("a", {
118
+ role: "button",
119
+ className: "pvtButton",
120
+ onClick: function onClick() {
121
+ return addValuesToFilter(name, Object.keys(attrValues).filter(matchesFilter));
122
+ }
123
+ }, "Deselect ", values.length === shown.length ? 'All' : shown.length)), showMenu && /*#__PURE__*/_react["default"].createElement("div", {
124
+ className: "pvtCheckContainer"
125
+ }, shown.map(function (x) {
126
+ return /*#__PURE__*/_react["default"].createElement("p", {
127
+ key: x,
128
+ onClick: function onClick() {
129
+ return toggleValue(x);
130
+ },
131
+ className: x in valueFilter ? '' : 'selected'
132
+ }, /*#__PURE__*/_react["default"].createElement("a", {
133
+ className: "pvtOnly",
134
+ onClick: function onClick(e) {
135
+ return selectOnly(e, x);
136
+ }
137
+ }, "only"), /*#__PURE__*/_react["default"].createElement("a", {
138
+ className: "pvtOnlySpacer"
139
+ }, "\xA0"), x === '' ? /*#__PURE__*/_react["default"].createElement("em", null, "null") : x);
140
+ }))));
141
+ };
142
+ var toggleFilterBox = function toggleFilterBox() {
143
+ setOpen(function (o) {
144
+ return !o;
145
+ });
146
+ moveFilterBoxToTop(name);
147
+ };
148
+ var filtered = Object.keys(valueFilter).length !== 0 ? 'pvtFilteredAttribute' : '';
149
+ return /*#__PURE__*/_react["default"].createElement("li", {
150
+ ref: ref,
151
+ "data-id": name,
152
+ style: {
153
+ opacity: isDragging ? 0.4 : 1
154
+ }
155
+ }, /*#__PURE__*/_react["default"].createElement("span", _extends({
156
+ className: 'pvtAttr ' + filtered
157
+ }, dragHandleProps), name, /*#__PURE__*/_react["default"].createElement("span", {
158
+ className: "pvtTriangle",
159
+ onClick: function onClick(e) {
160
+ e.stopPropagation();
161
+ toggleFilterBox();
162
+ }
163
+ }, ' ', "\u25BE")), open ? getFilterBox() : null);
164
+ });
165
+ DraggableAttribute.displayName = 'DraggableAttribute';
166
+
167
+ // ─── SortableAttribute: wrapper que conecta dnd-kit con DraggableAttribute ────
168
+
169
+ var SortableAttribute = function SortableAttribute(_ref2) {
170
+ var id = _ref2.id,
171
+ rest = _objectWithoutProperties(_ref2, _excluded);
172
+ var _useSortable = (0, _sortable.useSortable)({
173
+ id: id
174
+ }),
175
+ attributes = _useSortable.attributes,
176
+ listeners = _useSortable.listeners,
177
+ setNodeRef = _useSortable.setNodeRef,
178
+ transform = _useSortable.transform,
179
+ transition = _useSortable.transition,
180
+ isDragging = _useSortable.isDragging;
181
+ var style = {
182
+ transform: _utilities.CSS.Transform.toString(transform),
183
+ transition: transition
184
+ };
185
+ return /*#__PURE__*/_react["default"].createElement(DraggableAttribute, _extends({
186
+ ref: setNodeRef,
187
+ name: id,
188
+ isDragging: isDragging,
189
+ dragHandleProps: _objectSpread(_objectSpread(_objectSpread({}, attributes), listeners), {}, {
190
+ style: style
191
+ })
192
+ }, rest));
193
+ };
194
+
195
+ // ─── Dropdown ─────────────────────────────────────────────────────────────────
196
+
197
+ var Dropdown = exports.Dropdown = function Dropdown(_ref3) {
198
+ var _ref3$zIndex = _ref3.zIndex,
199
+ zIndex = _ref3$zIndex === void 0 ? 1 : _ref3$zIndex,
200
+ _ref3$open = _ref3.open,
201
+ open = _ref3$open === void 0 ? false : _ref3$open,
202
+ toggle = _ref3.toggle,
203
+ current = _ref3.current,
204
+ _ref3$values = _ref3.values,
205
+ values = _ref3$values === void 0 ? [] : _ref3$values,
206
+ setValue = _ref3.setValue;
207
+ return /*#__PURE__*/_react["default"].createElement("div", {
208
+ className: "pvtDropdown",
209
+ style: {
210
+ zIndex: zIndex
211
+ }
212
+ }, /*#__PURE__*/_react["default"].createElement("div", {
213
+ onClick: function onClick(e) {
214
+ e.stopPropagation();
215
+ toggle();
216
+ },
217
+ className: 'pvtDropdownValue pvtDropdownCurrent ' + (open ? 'pvtDropdownCurrentOpen' : ''),
218
+ role: "button"
219
+ }, /*#__PURE__*/_react["default"].createElement("div", {
220
+ className: "pvtDropdownIcon"
221
+ }, open ? '×' : '▾'), current || /*#__PURE__*/_react["default"].createElement("span", null, "\xA0")), open && /*#__PURE__*/_react["default"].createElement("div", {
222
+ className: "pvtDropdownMenu"
223
+ }, values.map(function (r) {
224
+ return /*#__PURE__*/_react["default"].createElement("div", {
225
+ key: r,
226
+ role: "button",
227
+ onClick: function onClick(e) {
228
+ e.stopPropagation();
229
+ if (current === r) toggle();else {
230
+ setValue(r);
231
+ toggle();
232
+ }
233
+ },
234
+ className: 'pvtDropdownValue ' + (r === current ? 'pvtDropdownActiveValue' : '')
235
+ }, r);
236
+ })));
237
+ };
238
+
239
+ // ─── DnDCell: lista sortable con dnd-kit ──────────────────────────────────────
240
+
241
+ var DnDCell = function DnDCell(_ref4) {
242
+ var id = _ref4.id,
243
+ items = _ref4.items,
244
+ classes = _ref4.classes,
245
+ state = _ref4.state,
246
+ valueFilter = _ref4.valueFilter,
247
+ sorters = _ref4.sorters,
248
+ menuLimit = _ref4.menuLimit,
249
+ setValuesInFilter = _ref4.setValuesInFilter,
250
+ addValuesToFilter = _ref4.addValuesToFilter,
251
+ moveFilterBoxToTop = _ref4.moveFilterBoxToTop,
252
+ removeValuesFromFilter = _ref4.removeValuesFromFilter,
253
+ isHorizontal = _ref4.isHorizontal;
254
+ var strategy = isHorizontal ? _sortable.horizontalListSortingStrategy : _sortable.verticalListSortingStrategy;
255
+ return /*#__PURE__*/_react["default"].createElement("td", {
256
+ className: classes
257
+ }, /*#__PURE__*/_react["default"].createElement(_sortable.SortableContext, {
258
+ id: id,
259
+ items: items,
260
+ strategy: strategy
261
+ }, /*#__PURE__*/_react["default"].createElement("ul", {
262
+ style: {
263
+ listStyle: 'none',
264
+ padding: 0,
265
+ margin: 0
266
+ }
267
+ }, items.map(function (x) {
268
+ return /*#__PURE__*/_react["default"].createElement(SortableAttribute, {
269
+ key: x,
270
+ id: x,
271
+ attrValues: state.attrValues[x] || {},
272
+ valueFilter: valueFilter[x] || {},
273
+ sorter: (0, _Utilities.getSort)(sorters, x),
274
+ menuLimit: menuLimit,
275
+ setValuesInFilter: setValuesInFilter,
276
+ addValuesToFilter: addValuesToFilter,
277
+ moveFilterBoxToTop: moveFilterBoxToTop,
278
+ removeValuesFromFilter: removeValuesFromFilter,
279
+ zIndex: state.zIndices[x] || state.maxZIndex
280
+ });
281
+ }))));
282
+ };
283
+
284
+ // ─── PivotTableUI ─────────────────────────────────────────────────────────────
285
+
286
+ var PivotTableUI = function PivotTableUI(props) {
287
+ var _aggregators$aggregat, _aggregators$aggregat2, _aggregators$aggregat3, _aggregators$aggregat4;
288
+ var _useState5 = (0, _react.useState)({
289
+ unusedOrder: [],
290
+ zIndices: {},
291
+ maxZIndex: 1000,
292
+ openDropdown: false,
293
+ attrValues: {},
294
+ materializedInput: [],
295
+ data: null
296
+ }),
297
+ _useState6 = _slicedToArray(_useState5, 2),
298
+ state = _useState6[0],
299
+ setState = _useState6[1];
300
+
301
+ // activeId: el atributo que se está arrastrando
302
+ var _useState7 = (0, _react.useState)(null),
303
+ _useState8 = _slicedToArray(_useState7, 2),
304
+ activeId = _useState8[0],
305
+ setActiveId = _useState8[1];
306
+ var data = props.data,
307
+ onChange = props.onChange,
308
+ rows = props.rows,
309
+ cols = props.cols,
310
+ aggregatorName = props.aggregatorName,
311
+ aggregators = props.aggregators,
312
+ vals = props.vals,
313
+ rendererName = props.rendererName,
314
+ renderers = props.renderers,
315
+ valueFilter = props.valueFilter,
316
+ sorters = props.sorters,
317
+ menuLimit = props.menuLimit,
318
+ unusedOrientationCutoff = props.unusedOrientationCutoff,
319
+ hiddenAttributes = props.hiddenAttributes,
320
+ hiddenFromAggregators = props.hiddenFromAggregators,
321
+ hiddenFromDragDrop = props.hiddenFromDragDrop,
322
+ pagination = props.pagination,
323
+ page = props.page,
324
+ pageSize = props.pageSize,
325
+ rowOrder = props.rowOrder,
326
+ colOrder = props.colOrder,
327
+ derivedAttributes = props.derivedAttributes;
328
+ var onChangeRef = (0, _react.useRef)(onChange);
329
+ (0, _react.useEffect)(function () {
330
+ onChangeRef.current = onChange;
331
+ }, [onChange]);
332
+
333
+ // ── Materializar datos ───────────────────────────────────────────────────────
334
+ (0, _react.useEffect)(function () {
335
+ if (state.data === data) return;
336
+ var newState = {
337
+ data: data,
338
+ attrValues: {},
339
+ materializedInput: []
340
+ };
341
+ var recordsProcessed = 0;
342
+ _Utilities.PivotData.forEachRecord(data, derivedAttributes, function (record) {
343
+ newState.materializedInput.push(record);
344
+ for (var _i = 0, _Object$keys = Object.keys(record); _i < _Object$keys.length; _i++) {
345
+ var attr = _Object$keys[_i];
346
+ if (!(attr in newState.attrValues)) {
347
+ newState.attrValues[attr] = {};
348
+ if (recordsProcessed > 0) newState.attrValues[attr]["null"] = recordsProcessed;
349
+ }
350
+ }
351
+ for (var _attr in newState.attrValues) {
352
+ var value = _attr in record ? record[_attr] : 'null';
353
+ if (!(value in newState.attrValues[_attr])) newState.attrValues[_attr][value] = 0;
354
+ newState.attrValues[_attr][value]++;
355
+ }
356
+ recordsProcessed++;
357
+ });
358
+ setState(function (s) {
359
+ return _objectSpread(_objectSpread({}, s), newState);
360
+ });
361
+ }, [data, derivedAttributes, state.data]);
362
+
363
+ // ── Helpers ──────────────────────────────────────────────────────────────────
364
+ var handleDuplicates = function handleDuplicates(newAttrs, existingAttrs) {
365
+ if (!newAttrs || !existingAttrs) return existingAttrs || [];
366
+ var dups = newAttrs.filter(function (item) {
367
+ return existingAttrs.includes(item);
368
+ });
369
+ return dups.length > 0 ? existingAttrs.filter(function (item) {
370
+ return !dups.includes(item);
371
+ }) : existingAttrs;
372
+ };
373
+ var sendPropUpdate = (0, _react.useCallback)(function (command) {
374
+ var _onChangeRef$current;
375
+ var newProps = (0, _immutabilityHelper["default"])(props, command);
376
+ (_onChangeRef$current = onChangeRef.current) === null || _onChangeRef$current === void 0 || _onChangeRef$current.call(onChangeRef, newProps);
377
+ }, [props]);
378
+ var propUpdater = (0, _react.useCallback)(function (key) {
379
+ return function (value) {
380
+ var updateObj = _defineProperty({}, key, {
381
+ $set: value
382
+ });
383
+ if (key === 'rows') {
384
+ var updatedCols = handleDuplicates(value, cols);
385
+ if (updatedCols.length !== cols.length) updateObj.cols = {
386
+ $set: updatedCols
387
+ };
388
+ } else if (key === 'cols') {
389
+ var updatedRows = handleDuplicates(value, rows);
390
+ if (updatedRows.length !== rows.length) updateObj.rows = {
391
+ $set: updatedRows
392
+ };
393
+ }
394
+ sendPropUpdate(updateObj);
395
+ };
396
+ }, [cols, rows, sendPropUpdate]);
397
+ var setValuesInFilter = (0, _react.useCallback)(function (attribute, values) {
398
+ sendPropUpdate({
399
+ valueFilter: _defineProperty({}, attribute, {
400
+ $set: values.reduce(function (r, v) {
401
+ r[v] = true;
402
+ return r;
403
+ }, {})
404
+ })
405
+ });
406
+ }, [sendPropUpdate]);
407
+ var addValuesToFilter = (0, _react.useCallback)(function (attribute, values) {
408
+ if (attribute in valueFilter) {
409
+ sendPropUpdate({
410
+ valueFilter: _defineProperty({}, attribute, values.reduce(function (r, v) {
411
+ r[v] = {
412
+ $set: true
413
+ };
414
+ return r;
415
+ }, {}))
416
+ });
417
+ } else {
418
+ setValuesInFilter(attribute, values);
419
+ }
420
+ }, [sendPropUpdate, valueFilter, setValuesInFilter]);
421
+ var removeValuesFromFilter = (0, _react.useCallback)(function (attribute, values) {
422
+ sendPropUpdate({
423
+ valueFilter: _defineProperty({}, attribute, {
424
+ $unset: values
425
+ })
426
+ });
427
+ }, [sendPropUpdate]);
428
+ var moveFilterBoxToTop = (0, _react.useCallback)(function (attribute) {
429
+ setState(function (s) {
430
+ return _objectSpread(_objectSpread({}, s), {}, {
431
+ maxZIndex: s.maxZIndex + 1,
432
+ zIndices: _objectSpread(_objectSpread({}, s.zIndices), {}, _defineProperty({}, attribute, s.maxZIndex + 1))
433
+ });
434
+ });
435
+ }, []);
436
+
437
+ // ── Listas de atributos ──────────────────────────────────────────────────────
438
+ var unusedAttrs = Object.keys(state.attrValues).filter(function (e) {
439
+ return e && e.trim() !== '' && !rows.includes(e) && !cols.includes(e) && !hiddenAttributes.includes(e) && !hiddenFromDragDrop.includes(e);
440
+ }).sort((0, _Utilities.sortAs)(state.unusedOrder));
441
+ var unusedLength = unusedAttrs.reduce(function (r, e) {
442
+ return r + e.length;
443
+ }, 0);
444
+ var horizUnused = unusedLength < unusedOrientationCutoff;
445
+ var colAttrs = cols.filter(function (e) {
446
+ return e && e.trim() !== '' && !hiddenAttributes.includes(e) && !hiddenFromDragDrop.includes(e);
447
+ });
448
+ var rowAttrs = rows.filter(function (e) {
449
+ return e && e.trim() !== '' && !hiddenAttributes.includes(e) && !hiddenFromDragDrop.includes(e);
450
+ });
451
+
452
+ // ── Mapa de zona → lista actual ──────────────────────────────────────────────
453
+ // Para saber a qué lista pertenece cada atributo durante el drag
454
+ var getZoneOfItem = function getZoneOfItem(id) {
455
+ if (rowAttrs.includes(id)) return 'rows';
456
+ if (colAttrs.includes(id)) return 'cols';
457
+ if (unusedAttrs.includes(id)) return 'unused';
458
+ return null;
459
+ };
460
+ var getListByZone = function getListByZone(zone) {
461
+ if (zone === 'rows') return rowAttrs;
462
+ if (zone === 'cols') return colAttrs;
463
+ if (zone === 'unused') return unusedAttrs;
464
+ return [];
465
+ };
466
+ var getUpdaterByZone = function getUpdaterByZone(zone) {
467
+ if (zone === 'rows') return propUpdater('rows');
468
+ if (zone === 'cols') return propUpdater('cols');
469
+ if (zone === 'unused') return function (order) {
470
+ return setState(function (s) {
471
+ return _objectSpread(_objectSpread({}, s), {}, {
472
+ unusedOrder: order
473
+ });
474
+ });
475
+ };
476
+ return function () {};
477
+ };
478
+
479
+ // ── Sensores dnd-kit ─────────────────────────────────────────────────────────
480
+ var sensors = (0, _core.useSensors)((0, _core.useSensor)(_core.PointerSensor, {
481
+ activationConstraint: {
482
+ distance: 5
483
+ }
484
+ }));
485
+
486
+ // ── Handlers de dnd-kit ──────────────────────────────────────────────────────
487
+ var handleDragStart = function handleDragStart(_ref5) {
488
+ var active = _ref5.active;
489
+ setActiveId(active.id);
490
+ };
491
+ var handleDragOver = function handleDragOver(_ref6) {
492
+ var _over$data$current$so, _over$data;
493
+ var active = _ref6.active,
494
+ over = _ref6.over;
495
+ if (!over) return;
496
+ var activeZone = getZoneOfItem(active.id);
497
+ var overZone = (_over$data$current$so = (_over$data = over.data) === null || _over$data === void 0 || (_over$data = _over$data.current) === null || _over$data === void 0 || (_over$data = _over$data.sortable) === null || _over$data === void 0 ? void 0 : _over$data.containerId) !== null && _over$data$current$so !== void 0 ? _over$data$current$so : getZoneOfItem(over.id);
498
+
499
+ // Guardia 1: Ambos deben tener zona y ser distintas
500
+ if (!activeZone || !overZone || activeZone === overZone) return;
501
+
502
+ // Mover entre zonas en tiempo real (mientras se arrastra)
503
+ var activeList = _toConsumableArray(getListByZone(activeZone));
504
+ var overList = _toConsumableArray(getListByZone(overZone));
505
+ var activeIndex = activeList.indexOf(active.id);
506
+ var overIndex = overList.indexOf(over.id);
507
+
508
+ // Guardia 2: El item debe existir en la lista de origen (evita splice -1)
509
+ if (activeIndex === -1) return;
510
+
511
+ // Guardia 3: Evitar duplicados en la lista de destino
512
+ if (overList.includes(active.id)) return;
513
+ activeList.splice(activeIndex, 1);
514
+ var insertAt = overIndex >= 0 ? overIndex : overList.length;
515
+ overList.splice(insertAt, 0, active.id);
516
+
517
+ // Actualizar ambas listas
518
+ var updateActiveZone = getUpdaterByZone(activeZone);
519
+ var updateOverZone = getUpdaterByZone(overZone);
520
+ updateActiveZone(activeList);
521
+ updateOverZone(overList);
522
+ };
523
+ var handleDragEnd = function handleDragEnd(_ref7) {
524
+ var _over$data$current$so2, _over$data2;
525
+ var active = _ref7.active,
526
+ over = _ref7.over;
527
+ setActiveId(null);
528
+ if (!over) return;
529
+ var activeZone = getZoneOfItem(active.id);
530
+ var overZone = (_over$data$current$so2 = (_over$data2 = over.data) === null || _over$data2 === void 0 || (_over$data2 = _over$data2.current) === null || _over$data2 === void 0 || (_over$data2 = _over$data2.sortable) === null || _over$data2 === void 0 ? void 0 : _over$data2.containerId) !== null && _over$data$current$so2 !== void 0 ? _over$data$current$so2 : getZoneOfItem(over.id);
531
+ if (!activeZone || !overZone) return;
532
+ if (activeZone === overZone) {
533
+ // Reordenamiento dentro de la misma zona
534
+ var list = getListByZone(activeZone);
535
+ var oldIndex = list.indexOf(active.id);
536
+ var newIndex = list.indexOf(over.id);
537
+ if (oldIndex !== newIndex) {
538
+ getUpdaterByZone(activeZone)((0, _sortable.arrayMove)(list, oldIndex, newIndex));
539
+ }
540
+ }
541
+ // Si activeZone !== overZone, ya fue manejado en handleDragOver
542
+ };
543
+
544
+ // ── UI ───────────────────────────────────────────────────────────────────────
545
+ var isOpen = function isOpen(dropdown) {
546
+ return state.openDropdown === dropdown;
547
+ };
548
+ var numValsAllowed = ((_aggregators$aggregat = aggregators[aggregatorName]) === null || _aggregators$aggregat === void 0 || (_aggregators$aggregat2 = _aggregators$aggregat.call(aggregators, [])) === null || _aggregators$aggregat2 === void 0 || (_aggregators$aggregat2 = _aggregators$aggregat2()) === null || _aggregators$aggregat2 === void 0 ? void 0 : _aggregators$aggregat2.numInputs) || 0;
549
+ var aggregatorCellOutlet = (_aggregators$aggregat3 = aggregators[aggregatorName]) === null || _aggregators$aggregat3 === void 0 || (_aggregators$aggregat4 = _aggregators$aggregat3.call(aggregators, [])) === null || _aggregators$aggregat4 === void 0 || (_aggregators$aggregat4 = _aggregators$aggregat4()) === null || _aggregators$aggregat4 === void 0 ? void 0 : _aggregators$aggregat4.outlet;
550
+ var actualRendererName = rendererName in renderers ? rendererName : Object.keys(renderers)[0];
551
+ var sortIcons = {
552
+ key_a_to_z: {
553
+ rowSymbol: '↕',
554
+ colSymbol: '↔',
555
+ next: 'value_a_to_z'
556
+ },
557
+ value_a_to_z: {
558
+ rowSymbol: '↓',
559
+ colSymbol: '→',
560
+ next: 'value_z_to_a'
561
+ },
562
+ value_z_to_a: {
563
+ rowSymbol: '↑',
564
+ colSymbol: '←',
565
+ next: 'key_a_to_z'
566
+ }
567
+ };
568
+ var sharedCellProps = {
569
+ state: state,
570
+ valueFilter: valueFilter,
571
+ sorters: sorters,
572
+ menuLimit: menuLimit,
573
+ setValuesInFilter: setValuesInFilter,
574
+ addValuesToFilter: addValuesToFilter,
575
+ moveFilterBoxToTop: moveFilterBoxToTop,
576
+ removeValuesFromFilter: removeValuesFromFilter
577
+ };
578
+ var rendererCell = /*#__PURE__*/_react["default"].createElement("td", {
579
+ className: "pvtRenderers"
580
+ }, /*#__PURE__*/_react["default"].createElement(Dropdown, {
581
+ current: actualRendererName,
582
+ values: Object.keys(renderers),
583
+ open: isOpen('renderer'),
584
+ zIndex: isOpen('renderer') ? state.maxZIndex + 1 : 1,
585
+ toggle: function toggle() {
586
+ return setState(function (s) {
587
+ return _objectSpread(_objectSpread({}, s), {}, {
588
+ openDropdown: isOpen('renderer') ? false : 'renderer'
589
+ });
590
+ });
591
+ },
592
+ setValue: propUpdater('rendererName')
593
+ }));
594
+ var aggregatorCell = /*#__PURE__*/_react["default"].createElement("td", {
595
+ className: "pvtVals"
596
+ }, /*#__PURE__*/_react["default"].createElement(Dropdown, {
597
+ current: aggregatorName,
598
+ values: Object.keys(aggregators),
599
+ open: isOpen('aggregators'),
600
+ zIndex: isOpen('aggregators') ? state.maxZIndex + 1 : 1,
601
+ toggle: function toggle() {
602
+ return setState(function (s) {
603
+ return _objectSpread(_objectSpread({}, s), {}, {
604
+ openDropdown: isOpen('aggregators') ? false : 'aggregators'
605
+ });
606
+ });
607
+ },
608
+ setValue: propUpdater('aggregatorName')
609
+ }), /*#__PURE__*/_react["default"].createElement("a", {
610
+ role: "button",
611
+ className: "pvtRowOrder",
612
+ onClick: function onClick() {
613
+ return propUpdater('rowOrder')(sortIcons[rowOrder].next);
614
+ }
615
+ }, sortIcons[rowOrder].rowSymbol), /*#__PURE__*/_react["default"].createElement("a", {
616
+ role: "button",
617
+ className: "pvtColOrder",
618
+ onClick: function onClick() {
619
+ return propUpdater('colOrder')(sortIcons[colOrder].next);
620
+ }
621
+ }, sortIcons[colOrder].colSymbol), numValsAllowed > 0 && /*#__PURE__*/_react["default"].createElement("br", null), new Array(numValsAllowed).fill(null).map(function (_, i) {
622
+ return [/*#__PURE__*/_react["default"].createElement(Dropdown, {
623
+ key: i,
624
+ current: vals[i],
625
+ values: Object.keys(state.attrValues).filter(function (e) {
626
+ return !hiddenAttributes.includes(e) && !hiddenFromAggregators.includes(e);
627
+ }),
628
+ open: isOpen("val".concat(i)),
629
+ zIndex: isOpen("val".concat(i)) ? state.maxZIndex + 1 : 1,
630
+ toggle: function toggle() {
631
+ return setState(function (s) {
632
+ return _objectSpread(_objectSpread({}, s), {}, {
633
+ openDropdown: isOpen("val".concat(i)) ? false : "val".concat(i)
634
+ });
635
+ });
636
+ },
637
+ setValue: function setValue(value) {
638
+ return sendPropUpdate({
639
+ vals: {
640
+ $splice: [[i, 1, value]]
641
+ }
642
+ });
643
+ }
644
+ }), i + 1 !== numValsAllowed ? /*#__PURE__*/_react["default"].createElement("br", {
645
+ key: "br".concat(i)
646
+ }) : null];
647
+ }), aggregatorCellOutlet && aggregatorCellOutlet(data));
648
+ var unusedAttrsCell = /*#__PURE__*/_react["default"].createElement(DnDCell, _extends({
649
+ id: "unused",
650
+ items: unusedAttrs,
651
+ classes: "pvtAxisContainer pvtUnused ".concat(horizUnused ? 'pvtHorizList' : 'pvtVertList'),
652
+ isHorizontal: horizUnused
653
+ }, sharedCellProps));
654
+ var colAttrsCell = /*#__PURE__*/_react["default"].createElement(DnDCell, _extends({
655
+ id: "cols",
656
+ items: colAttrs,
657
+ classes: "pvtAxisContainer pvtHorizList pvtCols",
658
+ isHorizontal: true
659
+ }, sharedCellProps));
660
+ var rowAttrsCell = /*#__PURE__*/_react["default"].createElement(DnDCell, _extends({
661
+ id: "rows",
662
+ items: rowAttrs,
663
+ classes: "pvtAxisContainer pvtVertList pvtRows",
664
+ isHorizontal: false
665
+ }, sharedCellProps));
666
+
667
+ // Footer de paginación
668
+ var renderFooter = function renderFooter() {
669
+ var pivotData = new _Utilities.PivotData(_objectSpread(_objectSpread({}, props), {}, {
670
+ data: state.materializedInput
671
+ }));
672
+ var totalPivotRows = pivotData.getRowKeys().length;
673
+ var totalRecords = state.materializedInput.length;
674
+ var totalPages = Math.ceil(totalPivotRows / pageSize);
675
+ return /*#__PURE__*/_react["default"].createElement("div", {
676
+ className: "pvtFooter"
677
+ }, /*#__PURE__*/_react["default"].createElement("div", {
678
+ className: "pvtFooterInfo"
679
+ }, "Total registros: ", totalRecords, " | Filas: ", totalPivotRows), /*#__PURE__*/_react["default"].createElement("div", {
680
+ className: "pvtFooterPagination"
681
+ }, /*#__PURE__*/_react["default"].createElement("button", {
682
+ className: "pvtButton",
683
+ disabled: page <= 1,
684
+ onClick: function onClick() {
685
+ return propUpdater('page')(1);
686
+ }
687
+ }, "\xAB"), /*#__PURE__*/_react["default"].createElement("button", {
688
+ className: "pvtButton",
689
+ disabled: page <= 1,
690
+ onClick: function onClick() {
691
+ return propUpdater('page')(page - 1);
692
+ }
693
+ }, "\u2039"), /*#__PURE__*/_react["default"].createElement("span", null, "P\xE1gina", ' ', /*#__PURE__*/_react["default"].createElement("input", {
694
+ type: "number",
695
+ className: "pvtPageInput",
696
+ value: page,
697
+ min: 1,
698
+ max: totalPages,
699
+ onChange: function onChange(e) {
700
+ var val = parseInt(e.target.value, 10);
701
+ if (val > 0 && val <= totalPages) propUpdater('page')(val);
702
+ }
703
+ }), ' ', "de ", totalPages), /*#__PURE__*/_react["default"].createElement("button", {
704
+ className: "pvtButton",
705
+ disabled: page >= totalPages,
706
+ onClick: function onClick() {
707
+ return propUpdater('page')(page + 1);
708
+ }
709
+ }, "\u203A"), /*#__PURE__*/_react["default"].createElement("button", {
710
+ className: "pvtButton",
711
+ disabled: page >= totalPages,
712
+ onClick: function onClick() {
713
+ return propUpdater('page')(totalPages);
714
+ }
715
+ }, "\xBB"), /*#__PURE__*/_react["default"].createElement("select", {
716
+ className: "pvtPageSize",
717
+ value: pageSize,
718
+ onChange: function onChange(e) {
719
+ var _onChangeRef$current2;
720
+ var newSize = parseInt(e.target.value, 10);
721
+ (_onChangeRef$current2 = onChangeRef.current) === null || _onChangeRef$current2 === void 0 || _onChangeRef$current2.call(onChangeRef, (0, _immutabilityHelper["default"])(props, {
722
+ pageSize: {
723
+ $set: newSize
724
+ },
725
+ page: {
726
+ $set: 1
727
+ }
728
+ }));
729
+ }
730
+ }, [10, 20, 50, 100].map(function (n) {
731
+ return /*#__PURE__*/_react["default"].createElement("option", {
732
+ key: n,
733
+ value: n
734
+ }, n, " / p\xE1g");
735
+ }))));
736
+ };
737
+ var outputCell = /*#__PURE__*/_react["default"].createElement("td", {
738
+ className: "pvtOutput"
739
+ }, /*#__PURE__*/_react["default"].createElement(_PivotTable["default"], (0, _immutabilityHelper["default"])(props, {
740
+ data: {
741
+ $set: state.materializedInput
742
+ }
743
+ })), pagination && renderFooter());
744
+ return /*#__PURE__*/_react["default"].createElement(_core.DndContext, {
745
+ sensors: sensors,
746
+ collisionDetection: _core.closestCorners,
747
+ onDragStart: handleDragStart,
748
+ onDragOver: handleDragOver,
749
+ onDragEnd: handleDragEnd
750
+ }, /*#__PURE__*/_react["default"].createElement("table", {
751
+ className: "pvtUi"
752
+ }, /*#__PURE__*/_react["default"].createElement("tbody", {
753
+ onClick: function onClick() {
754
+ return setState(function (s) {
755
+ return _objectSpread(_objectSpread({}, s), {}, {
756
+ openDropdown: false
757
+ });
758
+ });
759
+ }
760
+ }, horizUnused ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("tr", null, rendererCell, unusedAttrsCell), /*#__PURE__*/_react["default"].createElement("tr", null, aggregatorCell, colAttrsCell), /*#__PURE__*/_react["default"].createElement("tr", null, rowAttrsCell, outputCell)) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("tr", null, rendererCell, aggregatorCell, colAttrsCell), /*#__PURE__*/_react["default"].createElement("tr", null, unusedAttrsCell, rowAttrsCell, outputCell)))), /*#__PURE__*/_react["default"].createElement(_core.DragOverlay, null, activeId ? /*#__PURE__*/_react["default"].createElement("ul", {
761
+ style: {
762
+ listStyle: 'none',
763
+ padding: 0,
764
+ margin: 0
765
+ }
766
+ }, /*#__PURE__*/_react["default"].createElement("li", null, /*#__PURE__*/_react["default"].createElement("span", {
767
+ className: "pvtAttr"
768
+ }, activeId))) : null));
769
+ };
770
+ PivotTableUI.propTypes = {
771
+ onChange: _propTypes["default"].func.isRequired,
772
+ hiddenAttributes: _propTypes["default"].arrayOf(_propTypes["default"].string),
773
+ hiddenFromAggregators: _propTypes["default"].arrayOf(_propTypes["default"].string),
774
+ hiddenFromDragDrop: _propTypes["default"].arrayOf(_propTypes["default"].string),
775
+ unusedOrientationCutoff: _propTypes["default"].number,
776
+ menuLimit: _propTypes["default"].number
777
+ };
778
+ PivotTableUI.defaultProps = {
779
+ hiddenAttributes: [],
780
+ hiddenFromAggregators: [],
781
+ hiddenFromDragDrop: [],
782
+ unusedOrientationCutoff: 85,
783
+ menuLimit: 500
784
+ };
785
+ var _default = exports["default"] = PivotTableUI;
786
+ //# sourceMappingURL=PivotTableUI.js.map