@hrforte/react-pivottable 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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