@infinite-table/infinite-react 7.4.1 → 7.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.dev.mjs CHANGED
@@ -1328,6 +1328,13 @@ var toUpperFirst = (s) => {
1328
1328
  return s ? s.substr(0, 1).toUpperCase() + s.substr(1) : s;
1329
1329
  };
1330
1330
 
1331
+ // src/components/InfiniteTable/types/Utility.ts
1332
+ function notNullable(value) {
1333
+ if (value === null || value === void 0) return false;
1334
+ const testDummyForCompileError = value;
1335
+ return true;
1336
+ }
1337
+
1331
1338
  // src/components/utils/isControlledValue.ts
1332
1339
  function isControlledValue(value) {
1333
1340
  const controlled = value !== void 0;
@@ -1401,6 +1408,164 @@ var usePrevious = (value, initialValue) => {
1401
1408
  return ref.current;
1402
1409
  };
1403
1410
 
1411
+ // src/utils/devTools/devToolsTracks.ts
1412
+ var DevToolsTracks = {
1413
+ DataSource: {
1414
+ track: "DataSource",
1415
+ labels: {
1416
+ RemoteDataLoad: "Remote data load",
1417
+ TreeUnfilteredTreePaths: "Computing unfiltered tree paths",
1418
+ Filter: "Filter",
1419
+ Sort: "Sort",
1420
+ Group: "Group",
1421
+ LazyGroup: "Lazy group",
1422
+ Tree: "Tree",
1423
+ FlattenTree: "Flatten tree",
1424
+ Flatten: "Flatten groups",
1425
+ PrepareData: "Preparing data",
1426
+ ComputeSelectionCount: "Computing selection count",
1427
+ ComputeSelectionCountLazy: "Computing selection count (lazy)",
1428
+ PrepareRowInfo: "Preparing row info array"
1429
+ }
1430
+ },
1431
+ InfiniteTable: {
1432
+ track: "InfiniteTable",
1433
+ labels: {
1434
+ Render: "Rendering"
1435
+ }
1436
+ },
1437
+ MatrixBrain: {
1438
+ track: "Layout Computations",
1439
+ labels: {
1440
+ ComputeRenderRange: "Computing render range"
1441
+ }
1442
+ },
1443
+ ComponentState: {
1444
+ track: "ComponentState",
1445
+ labels: {
1446
+ PropUpdate: "Prop update"
1447
+ }
1448
+ }
1449
+ };
1450
+
1451
+ // src/utils/devTools/index.ts
1452
+ var DevToolsMarker = class _DevToolsMarker {
1453
+ constructor(debugId) {
1454
+ this.debugId = debugId;
1455
+ this.markerDetails = {
1456
+ label: "",
1457
+ track: "",
1458
+ trackGroup: void 0,
1459
+ color: void 0,
1460
+ details: [],
1461
+ tooltip: void 0
1462
+ };
1463
+ this.stopped = false;
1464
+ this.start = (startDetails) => {
1465
+ if (this.markerDetails.startTs) {
1466
+ return this;
1467
+ }
1468
+ const start = performance.now();
1469
+ this.markerDetails.details = startDetails?.details ?? [];
1470
+ this.markerDetails.startTs = start;
1471
+ return this;
1472
+ };
1473
+ this.end = (markerDetails = {}) => {
1474
+ if (this.stopped) {
1475
+ return this;
1476
+ }
1477
+ this.stopped = true;
1478
+ const start = markerDetails.startTs ?? this.markerDetails.startTs;
1479
+ const end = markerDetails.endTs ?? this.markerDetails.endTs ?? performance.now();
1480
+ const color = markerDetails.color || this.markerDetails.color || "primary";
1481
+ const trackGroup = markerDetails.trackGroup || this.markerDetails.trackGroup || `Infinite Table (${this.debugId})`;
1482
+ const details = [
1483
+ ...this.markerDetails.details || [],
1484
+ ...markerDetails.details || []
1485
+ ];
1486
+ const tooltip = markerDetails.tooltip || this.markerDetails.tooltip;
1487
+ const label = markerDetails.label || this.markerDetails.label || "Unknown";
1488
+ const track = markerDetails.track || this.markerDetails.track || "Unknown";
1489
+ performance.measure(label, {
1490
+ start,
1491
+ end,
1492
+ detail: {
1493
+ devtools: {
1494
+ dataType: "track-entry",
1495
+ trackGroup,
1496
+ track,
1497
+ color,
1498
+ properties: details.length > 0 ? details.map((detail) => [detail.name, detail.value]) : void 0,
1499
+ tooltipText: tooltip
1500
+ }
1501
+ }
1502
+ });
1503
+ return this;
1504
+ };
1505
+ this.debugId = debugId;
1506
+ }
1507
+ static create(debugId) {
1508
+ return new _DevToolsMarker(debugId);
1509
+ }
1510
+ get startTimestamp() {
1511
+ return this.markerDetails.startTs;
1512
+ }
1513
+ get track() {
1514
+ const self = this;
1515
+ return Object.keys(DevToolsTracks).reduce(
1516
+ (acc, track) => {
1517
+ const trackObj = {
1518
+ start: self.start,
1519
+ end: (markerDetails) => {
1520
+ return self.end({
1521
+ ...markerDetails,
1522
+ track: DevToolsTracks[track].track,
1523
+ label: markerDetails.label
1524
+ });
1525
+ },
1526
+ get label() {
1527
+ const currentTrack = DevToolsTracks[track];
1528
+ return Object.keys(currentTrack.labels).reduce(
1529
+ (labelAcc, label) => {
1530
+ const labelObj = {
1531
+ start: self.start,
1532
+ end: (markerDetails) => {
1533
+ return self.end({
1534
+ ...markerDetails,
1535
+ track: currentTrack.track,
1536
+ label: currentTrack.labels[label]
1537
+ });
1538
+ }
1539
+ };
1540
+ Object.defineProperty(labelAcc, label, {
1541
+ get: () => {
1542
+ self.markerDetails.label = currentTrack.labels[label];
1543
+ return labelObj;
1544
+ }
1545
+ });
1546
+ return labelAcc;
1547
+ },
1548
+ {}
1549
+ );
1550
+ }
1551
+ };
1552
+ Object.defineProperty(acc, track, {
1553
+ get: () => {
1554
+ const currentTrack = DevToolsTracks[track];
1555
+ self.markerDetails.track = currentTrack.track;
1556
+ return trackObj;
1557
+ }
1558
+ });
1559
+ return acc;
1560
+ },
1561
+ {}
1562
+ );
1563
+ }
1564
+ };
1565
+ function getMarker(debugId) {
1566
+ return DevToolsMarker.create(debugId);
1567
+ }
1568
+
1404
1569
  // src/components/hooks/useComponentState/index.tsx
1405
1570
  var notifyChange = (props, callbackPropName, values) => {
1406
1571
  const callbackProp = props[callbackPropName];
@@ -1657,9 +1822,10 @@ function buildManagedComponent(config) {
1657
1822
  }
1658
1823
  });
1659
1824
  if (updatedPropsToStateCount > 0 || newMappedStateCount > 0) {
1660
- const logger2 = config.debugName ? dbg(
1661
- typeof config.debugName === "function" ? `${config.debugName(currentProps)}:rerender` : `${config.debugName}:rerender`
1662
- ) : dbg("rerender");
1825
+ const debugId = state.debugId;
1826
+ const marker = debugId ? getMarker(debugId).track.ComponentState.label.PropUpdate.start() : void 0;
1827
+ const debugChannelName = config.debugName ? typeof config.debugName === "function" ? `${config.debugName(currentProps)}:rerender` : `${config.debugName}:rerender` : "rerender";
1828
+ const logger2 = dbg(debugChannelName);
1663
1829
  logger2(
1664
1830
  "Triggered by new values for the following props",
1665
1831
  ...[
@@ -1667,6 +1833,25 @@ function buildManagedComponent(config) {
1667
1833
  ...Object.keys(updatedPropsToState ?? {})
1668
1834
  ]
1669
1835
  );
1836
+ if (marker) {
1837
+ marker.end({
1838
+ label: debugChannelName,
1839
+ details: [
1840
+ newMappedStateCount > 0 ? {
1841
+ name: "Updated properties",
1842
+ value: Object.keys(newMappedState).join(", ")
1843
+ } : void 0,
1844
+ updatedPropsToStateCount > 0 ? {
1845
+ name: "Updated props",
1846
+ value: Object.keys(updatedPropsToState).join(", ")
1847
+ } : void 0,
1848
+ updatedPropsToStateCount > 0 || updatedPropsToState ? {
1849
+ name: "Details",
1850
+ value: "The time for this marker is not accurate. The marker is only displayed so you can easily identify the props that triggered the rerender."
1851
+ } : void 0
1852
+ ].filter(notNullable)
1853
+ });
1854
+ }
1670
1855
  const action = {
1671
1856
  payload: {
1672
1857
  mappedState: newMappedStateCount ? newMappedState : null,
@@ -8450,28 +8635,39 @@ import { useLayoutEffect as useLayoutEffect8, useMemo as useMemo6 } from "react"
8450
8635
  import * as React39 from "react";
8451
8636
  import { flushSync } from "react-dom";
8452
8637
  import { useLayoutEffect as useLayoutEffect7, useRef as useRef14, useState as useState12 } from "react";
8638
+ var SHOULD_FLUSH_SYNC = () => false;
8453
8639
  function AvoidReactDiffFn(props) {
8454
8640
  const [children, setChildren] = useState12(props.updater.get);
8455
8641
  const rafId = useRef14(null);
8642
+ const shouldFlushSync = props.shouldFlushSync ?? SHOULD_FLUSH_SYNC;
8456
8643
  useLayoutEffect7(() => {
8457
8644
  function onChange(children2) {
8645
+ let FLUSH_SYNC = shouldFlushSync();
8458
8646
  if (props.useraf) {
8459
8647
  if (rafId.current != null) {
8460
8648
  cancelAnimationFrame(rafId.current);
8461
8649
  }
8462
8650
  rafId.current = requestAnimationFrame(() => {
8651
+ if (FLUSH_SYNC) {
8652
+ queueMicrotask(() => {
8653
+ flushSync(() => {
8654
+ setChildren(children2);
8655
+ });
8656
+ });
8657
+ } else {
8658
+ setChildren(children2);
8659
+ }
8660
+ });
8661
+ } else {
8662
+ if (FLUSH_SYNC) {
8463
8663
  queueMicrotask(() => {
8464
8664
  flushSync(() => {
8465
8665
  setChildren(children2);
8466
8666
  });
8467
8667
  });
8468
- });
8469
- } else {
8470
- queueMicrotask(() => {
8471
- flushSync(() => {
8472
- setChildren(children2);
8473
- });
8474
- });
8668
+ } else {
8669
+ setChildren(children2);
8670
+ }
8475
8671
  }
8476
8672
  }
8477
8673
  const remove = props.updater.onChange(onChange);
@@ -8481,7 +8677,7 @@ function AvoidReactDiffFn(props) {
8481
8677
  }
8482
8678
  remove();
8483
8679
  };
8484
- }, [props.updater, props.useraf]);
8680
+ }, [props.updater, props.useraf, shouldFlushSync]);
8485
8681
  return children ?? null;
8486
8682
  }
8487
8683
  var AvoidReactDiff = React39.memo(AvoidReactDiffFn);
@@ -9810,14 +10006,26 @@ var GridCellForReact = class {
9810
10006
  constructor(debugId, cellInfo) {
9811
10007
  this.element = null;
9812
10008
  this.mounted = false;
10009
+ this.IS_UPDATED_WHILE_SCROLLING = false;
9813
10010
  this.mountSubscription = buildSubscriptionCallback();
10011
+ this.isUpdatedWhileScrolling = () => {
10012
+ return this.IS_UPDATED_WHILE_SCROLLING;
10013
+ };
9814
10014
  const count = CELL_COUNT_BY_DEBUG_ID.get(debugId) ?? 0;
9815
10015
  const key = `${debugId}:GridCellReact:${count}`;
9816
10016
  CELL_COUNT_BY_DEBUG_ID.set(debugId, count + 1);
9817
10017
  this.debugId = key;
9818
10018
  this.cellInfo = cellInfo;
9819
10019
  this.updater = buildSubscriptionCallback();
9820
- this.node = /* @__PURE__ */ React40.createElement(AvoidReactDiff, { key, name: key, updater: this.updater });
10020
+ this.node = /* @__PURE__ */ React40.createElement(
10021
+ AvoidReactDiff,
10022
+ {
10023
+ key,
10024
+ name: key,
10025
+ updater: this.updater,
10026
+ shouldFlushSync: this.isUpdatedWhileScrolling
10027
+ }
10028
+ );
9821
10029
  this.ref = (htmlElement) => {
9822
10030
  this.element = htmlElement;
9823
10031
  if (htmlElement) {
@@ -9849,7 +10057,8 @@ var GridCellForReact = class {
9849
10057
  getNode() {
9850
10058
  return this.node;
9851
10059
  }
9852
- update(content, additionalInfo) {
10060
+ update(content, additionalInfo, scrollingObjectParam) {
10061
+ this.IS_UPDATED_WHILE_SCROLLING = scrollingObjectParam ? scrollingObjectParam.scrolling : false;
9853
10062
  this.updater(content);
9854
10063
  this.cellInfo = additionalInfo;
9855
10064
  }
@@ -10141,14 +10350,14 @@ var GridCellManager = class extends Logger {
10141
10350
  }
10142
10351
  this.addCellToMatrix(cell, cellPos);
10143
10352
  }
10144
- renderNodeAtCell(node, cell, cellPos, additionalInfo) {
10353
+ renderNodeAtCell(node, cell, cellPos, additionalInfo, scrollingObjectParam) {
10145
10354
  const currentCellAtPos = this.getCellAt(cellPos);
10146
10355
  if (currentCellAtPos && currentCellAtPos !== cell) {
10147
10356
  this.detachCellAt(cellPos);
10148
10357
  }
10149
10358
  this.pool.attachCell(cell);
10150
10359
  this.setCellPositionInMatrix(cell, cellPos);
10151
- cell.update(node, additionalInfo);
10360
+ cell.update(node, additionalInfo, scrollingObjectParam);
10152
10361
  return cell;
10153
10362
  }
10154
10363
  getCellPosition(cell) {
@@ -10731,6 +10940,9 @@ var columnOffsetAtIndex2 = stripVar(InternalVars.columnOffsetAtIndex);
10731
10940
  var columnOffsetAtIndexWhileReordering2 = stripVar(
10732
10941
  InternalVars.columnOffsetAtIndexWhileReordering
10733
10942
  );
10943
+ var SCROLLING_OBJECT_PARAM_FLYWEIGHT = {
10944
+ scrolling: false
10945
+ };
10734
10946
  var GridRenderer = class extends Logger {
10735
10947
  constructor(brain, debugId) {
10736
10948
  debugId = debugId || "ReactHeadlessTableRenderer";
@@ -11885,11 +12097,13 @@ var GridRenderer = class extends Logger {
11885
12097
  }
11886
12098
  return;
11887
12099
  }
12100
+ SCROLLING_OBJECT_PARAM_FLYWEIGHT.scrolling = this.scrolling;
11888
12101
  this.cellManager.renderNodeAtCell(
11889
12102
  renderedNode,
11890
12103
  cell,
11891
12104
  [rowIndex, colIndex],
11892
- cellAdditionalInfo
12105
+ cellAdditionalInfo,
12106
+ SCROLLING_OBJECT_PARAM_FLYWEIGHT
11893
12107
  );
11894
12108
  this.updateElementPosition(cell, { hidden, rowspan, colspan });
11895
12109
  return;
@@ -18772,165 +18986,6 @@ function finishRowInfoReducersFor(params) {
18772
18986
  return results;
18773
18987
  }
18774
18988
 
18775
- // src/utils/devTools/devToolsTracks.ts
18776
- var DevToolsTracks = {
18777
- DataSource: {
18778
- track: "DataSource",
18779
- labels: {
18780
- RemoteDataLoad: "Remote data load",
18781
- TreeUnfilteredTreePaths: "Computing unfiltered tree paths",
18782
- Filter: "Filter",
18783
- Sort: "Sort",
18784
- Group: "Group",
18785
- LazyGroup: "Lazy group",
18786
- Tree: "Tree",
18787
- FlattenTree: "Flatten tree",
18788
- Flatten: "Flatten groups",
18789
- PrepareData: "Preparing data",
18790
- ComputeSelectionCount: "Computing selection count",
18791
- ComputeSelectionCountLazy: "Computing selection count (lazy)",
18792
- PrepareRowInfo: "Preparing row info array"
18793
- }
18794
- },
18795
- InfiniteTable: {
18796
- track: "InfiniteTable",
18797
- labels: {
18798
- Render: "Rendering"
18799
- }
18800
- },
18801
- MatrixBrain: {
18802
- track: "Layout Computations",
18803
- labels: {
18804
- ComputeRenderRange: "Computing render range"
18805
- }
18806
- }
18807
- };
18808
-
18809
- // src/utils/devTools/index.ts
18810
- var DevToolsMarker = class _DevToolsMarker {
18811
- constructor(debugId) {
18812
- this.debugId = debugId;
18813
- this.markerDetails = {
18814
- label: "",
18815
- track: "",
18816
- trackGroup: void 0,
18817
- color: void 0,
18818
- details: [],
18819
- tooltip: void 0
18820
- };
18821
- this.stopped = false;
18822
- this.start = (startDetails) => {
18823
- if (this.markerDetails.startTs) {
18824
- return this;
18825
- }
18826
- const start = performance.now();
18827
- this.markerDetails.details = startDetails?.details ?? [];
18828
- this.markerDetails.startTs = start;
18829
- return this;
18830
- };
18831
- this.end = (markerDetails = {}) => {
18832
- if (this.stopped) {
18833
- return this;
18834
- }
18835
- this.stopped = true;
18836
- const start = markerDetails.startTs ?? this.markerDetails.startTs;
18837
- const end = markerDetails.endTs ?? this.markerDetails.endTs ?? performance.now();
18838
- const color = markerDetails.color || this.markerDetails.color || "primary";
18839
- const trackGroup = markerDetails.trackGroup || this.markerDetails.trackGroup || `Infinite Table (${this.debugId})`;
18840
- const details = [
18841
- ...this.markerDetails.details || [],
18842
- ...markerDetails.details || []
18843
- ];
18844
- const tooltip = markerDetails.tooltip || this.markerDetails.tooltip;
18845
- const label = markerDetails.label || this.markerDetails.label || "Unknown";
18846
- const track = markerDetails.track || this.markerDetails.track || "Unknown";
18847
- performance.measure(label, {
18848
- start,
18849
- end,
18850
- detail: {
18851
- devtools: {
18852
- dataType: "track-entry",
18853
- trackGroup,
18854
- track,
18855
- color,
18856
- properties: details.length > 0 ? details.map((detail) => [detail.name, detail.value]) : void 0,
18857
- tooltipText: tooltip
18858
- }
18859
- }
18860
- });
18861
- return this;
18862
- };
18863
- this.debugId = debugId;
18864
- }
18865
- static create(debugId) {
18866
- return new _DevToolsMarker(debugId);
18867
- }
18868
- get startTimestamp() {
18869
- return this.markerDetails.startTs;
18870
- }
18871
- get track() {
18872
- const self = this;
18873
- return Object.keys(DevToolsTracks).reduce(
18874
- (acc, track) => {
18875
- const trackObj = {
18876
- start: self.start,
18877
- end: (markerDetails) => {
18878
- return self.end({
18879
- ...markerDetails,
18880
- track: DevToolsTracks[track].track,
18881
- label: markerDetails.label
18882
- });
18883
- },
18884
- get label() {
18885
- const currentTrack = DevToolsTracks[track];
18886
- return Object.keys(currentTrack.labels).reduce(
18887
- (labelAcc, label) => {
18888
- const labelObj = {
18889
- start: self.start,
18890
- end: (markerDetails) => {
18891
- return self.end({
18892
- ...markerDetails,
18893
- track: currentTrack.track,
18894
- label: currentTrack.labels[label]
18895
- });
18896
- }
18897
- };
18898
- Object.defineProperty(labelAcc, label, {
18899
- get: () => {
18900
- self.markerDetails.label = currentTrack.labels[label];
18901
- return labelObj;
18902
- }
18903
- });
18904
- return labelAcc;
18905
- },
18906
- {}
18907
- );
18908
- }
18909
- };
18910
- Object.defineProperty(acc, track, {
18911
- get: () => {
18912
- const currentTrack = DevToolsTracks[track];
18913
- self.markerDetails.track = currentTrack.track;
18914
- return trackObj;
18915
- }
18916
- });
18917
- return acc;
18918
- },
18919
- {}
18920
- );
18921
- }
18922
- };
18923
- function getMarker(debugId) {
18924
- return DevToolsMarker.create(debugId);
18925
- }
18926
-
18927
- // src/components/InfiniteTable/types/Utility.ts
18928
- function notNullable(value) {
18929
- if (value === null || value === void 0) return false;
18930
- const testDummyForCompileError = value;
18931
- return true;
18932
- }
18933
-
18934
18989
  // src/components/DataSource/state/reducer.ts
18935
18990
  function cleanupEmptyFilterValues(filterValue, filterTypes) {
18936
18991
  if (!filterValue) {
@@ -22392,6 +22447,9 @@ function isSortInfoForColumn(sortInfo, col) {
22392
22447
  }
22393
22448
  var InfiniteTableApiImpl = class {
22394
22449
  constructor(context) {
22450
+ this.getVisibleRenderRange = () => {
22451
+ return this.getState().brain.getRenderRange();
22452
+ };
22395
22453
  this.hideFilterOperatorMenu = () => {
22396
22454
  this.actions.filterOperatorMenuVisibleForColumnId = null;
22397
22455
  };
@@ -25637,7 +25695,7 @@ var useLicense = (licenseKey = "") => {
25637
25695
  }
25638
25696
  let valid2 = isValidLicense(licenseKey, {
25639
25697
  publishedAt: 1624970570587,
25640
- version: "7.4.1"
25698
+ version: "7.4.2"
25641
25699
  });
25642
25700
  if (!licenseKey && !valid2 && isInsidePlayground) {
25643
25701
  return true;