@hrforte/react-pivottable 1.0.0 → 1.1.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.
- package/dist/PivotTable.js +72 -0
- package/dist/PivotTable.js.map +1 -0
- package/dist/PivotTableUI.js +1846 -0
- package/dist/PivotTableUI.js.map +1 -0
- package/dist/PlotlyRenderers.js +822 -0
- package/dist/PlotlyRenderers.js.map +1 -0
- package/dist/TableRenderers.js +1066 -0
- package/dist/TableRenderers.js.map +1 -0
- package/dist/Utilities.js +1476 -0
- package/dist/Utilities.js.map +1 -0
- package/dist/__tests__/Utilities-test.js +571 -0
- package/dist/__tests__/Utilities-test.js.map +1 -0
- package/dist/pivottable.css +377 -0
- package/package.json +4 -14
|
@@ -0,0 +1,1476 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PivotData = exports.createSorterByType = exports.detectDataType = exports.builtInSorters = exports.sortAs = exports.getSort = exports.numberFormat = exports.naturalSort = exports.locales = exports.derivers = exports.aggregators = exports.aggregatorTemplates = undefined;
|
|
7
|
+
|
|
8
|
+
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
9
|
+
|
|
10
|
+
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
|
11
|
+
|
|
12
|
+
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /* eslint-disable no-undefined */
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
var _propTypes = require('prop-types');
|
|
16
|
+
|
|
17
|
+
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
18
|
+
|
|
19
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
+
|
|
21
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
22
|
+
|
|
23
|
+
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* decaffeinate suggestions:
|
|
27
|
+
* DS101: Remove unnecessary use of Array.from
|
|
28
|
+
* DS102: Remove unnecessary code created because of implicit returns
|
|
29
|
+
* DS104: Avoid inline assignments
|
|
30
|
+
* DS201: Simplify complex destructure assignments
|
|
31
|
+
* DS203: Remove `|| {}` from converted for-own loops
|
|
32
|
+
* DS205: Consider reworking code to avoid use of IIFEs
|
|
33
|
+
* DS207: Consider shorter variations of null checks
|
|
34
|
+
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
var addSeparators = function addSeparators(nStr, thousandsSep, decimalSep) {
|
|
38
|
+
var x = String(nStr).split('.');
|
|
39
|
+
var x1 = x[0];
|
|
40
|
+
var x2 = x.length > 1 ? decimalSep + x[1] : '';
|
|
41
|
+
var rgx = /(\d+)(\d{3})/;
|
|
42
|
+
while (rgx.test(x1)) {
|
|
43
|
+
x1 = x1.replace(rgx, '$1' + thousandsSep + '$2');
|
|
44
|
+
}
|
|
45
|
+
return x1 + x2;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
var numberFormat = function numberFormat(opts_in) {
|
|
49
|
+
var defaults = {
|
|
50
|
+
digitsAfterDecimal: 2,
|
|
51
|
+
scaler: 1,
|
|
52
|
+
thousandsSep: ',',
|
|
53
|
+
decimalSep: '.',
|
|
54
|
+
prefix: '',
|
|
55
|
+
suffix: '',
|
|
56
|
+
showOriginal: false
|
|
57
|
+
};
|
|
58
|
+
var opts = Object.assign({}, defaults, opts_in);
|
|
59
|
+
return function (x) {
|
|
60
|
+
if (isNaN(x) || !isFinite(x)) {
|
|
61
|
+
return '';
|
|
62
|
+
}
|
|
63
|
+
// Show completely original value if showOriginal is true
|
|
64
|
+
if (opts.showOriginal) {
|
|
65
|
+
return String(opts.scaler * x);
|
|
66
|
+
}
|
|
67
|
+
// When thousandsSep is empty, apply decimal formatting but skip thousand separator
|
|
68
|
+
if (opts.thousandsSep === '') {
|
|
69
|
+
var scaledValue = opts.scaler * x;
|
|
70
|
+
var fixedValue = scaledValue.toFixed(opts.digitsAfterDecimal);
|
|
71
|
+
// Apply decimal separator if needed
|
|
72
|
+
var _result = fixedValue.replace('.', opts.decimalSep);
|
|
73
|
+
return '' + opts.prefix + _result + opts.suffix;
|
|
74
|
+
}
|
|
75
|
+
// Normal formatting with thousand separator
|
|
76
|
+
var result = addSeparators((opts.scaler * x).toFixed(opts.digitsAfterDecimal), opts.thousandsSep, opts.decimalSep);
|
|
77
|
+
return '' + opts.prefix + result + opts.suffix;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
var rx = /(\d+)|(\D+)/g;
|
|
82
|
+
var rd = /\d/;
|
|
83
|
+
var rz = /^0/;
|
|
84
|
+
var naturalSort = function naturalSort(as, bs) {
|
|
85
|
+
// nulls first
|
|
86
|
+
if (bs !== null && as === null) {
|
|
87
|
+
return -1;
|
|
88
|
+
}
|
|
89
|
+
if (as !== null && bs === null) {
|
|
90
|
+
return 1;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// then raw NaNs
|
|
94
|
+
if (typeof as === 'number' && isNaN(as)) {
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
if (typeof bs === 'number' && isNaN(bs)) {
|
|
98
|
+
return 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// numbers and numbery strings group together
|
|
102
|
+
var nas = Number(as);
|
|
103
|
+
var nbs = Number(bs);
|
|
104
|
+
if (nas < nbs) {
|
|
105
|
+
return -1;
|
|
106
|
+
}
|
|
107
|
+
if (nas > nbs) {
|
|
108
|
+
return 1;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// within that, true numbers before numbery strings
|
|
112
|
+
if (typeof as === 'number' && typeof bs !== 'number') {
|
|
113
|
+
return -1;
|
|
114
|
+
}
|
|
115
|
+
if (typeof bs === 'number' && typeof as !== 'number') {
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
if (typeof as === 'number' && typeof bs === 'number') {
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 'Infinity' is a textual number, so less than 'A'
|
|
123
|
+
if (isNaN(nbs) && !isNaN(nas)) {
|
|
124
|
+
return -1;
|
|
125
|
+
}
|
|
126
|
+
if (isNaN(nas) && !isNaN(nbs)) {
|
|
127
|
+
return 1;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// finally, "smart" string sorting per http://stackoverflow.com/a/4373421/112871
|
|
131
|
+
var a = String(as);
|
|
132
|
+
var b = String(bs);
|
|
133
|
+
if (a === b) {
|
|
134
|
+
return 0;
|
|
135
|
+
}
|
|
136
|
+
if (!rd.test(a) || !rd.test(b)) {
|
|
137
|
+
return a > b ? 1 : -1;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// special treatment for strings containing digits
|
|
141
|
+
a = a.match(rx);
|
|
142
|
+
b = b.match(rx);
|
|
143
|
+
while (a.length && b.length) {
|
|
144
|
+
var a1 = a.shift();
|
|
145
|
+
var b1 = b.shift();
|
|
146
|
+
if (a1 !== b1) {
|
|
147
|
+
if (rd.test(a1) && rd.test(b1)) {
|
|
148
|
+
return a1.replace(rz, '.0') - b1.replace(rz, '.0');
|
|
149
|
+
}
|
|
150
|
+
return a1 > b1 ? 1 : -1;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return a.length - b.length;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
var sortAs = function sortAs(order) {
|
|
157
|
+
var mapping = {};
|
|
158
|
+
|
|
159
|
+
// sort lowercased keys similarly
|
|
160
|
+
var l_mapping = {};
|
|
161
|
+
for (var i in order) {
|
|
162
|
+
var x = order[i];
|
|
163
|
+
mapping[x] = i;
|
|
164
|
+
if (typeof x === 'string') {
|
|
165
|
+
l_mapping[x.toLowerCase()] = i;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return function (a, b) {
|
|
169
|
+
if (a in mapping && b in mapping) {
|
|
170
|
+
return mapping[a] - mapping[b];
|
|
171
|
+
} else if (a in mapping) {
|
|
172
|
+
return -1;
|
|
173
|
+
} else if (b in mapping) {
|
|
174
|
+
return 1;
|
|
175
|
+
} else if (a in l_mapping && b in l_mapping) {
|
|
176
|
+
return l_mapping[a] - l_mapping[b];
|
|
177
|
+
} else if (a in l_mapping) {
|
|
178
|
+
return -1;
|
|
179
|
+
} else if (b in l_mapping) {
|
|
180
|
+
return 1;
|
|
181
|
+
}
|
|
182
|
+
return naturalSort(a, b);
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
// Built-in sort functions for different data types
|
|
187
|
+
var builtInSorters = {
|
|
188
|
+
// Number sorter - handles numeric values
|
|
189
|
+
number: function number(a, b) {
|
|
190
|
+
if (a === null || a === undefined || a === '') {
|
|
191
|
+
return b === null || b === undefined || b === '' ? 0 : -1;
|
|
192
|
+
}
|
|
193
|
+
if (b === null || b === undefined || b === '') {
|
|
194
|
+
return 1;
|
|
195
|
+
}
|
|
196
|
+
var numA = typeof a === 'number' ? a : parseFloat(a);
|
|
197
|
+
var numB = typeof b === 'number' ? b : parseFloat(b);
|
|
198
|
+
if (isNaN(numA) && isNaN(numB)) {
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
if (isNaN(numA)) {
|
|
202
|
+
return -1;
|
|
203
|
+
}
|
|
204
|
+
if (isNaN(numB)) {
|
|
205
|
+
return 1;
|
|
206
|
+
}
|
|
207
|
+
return numA - numB;
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
// Date sorter - handles date values
|
|
211
|
+
date: function date(a, b) {
|
|
212
|
+
if (a === null || a === undefined || a === '') {
|
|
213
|
+
return b === null || b === undefined || b === '' ? 0 : -1;
|
|
214
|
+
}
|
|
215
|
+
if (b === null || b === undefined || b === '') {
|
|
216
|
+
return 1;
|
|
217
|
+
}
|
|
218
|
+
var dateA = a instanceof Date ? a : new Date(a);
|
|
219
|
+
var dateB = b instanceof Date ? b : new Date(b);
|
|
220
|
+
if (isNaN(dateA.getTime()) && isNaN(dateB.getTime())) {
|
|
221
|
+
return 0;
|
|
222
|
+
}
|
|
223
|
+
if (isNaN(dateA.getTime())) {
|
|
224
|
+
return -1;
|
|
225
|
+
}
|
|
226
|
+
if (isNaN(dateB.getTime())) {
|
|
227
|
+
return 1;
|
|
228
|
+
}
|
|
229
|
+
return dateA.getTime() - dateB.getTime();
|
|
230
|
+
},
|
|
231
|
+
|
|
232
|
+
// String sorter - case-sensitive
|
|
233
|
+
string: function string(a, b) {
|
|
234
|
+
if (a === null || a === undefined || a === '') {
|
|
235
|
+
return b === null || b === undefined || b === '' ? 0 : -1;
|
|
236
|
+
}
|
|
237
|
+
if (b === null || b === undefined || b === '') {
|
|
238
|
+
return 1;
|
|
239
|
+
}
|
|
240
|
+
var strA = String(a);
|
|
241
|
+
var strB = String(b);
|
|
242
|
+
return strA > strB ? 1 : strA < strB ? -1 : 0;
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
// String sorter - case-insensitive
|
|
246
|
+
stringCaseInsensitive: function stringCaseInsensitive(a, b) {
|
|
247
|
+
if (a === null || a === undefined || a === '') {
|
|
248
|
+
return b === null || b === undefined || b === '' ? 0 : -1;
|
|
249
|
+
}
|
|
250
|
+
if (b === null || b === undefined || b === '') {
|
|
251
|
+
return 1;
|
|
252
|
+
}
|
|
253
|
+
var strA = String(a).toLowerCase();
|
|
254
|
+
var strB = String(b).toLowerCase();
|
|
255
|
+
return strA > strB ? 1 : strA < strB ? -1 : 0;
|
|
256
|
+
},
|
|
257
|
+
|
|
258
|
+
// Natural sort (default)
|
|
259
|
+
natural: naturalSort
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
// Alias for backward compatibility
|
|
263
|
+
// const sorters = builtInSorters;
|
|
264
|
+
|
|
265
|
+
// Auto-detect data type from sample values
|
|
266
|
+
var detectDataType = function detectDataType(values) {
|
|
267
|
+
if (!values || values.length === 0) {
|
|
268
|
+
return 'natural';
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
var sampleSize = Math.min(10, values.length);
|
|
272
|
+
var samples = values.slice(0, sampleSize);
|
|
273
|
+
|
|
274
|
+
var numberCount = 0;
|
|
275
|
+
var dateCount = 0;
|
|
276
|
+
var stringCount = 0;
|
|
277
|
+
|
|
278
|
+
var _iteratorNormalCompletion = true;
|
|
279
|
+
var _didIteratorError = false;
|
|
280
|
+
var _iteratorError = undefined;
|
|
281
|
+
|
|
282
|
+
try {
|
|
283
|
+
for (var _iterator = samples[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
284
|
+
var val = _step.value;
|
|
285
|
+
|
|
286
|
+
if (val === null || val === undefined || val === '') {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Check if it's a number
|
|
291
|
+
if (typeof val === 'number' || !isNaN(parseFloat(val)) && isFinite(val)) {
|
|
292
|
+
numberCount++;
|
|
293
|
+
}
|
|
294
|
+
// Check if it's a date
|
|
295
|
+
else if (val instanceof Date || !isNaN(Date.parse(val)) && String(val).match(/^\d{4}-\d{2}-\d{2}/)) {
|
|
296
|
+
dateCount++;
|
|
297
|
+
}
|
|
298
|
+
// Otherwise it's a string
|
|
299
|
+
else {
|
|
300
|
+
stringCount++;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Determine the most common type
|
|
305
|
+
} catch (err) {
|
|
306
|
+
_didIteratorError = true;
|
|
307
|
+
_iteratorError = err;
|
|
308
|
+
} finally {
|
|
309
|
+
try {
|
|
310
|
+
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
311
|
+
_iterator.return();
|
|
312
|
+
}
|
|
313
|
+
} finally {
|
|
314
|
+
if (_didIteratorError) {
|
|
315
|
+
throw _iteratorError;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (numberCount > dateCount && numberCount > stringCount) {
|
|
321
|
+
return 'number';
|
|
322
|
+
} else if (dateCount > stringCount) {
|
|
323
|
+
return 'date';
|
|
324
|
+
} else if (stringCount > 0) {
|
|
325
|
+
return 'string';
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return 'natural';
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
// Create a sorter based on data type
|
|
332
|
+
var createSorterByType = function createSorterByType(dataType) {
|
|
333
|
+
if (typeof dataType === 'function') {
|
|
334
|
+
return dataType;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
if (typeof dataType === 'string' && dataType in builtInSorters) {
|
|
338
|
+
return builtInSorters[dataType];
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Auto-detect if dataType is an array of values
|
|
342
|
+
if (Array.isArray(dataType)) {
|
|
343
|
+
var detectedType = detectDataType(dataType);
|
|
344
|
+
return builtInSorters[detectedType] || naturalSort;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return naturalSort;
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// Get sorter for an attribute, with auto-detection support
|
|
351
|
+
var getSort = function getSort(sorters, attr) {
|
|
352
|
+
var attrValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
353
|
+
|
|
354
|
+
if (sorters) {
|
|
355
|
+
if (typeof sorters === 'function') {
|
|
356
|
+
var sort = sorters(attr);
|
|
357
|
+
if (typeof sort === 'function') {
|
|
358
|
+
return sort;
|
|
359
|
+
}
|
|
360
|
+
} else if (attr in sorters) {
|
|
361
|
+
var sorter = sorters[attr];
|
|
362
|
+
// If it's a string (data type name) or array (sample values), create appropriate sorter
|
|
363
|
+
if (typeof sorter === 'string' || Array.isArray(sorter)) {
|
|
364
|
+
return createSorterByType(sorter);
|
|
365
|
+
}
|
|
366
|
+
// If it's already a function, use it
|
|
367
|
+
if (typeof sorter === 'function') {
|
|
368
|
+
return sorter;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Auto-detect if attrValues are provided
|
|
374
|
+
if (attrValues && (typeof attrValues === 'undefined' ? 'undefined' : _typeof(attrValues)) === 'object') {
|
|
375
|
+
var values = Object.keys(attrValues);
|
|
376
|
+
if (values.length > 0) {
|
|
377
|
+
var detectedType = detectDataType(values);
|
|
378
|
+
return builtInSorters[detectedType] || naturalSort;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return naturalSort;
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
// aggregator templates default to US number formatting but this is overrideable
|
|
386
|
+
var usFmt = numberFormat();
|
|
387
|
+
var usFmtInt = numberFormat({ digitsAfterDecimal: 0 });
|
|
388
|
+
var usFmtPct = numberFormat({
|
|
389
|
+
digitsAfterDecimal: 1,
|
|
390
|
+
scaler: 100,
|
|
391
|
+
suffix: '%'
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
var aggregatorTemplates = {
|
|
395
|
+
count: function count() {
|
|
396
|
+
var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmtInt;
|
|
397
|
+
|
|
398
|
+
return function () {
|
|
399
|
+
return function () {
|
|
400
|
+
return {
|
|
401
|
+
count: 0,
|
|
402
|
+
push: function push() {
|
|
403
|
+
this.count++;
|
|
404
|
+
},
|
|
405
|
+
value: function value() {
|
|
406
|
+
return this.count;
|
|
407
|
+
},
|
|
408
|
+
|
|
409
|
+
format: formatter
|
|
410
|
+
};
|
|
411
|
+
};
|
|
412
|
+
};
|
|
413
|
+
},
|
|
414
|
+
uniques: function uniques(fn) {
|
|
415
|
+
var formatter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : usFmtInt;
|
|
416
|
+
|
|
417
|
+
return function (_ref) {
|
|
418
|
+
var _ref2 = _slicedToArray(_ref, 1),
|
|
419
|
+
attr = _ref2[0];
|
|
420
|
+
|
|
421
|
+
return function () {
|
|
422
|
+
return {
|
|
423
|
+
uniq: [],
|
|
424
|
+
push: function push(record) {
|
|
425
|
+
if (!Array.from(this.uniq).includes(record[attr])) {
|
|
426
|
+
this.uniq.push(record[attr]);
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
value: function value() {
|
|
430
|
+
return fn(this.uniq);
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
format: formatter,
|
|
434
|
+
numInputs: typeof attr !== 'undefined' ? 0 : 1
|
|
435
|
+
};
|
|
436
|
+
};
|
|
437
|
+
};
|
|
438
|
+
},
|
|
439
|
+
sum: function sum() {
|
|
440
|
+
var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmt;
|
|
441
|
+
|
|
442
|
+
return function (_ref3) {
|
|
443
|
+
var _ref4 = _slicedToArray(_ref3, 1),
|
|
444
|
+
attr = _ref4[0];
|
|
445
|
+
|
|
446
|
+
return function () {
|
|
447
|
+
return {
|
|
448
|
+
sum: 0,
|
|
449
|
+
push: function push(record) {
|
|
450
|
+
if (!isNaN(parseFloat(record[attr]))) {
|
|
451
|
+
this.sum += parseFloat(record[attr]);
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
value: function value() {
|
|
455
|
+
return this.sum;
|
|
456
|
+
},
|
|
457
|
+
|
|
458
|
+
format: formatter,
|
|
459
|
+
numInputs: typeof attr !== 'undefined' ? 0 : 1
|
|
460
|
+
};
|
|
461
|
+
};
|
|
462
|
+
};
|
|
463
|
+
},
|
|
464
|
+
extremes: function extremes(mode) {
|
|
465
|
+
var formatter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : usFmt;
|
|
466
|
+
|
|
467
|
+
return function (_ref5) {
|
|
468
|
+
var _ref6 = _slicedToArray(_ref5, 1),
|
|
469
|
+
attr = _ref6[0];
|
|
470
|
+
|
|
471
|
+
return function (data) {
|
|
472
|
+
return {
|
|
473
|
+
val: null,
|
|
474
|
+
sorter: getSort(typeof data !== 'undefined' ? data.sorters : null, attr),
|
|
475
|
+
push: function push(record) {
|
|
476
|
+
var x = record[attr];
|
|
477
|
+
if (['min', 'max'].includes(mode)) {
|
|
478
|
+
x = parseFloat(x);
|
|
479
|
+
if (!isNaN(x)) {
|
|
480
|
+
this.val = Math[mode](x, this.val !== null ? this.val : x);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if (mode === 'first' && this.sorter(x, this.val !== null ? this.val : x) <= 0) {
|
|
484
|
+
this.val = x;
|
|
485
|
+
}
|
|
486
|
+
if (mode === 'last' && this.sorter(x, this.val !== null ? this.val : x) >= 0) {
|
|
487
|
+
this.val = x;
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
value: function value() {
|
|
491
|
+
return this.val;
|
|
492
|
+
},
|
|
493
|
+
format: function format(x) {
|
|
494
|
+
if (isNaN(x)) {
|
|
495
|
+
return x;
|
|
496
|
+
}
|
|
497
|
+
return formatter(x);
|
|
498
|
+
},
|
|
499
|
+
|
|
500
|
+
numInputs: typeof attr !== 'undefined' ? 0 : 1
|
|
501
|
+
};
|
|
502
|
+
};
|
|
503
|
+
};
|
|
504
|
+
},
|
|
505
|
+
quantile: function quantile(q) {
|
|
506
|
+
var formatter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : usFmt;
|
|
507
|
+
|
|
508
|
+
return function (_ref7) {
|
|
509
|
+
var _ref8 = _slicedToArray(_ref7, 1),
|
|
510
|
+
attr = _ref8[0];
|
|
511
|
+
|
|
512
|
+
return function () {
|
|
513
|
+
return {
|
|
514
|
+
vals: [],
|
|
515
|
+
push: function push(record) {
|
|
516
|
+
var x = parseFloat(record[attr]);
|
|
517
|
+
if (!isNaN(x)) {
|
|
518
|
+
this.vals.push(x);
|
|
519
|
+
}
|
|
520
|
+
},
|
|
521
|
+
value: function value() {
|
|
522
|
+
if (this.vals.length === 0) {
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
this.vals.sort(function (a, b) {
|
|
526
|
+
return a - b;
|
|
527
|
+
});
|
|
528
|
+
var i = (this.vals.length - 1) * q;
|
|
529
|
+
return (this.vals[Math.floor(i)] + this.vals[Math.ceil(i)]) / 2.0;
|
|
530
|
+
},
|
|
531
|
+
|
|
532
|
+
format: formatter,
|
|
533
|
+
numInputs: typeof attr !== 'undefined' ? 0 : 1
|
|
534
|
+
};
|
|
535
|
+
};
|
|
536
|
+
};
|
|
537
|
+
},
|
|
538
|
+
runningStat: function runningStat() {
|
|
539
|
+
var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mean';
|
|
540
|
+
var ddof = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
|
|
541
|
+
var formatter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : usFmt;
|
|
542
|
+
|
|
543
|
+
return function (_ref9) {
|
|
544
|
+
var _ref10 = _slicedToArray(_ref9, 1),
|
|
545
|
+
attr = _ref10[0];
|
|
546
|
+
|
|
547
|
+
return function () {
|
|
548
|
+
return {
|
|
549
|
+
n: 0.0,
|
|
550
|
+
m: 0.0,
|
|
551
|
+
s: 0.0,
|
|
552
|
+
push: function push(record) {
|
|
553
|
+
var x = parseFloat(record[attr]);
|
|
554
|
+
if (isNaN(x)) {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
this.n += 1.0;
|
|
558
|
+
if (this.n === 1.0) {
|
|
559
|
+
this.m = x;
|
|
560
|
+
}
|
|
561
|
+
var m_new = this.m + (x - this.m) / this.n;
|
|
562
|
+
this.s = this.s + (x - this.m) * (x - m_new);
|
|
563
|
+
this.m = m_new;
|
|
564
|
+
},
|
|
565
|
+
value: function value() {
|
|
566
|
+
if (mode === 'mean') {
|
|
567
|
+
if (this.n === 0) {
|
|
568
|
+
return 0 / 0;
|
|
569
|
+
}
|
|
570
|
+
return this.m;
|
|
571
|
+
}
|
|
572
|
+
if (this.n <= ddof) {
|
|
573
|
+
return 0;
|
|
574
|
+
}
|
|
575
|
+
switch (mode) {
|
|
576
|
+
case 'var':
|
|
577
|
+
return this.s / (this.n - ddof);
|
|
578
|
+
case 'stdev':
|
|
579
|
+
return Math.sqrt(this.s / (this.n - ddof));
|
|
580
|
+
default:
|
|
581
|
+
throw new Error('unknown mode for runningStat');
|
|
582
|
+
}
|
|
583
|
+
},
|
|
584
|
+
|
|
585
|
+
format: formatter,
|
|
586
|
+
numInputs: typeof attr !== 'undefined' ? 0 : 1
|
|
587
|
+
};
|
|
588
|
+
};
|
|
589
|
+
};
|
|
590
|
+
},
|
|
591
|
+
sumOverSum: function sumOverSum() {
|
|
592
|
+
var formatter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : usFmt;
|
|
593
|
+
|
|
594
|
+
return function (_ref11) {
|
|
595
|
+
var _ref12 = _slicedToArray(_ref11, 2),
|
|
596
|
+
num = _ref12[0],
|
|
597
|
+
denom = _ref12[1];
|
|
598
|
+
|
|
599
|
+
return function () {
|
|
600
|
+
return {
|
|
601
|
+
sumNum: 0,
|
|
602
|
+
sumDenom: 0,
|
|
603
|
+
push: function push(record) {
|
|
604
|
+
if (!isNaN(parseFloat(record[num]))) {
|
|
605
|
+
this.sumNum += parseFloat(record[num]);
|
|
606
|
+
}
|
|
607
|
+
if (!isNaN(parseFloat(record[denom]))) {
|
|
608
|
+
this.sumDenom += parseFloat(record[denom]);
|
|
609
|
+
}
|
|
610
|
+
},
|
|
611
|
+
value: function value() {
|
|
612
|
+
return this.sumNum / this.sumDenom;
|
|
613
|
+
},
|
|
614
|
+
|
|
615
|
+
format: formatter,
|
|
616
|
+
numInputs: typeof num !== 'undefined' && typeof denom !== 'undefined' ? 0 : 2
|
|
617
|
+
};
|
|
618
|
+
};
|
|
619
|
+
};
|
|
620
|
+
},
|
|
621
|
+
fractionOf: function fractionOf(wrapped) {
|
|
622
|
+
var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'total';
|
|
623
|
+
var formatter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : usFmtPct;
|
|
624
|
+
|
|
625
|
+
return function () {
|
|
626
|
+
for (var _len = arguments.length, x = Array(_len), _key = 0; _key < _len; _key++) {
|
|
627
|
+
x[_key] = arguments[_key];
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
return function (data, rowKey, colKey) {
|
|
631
|
+
return {
|
|
632
|
+
selector: { total: [[], []], row: [rowKey, []], col: [[], colKey] }[type],
|
|
633
|
+
inner: wrapped.apply(undefined, _toConsumableArray(Array.from(x || [])))(data, rowKey, colKey),
|
|
634
|
+
push: function push(record) {
|
|
635
|
+
this.inner.push(record);
|
|
636
|
+
},
|
|
637
|
+
|
|
638
|
+
format: formatter,
|
|
639
|
+
value: function value() {
|
|
640
|
+
var aggregator = data.getAggregator.apply(data, _toConsumableArray(Array.from(this.selector || [])));
|
|
641
|
+
|
|
642
|
+
return this.inner.value() / (aggregator.inner && aggregator.inner.value() || 0);
|
|
643
|
+
},
|
|
644
|
+
|
|
645
|
+
numInputs: wrapped.apply(undefined, _toConsumableArray(Array.from(x || [])))().numInputs
|
|
646
|
+
};
|
|
647
|
+
};
|
|
648
|
+
};
|
|
649
|
+
}
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
aggregatorTemplates.countUnique = function (f) {
|
|
653
|
+
return aggregatorTemplates.uniques(function (x) {
|
|
654
|
+
return x.length;
|
|
655
|
+
}, f);
|
|
656
|
+
};
|
|
657
|
+
aggregatorTemplates.listUnique = function (s) {
|
|
658
|
+
return aggregatorTemplates.uniques(function (x) {
|
|
659
|
+
return x.join(s);
|
|
660
|
+
}, function (x) {
|
|
661
|
+
return x;
|
|
662
|
+
});
|
|
663
|
+
};
|
|
664
|
+
aggregatorTemplates.max = function (f) {
|
|
665
|
+
return aggregatorTemplates.extremes('max', f);
|
|
666
|
+
};
|
|
667
|
+
aggregatorTemplates.min = function (f) {
|
|
668
|
+
return aggregatorTemplates.extremes('min', f);
|
|
669
|
+
};
|
|
670
|
+
aggregatorTemplates.first = function (f) {
|
|
671
|
+
return aggregatorTemplates.extremes('first', f);
|
|
672
|
+
};
|
|
673
|
+
aggregatorTemplates.last = function (f) {
|
|
674
|
+
return aggregatorTemplates.extremes('last', f);
|
|
675
|
+
};
|
|
676
|
+
aggregatorTemplates.median = function (f) {
|
|
677
|
+
return aggregatorTemplates.quantile(0.5, f);
|
|
678
|
+
};
|
|
679
|
+
aggregatorTemplates.average = function (f) {
|
|
680
|
+
return aggregatorTemplates.runningStat('mean', 1, f);
|
|
681
|
+
};
|
|
682
|
+
aggregatorTemplates.var = function (ddof, f) {
|
|
683
|
+
return aggregatorTemplates.runningStat('var', ddof, f);
|
|
684
|
+
};
|
|
685
|
+
aggregatorTemplates.stdev = function (ddof, f) {
|
|
686
|
+
return aggregatorTemplates.runningStat('stdev', ddof, f);
|
|
687
|
+
};
|
|
688
|
+
|
|
689
|
+
var AggregatorCell = function () {
|
|
690
|
+
function AggregatorCell(instances, primaryKey) {
|
|
691
|
+
_classCallCheck(this, AggregatorCell);
|
|
692
|
+
|
|
693
|
+
this.instances = instances;
|
|
694
|
+
this.primaryKey = primaryKey;
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
_createClass(AggregatorCell, [{
|
|
698
|
+
key: 'push',
|
|
699
|
+
value: function push(record) {
|
|
700
|
+
var _this = this;
|
|
701
|
+
|
|
702
|
+
Object.keys(this.instances).forEach(function (key) {
|
|
703
|
+
_this.instances[key].push(record);
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
}, {
|
|
707
|
+
key: 'getInstance',
|
|
708
|
+
value: function getInstance(key) {
|
|
709
|
+
var targetKey = key || this.primaryKey;
|
|
710
|
+
if (targetKey && this.instances[targetKey]) {
|
|
711
|
+
return this.instances[targetKey];
|
|
712
|
+
}
|
|
713
|
+
var first = this.instances[this.primaryKey] || this.instances[Object.keys(this.instances)[0]];
|
|
714
|
+
return first || null;
|
|
715
|
+
}
|
|
716
|
+
}]);
|
|
717
|
+
|
|
718
|
+
return AggregatorCell;
|
|
719
|
+
}();
|
|
720
|
+
|
|
721
|
+
// default aggregators & renderers use US naming and number formatting
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
var aggregators = function (tpl) {
|
|
725
|
+
return {
|
|
726
|
+
Count: tpl.count(usFmtInt),
|
|
727
|
+
'Count Unique Values': tpl.countUnique(usFmtInt),
|
|
728
|
+
'List Unique Values': tpl.listUnique(', '),
|
|
729
|
+
Sum: tpl.sum(usFmt),
|
|
730
|
+
'Integer Sum': tpl.sum(usFmtInt),
|
|
731
|
+
Average: tpl.average(usFmt),
|
|
732
|
+
Median: tpl.median(usFmt),
|
|
733
|
+
'Sample Variance': tpl.var(1, usFmt),
|
|
734
|
+
'Sample Standard Deviation': tpl.stdev(1, usFmt),
|
|
735
|
+
Minimum: tpl.min(usFmt),
|
|
736
|
+
Maximum: tpl.max(usFmt),
|
|
737
|
+
First: tpl.first(usFmt),
|
|
738
|
+
Last: tpl.last(usFmt),
|
|
739
|
+
'Sum over Sum': tpl.sumOverSum(usFmt),
|
|
740
|
+
'Sum as Fraction of Total': tpl.fractionOf(tpl.sum(), 'total', usFmtPct),
|
|
741
|
+
'Sum as Fraction of Rows': tpl.fractionOf(tpl.sum(), 'row', usFmtPct),
|
|
742
|
+
'Sum as Fraction of Columns': tpl.fractionOf(tpl.sum(), 'col', usFmtPct),
|
|
743
|
+
'Count as Fraction of Total': tpl.fractionOf(tpl.count(), 'total', usFmtPct),
|
|
744
|
+
'Count as Fraction of Rows': tpl.fractionOf(tpl.count(), 'row', usFmtPct),
|
|
745
|
+
'Count as Fraction of Columns': tpl.fractionOf(tpl.count(), 'col', usFmtPct)
|
|
746
|
+
};
|
|
747
|
+
}(aggregatorTemplates);
|
|
748
|
+
|
|
749
|
+
var locales = {
|
|
750
|
+
en: {
|
|
751
|
+
aggregators: aggregators,
|
|
752
|
+
localeStrings: {
|
|
753
|
+
renderError: 'An error occurred rendering the PivotTable results.',
|
|
754
|
+
computeError: 'An error occurred computing the PivotTable results.',
|
|
755
|
+
uiRenderError: 'An error occurred rendering the PivotTable UI.',
|
|
756
|
+
selectAll: 'Select All',
|
|
757
|
+
selectNone: 'Select None',
|
|
758
|
+
tooMany: '(too many to list)',
|
|
759
|
+
filterResults: 'Filter values',
|
|
760
|
+
apply: 'Apply',
|
|
761
|
+
cancel: 'Cancel',
|
|
762
|
+
totals: 'Totals',
|
|
763
|
+
vs: 'vs',
|
|
764
|
+
by: 'by'
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
};
|
|
768
|
+
|
|
769
|
+
// dateFormat deriver l10n requires month and day names to be passed in directly
|
|
770
|
+
var mthNamesEn = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
771
|
+
var dayNamesEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
|
772
|
+
var zeroPad = function zeroPad(number) {
|
|
773
|
+
return ('0' + number).substr(-2, 2);
|
|
774
|
+
}; // eslint-disable-line no-magic-numbers
|
|
775
|
+
|
|
776
|
+
var derivers = {
|
|
777
|
+
bin: function bin(col, binWidth) {
|
|
778
|
+
return function (record) {
|
|
779
|
+
return record[col] - record[col] % binWidth;
|
|
780
|
+
};
|
|
781
|
+
},
|
|
782
|
+
dateFormat: function dateFormat(col, formatString) {
|
|
783
|
+
var utcOutput = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
784
|
+
var mthNames = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : mthNamesEn;
|
|
785
|
+
var dayNames = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : dayNamesEn;
|
|
786
|
+
|
|
787
|
+
var utc = utcOutput ? 'UTC' : '';
|
|
788
|
+
return function (record) {
|
|
789
|
+
var date = new Date(Date.parse(record[col]));
|
|
790
|
+
if (isNaN(date)) {
|
|
791
|
+
return '';
|
|
792
|
+
}
|
|
793
|
+
return formatString.replace(/%(.)/g, function (m, p) {
|
|
794
|
+
switch (p) {
|
|
795
|
+
case 'y':
|
|
796
|
+
return date['get' + utc + 'FullYear']();
|
|
797
|
+
case 'm':
|
|
798
|
+
return zeroPad(date['get' + utc + 'Month']() + 1);
|
|
799
|
+
case 'n':
|
|
800
|
+
return mthNames[date['get' + utc + 'Month']()];
|
|
801
|
+
case 'd':
|
|
802
|
+
return zeroPad(date['get' + utc + 'Date']());
|
|
803
|
+
case 'w':
|
|
804
|
+
return dayNames[date['get' + utc + 'Day']()];
|
|
805
|
+
case 'x':
|
|
806
|
+
return date['get' + utc + 'Day']();
|
|
807
|
+
case 'H':
|
|
808
|
+
return zeroPad(date['get' + utc + 'Hours']());
|
|
809
|
+
case 'M':
|
|
810
|
+
return zeroPad(date['get' + utc + 'Minutes']());
|
|
811
|
+
case 'S':
|
|
812
|
+
return zeroPad(date['get' + utc + 'Seconds']());
|
|
813
|
+
default:
|
|
814
|
+
return '%' + p;
|
|
815
|
+
}
|
|
816
|
+
});
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
};
|
|
820
|
+
|
|
821
|
+
/*
|
|
822
|
+
Data Model class
|
|
823
|
+
*/
|
|
824
|
+
|
|
825
|
+
var PivotData = function () {
|
|
826
|
+
function PivotData() {
|
|
827
|
+
var _this2 = this;
|
|
828
|
+
|
|
829
|
+
var inputProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
830
|
+
|
|
831
|
+
_classCallCheck(this, PivotData);
|
|
832
|
+
|
|
833
|
+
this.props = Object.assign({}, PivotData.defaultProps, inputProps);
|
|
834
|
+
_propTypes2.default.checkPropTypes(PivotData.propTypes, this.props, 'prop', 'PivotData');
|
|
835
|
+
|
|
836
|
+
this.aggregations = this.normalizeAggregations();
|
|
837
|
+
this.aggregationKeyLookup = {};
|
|
838
|
+
this.aggregations.forEach(function (agg) {
|
|
839
|
+
if (!(agg.aggregatorName in _this2.aggregationKeyLookup)) {
|
|
840
|
+
_this2.aggregationKeyLookup[agg.aggregatorName] = agg.key;
|
|
841
|
+
}
|
|
842
|
+
});
|
|
843
|
+
if (this.aggregations.length === 0) {
|
|
844
|
+
throw new Error('PivotData requires at least one aggregation');
|
|
845
|
+
}
|
|
846
|
+
this.primaryAggregation = this.aggregations[0];
|
|
847
|
+
this.primaryAggregatorName = this.primaryAggregation.aggregatorName;
|
|
848
|
+
|
|
849
|
+
this.aggregatorFactories = this.buildAggregatorFactories();
|
|
850
|
+
this.tree = {};
|
|
851
|
+
this.rowKeys = [];
|
|
852
|
+
this.colKeys = [];
|
|
853
|
+
this.rowTotals = {};
|
|
854
|
+
this.colTotals = {};
|
|
855
|
+
this.allTotal = this.createAggregatorCell([], []);
|
|
856
|
+
this.sorted = false;
|
|
857
|
+
|
|
858
|
+
// iterate through input, accumulating data for cells
|
|
859
|
+
PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) {
|
|
860
|
+
if (_this2.filter(record)) {
|
|
861
|
+
_this2.processRecord(record);
|
|
862
|
+
}
|
|
863
|
+
});
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
_createClass(PivotData, [{
|
|
867
|
+
key: 'filter',
|
|
868
|
+
value: function filter(record) {
|
|
869
|
+
for (var k in this.props.valueFilter) {
|
|
870
|
+
if (record[k] in this.props.valueFilter[k]) {
|
|
871
|
+
return false;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
return true;
|
|
875
|
+
}
|
|
876
|
+
}, {
|
|
877
|
+
key: 'forEachMatchingRecord',
|
|
878
|
+
value: function forEachMatchingRecord(criteria, callback) {
|
|
879
|
+
var _this3 = this;
|
|
880
|
+
|
|
881
|
+
return PivotData.forEachRecord(this.props.data, this.props.derivedAttributes, function (record) {
|
|
882
|
+
if (!_this3.filter(record)) {
|
|
883
|
+
return;
|
|
884
|
+
}
|
|
885
|
+
for (var k in criteria) {
|
|
886
|
+
var v = criteria[k];
|
|
887
|
+
if (v !== (k in record ? record[k] : 'null')) {
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
callback(record);
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
}, {
|
|
895
|
+
key: 'arrSort',
|
|
896
|
+
value: function arrSort(attrs) {
|
|
897
|
+
var _this4 = this;
|
|
898
|
+
|
|
899
|
+
var a = void 0;
|
|
900
|
+
var sortersArr = function () {
|
|
901
|
+
var result = [];
|
|
902
|
+
var _iteratorNormalCompletion2 = true;
|
|
903
|
+
var _didIteratorError2 = false;
|
|
904
|
+
var _iteratorError2 = undefined;
|
|
905
|
+
|
|
906
|
+
try {
|
|
907
|
+
for (var _iterator2 = Array.from(attrs)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
908
|
+
a = _step2.value;
|
|
909
|
+
|
|
910
|
+
result.push(getSort(_this4.props.sorters, a));
|
|
911
|
+
}
|
|
912
|
+
} catch (err) {
|
|
913
|
+
_didIteratorError2 = true;
|
|
914
|
+
_iteratorError2 = err;
|
|
915
|
+
} finally {
|
|
916
|
+
try {
|
|
917
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
918
|
+
_iterator2.return();
|
|
919
|
+
}
|
|
920
|
+
} finally {
|
|
921
|
+
if (_didIteratorError2) {
|
|
922
|
+
throw _iteratorError2;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
return result;
|
|
928
|
+
}();
|
|
929
|
+
return function (a, b) {
|
|
930
|
+
var _iteratorNormalCompletion3 = true;
|
|
931
|
+
var _didIteratorError3 = false;
|
|
932
|
+
var _iteratorError3 = undefined;
|
|
933
|
+
|
|
934
|
+
try {
|
|
935
|
+
for (var _iterator3 = Object.keys(sortersArr || {})[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
936
|
+
var i = _step3.value;
|
|
937
|
+
|
|
938
|
+
var sorter = sortersArr[i];
|
|
939
|
+
var comparison = sorter(a[i], b[i]);
|
|
940
|
+
if (comparison !== 0) {
|
|
941
|
+
return comparison;
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
} catch (err) {
|
|
945
|
+
_didIteratorError3 = true;
|
|
946
|
+
_iteratorError3 = err;
|
|
947
|
+
} finally {
|
|
948
|
+
try {
|
|
949
|
+
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
|
950
|
+
_iterator3.return();
|
|
951
|
+
}
|
|
952
|
+
} finally {
|
|
953
|
+
if (_didIteratorError3) {
|
|
954
|
+
throw _iteratorError3;
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
return 0;
|
|
960
|
+
};
|
|
961
|
+
}
|
|
962
|
+
}, {
|
|
963
|
+
key: 'sortKeys',
|
|
964
|
+
value: function sortKeys() {
|
|
965
|
+
var _this5 = this;
|
|
966
|
+
|
|
967
|
+
if (!this.sorted) {
|
|
968
|
+
this.sorted = true;
|
|
969
|
+
var v = function v(r, c) {
|
|
970
|
+
return _this5.getAggregator(r, c).value();
|
|
971
|
+
};
|
|
972
|
+
|
|
973
|
+
// Handle per-row sorting
|
|
974
|
+
if (this.props.rowSorts && Object.keys(this.props.rowSorts).length > 0) {
|
|
975
|
+
var rowSorts = this.props.rowSorts;
|
|
976
|
+
this.rowKeys.sort(function (a, b) {
|
|
977
|
+
// First, check if any sorted attribute has a difference
|
|
978
|
+
for (var i = 0; i < _this5.props.rows.length; i++) {
|
|
979
|
+
var attr = _this5.props.rows[i];
|
|
980
|
+
if (attr && rowSorts[attr]) {
|
|
981
|
+
var sortDir = rowSorts[attr] === 'ASC' ? 1 : -1;
|
|
982
|
+
var sorter = getSort(_this5.props.sorters, attr);
|
|
983
|
+
var comparison = sorter(a[i] || '', b[i] || '');
|
|
984
|
+
if (comparison !== 0) {
|
|
985
|
+
return sortDir * comparison;
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
// If sorted attributes are equal, use default sorting for remaining attributes
|
|
990
|
+
return _this5.arrSort(_this5.props.rows)(a, b);
|
|
991
|
+
});
|
|
992
|
+
} else {
|
|
993
|
+
// Use global row order
|
|
994
|
+
switch (this.props.rowOrder) {
|
|
995
|
+
case 'value_a_to_z':
|
|
996
|
+
this.rowKeys.sort(function (a, b) {
|
|
997
|
+
return naturalSort(v(a, []), v(b, []));
|
|
998
|
+
});
|
|
999
|
+
break;
|
|
1000
|
+
case 'value_z_to_a':
|
|
1001
|
+
this.rowKeys.sort(function (a, b) {
|
|
1002
|
+
return -naturalSort(v(a, []), v(b, []));
|
|
1003
|
+
});
|
|
1004
|
+
break;
|
|
1005
|
+
default:
|
|
1006
|
+
this.rowKeys.sort(this.arrSort(this.props.rows));
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
// Handle per-column sorting
|
|
1011
|
+
if (this.props.colSorts && Object.keys(this.props.colSorts).length > 0) {
|
|
1012
|
+
var colSorts = this.props.colSorts;
|
|
1013
|
+
this.colKeys.sort(function (a, b) {
|
|
1014
|
+
// First, check if any sorted attribute has a difference
|
|
1015
|
+
for (var i = 0; i < _this5.props.cols.length; i++) {
|
|
1016
|
+
var attr = _this5.props.cols[i];
|
|
1017
|
+
if (attr && colSorts[attr]) {
|
|
1018
|
+
var sortDir = colSorts[attr] === 'ASC' ? 1 : -1;
|
|
1019
|
+
var sorter = getSort(_this5.props.sorters, attr);
|
|
1020
|
+
var comparison = sorter(a[i] || '', b[i] || '');
|
|
1021
|
+
if (comparison !== 0) {
|
|
1022
|
+
return sortDir * comparison;
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
// If sorted attributes are equal, use default sorting for remaining attributes
|
|
1027
|
+
return _this5.arrSort(_this5.props.cols)(a, b);
|
|
1028
|
+
});
|
|
1029
|
+
} else {
|
|
1030
|
+
// Use global col order
|
|
1031
|
+
switch (this.props.colOrder) {
|
|
1032
|
+
case 'value_a_to_z':
|
|
1033
|
+
this.colKeys.sort(function (a, b) {
|
|
1034
|
+
return naturalSort(v([], a), v([], b));
|
|
1035
|
+
});
|
|
1036
|
+
break;
|
|
1037
|
+
case 'value_z_to_a':
|
|
1038
|
+
this.colKeys.sort(function (a, b) {
|
|
1039
|
+
return -naturalSort(v([], a), v([], b));
|
|
1040
|
+
});
|
|
1041
|
+
break;
|
|
1042
|
+
default:
|
|
1043
|
+
this.colKeys.sort(this.arrSort(this.props.cols));
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
}, {
|
|
1049
|
+
key: 'getColKeys',
|
|
1050
|
+
value: function getColKeys() {
|
|
1051
|
+
this.sortKeys();
|
|
1052
|
+
return this.colKeys;
|
|
1053
|
+
}
|
|
1054
|
+
}, {
|
|
1055
|
+
key: 'getRowKeys',
|
|
1056
|
+
value: function getRowKeys() {
|
|
1057
|
+
this.sortKeys();
|
|
1058
|
+
return this.rowKeys;
|
|
1059
|
+
}
|
|
1060
|
+
}, {
|
|
1061
|
+
key: 'processRecord',
|
|
1062
|
+
value: function processRecord(record) {
|
|
1063
|
+
// this code is called in a tight loop
|
|
1064
|
+
var colKey = [];
|
|
1065
|
+
var rowKey = [];
|
|
1066
|
+
var _iteratorNormalCompletion4 = true;
|
|
1067
|
+
var _didIteratorError4 = false;
|
|
1068
|
+
var _iteratorError4 = undefined;
|
|
1069
|
+
|
|
1070
|
+
try {
|
|
1071
|
+
for (var _iterator4 = Array.from(this.props.cols)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
1072
|
+
var x = _step4.value;
|
|
1073
|
+
|
|
1074
|
+
colKey.push(x in record ? record[x] : 'null');
|
|
1075
|
+
}
|
|
1076
|
+
} catch (err) {
|
|
1077
|
+
_didIteratorError4 = true;
|
|
1078
|
+
_iteratorError4 = err;
|
|
1079
|
+
} finally {
|
|
1080
|
+
try {
|
|
1081
|
+
if (!_iteratorNormalCompletion4 && _iterator4.return) {
|
|
1082
|
+
_iterator4.return();
|
|
1083
|
+
}
|
|
1084
|
+
} finally {
|
|
1085
|
+
if (_didIteratorError4) {
|
|
1086
|
+
throw _iteratorError4;
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
var _iteratorNormalCompletion5 = true;
|
|
1092
|
+
var _didIteratorError5 = false;
|
|
1093
|
+
var _iteratorError5 = undefined;
|
|
1094
|
+
|
|
1095
|
+
try {
|
|
1096
|
+
for (var _iterator5 = Array.from(this.props.rows)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
|
1097
|
+
var _x17 = _step5.value;
|
|
1098
|
+
|
|
1099
|
+
rowKey.push(_x17 in record ? record[_x17] : 'null');
|
|
1100
|
+
}
|
|
1101
|
+
} catch (err) {
|
|
1102
|
+
_didIteratorError5 = true;
|
|
1103
|
+
_iteratorError5 = err;
|
|
1104
|
+
} finally {
|
|
1105
|
+
try {
|
|
1106
|
+
if (!_iteratorNormalCompletion5 && _iterator5.return) {
|
|
1107
|
+
_iterator5.return();
|
|
1108
|
+
}
|
|
1109
|
+
} finally {
|
|
1110
|
+
if (_didIteratorError5) {
|
|
1111
|
+
throw _iteratorError5;
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
var flatRowKey = rowKey.join(String.fromCharCode(0));
|
|
1117
|
+
var flatColKey = colKey.join(String.fromCharCode(0));
|
|
1118
|
+
|
|
1119
|
+
this.allTotal.push(record);
|
|
1120
|
+
|
|
1121
|
+
if (rowKey.length !== 0) {
|
|
1122
|
+
if (!this.rowTotals[flatRowKey]) {
|
|
1123
|
+
this.rowKeys.push(rowKey);
|
|
1124
|
+
this.rowTotals[flatRowKey] = this.createAggregatorCell(rowKey, []);
|
|
1125
|
+
}
|
|
1126
|
+
this.rowTotals[flatRowKey].push(record);
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
if (colKey.length !== 0) {
|
|
1130
|
+
if (!this.colTotals[flatColKey]) {
|
|
1131
|
+
this.colKeys.push(colKey);
|
|
1132
|
+
this.colTotals[flatColKey] = this.createAggregatorCell([], colKey);
|
|
1133
|
+
}
|
|
1134
|
+
this.colTotals[flatColKey].push(record);
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
if (colKey.length !== 0 && rowKey.length !== 0) {
|
|
1138
|
+
if (!this.tree[flatRowKey]) {
|
|
1139
|
+
this.tree[flatRowKey] = {};
|
|
1140
|
+
}
|
|
1141
|
+
if (!this.tree[flatRowKey][flatColKey]) {
|
|
1142
|
+
this.tree[flatRowKey][flatColKey] = this.createAggregatorCell(rowKey, colKey);
|
|
1143
|
+
}
|
|
1144
|
+
this.tree[flatRowKey][flatColKey].push(record);
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
}, {
|
|
1148
|
+
key: 'getAggregator',
|
|
1149
|
+
value: function getAggregator(rowKey, colKey) {
|
|
1150
|
+
var aggregationKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.primaryAggregation.key;
|
|
1151
|
+
|
|
1152
|
+
var resolvedKey = aggregationKey;
|
|
1153
|
+
if (resolvedKey && !(resolvedKey in this.aggregatorFactories) && this.aggregationKeyLookup[resolvedKey]) {
|
|
1154
|
+
resolvedKey = this.aggregationKeyLookup[resolvedKey];
|
|
1155
|
+
}
|
|
1156
|
+
var cell = this.getAggregatorCell(rowKey, colKey);
|
|
1157
|
+
if (!cell) {
|
|
1158
|
+
return PivotData.emptyAggregator;
|
|
1159
|
+
}
|
|
1160
|
+
return cell.getInstance(resolvedKey) || PivotData.emptyAggregator;
|
|
1161
|
+
}
|
|
1162
|
+
}, {
|
|
1163
|
+
key: 'getAggregatorCell',
|
|
1164
|
+
value: function getAggregatorCell(rowKey, colKey) {
|
|
1165
|
+
var cell = void 0;
|
|
1166
|
+
var flatRowKey = rowKey.join(String.fromCharCode(0));
|
|
1167
|
+
var flatColKey = colKey.join(String.fromCharCode(0));
|
|
1168
|
+
if (rowKey.length === 0 && colKey.length === 0) {
|
|
1169
|
+
cell = this.allTotal;
|
|
1170
|
+
} else if (rowKey.length === 0) {
|
|
1171
|
+
cell = this.colTotals[flatColKey];
|
|
1172
|
+
} else if (colKey.length === 0) {
|
|
1173
|
+
cell = this.rowTotals[flatRowKey];
|
|
1174
|
+
} else {
|
|
1175
|
+
cell = this.tree[flatRowKey] && this.tree[flatRowKey][flatColKey] ? this.tree[flatRowKey][flatColKey] : null;
|
|
1176
|
+
}
|
|
1177
|
+
return cell || null;
|
|
1178
|
+
}
|
|
1179
|
+
}, {
|
|
1180
|
+
key: 'getAggregatorNames',
|
|
1181
|
+
value: function getAggregatorNames() {
|
|
1182
|
+
return this.aggregations.map(function (agg) {
|
|
1183
|
+
return agg.aggregatorName;
|
|
1184
|
+
});
|
|
1185
|
+
}
|
|
1186
|
+
}, {
|
|
1187
|
+
key: 'getAggregations',
|
|
1188
|
+
value: function getAggregations() {
|
|
1189
|
+
return this.aggregations.map(function (agg) {
|
|
1190
|
+
return Object.assign({}, agg);
|
|
1191
|
+
});
|
|
1192
|
+
}
|
|
1193
|
+
}, {
|
|
1194
|
+
key: 'getPrimaryAggregatorName',
|
|
1195
|
+
value: function getPrimaryAggregatorName() {
|
|
1196
|
+
return this.primaryAggregatorName;
|
|
1197
|
+
}
|
|
1198
|
+
}, {
|
|
1199
|
+
key: 'getPrimaryAggregation',
|
|
1200
|
+
value: function getPrimaryAggregation() {
|
|
1201
|
+
return Object.assign({}, this.primaryAggregation);
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
/**
|
|
1205
|
+
* Groups aggregations by their aggregatorName
|
|
1206
|
+
* @returns {Object} Object mapping aggregator names to arrays of aggregations
|
|
1207
|
+
* Example: { 'Count': [agg1, agg2], 'Sum': [agg3] }
|
|
1208
|
+
*/
|
|
1209
|
+
|
|
1210
|
+
}, {
|
|
1211
|
+
key: 'groupAggregationsByType',
|
|
1212
|
+
value: function groupAggregationsByType() {
|
|
1213
|
+
var grouped = {};
|
|
1214
|
+
this.aggregations.forEach(function (agg) {
|
|
1215
|
+
var aggName = agg.aggregatorName;
|
|
1216
|
+
if (!grouped[aggName]) {
|
|
1217
|
+
grouped[aggName] = [];
|
|
1218
|
+
}
|
|
1219
|
+
grouped[aggName].push(agg);
|
|
1220
|
+
});
|
|
1221
|
+
return grouped;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
/**
|
|
1225
|
+
* Gets aggregations for a specific aggregator type
|
|
1226
|
+
* @param {string} aggregatorName - The aggregator name (e.g., 'Count', 'Sum')
|
|
1227
|
+
* @returns {Array} Array of aggregation configurations
|
|
1228
|
+
*/
|
|
1229
|
+
|
|
1230
|
+
}, {
|
|
1231
|
+
key: 'getAggregationsByType',
|
|
1232
|
+
value: function getAggregationsByType(aggregatorName) {
|
|
1233
|
+
return this.aggregations.filter(function (agg) {
|
|
1234
|
+
return agg.aggregatorName === aggregatorName;
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
}, {
|
|
1238
|
+
key: 'normalizeAggregations',
|
|
1239
|
+
value: function normalizeAggregations() {
|
|
1240
|
+
var defaultAggregatorName = Object.keys(this.props.aggregators)[0];
|
|
1241
|
+
var aggregationsProvided = Array.isArray(this.props.aggregations) && this.props.aggregations.length > 0;
|
|
1242
|
+
var legacyAggregatorName = typeof this.props.aggregatorName === 'string' ? this.props.aggregatorName : null;
|
|
1243
|
+
var fallbackAggregatorName = legacyAggregatorName || defaultAggregatorName;
|
|
1244
|
+
var fallbackVals = Array.isArray(this.props.vals) ? this.props.vals : [];
|
|
1245
|
+
var aggregations = [];
|
|
1246
|
+
if (aggregationsProvided) {
|
|
1247
|
+
aggregations = this.props.aggregations;
|
|
1248
|
+
} else {
|
|
1249
|
+
aggregations = [{
|
|
1250
|
+
aggregatorName: fallbackAggregatorName,
|
|
1251
|
+
vals: fallbackVals
|
|
1252
|
+
}];
|
|
1253
|
+
}
|
|
1254
|
+
return aggregations.map(function (agg, idx) {
|
|
1255
|
+
var aggregatorName = agg.aggregatorName || (aggregationsProvided ? defaultAggregatorName : fallbackAggregatorName);
|
|
1256
|
+
var vals = typeof agg.vals !== 'undefined' ? agg.vals : aggregationsProvided ? [] : fallbackVals.slice();
|
|
1257
|
+
var normalizedVals = Array.isArray(vals) ? vals : [];
|
|
1258
|
+
var key = agg.key || (aggregatorName || 'agg') + '-' + (normalizedVals.length ? normalizedVals.join('|') : '') + '-' + idx;
|
|
1259
|
+
var label = agg.label || (normalizedVals.length ? aggregatorName + ' of ' + normalizedVals.join(', ') : aggregatorName);
|
|
1260
|
+
return {
|
|
1261
|
+
key: key,
|
|
1262
|
+
aggregatorName: aggregatorName,
|
|
1263
|
+
vals: normalizedVals,
|
|
1264
|
+
label: label
|
|
1265
|
+
};
|
|
1266
|
+
});
|
|
1267
|
+
}
|
|
1268
|
+
}, {
|
|
1269
|
+
key: 'buildAggregatorFactories',
|
|
1270
|
+
value: function buildAggregatorFactories() {
|
|
1271
|
+
var _this6 = this;
|
|
1272
|
+
|
|
1273
|
+
var factories = {};
|
|
1274
|
+
this.aggregations.forEach(function (agg) {
|
|
1275
|
+
if (!(agg.aggregatorName in _this6.props.aggregators)) {
|
|
1276
|
+
throw new Error('unknown aggregator ' + agg.aggregatorName);
|
|
1277
|
+
}
|
|
1278
|
+
factories[agg.key] = _this6.props.aggregators[agg.aggregatorName](agg.vals);
|
|
1279
|
+
});
|
|
1280
|
+
return factories;
|
|
1281
|
+
}
|
|
1282
|
+
}, {
|
|
1283
|
+
key: 'createAggregatorCell',
|
|
1284
|
+
value: function createAggregatorCell(rowKey, colKey) {
|
|
1285
|
+
var _this7 = this;
|
|
1286
|
+
|
|
1287
|
+
var instances = {};
|
|
1288
|
+
this.aggregations.forEach(function (agg) {
|
|
1289
|
+
instances[agg.key] = _this7.aggregatorFactories[agg.key](_this7, rowKey, colKey);
|
|
1290
|
+
});
|
|
1291
|
+
return new AggregatorCell(instances, this.primaryAggregation.key);
|
|
1292
|
+
}
|
|
1293
|
+
}]);
|
|
1294
|
+
|
|
1295
|
+
return PivotData;
|
|
1296
|
+
}();
|
|
1297
|
+
|
|
1298
|
+
PivotData.emptyAggregator = {
|
|
1299
|
+
push: function push() {},
|
|
1300
|
+
value: function value() {
|
|
1301
|
+
return null;
|
|
1302
|
+
},
|
|
1303
|
+
format: function format() {
|
|
1304
|
+
return '';
|
|
1305
|
+
}
|
|
1306
|
+
};
|
|
1307
|
+
|
|
1308
|
+
// can handle arrays or jQuery selections of tables
|
|
1309
|
+
PivotData.forEachRecord = function (input, derivedAttributes, f) {
|
|
1310
|
+
var addRecord = void 0,
|
|
1311
|
+
record = void 0;
|
|
1312
|
+
if (Object.getOwnPropertyNames(derivedAttributes).length === 0) {
|
|
1313
|
+
addRecord = f;
|
|
1314
|
+
} else {
|
|
1315
|
+
addRecord = function addRecord(record) {
|
|
1316
|
+
for (var k in derivedAttributes) {
|
|
1317
|
+
var derived = derivedAttributes[k](record);
|
|
1318
|
+
if (derived !== null) {
|
|
1319
|
+
record[k] = derived;
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
return f(record);
|
|
1323
|
+
};
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
// if it's a function, have it call us back
|
|
1327
|
+
if (typeof input === 'function') {
|
|
1328
|
+
return input(addRecord);
|
|
1329
|
+
} else if (Array.isArray(input)) {
|
|
1330
|
+
if (Array.isArray(input[0])) {
|
|
1331
|
+
// array of arrays
|
|
1332
|
+
return function () {
|
|
1333
|
+
var result = [];
|
|
1334
|
+
var _iteratorNormalCompletion6 = true;
|
|
1335
|
+
var _didIteratorError6 = false;
|
|
1336
|
+
var _iteratorError6 = undefined;
|
|
1337
|
+
|
|
1338
|
+
try {
|
|
1339
|
+
for (var _iterator6 = Object.keys(input || {})[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
|
|
1340
|
+
var i = _step6.value;
|
|
1341
|
+
|
|
1342
|
+
var compactRecord = input[i];
|
|
1343
|
+
if (i > 0) {
|
|
1344
|
+
record = {};
|
|
1345
|
+
var _iteratorNormalCompletion7 = true;
|
|
1346
|
+
var _didIteratorError7 = false;
|
|
1347
|
+
var _iteratorError7 = undefined;
|
|
1348
|
+
|
|
1349
|
+
try {
|
|
1350
|
+
for (var _iterator7 = Object.keys(input[0] || {})[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
|
|
1351
|
+
var j = _step7.value;
|
|
1352
|
+
|
|
1353
|
+
var k = input[0][j];
|
|
1354
|
+
record[k] = compactRecord[j];
|
|
1355
|
+
}
|
|
1356
|
+
} catch (err) {
|
|
1357
|
+
_didIteratorError7 = true;
|
|
1358
|
+
_iteratorError7 = err;
|
|
1359
|
+
} finally {
|
|
1360
|
+
try {
|
|
1361
|
+
if (!_iteratorNormalCompletion7 && _iterator7.return) {
|
|
1362
|
+
_iterator7.return();
|
|
1363
|
+
}
|
|
1364
|
+
} finally {
|
|
1365
|
+
if (_didIteratorError7) {
|
|
1366
|
+
throw _iteratorError7;
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
result.push(addRecord(record));
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
} catch (err) {
|
|
1375
|
+
_didIteratorError6 = true;
|
|
1376
|
+
_iteratorError6 = err;
|
|
1377
|
+
} finally {
|
|
1378
|
+
try {
|
|
1379
|
+
if (!_iteratorNormalCompletion6 && _iterator6.return) {
|
|
1380
|
+
_iterator6.return();
|
|
1381
|
+
}
|
|
1382
|
+
} finally {
|
|
1383
|
+
if (_didIteratorError6) {
|
|
1384
|
+
throw _iteratorError6;
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
return result;
|
|
1390
|
+
}();
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
// array of objects
|
|
1394
|
+
return function () {
|
|
1395
|
+
var result1 = [];
|
|
1396
|
+
var _iteratorNormalCompletion8 = true;
|
|
1397
|
+
var _didIteratorError8 = false;
|
|
1398
|
+
var _iteratorError8 = undefined;
|
|
1399
|
+
|
|
1400
|
+
try {
|
|
1401
|
+
for (var _iterator8 = Array.from(input)[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
|
|
1402
|
+
record = _step8.value;
|
|
1403
|
+
|
|
1404
|
+
result1.push(addRecord(record));
|
|
1405
|
+
}
|
|
1406
|
+
} catch (err) {
|
|
1407
|
+
_didIteratorError8 = true;
|
|
1408
|
+
_iteratorError8 = err;
|
|
1409
|
+
} finally {
|
|
1410
|
+
try {
|
|
1411
|
+
if (!_iteratorNormalCompletion8 && _iterator8.return) {
|
|
1412
|
+
_iterator8.return();
|
|
1413
|
+
}
|
|
1414
|
+
} finally {
|
|
1415
|
+
if (_didIteratorError8) {
|
|
1416
|
+
throw _iteratorError8;
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
return result1;
|
|
1422
|
+
}();
|
|
1423
|
+
}
|
|
1424
|
+
throw new Error('unknown input format');
|
|
1425
|
+
};
|
|
1426
|
+
|
|
1427
|
+
PivotData.defaultProps = {
|
|
1428
|
+
aggregators: aggregators,
|
|
1429
|
+
cols: [],
|
|
1430
|
+
rows: [],
|
|
1431
|
+
vals: [],
|
|
1432
|
+
aggregatorName: Object.keys(aggregators)[0],
|
|
1433
|
+
aggregations: [],
|
|
1434
|
+
sorters: {},
|
|
1435
|
+
valueFilter: {},
|
|
1436
|
+
rowOrder: 'key_a_to_z',
|
|
1437
|
+
colOrder: 'key_a_to_z',
|
|
1438
|
+
rowSorts: {},
|
|
1439
|
+
colSorts: {},
|
|
1440
|
+
derivedAttributes: {}
|
|
1441
|
+
};
|
|
1442
|
+
|
|
1443
|
+
PivotData.propTypes = {
|
|
1444
|
+
data: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.object, _propTypes2.default.func]).isRequired,
|
|
1445
|
+
aggregatorName: _propTypes2.default.string,
|
|
1446
|
+
aggregations: _propTypes2.default.arrayOf(_propTypes2.default.shape({
|
|
1447
|
+
key: _propTypes2.default.string,
|
|
1448
|
+
aggregatorName: _propTypes2.default.string,
|
|
1449
|
+
vals: _propTypes2.default.arrayOf(_propTypes2.default.string),
|
|
1450
|
+
label: _propTypes2.default.string
|
|
1451
|
+
})),
|
|
1452
|
+
cols: _propTypes2.default.arrayOf(_propTypes2.default.string),
|
|
1453
|
+
rows: _propTypes2.default.arrayOf(_propTypes2.default.string),
|
|
1454
|
+
vals: _propTypes2.default.arrayOf(_propTypes2.default.string),
|
|
1455
|
+
valueFilter: _propTypes2.default.objectOf(_propTypes2.default.objectOf(_propTypes2.default.bool)),
|
|
1456
|
+
sorters: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.objectOf(_propTypes2.default.func)]),
|
|
1457
|
+
derivedAttributes: _propTypes2.default.objectOf(_propTypes2.default.func),
|
|
1458
|
+
rowOrder: _propTypes2.default.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']),
|
|
1459
|
+
colOrder: _propTypes2.default.oneOf(['key_a_to_z', 'value_a_to_z', 'value_z_to_a']),
|
|
1460
|
+
rowSorts: _propTypes2.default.objectOf(_propTypes2.default.oneOf(['ASC', 'DESC'])),
|
|
1461
|
+
colSorts: _propTypes2.default.objectOf(_propTypes2.default.oneOf(['ASC', 'DESC']))
|
|
1462
|
+
};
|
|
1463
|
+
|
|
1464
|
+
exports.aggregatorTemplates = aggregatorTemplates;
|
|
1465
|
+
exports.aggregators = aggregators;
|
|
1466
|
+
exports.derivers = derivers;
|
|
1467
|
+
exports.locales = locales;
|
|
1468
|
+
exports.naturalSort = naturalSort;
|
|
1469
|
+
exports.numberFormat = numberFormat;
|
|
1470
|
+
exports.getSort = getSort;
|
|
1471
|
+
exports.sortAs = sortAs;
|
|
1472
|
+
exports.builtInSorters = builtInSorters;
|
|
1473
|
+
exports.detectDataType = detectDataType;
|
|
1474
|
+
exports.createSorterByType = createSorterByType;
|
|
1475
|
+
exports.PivotData = PivotData;
|
|
1476
|
+
//# sourceMappingURL=Utilities.js.map
|