@hrforte/react-pivottable 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,17 @@
1
1
  'use strict';
2
2
 
3
+ 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"); } }; }();
4
+
3
5
  var _react = require('react');
4
6
 
5
7
  var _react2 = _interopRequireDefault(_react);
6
8
 
7
9
  var _client = require('react-dom/client');
8
10
 
11
+ var _tips = require('../../examples/tips');
12
+
13
+ var _tips2 = _interopRequireDefault(_tips);
14
+
9
15
  var _PivotTable = require('../PivotTable');
10
16
 
11
17
  var _PivotTable2 = _interopRequireDefault(_PivotTable);
@@ -14,15 +20,33 @@ var _PivotTableUI = require('../PivotTableUI');
14
20
 
15
21
  var _PivotTableUI2 = _interopRequireDefault(_PivotTableUI);
16
22
 
23
+ var _TableRenderers = require('../TableRenderers');
24
+
25
+ var _PivotDataWorker = require('../PivotDataWorker');
26
+
27
+ var PivotDataWorker = _interopRequireWildcard(_PivotDataWorker);
28
+
29
+ var _pivotCompute = require('../pivotCompute');
30
+
31
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
32
+
17
33
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
34
 
19
35
  /* eslint-disable no-magic-numbers */
20
36
 
21
37
  // React 19 needs to be told that this environment supports `act`.
22
38
  global.IS_REACT_ACT_ENVIRONMENT = true;
39
+ global.queueMicrotask = function (callback) {
40
+ return Promise.resolve().then(callback);
41
+ };
42
+
43
+ var _require = require('react-dom/server'),
44
+ renderToStaticMarkup = _require.renderToStaticMarkup;
23
45
 
24
46
  // `showNumericalOrder` adds a "No." column in front of the row attributes so
25
47
  // every data row is prefixed with its 1-based index.
48
+
49
+
26
50
  var records = [{ name: 'Nick', gender: 'male', colour: 'blue', trials: 103 }, { name: 'Jane', gender: 'female', colour: 'red', trials: 95 }, { name: 'John', gender: 'male', colour: 'blue', trials: 112 }, { name: 'Carol', gender: 'female', colour: 'yellow', trials: 102 }];
27
51
 
28
52
  var baseProps = {
@@ -174,5 +198,430 @@ describe('Table renderer showNumericalOrder', function () {
174
198
  expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);
175
199
  });
176
200
  });
201
+
202
+ it('renders only visible rows and updates them while scrolling', function () {
203
+ var manyRecords = Array.from({ length: 1000 }, function (_, index) {
204
+ return {
205
+ name: 'Employee ' + String(index).padStart(4, '0')
206
+ };
207
+ });
208
+ var previousAnimationFrame = global.requestAnimationFrame;
209
+ var pendingFrame = void 0;
210
+ global.requestAnimationFrame = function (callback) {
211
+ pendingFrame = callback;
212
+ return 1;
213
+ };
214
+ jest.useFakeTimers();
215
+ try {
216
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, {
217
+ data: manyRecords,
218
+ showNumericalOrder: true,
219
+ virtualizeRows: true
220
+ })));
221
+
222
+ var table = mounted.node.querySelector('.pvtTable');
223
+ expect(table.getAttribute('data-pvt-virtualized')).toBe('true');
224
+ expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(150);
225
+ expect(numberCells(mounted.node)[0]).toBe('1');
226
+
227
+ var body = table.querySelector('tbody');
228
+ body.getBoundingClientRect = function () {
229
+ return { top: -3200 };
230
+ };
231
+ (0, _react.act)(function () {
232
+ window.dispatchEvent(new Event('scroll'));
233
+ if (pendingFrame) {
234
+ pendingFrame();
235
+ }
236
+ });
237
+ expect(numberCells(mounted.node)[0]).toBe('1');
238
+ expect(mounted.node.querySelector('.pvtVirtualScrollOverlay .pvtLoadingText').textContent).toBe('Processing');
239
+ (0, _react.act)(function () {
240
+ return jest.runTimersToTime(499);
241
+ });
242
+ expect(numberCells(mounted.node)[0]).toBe('1');
243
+ (0, _react.act)(function () {
244
+ return jest.runTimersToTime(1);
245
+ });
246
+ expect(numberCells(mounted.node)[0]).toBe('65');
247
+ expect(mounted.node.querySelector('.pvtVirtualScrollOverlay')).toBeNull();
248
+ expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(150);
249
+ } finally {
250
+ global.requestAnimationFrame = previousAnimationFrame;
251
+ jest.useRealTimers();
252
+ }
253
+ });
254
+
255
+ it('does not update synchronously again when layout shifts during a fast scroll', function () {
256
+ var manyRecords = Array.from({ length: 1000 }, function (_, index) {
257
+ return {
258
+ name: 'Employee ' + index
259
+ };
260
+ });
261
+ var fullPrecomputedData = (0, _pivotCompute.computePivotState)((0, _pivotCompute.materializeData)(manyRecords, {}), (0, _pivotCompute.createWorkerConfig)(baseProps));
262
+ var precomputedData = (0, _pivotCompute.createVirtualPivotSummary)(fullPrecomputedData, false);
263
+ precomputedData.viewportKey = 42;
264
+ var layoutReads = 0;
265
+ var previousAnimationFrame = global.requestAnimationFrame;
266
+ var pendingFrame = void 0;
267
+ global.requestAnimationFrame = function (callback) {
268
+ pendingFrame = callback;
269
+ return 1;
270
+ };
271
+ jest.useFakeTimers();
272
+ try {
273
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, {
274
+ data: [],
275
+ precomputedData: precomputedData,
276
+ virtualizeRows: true
277
+ })));
278
+
279
+ var body = mounted.node.querySelector('.pvtTable tbody');
280
+ body.getBoundingClientRect = function () {
281
+ return {
282
+ top: layoutReads++ % 2 === 0 ? -3200 : -6400
283
+ };
284
+ };
285
+ (0, _react.act)(function () {
286
+ window.dispatchEvent(new Event('scroll'));
287
+ if (pendingFrame) {
288
+ pendingFrame();
289
+ }
290
+ });
291
+ expect(layoutReads).toBe(0);
292
+ (0, _react.act)(function () {
293
+ return jest.runTimersToTime(250);
294
+ });
295
+ (0, _react.act)(function () {
296
+ window.dispatchEvent(new Event('scroll'));
297
+ });
298
+ (0, _react.act)(function () {
299
+ return jest.runTimersToTime(499);
300
+ });
301
+ expect(layoutReads).toBe(0);
302
+ (0, _react.act)(function () {
303
+ return jest.runTimersToTime(1);
304
+ });
305
+ expect(layoutReads).toBe(1);
306
+ (0, _react.act)(function () {
307
+ return window.dispatchEvent(new Event('scroll'));
308
+ });
309
+ (0, _react.act)(function () {
310
+ return jest.runTimersToTime(500);
311
+ });
312
+ expect(layoutReads).toBe(2);
313
+ } finally {
314
+ global.requestAnimationFrame = previousAnimationFrame;
315
+ jest.useRealTimers();
316
+ }
317
+ });
318
+
319
+ it('renders only the visible columns and updates them after horizontal scrolling', function () {
320
+ var wideRecords = Array.from({ length: 200 }, function (_, index) {
321
+ return {
322
+ employee: 'Employee ' + String(index).padStart(3, '0'),
323
+ gender: index % 2 === 0 ? 'female' : 'male'
324
+ };
325
+ });
326
+ jest.useFakeTimers();
327
+ try {
328
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, {
329
+ data: wideRecords,
330
+ rows: ['gender'],
331
+ cols: ['employee'],
332
+ virtualizeRows: true
333
+ })));
334
+
335
+ var table = mounted.node.querySelector('.pvtTable');
336
+ var initialLabels = Array.from(table.querySelectorAll('thead .pvtColLabel')).map(function (cell) {
337
+ return cell.textContent.trim();
338
+ });
339
+ expect(table.classList.contains('pvtVirtualColumns')).toBe(true);
340
+ expect(initialLabels).toContain('Employee 000');
341
+ expect(initialLabels).not.toContain('Employee 150');
342
+ expect(table.querySelectorAll('tbody .pvtVal').length).toBeLessThan(100);
343
+
344
+ var body = table.querySelector('tbody');
345
+ body.getBoundingClientRect = function () {
346
+ return { top: 0, left: -16000 };
347
+ };
348
+ (0, _react.act)(function () {
349
+ return window.dispatchEvent(new Event('scroll'));
350
+ });
351
+ (0, _react.act)(function () {
352
+ return jest.runTimersToTime(500);
353
+ });
354
+
355
+ var scrolledLabels = Array.from(table.querySelectorAll('thead .pvtColLabel')).map(function (cell) {
356
+ return cell.textContent.trim();
357
+ });
358
+ expect(scrolledLabels).not.toContain('Employee 000');
359
+ expect(scrolledLabels.some(function (label) {
360
+ return label >= 'Employee 128';
361
+ })).toBe(true);
362
+ expect(table.querySelectorAll('tbody .pvtVal').length).toBeLessThan(100);
363
+ } finally {
364
+ jest.useRealTimers();
365
+ }
366
+ });
367
+
368
+ it('renders values after moving a high-cardinality field from rows to columns', function () {
369
+ var wait = function wait(ms) {
370
+ return new Promise(function (resolve) {
371
+ return setTimeout(resolve, ms);
372
+ });
373
+ };
374
+ var actAsync = function actAsync(callback) {
375
+ return new Promise(function (resolve, reject) {
376
+ return (0, _react.act)(callback).then(resolve, reject);
377
+ });
378
+ };
379
+ var manyRecords = Array.from({ length: 400 }, function (_, index) {
380
+ return {
381
+ employee: 'Employee ' + String(index).padStart(3, '0'),
382
+ rowLabel: 'Row ' + String(399 - index).padStart(3, '0')
383
+ };
384
+ });
385
+ var aggregation = [{ key: 'count', aggregatorName: 'Count', vals: [] }];
386
+ var rowConfig = {
387
+ rows: ['employee'],
388
+ cols: [],
389
+ aggregations: aggregation
390
+ };
391
+ var columnConfig = {
392
+ rows: ['rowLabel'],
393
+ cols: ['employee'],
394
+ aggregations: aggregation
395
+ };
396
+ var materialized = (0, _pivotCompute.materializeData)(manyRecords, {});
397
+ var rowPivot = (0, _pivotCompute.computePivotState)(materialized, rowConfig);
398
+ var columnPivot = (0, _pivotCompute.computePivotState)(materialized, columnConfig);
399
+ expect((0, _pivotCompute.alignSparseColumnsToRows)(columnPivot)).toBe(true);
400
+ var rowSummary = (0, _pivotCompute.createVirtualPivotSummary)(rowPivot, false);
401
+ var columnSummary = (0, _pivotCompute.createVirtualPivotSummary)(columnPivot, false);
402
+ rowSummary.viewportKey = 41;
403
+ columnSummary.viewportKey = 42;
404
+ var workerSpy = jest.spyOn(PivotDataWorker, 'computePivotViewportInWorker').mockImplementation(function (viewportKey, start, end, columnMode, columnStart, columnEnd) {
405
+ return Promise.resolve((0, _pivotCompute.computePivotViewport)(viewportKey === 41 ? rowPivot : columnPivot, start, end, columnMode, columnStart, columnEnd));
406
+ });
407
+
408
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, rowConfig, {
409
+ data: [],
410
+ precomputedData: rowSummary,
411
+ virtualizeRows: true
412
+ })));
413
+
414
+ return actAsync(function () {
415
+ return wait(30);
416
+ }).then(function () {
417
+ (0, _react.act)(function () {
418
+ // A layout-induced scroll can still be pending when the new worker
419
+ // result replaces the previous axis configuration. The new viewport
420
+ // must reset immediately instead of retaining an empty 0..0 column
421
+ // window until the scroll debounce expires.
422
+ window.dispatchEvent(new Event('scroll'));
423
+ mounted.root.render(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, columnConfig, {
424
+ data: [],
425
+ precomputedData: columnSummary,
426
+ virtualizeRows: true
427
+ })));
428
+ });
429
+ return actAsync(function () {
430
+ return wait(50);
431
+ });
432
+ }).then(function () {
433
+ var values = Array.from(mounted.node.querySelectorAll('.pvtTable tbody .pvtVal')).map(function (cell) {
434
+ return cell.textContent.trim();
435
+ });
436
+ expect(values.length).toBeGreaterThan(0);
437
+ expect(values).toContain('1');
438
+ expect(mounted.node.querySelector('.pvtVirtualLoading')).toBeNull();
439
+ workerSpy.mockRestore();
440
+ }).catch(function (error) {
441
+ workerSpy.mockRestore();
442
+ throw error;
443
+ });
444
+ });
445
+
446
+ it('renders Employee Ref headers and cells for the example configuration', function () {
447
+ var wait = function wait(ms) {
448
+ return new Promise(function (resolve) {
449
+ return setTimeout(resolve, ms);
450
+ });
451
+ };
452
+ var actAsync = function actAsync(callback) {
453
+ return new Promise(function (resolve, reject) {
454
+ return (0, _react.act)(callback).then(resolve, reject);
455
+ });
456
+ };
457
+ var appRows = ['Full Name Local', 'Full Name English', 'Gender', 'Joining Date', 'Last Working Date', 'Seniority Date', 'Contract Type', 'Location Name', 'Job Position Name', 'Cost Center Code', 'Cost Center Name', 'Organization Element Name', 'Nationality', 'Bank Account Number', 'Bank Name', 'Bank Account Holder Name', 'First Name Local', 'First Name English', 'Date Of Birth', 'Passport No.', 'Martial Status', 'Tax Code', 'Social Security No.', 'Pension Fund No'];
458
+ var appConfig = {
459
+ rows: appRows,
460
+ cols: ['Employee Ref'],
461
+ aggregations: [{ key: 'count', aggregatorName: 'Count', vals: [] }]
462
+ };
463
+ var fullPivot = (0, _pivotCompute.computePivotState)((0, _pivotCompute.materializeData)(_tips2.default, {}), appConfig);
464
+ expect((0, _pivotCompute.alignSparseColumnsToRows)(fullPivot)).toBe(true);
465
+ var summary = (0, _pivotCompute.createVirtualPivotSummary)(fullPivot, false);
466
+ summary.viewportKey = 43;
467
+ var workerSpy = jest.spyOn(PivotDataWorker, 'computePivotViewportInWorker').mockImplementation(function (viewportKey, start, end, columnMode, columnStart, columnEnd) {
468
+ return Promise.resolve((0, _pivotCompute.computePivotViewport)(fullPivot, start, end, columnMode, columnStart, columnEnd));
469
+ });
470
+
471
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, appConfig, {
472
+ data: [],
473
+ precomputedData: summary,
474
+ virtualizeRows: true
475
+ })));
476
+
477
+ return actAsync(function () {
478
+ return wait(50);
479
+ }).then(function () {
480
+ var headers = Array.from(mounted.node.querySelectorAll('.pvtTable thead .pvtColLabel')).map(function (cell) {
481
+ return cell.textContent.trim();
482
+ });
483
+ var values = Array.from(mounted.node.querySelectorAll('.pvtTable tbody .pvtVal')).map(function (cell) {
484
+ return cell.textContent.trim();
485
+ });
486
+ expect(headers.length).toBeGreaterThan(0);
487
+ expect(headers[0]).toMatch(/-F$/);
488
+ expect(values).toContain('1');
489
+ var firstHeader = headers[0];
490
+ var table = mounted.node.querySelector('.pvtTable');
491
+ var body = table.querySelector('tbody');
492
+ var firstColumn = table.querySelector('thead .pvtColLabel');
493
+ table.getBoundingClientRect = function () {
494
+ return { top: 0, left: -5000 };
495
+ };
496
+ body.getBoundingClientRect = function () {
497
+ return { top: 0, left: -5000 };
498
+ };
499
+ firstColumn.getBoundingClientRect = function () {
500
+ return {
501
+ top: 0,
502
+ left: -1885,
503
+ width: 100
504
+ };
505
+ };
506
+ (0, _react.act)(function () {
507
+ return window.dispatchEvent(new Event('scroll'));
508
+ });
509
+ return actAsync(function () {
510
+ return wait(600);
511
+ }).then(function () {
512
+ var scrolledHeaders = Array.from(mounted.node.querySelectorAll('.pvtTable thead .pvtColLabel')).map(function (cell) {
513
+ return cell.textContent.trim();
514
+ });
515
+ expect(scrolledHeaders[0]).toBe(firstHeader);
516
+ workerSpy.mockRestore();
517
+ });
518
+ }).catch(function (error) {
519
+ workerSpy.mockRestore();
520
+ throw error;
521
+ });
522
+ });
523
+
524
+ it('can render every row for a full export from a virtual table', function () {
525
+ var manyRecords = Array.from({ length: 301 }, function (_, index) {
526
+ return {
527
+ name: 'Employee ' + index
528
+ };
529
+ });
530
+ var fullPrecomputedData = (0, _pivotCompute.computePivotState)((0, _pivotCompute.materializeData)(manyRecords, {}), (0, _pivotCompute.createWorkerConfig)(baseProps));
531
+ var precomputedData = (0, _pivotCompute.createVirtualPivotSummary)(fullPrecomputedData, false);
532
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, {
533
+ data: manyRecords,
534
+ precomputedData: precomputedData,
535
+ virtualizeRows: true
536
+ })));
537
+
538
+ var table = mounted.node.querySelector('.pvtTable');
539
+ var pivotProps = (0, _TableRenderers.getPivotTableProps)(table);
540
+ expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(301);
541
+ var html = renderToStaticMarkup(_react2.default.createElement(_PivotTable2.default, Object.assign({}, pivotProps, { virtualizeRows: false })));
542
+ var exportedTable = new DOMParser().parseFromString(html, 'text/html').querySelector('.pvtTable');
543
+ expect(exportedTable.querySelectorAll('tbody .pvtDataRow')).toHaveLength(301);
544
+ });
545
+
546
+ it('shows loading until the worker returns the requested row window', function () {
547
+ var wait = function wait(ms) {
548
+ return new Promise(function (resolve) {
549
+ return setTimeout(resolve, ms);
550
+ });
551
+ };
552
+ var actAsync = function actAsync(callback) {
553
+ return new Promise(function (resolve, reject) {
554
+ return (0, _react.act)(callback).then(resolve, reject);
555
+ });
556
+ };
557
+ var manyRecords = Array.from({ length: 301 }, function (_, index) {
558
+ return {
559
+ name: 'Employee ' + index
560
+ };
561
+ });
562
+ var fullPrecomputedData = (0, _pivotCompute.computePivotState)((0, _pivotCompute.materializeData)(manyRecords, {}), (0, _pivotCompute.createWorkerConfig)(baseProps));
563
+ var precomputedData = (0, _pivotCompute.createVirtualPivotSummary)(fullPrecomputedData, false);
564
+ precomputedData.viewportKey = 42;
565
+ var resolveWindows = [];
566
+ var workerSpy = jest.spyOn(PivotDataWorker, 'computePivotViewportInWorker').mockImplementation(function () {
567
+ return new Promise(function (resolve) {
568
+ resolveWindows.push(resolve);
569
+ });
570
+ });
571
+
572
+ mounted = mount(_react2.default.createElement(_PivotTable2.default, Object.assign({}, baseProps, {
573
+ data: [],
574
+ precomputedData: precomputedData,
575
+ virtualizeRows: true
576
+ })));
577
+ expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();
578
+
579
+ return actAsync(function () {
580
+ return wait(30);
581
+ }).then(function () {
582
+ expect(workerSpy).toHaveBeenCalledTimes(1);
583
+ var body = mounted.node.querySelector('.pvtTable tbody');
584
+ body.getBoundingClientRect = function () {
585
+ return { top: -3200 };
586
+ };
587
+ (0, _react.act)(function () {
588
+ return window.dispatchEvent(new Event('scroll'));
589
+ });
590
+ expect(mounted.node.querySelector('.pvtVirtualScrollOverlay .pvtLoadingText').textContent).toBe('Processing');
591
+ return actAsync(function () {
592
+ return wait(550);
593
+ });
594
+ }).then(function () {
595
+ expect(workerSpy).toHaveBeenCalledTimes(2);
596
+ expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();
597
+
598
+ var _workerSpy$mock$calls = _slicedToArray(workerSpy.mock.calls[0], 3),
599
+ start = _workerSpy$mock$calls[1],
600
+ end = _workerSpy$mock$calls[2];
601
+
602
+ return actAsync(function () {
603
+ resolveWindows[0]((0, _pivotCompute.computePivotViewport)(fullPrecomputedData, start, end, false));
604
+ return wait(0);
605
+ });
606
+ }).then(function () {
607
+ expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();
608
+
609
+ var _workerSpy$mock$calls2 = _slicedToArray(workerSpy.mock.calls[1], 3),
610
+ start = _workerSpy$mock$calls2[1],
611
+ end = _workerSpy$mock$calls2[2];
612
+
613
+ return actAsync(function () {
614
+ resolveWindows[1]((0, _pivotCompute.computePivotViewport)(fullPrecomputedData, start, end, false));
615
+ return wait(0);
616
+ });
617
+ }).then(function () {
618
+ expect(mounted.node.querySelector('.pvtVirtualLoading')).toBeNull();
619
+ expect(mounted.node.querySelectorAll('.pvtTable tbody .pvtDataRow').length).toBeGreaterThan(0);
620
+ workerSpy.mockRestore();
621
+ }).catch(function (error) {
622
+ workerSpy.mockRestore();
623
+ throw error;
624
+ });
625
+ });
177
626
  });
178
627
  //# sourceMappingURL=TableRenderers-showNumericalOrder-test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/__tests__/TableRenderers-showNumericalOrder-test.js"],"names":["global","IS_REACT_ACT_ENVIRONMENT","records","name","gender","colour","trials","baseProps","data","rows","cols","aggregatorName","vals","rendererName","mount","node","document","createElement","body","appendChild","root","render","element","unmount","remove","numberTexts","selector","Array","from","querySelectorAll","map","cell","textContent","trim","numberHeaders","numberCells","describe","mounted","afterEach","it","React","PivotTable","expect","querySelector","toBeNull","not","toContain","Object","assign","showNumericalOrder","headers","toEqual","cells","headerCells","classList","contains","toBe","firstBodyRow","bodyCells","totalLabel","getAttribute","header","rowGroupConfig","label","match","wait","Promise","setTimeout","resolve","ms","actAsync","reject","callback","then","PivotTableUI"],"mappings":"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","file":"TableRenderers-showNumericalOrder-test.js","sourcesContent":["import React, {act} from 'react';\nimport {createRoot} from 'react-dom/client';\nimport PivotTable from '../PivotTable';\nimport PivotTableUI from '../PivotTableUI';\n\n/* eslint-disable no-magic-numbers */\n\n// React 19 needs to be told that this environment supports `act`.\nglobal.IS_REACT_ACT_ENVIRONMENT = true;\n\n// `showNumericalOrder` adds a \"No.\" column in front of the row attributes so\n// every data row is prefixed with its 1-based index.\nconst records = [\n {name: 'Nick', gender: 'male', colour: 'blue', trials: 103},\n {name: 'Jane', gender: 'female', colour: 'red', trials: 95},\n {name: 'John', gender: 'male', colour: 'blue', trials: 112},\n {name: 'Carol', gender: 'female', colour: 'yellow', trials: 102},\n];\n\nconst baseProps = {\n data: records,\n rows: ['name'],\n cols: [],\n aggregatorName: 'Count',\n vals: [],\n rendererName: 'Table',\n};\n\nconst mount = element => {\n const node = document.createElement('div');\n document.body.appendChild(node);\n const root = createRoot(node);\n act(() => {\n root.render(element);\n });\n return {node, root};\n};\n\nconst unmount = ({node, root}) => {\n act(() => {\n root.unmount();\n });\n node.remove();\n};\n\n// Both helpers are scoped to `.pvtTable`: PivotTableUI wraps the pivot table\n// in its own `.pvtUi` layout table, so an unscoped `tbody ...` selector would\n// also match header cells through that outer table.\nconst numberTexts = (node, selector) =>\n Array.from(node.querySelectorAll(`.pvtTable ${selector}`)).map(cell =>\n cell.textContent.trim()\n );\n\nconst numberHeaders = node => numberTexts(node, 'thead .pvtRowNumber');\nconst numberCells = node => numberTexts(node, 'tbody .pvtRowNumber');\n\ndescribe('Table renderer showNumericalOrder', function() {\n let mounted;\n\n afterEach(function() {\n if (mounted) {\n unmount(mounted);\n mounted = null;\n }\n });\n\n it('renders no \"No.\" column by default', function() {\n mounted = mount(React.createElement(PivotTable, baseProps));\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n expect(mounted.node.querySelector('.pvtTable').textContent).not.toContain(\n 'No.'\n );\n });\n\n it('renders no \"No.\" column when showNumericalOrder is false', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: false})\n )\n );\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n });\n\n it('numbers every data row from 1 with a \"No.\" header', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headers = numberHeaders(mounted.node);\n expect(headers).toEqual(['No.']);\n\n const cells = numberCells(mounted.node);\n expect(cells).toEqual(['1', '2', '3', '4']);\n });\n\n it('keeps the \"No.\" column in front of the row attribute column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headerCells = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead tr:last-child th')\n );\n expect(headerCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(headerCells[1].textContent).toContain('name');\n\n const firstBodyRow = mounted.node.querySelector('.pvtTable tbody tr');\n const bodyCells = Array.from(firstBodyRow.querySelectorAll('th,td'));\n expect(bodyCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(bodyCells[1].classList.contains('pvtRowLabel')).toBe(true);\n });\n\n it('extends the totals label over the \"No.\" column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('2');\n });\n\n it('spans the \"No.\" header across the column-attribute header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n cols: ['gender'],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.textContent.trim()).toBe('No.');\n expect(header.getAttribute('rowspan')).toBe('2');\n\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n\n // Totals now covers \"No.\" + the row attribute + the column axis column.\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('3');\n });\n\n it('spans the \"No.\" header across row group header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n rows: ['name', 'gender'],\n rowGroupConfig: [{label: 'GRP', match: ['name']}],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.getAttribute('rowspan')).toBe('2');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n\n it('passes showNumericalOrder through PivotTableUI', function() {\n // PivotTableUI computes asynchronously (worker / deferred main thread\n // computation, WORKER_DEBOUNCE_MS = 100ms), so the numbered rows only show\n // up after those timers ran.\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n\n mounted = mount(\n React.createElement(\n PivotTableUI,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n return actAsync(() => wait(300)).then(() => {\n expect(\n mounted.node.querySelector('.pvtTable thead .pvtRowNumber').textContent\n ).toBe('No.');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n });\n});\n"]}
1
+ {"version":3,"sources":["../../src/__tests__/TableRenderers-showNumericalOrder-test.js"],"names":["PivotDataWorker","global","IS_REACT_ACT_ENVIRONMENT","queueMicrotask","Promise","resolve","then","callback","require","renderToStaticMarkup","records","name","gender","colour","trials","baseProps","data","rows","cols","aggregatorName","vals","rendererName","mount","node","document","createElement","body","appendChild","root","render","element","unmount","remove","numberTexts","selector","Array","from","querySelectorAll","map","cell","textContent","trim","numberHeaders","numberCells","describe","mounted","afterEach","it","React","PivotTable","expect","querySelector","toBeNull","not","toContain","Object","assign","showNumericalOrder","headers","toEqual","cells","headerCells","classList","contains","toBe","firstBodyRow","bodyCells","totalLabel","getAttribute","header","rowGroupConfig","label","match","wait","setTimeout","ms","actAsync","reject","PivotTableUI","manyRecords","length","_","index","String","padStart","previousAnimationFrame","requestAnimationFrame","pendingFrame","jest","useFakeTimers","virtualizeRows","table","toBeLessThan","getBoundingClientRect","top","window","dispatchEvent","Event","runTimersToTime","useRealTimers","fullPrecomputedData","precomputedData","viewportKey","layoutReads","wideRecords","employee","initialLabels","left","scrolledLabels","some","rowLabel","aggregation","key","rowConfig","aggregations","columnConfig","materialized","rowPivot","columnPivot","rowSummary","columnSummary","workerSpy","spyOn","mockImplementation","start","end","columnMode","columnStart","columnEnd","values","toBeGreaterThan","mockRestore","catch","error","appRows","appConfig","fullPivot","tips","summary","toMatch","firstHeader","firstColumn","width","scrolledHeaders","pivotProps","html","exportedTable","DOMParser","parseFromString","toHaveLength","resolveWindows","push","toHaveBeenCalledTimes","mock","calls"],"mappings":"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","file":"TableRenderers-showNumericalOrder-test.js","sourcesContent":["import React, {act} from 'react';\nimport {createRoot} from 'react-dom/client';\nimport tips from '../../examples/tips';\nimport PivotTable from '../PivotTable';\nimport PivotTableUI from '../PivotTableUI';\nimport {getPivotTableProps} from '../TableRenderers';\nimport * as PivotDataWorker from '../PivotDataWorker';\nimport {\n alignSparseColumnsToRows,\n computePivotState,\n computePivotViewport,\n createVirtualPivotSummary,\n createWorkerConfig,\n materializeData,\n} from '../pivotCompute';\n\n/* eslint-disable no-magic-numbers */\n\n// React 19 needs to be told that this environment supports `act`.\nglobal.IS_REACT_ACT_ENVIRONMENT = true;\nglobal.queueMicrotask = callback => Promise.resolve().then(callback);\nconst {renderToStaticMarkup} = require('react-dom/server');\n\n// `showNumericalOrder` adds a \"No.\" column in front of the row attributes so\n// every data row is prefixed with its 1-based index.\nconst records = [\n {name: 'Nick', gender: 'male', colour: 'blue', trials: 103},\n {name: 'Jane', gender: 'female', colour: 'red', trials: 95},\n {name: 'John', gender: 'male', colour: 'blue', trials: 112},\n {name: 'Carol', gender: 'female', colour: 'yellow', trials: 102},\n];\n\nconst baseProps = {\n data: records,\n rows: ['name'],\n cols: [],\n aggregatorName: 'Count',\n vals: [],\n rendererName: 'Table',\n};\n\nconst mount = element => {\n const node = document.createElement('div');\n document.body.appendChild(node);\n const root = createRoot(node);\n act(() => {\n root.render(element);\n });\n return {node, root};\n};\n\nconst unmount = ({node, root}) => {\n act(() => {\n root.unmount();\n });\n node.remove();\n};\n\n// Both helpers are scoped to `.pvtTable`: PivotTableUI wraps the pivot table\n// in its own `.pvtUi` layout table, so an unscoped `tbody ...` selector would\n// also match header cells through that outer table.\nconst numberTexts = (node, selector) =>\n Array.from(node.querySelectorAll(`.pvtTable ${selector}`)).map(cell =>\n cell.textContent.trim()\n );\n\nconst numberHeaders = node => numberTexts(node, 'thead .pvtRowNumber');\nconst numberCells = node => numberTexts(node, 'tbody .pvtRowNumber');\n\ndescribe('Table renderer showNumericalOrder', function() {\n let mounted;\n\n afterEach(function() {\n if (mounted) {\n unmount(mounted);\n mounted = null;\n }\n });\n\n it('renders no \"No.\" column by default', function() {\n mounted = mount(React.createElement(PivotTable, baseProps));\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n expect(mounted.node.querySelector('.pvtTable').textContent).not.toContain(\n 'No.'\n );\n });\n\n it('renders no \"No.\" column when showNumericalOrder is false', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: false})\n )\n );\n expect(mounted.node.querySelector('.pvtRowNumber')).toBeNull();\n });\n\n it('numbers every data row from 1 with a \"No.\" header', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headers = numberHeaders(mounted.node);\n expect(headers).toEqual(['No.']);\n\n const cells = numberCells(mounted.node);\n expect(cells).toEqual(['1', '2', '3', '4']);\n });\n\n it('keeps the \"No.\" column in front of the row attribute column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const headerCells = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead tr:last-child th')\n );\n expect(headerCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(headerCells[1].textContent).toContain('name');\n\n const firstBodyRow = mounted.node.querySelector('.pvtTable tbody tr');\n const bodyCells = Array.from(firstBodyRow.querySelectorAll('th,td'));\n expect(bodyCells[0].classList.contains('pvtRowNumber')).toBe(true);\n expect(bodyCells[1].classList.contains('pvtRowLabel')).toBe(true);\n });\n\n it('extends the totals label over the \"No.\" column', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('2');\n });\n\n it('spans the \"No.\" header across the column-attribute header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n cols: ['gender'],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.textContent.trim()).toBe('No.');\n expect(header.getAttribute('rowspan')).toBe('2');\n\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n\n // Totals now covers \"No.\" + the row attribute + the column axis column.\n const totalLabel = mounted.node.querySelector(\n '.pvtTable tbody .pvtTotalLabel'\n );\n expect(totalLabel.getAttribute('colspan')).toBe('3');\n });\n\n it('spans the \"No.\" header across row group header rows', function() {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n rows: ['name', 'gender'],\n rowGroupConfig: [{label: 'GRP', match: ['name']}],\n showNumericalOrder: true,\n })\n )\n );\n\n const header = mounted.node.querySelector('.pvtTable thead .pvtRowNumber');\n expect(header.getAttribute('rowspan')).toBe('2');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n\n it('passes showNumericalOrder through PivotTableUI', function() {\n // PivotTableUI computes asynchronously (worker / deferred main thread\n // computation, WORKER_DEBOUNCE_MS = 100ms), so the numbered rows only show\n // up after those timers ran.\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n\n mounted = mount(\n React.createElement(\n PivotTableUI,\n Object.assign({}, baseProps, {showNumericalOrder: true})\n )\n );\n\n return actAsync(() => wait(300)).then(() => {\n expect(\n mounted.node.querySelector('.pvtTable thead .pvtRowNumber').textContent\n ).toBe('No.');\n expect(numberCells(mounted.node)).toEqual(['1', '2', '3', '4']);\n });\n });\n\n it('renders only visible rows and updates them while scrolling', function() {\n const manyRecords = Array.from({length: 1000}, (_, index) => ({\n name: `Employee ${String(index).padStart(4, '0')}`,\n }));\n const previousAnimationFrame = global.requestAnimationFrame;\n let pendingFrame;\n global.requestAnimationFrame = callback => {\n pendingFrame = callback;\n return 1;\n };\n jest.useFakeTimers();\n try {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: manyRecords,\n showNumericalOrder: true,\n virtualizeRows: true,\n })\n )\n );\n\n const table = mounted.node.querySelector('.pvtTable');\n expect(table.getAttribute('data-pvt-virtualized')).toBe('true');\n expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(\n 150\n );\n expect(numberCells(mounted.node)[0]).toBe('1');\n\n const body = table.querySelector('tbody');\n body.getBoundingClientRect = () => ({top: -3200});\n act(() => {\n window.dispatchEvent(new Event('scroll'));\n if (pendingFrame) {\n pendingFrame();\n }\n });\n expect(numberCells(mounted.node)[0]).toBe('1');\n expect(\n mounted.node.querySelector('.pvtVirtualScrollOverlay .pvtLoadingText')\n .textContent\n ).toBe('Processing');\n act(() => jest.runTimersToTime(499));\n expect(numberCells(mounted.node)[0]).toBe('1');\n act(() => jest.runTimersToTime(1));\n expect(numberCells(mounted.node)[0]).toBe('65');\n expect(mounted.node.querySelector('.pvtVirtualScrollOverlay')).toBeNull();\n expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(\n 150\n );\n } finally {\n global.requestAnimationFrame = previousAnimationFrame;\n jest.useRealTimers();\n }\n });\n\n it('does not update synchronously again when layout shifts during a fast scroll', function() {\n const manyRecords = Array.from({length: 1000}, (_, index) => ({\n name: `Employee ${index}`,\n }));\n const fullPrecomputedData = computePivotState(\n materializeData(manyRecords, {}),\n createWorkerConfig(baseProps)\n );\n const precomputedData = createVirtualPivotSummary(\n fullPrecomputedData,\n false\n );\n precomputedData.viewportKey = 42;\n let layoutReads = 0;\n const previousAnimationFrame = global.requestAnimationFrame;\n let pendingFrame;\n global.requestAnimationFrame = callback => {\n pendingFrame = callback;\n return 1;\n };\n jest.useFakeTimers();\n try {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: [],\n precomputedData,\n virtualizeRows: true,\n })\n )\n );\n\n const body = mounted.node.querySelector('.pvtTable tbody');\n body.getBoundingClientRect = () => ({\n top: layoutReads++ % 2 === 0 ? -3200 : -6400,\n });\n act(() => {\n window.dispatchEvent(new Event('scroll'));\n if (pendingFrame) {\n pendingFrame();\n }\n });\n expect(layoutReads).toBe(0);\n act(() => jest.runTimersToTime(250));\n act(() => {\n window.dispatchEvent(new Event('scroll'));\n });\n act(() => jest.runTimersToTime(499));\n expect(layoutReads).toBe(0);\n act(() => jest.runTimersToTime(1));\n expect(layoutReads).toBe(1);\n act(() => window.dispatchEvent(new Event('scroll')));\n act(() => jest.runTimersToTime(500));\n expect(layoutReads).toBe(2);\n } finally {\n global.requestAnimationFrame = previousAnimationFrame;\n jest.useRealTimers();\n }\n });\n\n it('renders only the visible columns and updates them after horizontal scrolling', function() {\n const wideRecords = Array.from({length: 200}, (_, index) => ({\n employee: `Employee ${String(index).padStart(3, '0')}`,\n gender: index % 2 === 0 ? 'female' : 'male',\n }));\n jest.useFakeTimers();\n try {\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: wideRecords,\n rows: ['gender'],\n cols: ['employee'],\n virtualizeRows: true,\n })\n )\n );\n\n const table = mounted.node.querySelector('.pvtTable');\n const initialLabels = Array.from(\n table.querySelectorAll('thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n expect(table.classList.contains('pvtVirtualColumns')).toBe(true);\n expect(initialLabels).toContain('Employee 000');\n expect(initialLabels).not.toContain('Employee 150');\n expect(table.querySelectorAll('tbody .pvtVal').length).toBeLessThan(100);\n\n const body = table.querySelector('tbody');\n body.getBoundingClientRect = () => ({top: 0, left: -16000});\n act(() => window.dispatchEvent(new Event('scroll')));\n act(() => jest.runTimersToTime(500));\n\n const scrolledLabels = Array.from(\n table.querySelectorAll('thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n expect(scrolledLabels).not.toContain('Employee 000');\n expect(scrolledLabels.some(label => label >= 'Employee 128')).toBe(true);\n expect(table.querySelectorAll('tbody .pvtVal').length).toBeLessThan(100);\n } finally {\n jest.useRealTimers();\n }\n });\n\n it('renders values after moving a high-cardinality field from rows to columns', function() {\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n const manyRecords = Array.from({length: 400}, (_, index) => ({\n employee: `Employee ${String(index).padStart(3, '0')}`,\n rowLabel: `Row ${String(399 - index).padStart(3, '0')}`,\n }));\n const aggregation = [{key: 'count', aggregatorName: 'Count', vals: []}];\n const rowConfig = {\n rows: ['employee'],\n cols: [],\n aggregations: aggregation,\n };\n const columnConfig = {\n rows: ['rowLabel'],\n cols: ['employee'],\n aggregations: aggregation,\n };\n const materialized = materializeData(manyRecords, {});\n const rowPivot = computePivotState(materialized, rowConfig);\n const columnPivot = computePivotState(materialized, columnConfig);\n expect(alignSparseColumnsToRows(columnPivot)).toBe(true);\n const rowSummary = createVirtualPivotSummary(rowPivot, false);\n const columnSummary = createVirtualPivotSummary(columnPivot, false);\n rowSummary.viewportKey = 41;\n columnSummary.viewportKey = 42;\n const workerSpy = jest\n .spyOn(PivotDataWorker, 'computePivotViewportInWorker')\n .mockImplementation(\n (viewportKey, start, end, columnMode, columnStart, columnEnd) =>\n Promise.resolve(\n computePivotViewport(\n viewportKey === 41 ? rowPivot : columnPivot,\n start,\n end,\n columnMode,\n columnStart,\n columnEnd\n )\n )\n );\n\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, rowConfig, {\n data: [],\n precomputedData: rowSummary,\n virtualizeRows: true,\n })\n )\n );\n\n return actAsync(() => wait(30))\n .then(() => {\n act(() => {\n // A layout-induced scroll can still be pending when the new worker\n // result replaces the previous axis configuration. The new viewport\n // must reset immediately instead of retaining an empty 0..0 column\n // window until the scroll debounce expires.\n window.dispatchEvent(new Event('scroll'));\n mounted.root.render(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, columnConfig, {\n data: [],\n precomputedData: columnSummary,\n virtualizeRows: true,\n })\n )\n );\n });\n return actAsync(() => wait(50));\n })\n .then(() => {\n const values = Array.from(\n mounted.node.querySelectorAll('.pvtTable tbody .pvtVal')\n ).map(cell => cell.textContent.trim());\n expect(values.length).toBeGreaterThan(0);\n expect(values).toContain('1');\n expect(mounted.node.querySelector('.pvtVirtualLoading')).toBeNull();\n workerSpy.mockRestore();\n })\n .catch(error => {\n workerSpy.mockRestore();\n throw error;\n });\n });\n\n it('renders Employee Ref headers and cells for the example configuration', function() {\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n const appRows = [\n 'Full Name Local',\n 'Full Name English',\n 'Gender',\n 'Joining Date',\n 'Last Working Date',\n 'Seniority Date',\n 'Contract Type',\n 'Location Name',\n 'Job Position Name',\n 'Cost Center Code',\n 'Cost Center Name',\n 'Organization Element Name',\n 'Nationality',\n 'Bank Account Number',\n 'Bank Name',\n 'Bank Account Holder Name',\n 'First Name Local',\n 'First Name English',\n 'Date Of Birth',\n 'Passport No.',\n 'Martial Status',\n 'Tax Code',\n 'Social Security No.',\n 'Pension Fund No',\n ];\n const appConfig = {\n rows: appRows,\n cols: ['Employee Ref'],\n aggregations: [{key: 'count', aggregatorName: 'Count', vals: []}],\n };\n const fullPivot = computePivotState(materializeData(tips, {}), appConfig);\n expect(alignSparseColumnsToRows(fullPivot)).toBe(true);\n const summary = createVirtualPivotSummary(fullPivot, false);\n summary.viewportKey = 43;\n const workerSpy = jest\n .spyOn(PivotDataWorker, 'computePivotViewportInWorker')\n .mockImplementation(\n (viewportKey, start, end, columnMode, columnStart, columnEnd) =>\n Promise.resolve(\n computePivotViewport(\n fullPivot,\n start,\n end,\n columnMode,\n columnStart,\n columnEnd\n )\n )\n );\n\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, appConfig, {\n data: [],\n precomputedData: summary,\n virtualizeRows: true,\n })\n )\n );\n\n return actAsync(() => wait(50))\n .then(() => {\n const headers = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n const values = Array.from(\n mounted.node.querySelectorAll('.pvtTable tbody .pvtVal')\n ).map(cell => cell.textContent.trim());\n expect(headers.length).toBeGreaterThan(0);\n expect(headers[0]).toMatch(/-F$/);\n expect(values).toContain('1');\n const firstHeader = headers[0];\n const table = mounted.node.querySelector('.pvtTable');\n const body = table.querySelector('tbody');\n const firstColumn = table.querySelector('thead .pvtColLabel');\n table.getBoundingClientRect = () => ({top: 0, left: -5000});\n body.getBoundingClientRect = () => ({top: 0, left: -5000});\n firstColumn.getBoundingClientRect = () => ({\n top: 0,\n left: -1885,\n width: 100,\n });\n act(() => window.dispatchEvent(new Event('scroll')));\n return actAsync(() => wait(600)).then(() => {\n const scrolledHeaders = Array.from(\n mounted.node.querySelectorAll('.pvtTable thead .pvtColLabel')\n ).map(cell => cell.textContent.trim());\n expect(scrolledHeaders[0]).toBe(firstHeader);\n workerSpy.mockRestore();\n });\n })\n .catch(error => {\n workerSpy.mockRestore();\n throw error;\n });\n });\n\n it('can render every row for a full export from a virtual table', function() {\n const manyRecords = Array.from({length: 301}, (_, index) => ({\n name: `Employee ${index}`,\n }));\n const fullPrecomputedData = computePivotState(\n materializeData(manyRecords, {}),\n createWorkerConfig(baseProps)\n );\n const precomputedData = createVirtualPivotSummary(\n fullPrecomputedData,\n false\n );\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: manyRecords,\n precomputedData,\n virtualizeRows: true,\n })\n )\n );\n\n const table = mounted.node.querySelector('.pvtTable');\n const pivotProps = getPivotTableProps(table);\n expect(table.querySelectorAll('tbody .pvtDataRow').length).toBeLessThan(\n 301\n );\n const html = renderToStaticMarkup(\n React.createElement(\n PivotTable,\n Object.assign({}, pivotProps, {virtualizeRows: false})\n )\n );\n const exportedTable = new DOMParser()\n .parseFromString(html, 'text/html')\n .querySelector('.pvtTable');\n expect(exportedTable.querySelectorAll('tbody .pvtDataRow')).toHaveLength(\n 301\n );\n });\n\n it('shows loading until the worker returns the requested row window', function() {\n const wait = ms => new Promise(resolve => setTimeout(resolve, ms));\n const actAsync = callback =>\n new Promise((resolve, reject) => act(callback).then(resolve, reject));\n const manyRecords = Array.from({length: 301}, (_, index) => ({\n name: `Employee ${index}`,\n }));\n const fullPrecomputedData = computePivotState(\n materializeData(manyRecords, {}),\n createWorkerConfig(baseProps)\n );\n const precomputedData = createVirtualPivotSummary(\n fullPrecomputedData,\n false\n );\n precomputedData.viewportKey = 42;\n const resolveWindows = [];\n const workerSpy = jest\n .spyOn(PivotDataWorker, 'computePivotViewportInWorker')\n .mockImplementation(\n () =>\n new Promise(resolve => {\n resolveWindows.push(resolve);\n })\n );\n\n mounted = mount(\n React.createElement(\n PivotTable,\n Object.assign({}, baseProps, {\n data: [],\n precomputedData,\n virtualizeRows: true,\n })\n )\n );\n expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();\n\n return actAsync(() => wait(30))\n .then(() => {\n expect(workerSpy).toHaveBeenCalledTimes(1);\n const body = mounted.node.querySelector('.pvtTable tbody');\n body.getBoundingClientRect = () => ({top: -3200});\n act(() => window.dispatchEvent(new Event('scroll')));\n expect(\n mounted.node.querySelector('.pvtVirtualScrollOverlay .pvtLoadingText')\n .textContent\n ).toBe('Processing');\n return actAsync(() => wait(550));\n })\n .then(() => {\n expect(workerSpy).toHaveBeenCalledTimes(2);\n expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();\n const [, start, end] = workerSpy.mock.calls[0];\n return actAsync(() => {\n resolveWindows[0](\n computePivotViewport(fullPrecomputedData, start, end, false)\n );\n return wait(0);\n });\n })\n .then(() => {\n expect(mounted.node.querySelector('.pvtVirtualLoading')).not.toBeNull();\n const [, start, end] = workerSpy.mock.calls[1];\n return actAsync(() => {\n resolveWindows[1](\n computePivotViewport(fullPrecomputedData, start, end, false)\n );\n return wait(0);\n });\n })\n .then(() => {\n expect(mounted.node.querySelector('.pvtVirtualLoading')).toBeNull();\n expect(\n mounted.node.querySelectorAll('.pvtTable tbody .pvtDataRow').length\n ).toBeGreaterThan(0);\n workerSpy.mockRestore();\n })\n .catch(error => {\n workerSpy.mockRestore();\n throw error;\n });\n });\n});\n"]}