@economic/taco 2.48.5 → 2.49.0-dataloader.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.
Files changed (90) hide show
  1. package/dist/components/Report/Report.d.ts +1 -1
  2. package/dist/components/SearchInput2/SearchInput2.d.ts +2 -0
  3. package/dist/components/Table3/features/useEditingState.d.ts +13 -13
  4. package/dist/components/Table3/features/useTableEditing.d.ts +15 -15
  5. package/dist/components/Table3/types.d.ts +2 -0
  6. package/dist/esm/packages/taco/src/charts/components/Donut/Legend.js +1 -0
  7. package/dist/esm/packages/taco/src/charts/components/Donut/Legend.js.map +1 -1
  8. package/dist/esm/packages/taco/src/charts/components/Legend.js +1 -0
  9. package/dist/esm/packages/taco/src/charts/components/Legend.js.map +1 -1
  10. package/dist/esm/packages/taco/src/components/SearchInput2/SearchInput2.js +6 -3
  11. package/dist/esm/packages/taco/src/components/SearchInput2/SearchInput2.js.map +1 -1
  12. package/dist/esm/packages/taco/src/components/Table/hooks/plugins/useRowActions.js +1 -1
  13. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js +1 -1
  14. package/dist/esm/packages/taco/src/components/Table3/components/Columns/Cell/EditingControlCell.js.map +1 -1
  15. package/dist/esm/packages/taco/src/components/Table3/components/Editing/Alert.js +15 -9
  16. package/dist/esm/packages/taco/src/components/Table3/components/Editing/Alert.js.map +1 -1
  17. package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/CreateNewRow.js +4 -2
  18. package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/CreateNewRow.js.map +1 -1
  19. package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/TemporaryRow.js +3 -2
  20. package/dist/esm/packages/taco/src/components/Table3/components/Row/Editing/TemporaryRow.js.map +1 -1
  21. package/dist/esm/packages/taco/src/components/Table3/features/useEditingState.js +61 -69
  22. package/dist/esm/packages/taco/src/components/Table3/features/useEditingState.js.map +1 -1
  23. package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js +13 -6
  24. package/dist/esm/packages/taco/src/components/Table3/features/useTableEditing.js.map +1 -1
  25. package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js +15 -12
  26. package/dist/esm/packages/taco/src/components/Table3/listeners/useTableEditingListener.js.map +1 -1
  27. package/dist/esm/packages/taco/src/components/Table3/useTable3.js +1 -1
  28. package/dist/esm/packages/taco/src/components/Table3/useTable3.js.map +1 -1
  29. package/dist/esm/packages/taco/src/index.js +1 -0
  30. package/dist/esm/packages/taco/src/index.js.map +1 -1
  31. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Columns/Internal/Selection.js +7 -4
  32. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Columns/Internal/Selection.js.map +1 -1
  33. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Footer/Summary.js +7 -6
  34. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Footer/Summary.js.map +1 -1
  35. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/BuiltIns/SkeletonRow.js +24 -22
  36. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/BuiltIns/SkeletonRow.js.map +1 -1
  37. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/Row.js +41 -4
  38. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Row/Row.js.map +1 -1
  39. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Print/Print.js +3 -1
  40. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Print/Print.js.map +1 -1
  41. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Search/Search.js +26 -3
  42. package/dist/esm/packages/taco/src/primitives/Table/Core/components/Toolbar/components/Search/Search.js.map +1 -1
  43. package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableGlobalShortcuts.js +2 -2
  44. package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableGlobalShortcuts.js.map +1 -1
  45. package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableRenderer.js +40 -13
  46. package/dist/esm/packages/taco/src/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
  47. package/dist/esm/packages/taco/src/primitives/Table/Core/useTable.js +1 -1
  48. package/dist/esm/packages/taco/src/primitives/Table/Core/useTable.js.map +1 -1
  49. package/dist/esm/packages/taco/src/primitives/Table/types.js.map +1 -1
  50. package/dist/esm/packages/taco/src/primitives/Table/useTableDataLoader.js +13 -12
  51. package/dist/esm/packages/taco/src/primitives/Table/useTableDataLoader.js.map +1 -1
  52. package/dist/esm/packages/taco/src/primitives/Table/useTableDataLoader2.js +223 -0
  53. package/dist/esm/packages/taco/src/primitives/Table/useTableDataLoader2.js.map +1 -0
  54. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableRowActive.js +1 -1
  55. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableRowActive.js.map +1 -1
  56. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableSearch.js +3 -2
  57. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableSearch.js.map +1 -1
  58. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableServerLoading.js +6 -2
  59. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/features/useTableServerLoading.js.map +1 -1
  60. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableFilterListener.js +3 -1
  61. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableFilterListener.js.map +1 -1
  62. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableRowSelectionListener.js +4 -4
  63. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableRowSelectionListener.js.map +1 -1
  64. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableSearchListener.js +14 -13
  65. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableSearchListener.js.map +1 -1
  66. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableServerLoadingListener.js +7 -3
  67. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/listeners/useTableServerLoadingListener.js.map +1 -1
  68. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/useTableManager.js +3 -3
  69. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/useTableManager.js.map +1 -1
  70. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/columns.js +4 -1
  71. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/columns.js.map +1 -1
  72. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/setup.js +8 -1
  73. package/dist/esm/packages/taco/src/primitives/Table/useTableManager/util/setup.js.map +1 -1
  74. package/dist/hooks/useLazyDebouncedEffect.d.ts +2 -0
  75. package/dist/index.d.ts +1 -0
  76. package/dist/primitives/Table/Core/components/Row/BuiltIns/SkeletonRow.d.ts +2 -2
  77. package/dist/primitives/Table/Core/components/Row/Row.d.ts +2 -0
  78. package/dist/primitives/Table/Core/features/useTableRenderer.d.ts +1 -1
  79. package/dist/primitives/Table/types.d.ts +10 -6
  80. package/dist/primitives/Table/useTableDataLoader.d.ts +2 -2
  81. package/dist/primitives/Table/useTableDataLoader2.d.ts +23 -0
  82. package/dist/primitives/Table/useTableManager/features/useTableSearch.d.ts +4 -2
  83. package/dist/primitives/Table/useTableManager/features/useTableServerLoading.d.ts +4 -1
  84. package/dist/primitives/Table/useTableManager/listeners/useTableSearchListener.d.ts +1 -2
  85. package/dist/primitives/Table/useTableManager/util/columns.d.ts +2 -1
  86. package/dist/taco.cjs.development.js +575 -232
  87. package/dist/taco.cjs.development.js.map +1 -1
  88. package/dist/taco.cjs.production.min.js +1 -1
  89. package/dist/taco.cjs.production.min.js.map +1 -1
  90. package/package.json +2 -2
@@ -31,12 +31,12 @@ var reactPortal = require('@radix-ui/react-portal');
31
31
  var reactTable = require('@tanstack/react-table');
32
32
  var get = _interopDefault(require('lodash/get'));
33
33
  var reactVirtual = require('@tanstack/react-virtual');
34
- var reactIntersectionObserver = require('react-intersection-observer');
35
34
  var core = require('@dnd-kit/core');
36
35
  var modifiers = require('@dnd-kit/modifiers');
37
36
  var SortablePrimitive = require('@dnd-kit/sortable');
38
37
  var utilities = require('@dnd-kit/utilities');
39
38
  var reactTable$1 = require('react-table');
39
+ var reactIntersectionObserver = require('react-intersection-observer');
40
40
  var reactWindow = require('react-window');
41
41
  var InfiniteLoader = _interopDefault(require('react-window-infinite-loader'));
42
42
  var set = _interopDefault(require('lodash/set'));
@@ -10318,6 +10318,9 @@ function unfreezeAllExternalColumns(leftPinnedState) {
10318
10318
  function freezeUptoExternalColumn(index, columns) {
10319
10319
  return columns.slice(0, index + 1);
10320
10320
  }
10321
+ function getHiddenColumns(columnVisibility = {}) {
10322
+ return Object.keys(columnVisibility).filter(c => columnVisibility[c] === false);
10323
+ }
10321
10324
 
10322
10325
  function getSettings(table) {
10323
10326
  const meta = table.options.meta;
@@ -10582,7 +10585,8 @@ function configureReactTableOptions(options, props, localization) {
10582
10585
  getExpandedRowModel: reactTable.getExpandedRowModel(),
10583
10586
  getGroupedRowModel: reactTable.getGroupedRowModel(),
10584
10587
  getRowId,
10585
- groupedColumnMode: false
10588
+ groupedColumnMode: false,
10589
+ keepPinnedRows: false
10586
10590
  };
10587
10591
  if (tableOptions.enableColumnResizing) {
10588
10592
  tableOptions.columnResizeMode = 'onChange';
@@ -10604,6 +10608,12 @@ function configureReactTableOptions(options, props, localization) {
10604
10608
  var _column$columnDef$met;
10605
10609
  return ((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.enableSearch) !== false && column.getIsVisible();
10606
10610
  };
10611
+ // enter controlled search mode (controlled could be local state, but usually the server)
10612
+ if (props.onChangeSearch) {
10613
+ if (props._experimentalDataLoader2) {
10614
+ tableOptions.manualFiltering = true;
10615
+ }
10616
+ }
10607
10617
  }
10608
10618
  if (tableOptions.enableSorting) {
10609
10619
  // enter controlled sort mode (controlled could be local state, but usually the server)
@@ -10987,7 +10997,7 @@ function useTableRowActive(isEnabled = false, initialRowActiveIndex) {
10987
10997
  return index;
10988
10998
  });
10989
10999
  }
10990
- }, [rowActiveIndex, length, isEnabled]);
11000
+ }, [rowActiveIndex, isEnabled]);
10991
11001
  return {
10992
11002
  isEnabled,
10993
11003
  rowActiveIndex,
@@ -11103,7 +11113,7 @@ function useTableRowSelection(isEnabled = false) {
11103
11113
  - Highlighting search results, this is custom and only uses the state part of globalFilter (to store the search query)
11104
11114
  - Filtering of results, this is essentially the built in filtering, and relies on enableGlobalFilter being on or off
11105
11115
  */
11106
- function useTableSearch(isEnabled = false, defaultEnableGlobalFilter = false) {
11116
+ function useTableSearch(isEnabled = false, onChangeSearch, defaultEnableGlobalFilter = false) {
11107
11117
  const [enableGlobalFilter, _setEnableGlobalFilter] = React__default.useState(defaultEnableGlobalFilter);
11108
11118
  function setEnableGlobalFilter(enabled, instance) {
11109
11119
  _setEnableGlobalFilter(enabled);
@@ -11128,7 +11138,8 @@ function useTableSearch(isEnabled = false, defaultEnableGlobalFilter = false) {
11128
11138
  highlightedColumnIndexes,
11129
11139
  setHighlightedColumnIndexes,
11130
11140
  currentHighlightColumnIndex,
11131
- setCurrentHighlightColumnIndex
11141
+ setCurrentHighlightColumnIndex,
11142
+ handleSearch: isEnabled && typeof onChangeSearch === 'function' ? onChangeSearch : undefined
11132
11143
  };
11133
11144
  }
11134
11145
 
@@ -11338,9 +11349,10 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11338
11349
  const _lastUsedSorting = React__default.useRef([]);
11339
11350
  const _lastUsedFilters = React__default.useRef([]);
11340
11351
  const _lastUsedSearch = React__default.useRef();
11352
+ const _lastUsedHiddenColumns = React__default.useRef([]);
11341
11353
  const _lastUsedPageIndex = React__default.useRef();
11342
11354
  const _forceReset = React__default.useRef(false);
11343
- const loadPage = function (pageIndex, sorting, filters) {
11355
+ const loadPage = function (pageIndex, sorting, filters, hiddenColumns) {
11344
11356
  try {
11345
11357
  let reset = false;
11346
11358
  // sorting or filters changed, reset everything
@@ -11362,9 +11374,10 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11362
11374
  _lastUsedSorting.current = sorting;
11363
11375
  // set the filters so we can track if it changed between loads
11364
11376
  _lastUsedFilters.current = filters;
11377
+ _lastUsedHiddenColumns.current = hiddenColumns;
11365
11378
  const _temp = _finallyRethrows(function () {
11366
11379
  return _catch(function () {
11367
- return Promise.resolve(fetchPage(pageIndex, pageSize, sorting, filters)).then(function (response) {
11380
+ return Promise.resolve(fetchPage(pageIndex, pageSize, sorting, filters, hiddenColumns)).then(function (response) {
11368
11381
  // update state, here we do some "magic" to support "load in place"
11369
11382
  setData(currentData => {
11370
11383
  let nextData;
@@ -11393,14 +11406,15 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11393
11406
  return Promise.reject(e);
11394
11407
  }
11395
11408
  };
11396
- const loadAll = function (sorting, filters) {
11409
+ const loadAll = function (sorting, filters, hiddenColumns) {
11397
11410
  try {
11398
11411
  // set the sorting so we can track if it changed between loads
11399
11412
  _lastUsedSorting.current = sorting;
11400
11413
  // set the filters so we can track if it changed between loads
11401
11414
  _lastUsedFilters.current = filters;
11415
+ _lastUsedHiddenColumns.current = hiddenColumns;
11402
11416
  const _temp2 = _catch(function () {
11403
- return Promise.resolve(fetchAll(sorting, filters)).then(function (response) {
11417
+ return Promise.resolve(fetchAll(sorting, filters, hiddenColumns)).then(function (response) {
11404
11418
  length.current = response.length;
11405
11419
  setData(() => {
11406
11420
  let nextData;
@@ -11425,11 +11439,11 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11425
11439
  _forceReset.current = true;
11426
11440
  if (_lastUsedSearch.current) {
11427
11441
  // we're searching, which means we need to refetch all with the correct sorting applied
11428
- return loadAll(_lastUsedSorting.current, _lastUsedFilters.current);
11442
+ return loadAll(_lastUsedSorting.current, _lastUsedFilters.current, _lastUsedHiddenColumns.current);
11429
11443
  } else {
11430
11444
  var _lastUsedPageIndex$cu;
11431
11445
  // load the last page that we scrolled to
11432
- return loadPage((_lastUsedPageIndex$cu = _lastUsedPageIndex.current) !== null && _lastUsedPageIndex$cu !== void 0 ? _lastUsedPageIndex$cu : 0, _lastUsedSorting.current, _lastUsedFilters.current);
11446
+ return loadPage((_lastUsedPageIndex$cu = _lastUsedPageIndex.current) !== null && _lastUsedPageIndex$cu !== void 0 ? _lastUsedPageIndex$cu : 0, _lastUsedSorting.current, _lastUsedFilters.current, _lastUsedHiddenColumns.current);
11433
11447
  }
11434
11448
  } catch (e) {
11435
11449
  return Promise.reject(e);
@@ -11441,13 +11455,12 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11441
11455
  try {
11442
11456
  if (_lastUsedSearch.current) {
11443
11457
  // we're searching, which means we need to refetch all with the correct sorting applied
11444
- loadAll(sorting, _lastUsedFilters.current);
11458
+ return loadAll(sorting, _lastUsedFilters.current, _lastUsedHiddenColumns.current);
11445
11459
  } else {
11446
11460
  var _lastUsedPageIndex$cu2;
11447
11461
  // load the last page that we scrolled to
11448
- loadPage((_lastUsedPageIndex$cu2 = _lastUsedPageIndex.current) !== null && _lastUsedPageIndex$cu2 !== void 0 ? _lastUsedPageIndex$cu2 : 0, sorting, _lastUsedFilters.current);
11462
+ return loadPage((_lastUsedPageIndex$cu2 = _lastUsedPageIndex.current) !== null && _lastUsedPageIndex$cu2 !== void 0 ? _lastUsedPageIndex$cu2 : 0, sorting, _lastUsedFilters.current, _lastUsedHiddenColumns.current);
11449
11463
  }
11450
- return Promise.resolve();
11451
11464
  } catch (e) {
11452
11465
  return Promise.reject(e);
11453
11466
  }
@@ -11456,13 +11469,12 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11456
11469
  try {
11457
11470
  if (_lastUsedSearch.current) {
11458
11471
  // we're searching, which means we need to refetch all with the correct sorting applied
11459
- loadAll(_lastUsedSorting.current, filters);
11472
+ return loadAll(_lastUsedSorting.current, filters, _lastUsedHiddenColumns.current);
11460
11473
  } else {
11461
11474
  var _lastUsedPageIndex$cu3;
11462
11475
  // load the last page that we scrolled to
11463
- loadPage((_lastUsedPageIndex$cu3 = _lastUsedPageIndex.current) !== null && _lastUsedPageIndex$cu3 !== void 0 ? _lastUsedPageIndex$cu3 : 0, _lastUsedSorting.current, filters);
11476
+ return loadPage((_lastUsedPageIndex$cu3 = _lastUsedPageIndex.current) !== null && _lastUsedPageIndex$cu3 !== void 0 ? _lastUsedPageIndex$cu3 : 0, _lastUsedSorting.current, filters, _lastUsedHiddenColumns.current);
11464
11477
  }
11465
- return Promise.resolve();
11466
11478
  } catch (e) {
11467
11479
  return Promise.reject(e);
11468
11480
  }
@@ -11490,7 +11502,7 @@ function useTableDataLoader(fetchPage, fetchAll, options = {
11490
11502
  }, invalidate];
11491
11503
  }
11492
11504
 
11493
- function useTableServerLoading(length, data, loadPage, loadAll, pageSize = DEFAULT_PAGE_SIZE) {
11505
+ function useTableServerLoading(length, data, loadPage, loadAll, pages, pageSize = DEFAULT_PAGE_SIZE, _experimentalDataLoader2 = false) {
11494
11506
  const isEnabled = !!loadPage && !!loadAll;
11495
11507
  const [isReady, setReady] = React__default.useState(false);
11496
11508
  const [loading, setLoading] = React__default.useState(false);
@@ -11551,14 +11563,18 @@ function useTableServerLoading(length, data, loadPage, loadAll, pageSize = DEFAU
11551
11563
  }
11552
11564
  };
11553
11565
  }
11566
+ const pageCount = Math.ceil(length / pageSize);
11554
11567
  return {
11568
+ pages,
11555
11569
  isEnabled,
11556
11570
  isReady,
11557
11571
  loadPage: _loadPage,
11558
11572
  loadAll: _loadAll,
11559
11573
  loadAllIfNeeded: _loadAllIfNeeded,
11560
11574
  loading,
11561
- pageSize
11575
+ pageSize,
11576
+ pageCount,
11577
+ _experimentalDataLoader2
11562
11578
  };
11563
11579
  }
11564
11580
 
@@ -11655,7 +11671,8 @@ function useTableFilterListener(table, onFilter) {
11655
11671
  const columnFilters = table.getState().columnFilters;
11656
11672
  useLazyEffect(() => {
11657
11673
  if (table.options.enableColumnFilters && typeof onFilter === 'function') {
11658
- onFilter(columnFilters);
11674
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
11675
+ onFilter(columnFilters, hiddenColumns);
11659
11676
  if (table.options.enableRowSelection) {
11660
11677
  table.resetRowSelection();
11661
11678
  }
@@ -11714,11 +11731,12 @@ function useTableRowHeightListener(table) {
11714
11731
  }
11715
11732
 
11716
11733
  function useTableRowSelectionListener(table, onRowSelect) {
11734
+ // note that the selected row model may not contain all rows in state when using server loading
11717
11735
  const rows = table.getSelectedRowModel().flatRows;
11718
- const rowSelection = React__default.useMemo(() => rows.map(row => row.original), [rows]);
11736
+ const state = table.getState().rowSelection;
11719
11737
  useLazyEffect(() => {
11720
11738
  if (table.options.enableRowSelection && typeof onRowSelect === 'function') {
11721
- onRowSelect(rowSelection);
11739
+ onRowSelect(rows.map(row => row.original), Object.keys(state));
11722
11740
  }
11723
11741
  /**
11724
11742
  * Casting to a boolean, since enableRowSelection can be a function,
@@ -11726,33 +11744,33 @@ function useTableRowSelectionListener(table, onRowSelect) {
11726
11744
  * we only need to know if selection was enabled or disabled, because enableRowSelection function
11727
11745
  * will be applied directly to particular rows.
11728
11746
  */
11729
- }, [!!table.options.enableRowSelection, JSON.stringify(rowSelection)]);
11747
+ }, [!!table.options.enableRowSelection, JSON.stringify(state)]);
11730
11748
  }
11731
11749
 
11732
- function useTableSearchListener(table, onChangeSearch) {
11750
+ function useTableSearchListener(table) {
11733
11751
  const meta = table.options.meta;
11734
11752
  const localization = useLocalization();
11735
- const visibleColumns = table.getVisibleFlatColumns();
11753
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
11754
+ const query = table.getState().globalFilter;
11736
11755
  // Need to re-run search when columns are getting shown/hidden.
11737
- React__default.useEffect(() => {
11738
- if (meta.search.isEnabled && visibleColumns.length > 0) {
11739
- const currentFilter = table.getState().globalFilter;
11756
+ useLazyEffect(() => {
11757
+ if (meta.search.isEnabled) {
11758
+ const currentFilter = query;
11740
11759
  requestAnimationFrame(() => {
11741
11760
  table.resetGlobalFilter();
11742
11761
  table.setGlobalFilter(currentFilter);
11743
11762
  });
11763
+ if (meta.search.handleSearch && meta.search.enableGlobalFilter && query) {
11764
+ meta.search.handleSearch(query, hiddenColumns);
11765
+ }
11744
11766
  }
11745
- }, [visibleColumns.length]);
11767
+ }, [hiddenColumns.length]);
11746
11768
  // recalculates highlighted indexes whenever something important changes
11747
- React__default.useEffect(() => {
11769
+ useLazyEffect(() => {
11748
11770
  if (meta.search.isEnabled) {
11749
- const query = table.getState().globalFilter;
11750
11771
  resetHighlightedColumnIndexes(query, table, localization);
11751
- if (typeof onChangeSearch === 'function') {
11752
- onChangeSearch(query);
11753
- }
11754
11772
  }
11755
- }, [meta.server.loading, meta.search.isEnabled, meta.search.enableGlobalFilter, table.getRowModel().rows.length, table.getState().globalFilter, JSON.stringify(table.getState().sorting), onChangeSearch]);
11773
+ }, [meta.server.loading, meta.search.isEnabled, meta.search.enableGlobalFilter, table.getRowModel().rows.length, query, JSON.stringify(table.getState().sorting)]);
11756
11774
  }
11757
11775
 
11758
11776
  function useTableSettingsListener(table, onChangeSettings) {
@@ -11836,12 +11854,15 @@ function useTableSortingListener(table, onSort) {
11836
11854
  }
11837
11855
 
11838
11856
  function useTableServerLoadingListener(table, loadPage) {
11839
- const sorting = table.getState().sorting;
11840
- const columnFilters = table.getState().columnFilters;
11857
+ const meta = table.options.meta;
11841
11858
  // trigger load of the first page on mount
11842
11859
  React__default.useEffect(() => {
11843
11860
  if (loadPage) {
11844
- loadPage(0, sorting, columnFilters);
11861
+ const sorting = table.getState().sorting;
11862
+ const columnFilters = table.getState().columnFilters;
11863
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
11864
+ const search = meta.search.enableGlobalFilter ? table.getState().globalFilter : undefined;
11865
+ loadPage(0, sorting, columnFilters, hiddenColumns, search);
11845
11866
  }
11846
11867
  }, []);
11847
11868
  }
@@ -11893,8 +11914,8 @@ function useTableManager(props, meta, internalColumns) {
11893
11914
  const rowGroups = useTableRowGroups(props.rowActionsForGroup);
11894
11915
  const rowHeight = useTableRowHeight(options.enableRowHeight, settings.rowHeight);
11895
11916
  const rowSelection = useTableRowSelection(!!options.enableRowSelection);
11896
- const search = useTableSearch(options.enableSearch, settings.excludeUnmatchedRecordsInSearch);
11897
- const server = useTableServerLoading(length, data, props.loadPage, props.loadAll, props.pageSize);
11917
+ const search = useTableSearch(options.enableSearch, props.onChangeSearch, settings.excludeUnmatchedRecordsInSearch);
11918
+ const server = useTableServerLoading(length, data, props.loadPage, props.loadAll, props.pages, props.pageSize, props._experimentalDataLoader2);
11898
11919
  // TODO: memoise
11899
11920
  // convert jsx column components into valid table columns
11900
11921
  const {
@@ -11945,7 +11966,7 @@ function useTableManager(props, meta, internalColumns) {
11945
11966
  useTableFontSizeListener(instance);
11946
11967
  useTableRowHeightListener(instance);
11947
11968
  useTableRowSelectionListener(instance, props.onRowSelect);
11948
- useTableSearchListener(instance, props.onChangeSearch);
11969
+ useTableSearchListener(instance);
11949
11970
  useTableServerLoadingListener(instance, server.loadPage);
11950
11971
  useTableSettingsListener(instance, setSettings);
11951
11972
  useTableShortcutsListener(instance, props.shortcuts);
@@ -12171,7 +12192,7 @@ function useTableGlobalShortcuts(table, tableRef, scrollToIndex) {
12171
12192
  if (isElementInsideOverlay(trigger) && !isSiblingElementInsideSameParentOverlay(trigger, tableRef.current) || isElementInteractive(trigger) && !isElementInsideOrTriggeredFromContainer(trigger, tableRef.current)) {
12172
12193
  return;
12173
12194
  }
12174
- tableMeta.rowActive.handleKeyDown(event, rows.length, scrollToIndex);
12195
+ tableMeta.rowActive.handleKeyDown(event, tableMeta.length, scrollToIndex);
12175
12196
  tableMeta.rowSelection.handleKeyDown(event, table);
12176
12197
  if (tableMeta.rowActive.rowActiveIndex !== undefined) {
12177
12198
  var _rows$tableMeta$rowAc;
@@ -12184,7 +12205,7 @@ function useTableGlobalShortcuts(table, tableRef, scrollToIndex) {
12184
12205
  };
12185
12206
  },
12186
12207
  // scrollToIndex function changes when row count changes, so it is important to update handlers
12187
- [tableRef.current, tableMeta.rowActive.rowActiveIndex, scrollToIndex]);
12208
+ [tableRef.current, tableMeta.length, tableMeta.rowActive.rowActiveIndex, scrollToIndex]);
12188
12209
  }
12189
12210
 
12190
12211
  function useTableRef(table, ref) {
@@ -12207,57 +12228,131 @@ const ROW_HEIGHT_ESTIMATES = {
12207
12228
  'extra-tall': 57
12208
12229
  };
12209
12230
 
12231
+ const RowContext = /*#__PURE__*/React__default.createContext({
12232
+ hideInternalColumns: false,
12233
+ hideRowActions: false,
12234
+ isHovered: false,
12235
+ rowIndex: -1
12236
+ });
12237
+
12238
+ const DELAY_BEFORE_LOAD_MS = 250;
12239
+ /* anonymous functions will break the memoisation on each render, wrap handlers in callbacks */
12240
+ function Row(props) {
12241
+ const {
12242
+ renderer: RowRenderer,
12243
+ cellRenderer: CellRenderer,
12244
+ hideInternalColumns = false,
12245
+ hideRowActions = false,
12246
+ scrollDirection,
12247
+ skipPageLoading = false,
12248
+ ...displayRowProps
12249
+ } = props;
12250
+ const tableMeta = props.table.options.meta;
12251
+ const isHovered = tableMeta.rowActive.rowHoverIndex === props.index;
12252
+ // context - it must be here for cells to read it, since they render alongside the row inside DisplayRow
12253
+ const contextValue = React__default.useMemo(() => ({
12254
+ isHovered,
12255
+ rowIndex: props.index,
12256
+ hideInternalColumns,
12257
+ hideRowActions
12258
+ }), [isHovered, props.index, hideInternalColumns, hideRowActions]);
12259
+ React__default.useEffect(() => {
12260
+ let timeout;
12261
+ if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 && !skipPageLoading) {
12262
+ const pageIndex = Math.floor(props.index / tableMeta.server.pageSize) * tableMeta.server.pageSize / tableMeta.server.pageSize;
12263
+ const sorting = props.table.getState().sorting;
12264
+ const filters = props.table.getState().columnFilters;
12265
+ const search = props.table.getState().globalFilter;
12266
+ const hiddenColumns = getHiddenColumns(props.table.getState().columnVisibility);
12267
+ const pageIndexesToFetch = [];
12268
+ // if there's no direction, it means the scroll bar got dropped un unloaded pages,
12269
+ // in that case, load forward and backward pages to prevent skeletons
12270
+ if (scrollDirection === 'backward' || !scrollDirection) {
12271
+ const backIndex = pageIndex - 1;
12272
+ if (backIndex > -1) {
12273
+ pageIndexesToFetch.push(backIndex);
12274
+ }
12275
+ }
12276
+ // always load the next page
12277
+ if ((scrollDirection === 'forward' || !scrollDirection) && pageIndex + 2 < tableMeta.server.pageCount) {
12278
+ pageIndexesToFetch.push(pageIndex + 1);
12279
+ }
12280
+ if (pageIndexesToFetch.length) {
12281
+ // the virtualiser fetches a page ahead, so this won't get called in most cases
12282
+ // but it provides a fallback for some edge cases
12283
+ timeout = setTimeout(() => {
12284
+ pageIndexesToFetch.forEach(index => {
12285
+ var _tableMeta$server$loa, _tableMeta$server;
12286
+ // this can be called by every row within the current page, but loadPage returns early if a pending request exists
12287
+ (_tableMeta$server$loa = (_tableMeta$server = tableMeta.server).loadPage) === null || _tableMeta$server$loa === void 0 ? void 0 : _tableMeta$server$loa.call(_tableMeta$server, index, sorting, filters, hiddenColumns, tableMeta.search.enableGlobalFilter ? search : undefined);
12288
+ });
12289
+ }, DELAY_BEFORE_LOAD_MS);
12290
+ }
12291
+ }
12292
+ return () => {
12293
+ clearTimeout(timeout);
12294
+ };
12295
+ }, [tableMeta.server.pages]);
12296
+ return /*#__PURE__*/React__default.createElement(RowContext.Provider, {
12297
+ value: contextValue
12298
+ }, /*#__PURE__*/React__default.createElement(RowRenderer, Object.assign({}, displayRowProps, {
12299
+ cellRenderer: CellRenderer
12300
+ })));
12301
+ }
12302
+
12303
+ const DELAY_BEFORE_LOAD_MS$1 = 150;
12210
12304
  function SkeletonRow(props) {
12211
12305
  const {
12212
12306
  index,
12213
- row,
12214
12307
  table
12215
12308
  } = props;
12216
12309
  const tableMeta = table.options.meta;
12217
12310
  if (tableMeta.server.isEnabled) {
12218
- return /*#__PURE__*/React__default.createElement(RowWithServerLoading, Object.assign({}, props, {
12219
- index: index
12220
- }));
12311
+ return /*#__PURE__*/React__default.createElement(RowWithServerLoading, Object.assign({}, props));
12221
12312
  }
12222
12313
  return /*#__PURE__*/React__default.createElement(Skeleton, {
12223
- cellsCount: row.getVisibleCells().length
12314
+ cellsCount: table.getVisibleFlatColumns().length,
12315
+ index: index
12224
12316
  });
12225
12317
  }
12226
12318
  function RowWithServerLoading(props) {
12227
12319
  var _table$getState$group, _table$getState;
12228
12320
  const {
12229
12321
  index,
12230
- row,
12231
12322
  table
12232
12323
  } = props;
12233
12324
  const tableMeta = table.options.meta;
12234
12325
  const pageIndex = Math.floor(index / tableMeta.server.pageSize) * tableMeta.server.pageSize / tableMeta.server.pageSize;
12235
- const {
12236
- ref,
12237
- inView
12238
- } = reactIntersectionObserver.useInView({
12239
- threshold: 0,
12240
- triggerOnce: true,
12241
- initialInView: pageIndex === 0
12242
- });
12243
12326
  React__default.useEffect(() => {
12244
- if (inView) {
12245
- var _tableMeta$server$loa, _tableMeta$server;
12246
- (_tableMeta$server$loa = (_tableMeta$server = tableMeta.server).loadPage) === null || _tableMeta$server$loa === void 0 ? void 0 : _tableMeta$server$loa.call(_tableMeta$server, pageIndex, table.getState().sorting, table.getState().columnFilters);
12327
+ let timeout;
12328
+ if (tableMeta.server.isEnabled) {
12329
+ const sorting = props.table.getState().sorting;
12330
+ const filters = props.table.getState().columnFilters;
12331
+ const search = props.table.getState().globalFilter;
12332
+ const hiddenColumns = getHiddenColumns(props.table.getState().columnVisibility);
12333
+ timeout = setTimeout(() => {
12334
+ var _tableMeta$server$loa, _tableMeta$server;
12335
+ (_tableMeta$server$loa = (_tableMeta$server = tableMeta.server).loadPage) === null || _tableMeta$server$loa === void 0 ? void 0 : _tableMeta$server$loa.call(_tableMeta$server, pageIndex, sorting, filters, hiddenColumns, tableMeta.search.enableGlobalFilter ? search : undefined);
12336
+ }, DELAY_BEFORE_LOAD_MS$1);
12247
12337
  }
12248
- }, [inView]);
12338
+ return () => {
12339
+ clearTimeout(timeout);
12340
+ };
12341
+ }, []);
12249
12342
  const groupedCellCount = (_table$getState$group = (_table$getState = table.getState()) === null || _table$getState === void 0 ? void 0 : _table$getState.grouping.length) !== null && _table$getState$group !== void 0 ? _table$getState$group : 0;
12250
- const ungroupedCellCount = row.getVisibleCells().length - groupedCellCount;
12343
+ const ungroupedCellCount = table.getVisibleFlatColumns().length - groupedCellCount;
12251
12344
  return /*#__PURE__*/React__default.createElement(Skeleton, {
12252
12345
  cellsCount: ungroupedCellCount,
12253
- ref: ref
12346
+ index: index
12254
12347
  });
12255
12348
  }
12256
12349
  const Skeleton = /*#__PURE__*/React__default.forwardRef(function Skeleton(props, ref) {
12257
12350
  const {
12258
- cellsCount
12351
+ cellsCount,
12352
+ index
12259
12353
  } = props;
12260
12354
  return /*#__PURE__*/React__default.createElement("tr", {
12355
+ "data-row-index": index,
12261
12356
  ref: ref
12262
12357
  }, Array(cellsCount).fill(null).map((_, index) => (/*#__PURE__*/React__default.createElement("td", {
12263
12358
  key: index
@@ -12266,41 +12361,6 @@ const Skeleton = /*#__PURE__*/React__default.forwardRef(function Skeleton(props,
12266
12361
  })))));
12267
12362
  });
12268
12363
 
12269
- const RowContext = /*#__PURE__*/React__default.createContext({
12270
- hideInternalColumns: false,
12271
- hideRowActions: false,
12272
- isHovered: false,
12273
- rowIndex: -1
12274
- });
12275
-
12276
- /* anonymous functions will break the memoisation on each render, wrap handlers in callbacks */
12277
- function Row(props) {
12278
- const {
12279
- renderer: RowRenderer,
12280
- cellRenderer: CellRenderer,
12281
- hideInternalColumns = false,
12282
- hideRowActions = false,
12283
- ...displayRowProps
12284
- } = props;
12285
- const tableMeta = props.table.options.meta;
12286
- const isHovered = tableMeta.rowActive.rowHoverIndex === props.index;
12287
- // context - it must be here for cells to read it, since they render alongside the row inside DisplayRow
12288
- const contextValue = React__default.useMemo(() => ({
12289
- isHovered,
12290
- rowIndex: props.index,
12291
- hideInternalColumns,
12292
- hideRowActions
12293
- }), [isHovered, props.index, hideInternalColumns, hideRowActions]);
12294
- if (props.row.original === undefined) {
12295
- return /*#__PURE__*/React__default.createElement(SkeletonRow, Object.assign({}, props));
12296
- }
12297
- return /*#__PURE__*/React__default.createElement(RowContext.Provider, {
12298
- value: contextValue
12299
- }, /*#__PURE__*/React__default.createElement(RowRenderer, Object.assign({}, displayRowProps, {
12300
- cellRenderer: CellRenderer
12301
- })));
12302
- }
12303
-
12304
12364
  // scroll padding end is designed to always show half of the next row
12305
12365
  function getScrollPaddingEndOffset(table) {
12306
12366
  const tableMeta = table.options.meta;
@@ -12325,8 +12385,8 @@ function getPaddingEndOffset(table, options) {
12325
12385
  const bottomRows = (_table$getBottomRows = table.getBottomRows()) !== null && _table$getBottomRows !== void 0 ? _table$getBottomRows : [];
12326
12386
  return ROW_HEIGHT_ESTIMATES.medium * ((_options$virtualiserP = options === null || options === void 0 ? void 0 : options.virtualiserPaddingEndOffset) !== null && _options$virtualiserP !== void 0 ? _options$virtualiserP : 1) * bottomRows.length;
12327
12387
  }
12328
- function useTableRenderer(renderers, table, tableRef, defaultRowActiveIndex, options) {
12329
- var _table$getState$group, _table$getCenterRows, _virtualItems$padding, _virtualItems$padding2, _virtualItems$padding3, _ref, _virtualItems;
12388
+ function useTableRenderer(renderers, table, tableRef, length, defaultRowActiveIndex, options) {
12389
+ var _table$getState$group, _table$getCenterRows, _virtualItems$padding, _virtualItems$padding2, _virtualItems$padding3, _virtualItems$end, _virtualItems;
12330
12390
  const tableMeta = table.options.meta;
12331
12391
  const isTableRowGrouped = !!((_table$getState$group = table.getState().grouping) !== null && _table$getState$group !== void 0 && _table$getState$group.length);
12332
12392
  const rows = (_table$getCenterRows = table.getCenterRows()) !== null && _table$getCenterRows !== void 0 ? _table$getCenterRows : [];
@@ -12339,11 +12399,12 @@ function useTableRenderer(renderers, table, tableRef, defaultRowActiveIndex, opt
12339
12399
  const rangeExtractor = useRowGroupVirtualisation(table);
12340
12400
  // account for thead and tfoot in the scroll area - both are always medium row height
12341
12401
  const scrollPaddingStart = ROW_HEIGHT_ESTIMATES.medium;
12402
+ const count = tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2 ? length : rows.length;
12342
12403
  const virtualiser = reactVirtual.useVirtualizer({
12343
- count: rows.length,
12404
+ count,
12344
12405
  estimateSize,
12345
12406
  getScrollElement: () => tableRef.current,
12346
- overscan: tableMeta.printing.isPrinting ? rows.length : undefined,
12407
+ overscan: tableMeta.printing.isPrinting ? count : undefined,
12347
12408
  rangeExtractor,
12348
12409
  // correctly sets the scroll padding offset, e.g. when keyboard navigating rows in the list
12349
12410
  scrollPaddingStart,
@@ -12363,19 +12424,19 @@ function useTableRenderer(renderers, table, tableRef, defaultRowActiveIndex, opt
12363
12424
  if (tableRef.current) {
12364
12425
  if (index === 0) {
12365
12426
  virtualiser.scrollToOffset(0, notSmooth);
12366
- } else if (index === rows.length - 1) {
12427
+ } else if (index === count - 1) {
12367
12428
  // sometimes the last row doesn't fully show, so we just force scroll to the bottom
12368
12429
  tableRef.current.scrollTop = tableRef.current.scrollHeight;
12369
12430
  } else {
12370
12431
  virtualiser.scrollToIndex(index, options);
12371
12432
  }
12372
12433
  }
12373
- }, [virtualItems.length, tableRef.current, totalSize, rows.length]);
12434
+ }, [virtualItems.length, tableRef.current, totalSize, count]);
12374
12435
  // use row 1 not 0, because 0 might be sticky in grouped tables and it's start value will always be 0
12375
- const paddingStartIndex = isTableRowGrouped && rows.length > 1 ? 1 : 0;
12436
+ const paddingStartIndex = isTableRowGrouped && count > 1 ? 1 : 0;
12376
12437
  const startValue = isTableRowGrouped ? ((_virtualItems$padding = virtualItems[paddingStartIndex]) === null || _virtualItems$padding === void 0 ? void 0 : _virtualItems$padding.start) - ((_virtualItems$padding2 = virtualItems[paddingStartIndex]) === null || _virtualItems$padding2 === void 0 ? void 0 : _virtualItems$padding2.size) : (_virtualItems$padding3 = virtualItems[paddingStartIndex]) === null || _virtualItems$padding3 === void 0 ? void 0 : _virtualItems$padding3.start;
12377
12438
  // styling for offsetting rows - this "is" the virtualisation
12378
- const [paddingTop, paddingBottom] = virtualItems.length > 0 ? [Math.max(0, startValue !== null && startValue !== void 0 ? startValue : 0), Math.max(0, (_ref = totalSize - ((_virtualItems = virtualItems[virtualItems.length - 1]) === null || _virtualItems === void 0 ? void 0 : _virtualItems.end)) !== null && _ref !== void 0 ? _ref : 0)] : [0, 0];
12439
+ const [paddingTop, paddingBottom] = virtualItems.length > 0 ? [Math.max(0, startValue !== null && startValue !== void 0 ? startValue : 0), Math.max(0, totalSize - ((_virtualItems$end = (_virtualItems = virtualItems[virtualItems.length - 1]) === null || _virtualItems === void 0 ? void 0 : _virtualItems.end) !== null && _virtualItems$end !== void 0 ? _virtualItems$end : 0))] : [0, 0];
12379
12440
  // ensure default active rows are scrolled to
12380
12441
  React__default.useEffect(() => {
12381
12442
  if (defaultRowActiveIndex) {
@@ -12389,26 +12450,51 @@ function useTableRenderer(renderers, table, tableRef, defaultRowActiveIndex, opt
12389
12450
  let style = {};
12390
12451
  let content = null;
12391
12452
  // bottom rows aren't virtualised (they're sticky) but we need to set the height
12392
- if (rows.length || table.getBottomRows().length) {
12453
+ if (count || table.getBottomRows().length) {
12393
12454
  style = {
12394
12455
  height: totalSize,
12395
- paddingBottom,
12396
- paddingTop
12456
+ paddingBottom: isNaN(paddingBottom) ? 0 : paddingBottom,
12457
+ paddingTop: isNaN(paddingTop) ? 0 : paddingTop
12397
12458
  };
12398
12459
  }
12399
12460
  // only render non sticky rows
12400
- if (rows.length) {
12461
+ if (count) {
12401
12462
  content = virtualItems.map(virtualRow => {
12463
+ var _row, _virtualiser$scrollDi2;
12402
12464
  // there appears to be a react-virtual bug where it inserts a single `undefined` item at the end of the row, which crashes here
12403
12465
  if (!virtualRow) {
12404
12466
  return null;
12405
12467
  }
12406
- const row = rows[virtualRow.index];
12468
+ let row;
12469
+ if (tableMeta.server.isEnabled && tableMeta.server._experimentalDataLoader2) {
12470
+ var _tableMeta$server$pag, _tableMeta$server$pag2;
12471
+ const currentPageIndex = Math.floor(virtualRow.index / tableMeta.server.pageSize) * tableMeta.server.pageSize / tableMeta.server.pageSize;
12472
+ const pagePosition = (_tableMeta$server$pag = (_tableMeta$server$pag2 = tableMeta.server.pages) === null || _tableMeta$server$pag2 === void 0 ? void 0 : _tableMeta$server$pag2.indexOf(currentPageIndex)) !== null && _tableMeta$server$pag !== void 0 ? _tableMeta$server$pag : -1;
12473
+ if (pagePosition > -1) {
12474
+ // "flatten" row indexes down into the dataloader2 dataset size
12475
+ // for example, with a page size of 100...
12476
+ // row index 14267 is actually one of index 67, 167, 267 etc within the dataset (depending on number of pages stored)
12477
+ const fakeIndex = pagePosition * tableMeta.server.pageSize + virtualRow.index % tableMeta.server.pageSize;
12478
+ row = rows[fakeIndex];
12479
+ }
12480
+ } else {
12481
+ row = rows[virtualRow.index];
12482
+ }
12483
+ if (!((_row = row) !== null && _row !== void 0 && _row.original)) {
12484
+ var _virtualiser$scrollDi;
12485
+ return /*#__PURE__*/React__default.createElement(SkeletonRow, {
12486
+ key: virtualRow.index,
12487
+ index: virtualRow.index,
12488
+ scrollDirection: (_virtualiser$scrollDi = virtualiser.scrollDirection) !== null && _virtualiser$scrollDi !== void 0 ? _virtualiser$scrollDi : undefined,
12489
+ table: table
12490
+ });
12491
+ }
12407
12492
  const measureRow = createRowMeasurer(virtualiser.resizeItem, virtualRow);
12408
12493
  return /*#__PURE__*/React__default.createElement(Row, {
12409
12494
  key: row.id,
12410
12495
  row: row,
12411
12496
  index: virtualRow.index,
12497
+ scrollDirection: (_virtualiser$scrollDi2 = virtualiser.scrollDirection) !== null && _virtualiser$scrollDi2 !== void 0 ? _virtualiser$scrollDi2 : undefined,
12412
12498
  table: table,
12413
12499
  measureRow: measureRow,
12414
12500
  renderer: renderers.row,
@@ -12715,8 +12801,9 @@ function Header$4(context) {
12715
12801
  }
12716
12802
  const _temp = function () {
12717
12803
  if (tableMeta.server.loadAllIfNeeded) {
12804
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
12718
12805
  // don't pass the search query because we need all data - not filtered data
12719
- return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters)).then(function () {});
12806
+ return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters, hiddenColumns, tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined)).then(function () {});
12720
12807
  }
12721
12808
  }();
12722
12809
  // load all data if that is possible
@@ -12775,6 +12862,7 @@ function Cell$3(context) {
12775
12862
  if (event.shiftKey) {
12776
12863
  var _tableMeta$rowSelecti;
12777
12864
  function _temp4() {
12865
+ const selectedRows = table.getRowModel().rows.slice(fromIndex, toIndex + 1);
12778
12866
  table.setRowSelection(currentRowSelection => ({
12779
12867
  ...currentRowSelection,
12780
12868
  ...selectedRows.filter(row => row.getCanSelect()).reduce((state, row) => ({
@@ -12784,11 +12872,11 @@ function Cell$3(context) {
12784
12872
  }));
12785
12873
  }
12786
12874
  const [fromIndex, toIndex] = toggleBetween((_tableMeta$rowSelecti = tableMeta.rowSelection.lastSelectedRowIndex.current) !== null && _tableMeta$rowSelecti !== void 0 ? _tableMeta$rowSelecti : 0, rowIndex);
12787
- const selectedRows = table.getRowModel().rows.slice(fromIndex, toIndex + 1);
12788
12875
  const _temp3 = function () {
12789
- if (tableMeta.server.loadAllIfNeeded && selectedRows.some(row => row.original === undefined)) {
12876
+ if (tableMeta.server.loadAllIfNeeded) {
12877
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
12790
12878
  // don't pass the search query because we need all data - not filtered data
12791
- return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters)).then(function () {});
12879
+ return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters, hiddenColumns, tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined)).then(function () {});
12792
12880
  }
12793
12881
  }();
12794
12882
  return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
@@ -12846,7 +12934,7 @@ function useTable(props, externalRef, renderers, meta, options) {
12846
12934
  // configure the table
12847
12935
  const manager = useTableManager(props, meta, INTERNAL_RENDERERS);
12848
12936
  // configure the virtualised renderer
12849
- const renderer = useTableRenderer(renderers, manager.instance, ref, props.defaultRowActiveIndex, options);
12937
+ const renderer = useTableRenderer(renderers, manager.instance, ref, manager.meta.length, props.defaultRowActiveIndex, options);
12850
12938
  // configure dynamic styling
12851
12939
  const {
12852
12940
  style,
@@ -13914,21 +14002,22 @@ function Summary(props) {
13914
14002
  locale,
13915
14003
  texts
13916
14004
  } = useLocalization();
13917
- const length = table.options.meta.length;
14005
+ const tableMeta = table.options.meta;
14006
+ const length = tableMeta.length;
13918
14007
  const currentLength = table.getRowModel().rows.length;
13919
14008
  let label;
13920
14009
  let count;
13921
14010
  // row selection
13922
- const rowsSelectedLength = table.getSelectedRowModel().rows.length;
14011
+ // use table state and not the selected row model because of the way server loading works
14012
+ const rowsSelectedLength = Object.keys(table.getState().rowSelection).length;
13923
14013
  if (rowsSelectedLength > 0) {
13924
14014
  label = texts.table.footer.summary.selected;
13925
14015
  count = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("strong", null, new Intl.NumberFormat(locale).format(rowsSelectedLength)), "\u00A0", texts.table.footer.summary.count, "\u00A0", /*#__PURE__*/React__default.createElement("strong", null, new Intl.NumberFormat(locale).format(length)));
13926
- } else if ((_table$getState$colum = table.getState().columnFilters) !== null && _table$getState$colum !== void 0 && _table$getState$colum.length ||
14016
+ } else if (!tableMeta.server.isEnabled && ((_table$getState$colum = table.getState().columnFilters) !== null && _table$getState$colum !== void 0 && _table$getState$colum.length ||
13927
14017
  // filtered data
13928
- !!table.getState().globalFilter && table.options.enableGlobalFilter // search with hide enabled
13929
- ) {
14018
+ !!table.getState().globalFilter && table.options.enableGlobalFilter)) {
13930
14019
  label = texts.table.footer.summary.records;
13931
- count = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("strong", null, currentLength), "\u00A0", texts.table.footer.summary.count, "\u00A0", /*#__PURE__*/React__default.createElement("strong", null, new Intl.NumberFormat(locale).format(length)));
14020
+ count = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("strong", null, new Intl.NumberFormat(locale).format(currentLength)), "\u00A0", texts.table.footer.summary.count, "\u00A0", /*#__PURE__*/React__default.createElement("strong", null, new Intl.NumberFormat(locale).format(length)));
13932
14021
  } else {
13933
14022
  label = texts.table.footer.summary.records;
13934
14023
  count = /*#__PURE__*/React__default.createElement("strong", null, new Intl.NumberFormat(locale).format(length));
@@ -14035,6 +14124,7 @@ const SearchInput2 = /*#__PURE__*/React__default.forwardRef(function SearchInput
14035
14124
  onClickFindPrevious: handleClickFindPrevious,
14036
14125
  settingsContent,
14037
14126
  shortcut,
14127
+ showTotal = true,
14038
14128
  value,
14039
14129
  ...attributes
14040
14130
  } = props;
@@ -14113,10 +14203,12 @@ const SearchInput2 = /*#__PURE__*/React__default.forwardRef(function SearchInput
14113
14203
  }
14114
14204
  if (hasFind && isActive) {
14115
14205
  postfix = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("span", {
14116
- className: "text-grey-700 flex h-4 items-center border-r border-black/[0.25] pr-2"
14117
- }, loading ? /*#__PURE__*/React__default.createElement(Spinner, {
14206
+ className: "text-grey-700 flex h-4 items-center"
14207
+ }, loading ? (/*#__PURE__*/React__default.createElement(Spinner, {
14118
14208
  className: "h-4 w-4"
14119
- }) : `${findCurrent !== null && findCurrent !== void 0 ? findCurrent : 0}/${findTotal !== null && findTotal !== void 0 ? findTotal : 0}`), findCurrent ? (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(IconButton, {
14209
+ })) : showTotal ? (/*#__PURE__*/React__default.createElement("span", {
14210
+ className: "border-r border-black/[0.25] pr-2"
14211
+ }, `${findCurrent !== null && findCurrent !== void 0 ? findCurrent : 0}/${findTotal !== null && findTotal !== void 0 ? findTotal : 0}`)) : null), findCurrent ? (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(IconButton, {
14120
14212
  "aria-label": texts.searchInput.findPrevious,
14121
14213
  className: "scale-75 !bg-transparent hover:!bg-black/[0.08] [&>svg]:scale-125",
14122
14214
  icon: "chevron-up",
@@ -14220,6 +14312,7 @@ function Search$1(props) {
14220
14312
  const scrollTo = rowIndex => scrollToIndex(rowIndex, {
14221
14313
  align: 'center'
14222
14314
  });
14315
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
14223
14316
  React__default.useEffect(() => {
14224
14317
  if (tableMeta.search.highlightedColumnIndexes.length) {
14225
14318
  scrollTo(tableMeta.search.highlightedColumnIndexes[0][0]);
@@ -14228,9 +14321,11 @@ function Search$1(props) {
14228
14321
  const handleFocus = function () {
14229
14322
  try {
14230
14323
  const _temp = function () {
14231
- if (tableMeta.server.loadAllIfNeeded) {
14324
+ if (tableMeta.server.loadAllIfNeeded && !tableMeta.server._experimentalDataLoader2) {
14232
14325
  // don't pass the search query because we need all data - not filtered data
14233
- return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters)).then(function () {});
14326
+ return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters, hiddenColumns,
14327
+ // the old data loader doesn't have server side search
14328
+ undefined)).then(function () {});
14234
14329
  }
14235
14330
  }();
14236
14331
  // load all data if that is possible
@@ -14239,8 +14334,20 @@ function Search$1(props) {
14239
14334
  return Promise.reject(e);
14240
14335
  }
14241
14336
  };
14337
+ const [loading, setLoading] = React__default.useState(false);
14338
+ const searchTimeoutRef = React__default.useRef();
14242
14339
  const handleChange = query => {
14243
14340
  table.setGlobalFilter(String(query !== null && query !== void 0 ? query : ''));
14341
+ if (tableMeta.search.enableGlobalFilter && tableMeta.search.handleSearch) {
14342
+ clearTimeout(searchTimeoutRef.current);
14343
+ searchTimeoutRef.current = setTimeout(() => {
14344
+ var _tableMeta$search$han, _tableMeta$search;
14345
+ setLoading(true);
14346
+ (_tableMeta$search$han = (_tableMeta$search = tableMeta.search).handleSearch) === null || _tableMeta$search$han === void 0 ? void 0 : _tableMeta$search$han.call(_tableMeta$search, query, hiddenColumns).then(() => {
14347
+ setLoading(false);
14348
+ });
14349
+ }, 150);
14350
+ }
14244
14351
  };
14245
14352
  const handleToggleExcludeUnmatchedResults = enabled => {
14246
14353
  tableMeta.search.setEnableGlobalFilter(enabled, table);
@@ -14248,6 +14355,12 @@ function Search$1(props) {
14248
14355
  var _ref$current;
14249
14356
  return (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.focus();
14250
14357
  });
14358
+ if (tableMeta.search.handleSearch) {
14359
+ setLoading(true);
14360
+ tableMeta.search.handleSearch(enabled ? query : undefined, hiddenColumns).then(() => {
14361
+ setLoading(false);
14362
+ });
14363
+ }
14251
14364
  };
14252
14365
  const handleNextResult = () => {
14253
14366
  if (!tableMeta.search.highlightedColumnIndexes.length) {
@@ -14291,7 +14404,7 @@ function Search$1(props) {
14291
14404
  return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(SearchInput2, {
14292
14405
  findCurrent: tableMeta.search.currentHighlightColumnIndex !== undefined ? tableMeta.search.currentHighlightColumnIndex + 1 : null,
14293
14406
  findTotal: (_tableMeta$search$hig = (_tableMeta$search$hig2 = tableMeta.search.highlightedColumnIndexes) === null || _tableMeta$search$hig2 === void 0 ? void 0 : _tableMeta$search$hig2.length) !== null && _tableMeta$search$hig !== void 0 ? _tableMeta$search$hig : null,
14294
- loading: tableMeta.server.loading,
14407
+ loading: tableMeta.server._experimentalDataLoader2 ? loading : tableMeta.server.loading,
14295
14408
  name: "table-search",
14296
14409
  onClickFindPrevious: handlePreviousResult,
14297
14410
  onClickFindNext: handleNextResult,
@@ -14306,6 +14419,7 @@ function Search$1(props) {
14306
14419
  meta: true,
14307
14420
  shift: false
14308
14421
  },
14422
+ showTotal: !tableMeta.server._experimentalDataLoader2,
14309
14423
  value: query
14310
14424
  }));
14311
14425
  }
@@ -16392,8 +16506,9 @@ function Print$1(props) {
16392
16506
  const toastRef = toast.loading(texts.table.print.loading);
16393
16507
  const _temp2 = function () {
16394
16508
  if (tableMeta.server.isEnabled && tableMeta.server.loadAllIfNeeded) {
16509
+ const hiddenColumns = getHiddenColumns(table.getState().columnVisibility);
16395
16510
  const _temp = _catch(function () {
16396
- return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters)).then(function () {});
16511
+ return Promise.resolve(tableMeta.server.loadAllIfNeeded(table.getState().sorting, table.getState().columnFilters, hiddenColumns, tableMeta.search.enableGlobalFilter ? table.getState().globalFilter : undefined)).then(function () {});
16397
16512
  }, function (error) {
16398
16513
  const errorMessage = `${texts.table.print.error}: ${error}`;
16399
16514
  console.error(errorMessage);
@@ -18759,18 +18874,21 @@ function useTableEditingListener(table, tableRef, scrollToIndex) {
18759
18874
  document.addEventListener('click', onClickOutside);
18760
18875
  return () => document.removeEventListener('click', onClickOutside);
18761
18876
  }, [tableMeta.editing.isEditing, tableMeta.editing.saveChanges]);
18762
- const rows = table.getRowModel().rows;
18763
- // make sure pending changes are removed for rows that no longer exist
18764
- useLazyEffect(() => {
18765
- const pendingChanges = tableMeta.editing.getErrorsShownInAlert();
18766
- pendingChanges.forEach(pendingChange => {
18767
- try {
18768
- table.getRow(pendingChange.rowId);
18769
- } catch {
18770
- tableMeta.editing.discardChanges(pendingChange.rowId, table);
18771
- }
18772
- });
18773
- }, [rows.length]);
18877
+ /*
18878
+ const rows = table.getRowModel().rows;
18879
+ // make sure pending changes are removed for rows that no longer exist
18880
+ useLazyEffect(() => {
18881
+ const pendingChanges = tableMeta.editing.getErrorsShownInAlert();
18882
+ pendingChanges.forEach(pendingChange => {
18883
+ try {
18884
+ table.getRow(pendingChange.rowId);
18885
+ } catch {
18886
+ // TODO: this has the potential to remove changes for "unloaded" rows in server loading
18887
+ //tableMeta.editing.discardChanges(pendingChange.rowId, table);
18888
+ }
18889
+ });
18890
+ }, [rows.length]);
18891
+ */
18774
18892
  // shortcuts
18775
18893
  useGlobalKeyDown(tableMeta.editing.isEnabled ? shortcut : undefined, event => {
18776
18894
  event.preventDefault();
@@ -18798,6 +18916,7 @@ function reducer$2(state, action) {
18798
18916
  {
18799
18917
  const {
18800
18918
  columnId,
18919
+ index,
18801
18920
  row,
18802
18921
  value
18803
18922
  } = payload;
@@ -18807,7 +18926,8 @@ function reducer$2(state, action) {
18807
18926
  ...state.changes,
18808
18927
  rows: setWith(state.changes.rows, `${rowId}.${columnId}`, value, Object),
18809
18928
  originals: setWith(state.changes.originals, rowId, row, Object)
18810
- }
18929
+ },
18930
+ indexes: setWith(state.indexes, rowId, index, Object)
18811
18931
  };
18812
18932
  }
18813
18933
  case 'removeCellValue':
@@ -18841,6 +18961,7 @@ function reducer$2(state, action) {
18841
18961
  {
18842
18962
  const {
18843
18963
  cellErrors,
18964
+ index,
18844
18965
  moveReasons,
18845
18966
  original,
18846
18967
  value
@@ -18855,7 +18976,8 @@ function reducer$2(state, action) {
18855
18976
  moveReasons: setWith(state.changes.moveReasons, rowId, moveReasons !== null && moveReasons !== void 0 ? moveReasons : state.changes.moveReasons[rowId], Object),
18856
18977
  // status can be undefined, so don't use ??
18857
18978
  status: setWith(state.changes.status, rowId, undefined, Object)
18858
- }
18979
+ },
18980
+ indexes: setWith(state.indexes, rowId, index, Object)
18859
18981
  };
18860
18982
  }
18861
18983
  case 'removeRow':
@@ -18873,6 +18995,7 @@ function reducer$2(state, action) {
18873
18995
  originals: omit(state.changes.originals, rowId),
18874
18996
  status: omit(state.changes.status, rowId)
18875
18997
  },
18998
+ indexes: omit(state.indexes, rowId),
18876
18999
  temporaryRows: state.temporaryRows.filter(row => row[rowIdentityAccessor] !== rowId)
18877
19000
  };
18878
19001
  }
@@ -18905,6 +19028,7 @@ function reducer$2(state, action) {
18905
19028
  case 'insertTemporaryRow':
18906
19029
  {
18907
19030
  const {
19031
+ index,
18908
19032
  value
18909
19033
  } = payload;
18910
19034
  return {
@@ -18914,14 +19038,36 @@ function reducer$2(state, action) {
18914
19038
  ...state.changes,
18915
19039
  rows: setWith(state.changes.rows, rowId, value, Object),
18916
19040
  originals: setWith(state.changes.originals, rowId, value, Object)
18917
- }
19041
+ },
19042
+ indexes: setWith(state.indexes, rowId, index, Object)
18918
19043
  };
18919
19044
  }
18920
19045
  default:
18921
19046
  return state;
18922
19047
  }
18923
19048
  }
18924
- function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, validator) {
19049
+ function usePendingChangesState(handleSave, handleChange, handleDiscard, rowIdentityAccessor, validator) {
19050
+ const discardChanges = function (rowId, table) {
19051
+ try {
19052
+ // remove any new rows from pinned state before discarding them
19053
+ table.resetRowPinning(true);
19054
+ dispatch({
19055
+ type: 'removeRow',
19056
+ rowId,
19057
+ payload: {
19058
+ rowIdentityAccessor
19059
+ }
19060
+ });
19061
+ const _temp8 = function () {
19062
+ if (typeof handleDiscard === 'function') {
19063
+ return Promise.resolve(handleDiscard()).then(function () {});
19064
+ }
19065
+ }();
19066
+ return Promise.resolve(_temp8 && _temp8.then ? _temp8.then(function () {}) : void 0);
19067
+ } catch (e) {
19068
+ return Promise.reject(e);
19069
+ }
19070
+ };
18925
19071
  const saveChanges = function (table, rowId = undefined) {
18926
19072
  try {
18927
19073
  let _exit = false;
@@ -18934,19 +19080,20 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
18934
19080
  [rowId]: state.changes.rows[rowId]
18935
19081
  } : state.changes.rows;
18936
19082
  let completed = true;
18937
- const _temp9 = _forOf(Object.keys(changes), function (rowId) {
19083
+ const _temp7 = _forOf(Object.keys(changes), function (rowId) {
18938
19084
  const status = getRowStatus(rowId);
18939
19085
  return _catch(function () {
18940
19086
  var _changes$rowId;
18941
- function _temp8(_result) {
19087
+ function _temp6(_result) {
18942
19088
  return _exit ? _result : Promise.resolve(handleSave(changeSet)).then(function () {
18943
19089
  // cleanup changes, we don't need them after saving
18944
- discardChanges(rowId, table);
18945
- // show the saved status, then remove it after a delay
18946
- setRowStatus(rowId, 'saved');
18947
- setTimeout(() => {
18948
- setRowStatus(rowId, undefined);
18949
- }, DELAY_BEFORE_REMOVING_SAVE_STATUS);
19090
+ return Promise.resolve(discardChanges(rowId, table)).then(function () {
19091
+ // show the saved status, then remove it after a delay
19092
+ setRowStatus(rowId, 'saved');
19093
+ setTimeout(() => {
19094
+ setRowStatus(rowId, undefined);
19095
+ }, DELAY_BEFORE_REMOVING_SAVE_STATUS);
19096
+ });
18950
19097
  });
18951
19098
  }
18952
19099
  const rowChanges = (_changes$rowId = changes[rowId]) !== null && _changes$rowId !== void 0 ? _changes$rowId : {};
@@ -18964,7 +19111,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
18964
19111
  delete changeSet[rowIdentityAccessor];
18965
19112
  }
18966
19113
  // re-run validation, maybe a cell is already invalid but has never been blurred
18967
- const _temp7 = function () {
19114
+ const _temp5 = function () {
18968
19115
  if (validator) {
18969
19116
  return Promise.resolve(validator(changeSet)).then(function (errors) {
18970
19117
  if (errors && Object.keys(errors).length) {
@@ -18973,7 +19120,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
18973
19120
  });
18974
19121
  }
18975
19122
  }();
18976
- return _temp7 && _temp7.then ? _temp7.then(_temp8) : _temp8(_temp7); // send new data to the server
19123
+ return _temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5); // send new data to the server
18977
19124
  }, function (error) {
18978
19125
  var _error$response;
18979
19126
  if (error instanceof ReferenceError || error instanceof TypeError || (error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) >= 500) {
@@ -19013,18 +19160,18 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19013
19160
  }, function () {
19014
19161
  return _exit;
19015
19162
  });
19016
- return Promise.resolve(_temp9 && _temp9.then ? _temp9.then(function (_result3) {
19163
+ return Promise.resolve(_temp7 && _temp7.then ? _temp7.then(function (_result3) {
19017
19164
  return _exit ? _result3 : completed;
19018
- }) : _exit ? _temp9 : completed);
19165
+ }) : _exit ? _temp7 : completed);
19019
19166
  } catch (e) {
19020
19167
  return Promise.reject(e);
19021
19168
  }
19022
19169
  };
19023
19170
  const onCellChanged = function (cell, rowIndex, nextValue, shouldRunUpdaters = true) {
19024
19171
  try {
19025
- function _temp6() {
19172
+ function _temp4() {
19026
19173
  var _state$changes$errors11;
19027
- function _temp4() {
19174
+ function _temp2() {
19028
19175
  // only set errors and move reasons for the cells we're currently acting on
19029
19176
  // why? because the UX is not good if we set them for cells the user hasn't touched yet
19030
19177
  const cellsToActOn = [cell.column.id, ...Object.keys(updatesForOtherCells)];
@@ -19055,6 +19202,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19055
19202
  rowId: cell.row.id,
19056
19203
  payload: {
19057
19204
  cellErrors: nextCellErrors,
19205
+ index: rowIndex,
19058
19206
  moveReasons: nextMoveReasons,
19059
19207
  value: nextChanges
19060
19208
  }
@@ -19073,7 +19221,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19073
19221
  };
19074
19222
  // run validation - if there are changes, and if there is an original stored
19075
19223
  let validationErrors = {};
19076
- const _temp3 = function () {
19224
+ const _temp = function () {
19077
19225
  if (validator && Object.keys(nextChanges).length && state.changes.originals[cell.row.id]) {
19078
19226
  // merge with the original so we get a full row
19079
19227
  const nextRowValue = {
@@ -19081,12 +19229,12 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19081
19229
  ...changes,
19082
19230
  ...updatesForOtherCells
19083
19231
  };
19084
- return Promise.resolve(validator(nextRowValue)).then(function (_validator2) {
19085
- validationErrors = _validator2 !== null && _validator2 !== void 0 ? _validator2 : {};
19232
+ return Promise.resolve(validator(nextRowValue)).then(function (_validator) {
19233
+ validationErrors = _validator !== null && _validator !== void 0 ? _validator : {};
19086
19234
  });
19087
19235
  }
19088
19236
  }();
19089
- return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
19237
+ return _temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp);
19090
19238
  }
19091
19239
  const changes = nextValue !== undefined ? {
19092
19240
  ...state.changes.rows[cell.row.id],
@@ -19099,7 +19247,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19099
19247
  }
19100
19248
  let updatesForOtherCells = {};
19101
19249
  // run the updater handler if there is one, to see if there are any other cells to update
19102
- const _temp5 = function () {
19250
+ const _temp3 = function () {
19103
19251
  if (typeof handleChange === 'function' && shouldRunUpdaters) {
19104
19252
  const previousRowValue = {
19105
19253
  ...state.changes.originals[cell.row.id]
@@ -19113,42 +19261,11 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19113
19261
  });
19114
19262
  }
19115
19263
  }();
19116
- return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5));
19264
+ return Promise.resolve(_temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3));
19117
19265
  } catch (e) {
19118
19266
  return Promise.reject(e);
19119
19267
  }
19120
19268
  }; // general
19121
- // rows
19122
- const setRowValue = function (rowId, original, value) {
19123
- try {
19124
- function _temp2() {
19125
- dispatch({
19126
- type: 'updateRow',
19127
- rowId,
19128
- payload: {
19129
- cellErrors,
19130
- original,
19131
- value
19132
- }
19133
- });
19134
- }
19135
- let cellErrors;
19136
- const _temp = function () {
19137
- if (validator) {
19138
- const row = {
19139
- ...original,
19140
- ...value
19141
- };
19142
- return Promise.resolve(validator(row)).then(function (_validator) {
19143
- cellErrors = _validator !== null && _validator !== void 0 ? _validator : {};
19144
- });
19145
- }
19146
- }();
19147
- return Promise.resolve(_temp && _temp.then ? _temp.then(_temp2) : _temp2(_temp));
19148
- } catch (e) {
19149
- return Promise.reject(e);
19150
- }
19151
- };
19152
19269
  const localization = useLocalization();
19153
19270
  const [state, dispatch] = React__default.useReducer(reducer$2, {
19154
19271
  changes: {
@@ -19158,8 +19275,10 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19158
19275
  originals: {},
19159
19276
  status: {}
19160
19277
  },
19278
+ indexes: {},
19161
19279
  temporaryRows: []
19162
19280
  });
19281
+ // rows
19163
19282
  function getRowValue(rowId) {
19164
19283
  var _state$changes$rows$r, _state$changes$rows;
19165
19284
  return (_state$changes$rows$r = (_state$changes$rows = state.changes.rows) === null || _state$changes$rows === void 0 ? void 0 : _state$changes$rows[rowId]) !== null && _state$changes$rows$r !== void 0 ? _state$changes$rows$r : undefined;
@@ -19197,7 +19316,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19197
19316
  }
19198
19317
  });
19199
19318
  }
19200
- function insertTemporaryRow(data) {
19319
+ function insertTemporaryRow(data, rowIndex) {
19201
19320
  const newRowId = `${TEMPORARY_ROW_ID_PREFIX}${uuid.v4()}`;
19202
19321
  const value = {
19203
19322
  ...data,
@@ -19207,13 +19326,14 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19207
19326
  type: 'insertTemporaryRow',
19208
19327
  rowId: newRowId,
19209
19328
  payload: {
19329
+ index: rowIndex,
19210
19330
  value
19211
19331
  }
19212
19332
  });
19213
19333
  return newRowId;
19214
19334
  }
19215
19335
  // cells
19216
- function setCellValue(cell, value) {
19336
+ function setCellValue(cell, rowIndex, value) {
19217
19337
  const rowId = cell.row.id;
19218
19338
  const columnId = cell.column.id;
19219
19339
  // update if the change is different to the original value
@@ -19223,6 +19343,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19223
19343
  rowId,
19224
19344
  payload: {
19225
19345
  columnId,
19346
+ index: rowIndex,
19226
19347
  row: cell.row.original,
19227
19348
  value
19228
19349
  }
@@ -19255,6 +19376,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19255
19376
  }
19256
19377
  return rowsWithErrors.filter(hasRowErrorsShownInAlert).map(rowId => ({
19257
19378
  rowId,
19379
+ index: state.indexes[rowId],
19258
19380
  changes: state.changes.rows[rowId],
19259
19381
  errors: state.changes.errors[rowId]
19260
19382
  }));
@@ -19265,20 +19387,8 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19265
19387
  function hasChanges(rowId) {
19266
19388
  return rowId ? !!state.changes.rows[rowId] : !!Object.keys(state.changes.rows).length;
19267
19389
  }
19268
- function discardChanges(rowId, table) {
19269
- // remove any new rows from pinned state before discarding them
19270
- table.resetRowPinning(true);
19271
- dispatch({
19272
- type: 'removeRow',
19273
- rowId,
19274
- payload: {
19275
- rowIdentityAccessor
19276
- }
19277
- });
19278
- }
19279
19390
  return {
19280
19391
  // row
19281
- setRowValue,
19282
19392
  getRowValue,
19283
19393
  getRowMoveReason,
19284
19394
  hasRowErrors,
@@ -19303,7 +19413,7 @@ function usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, v
19303
19413
  };
19304
19414
  }
19305
19415
 
19306
- function useTableEditing(isEnabled = false, handleSave, handleChange, handleCreate, rowIdentityAccessor, validator) {
19416
+ function useTableEditing(isEnabled = false, handleSave, handleChange, handleCreate, handleDiscard, rowIdentityAccessor, validator) {
19307
19417
  const createRow = function (table, scrollToIndex, row) {
19308
19418
  try {
19309
19419
  let _exit = false;
@@ -19312,17 +19422,24 @@ function useTableEditing(isEnabled = false, handleSave, handleChange, handleCrea
19312
19422
  const changeset = row !== null && row !== void 0 ? row : handleCreate();
19313
19423
  try {
19314
19424
  if (changeset) {
19315
- const newRowId = pendingChangesFns.insertTemporaryRow(changeset);
19316
- // reset before changing row otherwise the cell changes and validation might run
19317
- setLastFocusedCellIndex(undefined);
19318
19425
  // set the active row to the new row before toggling editing on
19319
19426
  const temporaryRows = tableMeta.editing.temporaryRows;
19320
19427
  const nextRowIndex = temporaryRows.length ? tableMeta.length + 1 : tableMeta.length;
19428
+ const newRowId = pendingChangesFns.insertTemporaryRow(changeset, nextRowIndex);
19429
+ // reset before changing row otherwise the cell changes and validation might run
19430
+ setLastFocusedCellIndex(undefined);
19431
+ // set the active row to the new row before toggling editing on
19321
19432
  tableMeta.rowActive.setRowActiveIndex(nextRowIndex);
19322
19433
  // wait until set states have run
19323
19434
  requestAnimationFrame(() => {
19324
19435
  toggleEditing(true, table, scrollToIndex, false);
19325
- table.getRow(newRowId).pin('bottom');
19436
+ table.setRowPinning(currentState => {
19437
+ var _ref, _currentState$bottom;
19438
+ return {
19439
+ ...currentState,
19440
+ bottom: (_ref = (_currentState$bottom = currentState.bottom) !== null && _currentState$bottom !== void 0 ? _currentState$bottom : []) === null || _ref === void 0 ? void 0 : _ref.concat(newRowId)
19441
+ };
19442
+ });
19326
19443
  });
19327
19444
  }
19328
19445
  } catch (error) {
@@ -19356,7 +19473,7 @@ function useTableEditing(isEnabled = false, handleSave, handleChange, handleCrea
19356
19473
  const createRowButtonRef = React__default.useRef(null);
19357
19474
  // store the last focused cell, so that up/down arrow key navigation remains in the same column
19358
19475
  const [lastFocusedCellIndex, setLastFocusedCellIndex] = React__default.useState(undefined);
19359
- const pendingChangesFns = usePendingChangesState(handleSave, handleChange, rowIdentityAccessor, validator);
19476
+ const pendingChangesFns = usePendingChangesState(handleSave, handleChange, handleDiscard, rowIdentityAccessor, validator);
19360
19477
  function toggleEditing(enabled, table, scrollToIndex, doSave = true) {
19361
19478
  const tableMeta = table.options.meta;
19362
19479
  if (enabled) {
@@ -19646,7 +19763,7 @@ function EditingControlCell(props) {
19646
19763
  }, [cellRef.current]);
19647
19764
  const handleChange = React__default.useCallback(nextValue => {
19648
19765
  if (nextValue !== value) {
19649
- tableMeta.editing.setCellValue(cell, nextValue);
19766
+ tableMeta.editing.setCellValue(cell, rowIndex, nextValue);
19650
19767
  if (hasNonTextControl) {
19651
19768
  requestAnimationFrame(() => tableMeta.editing.onCellChanged(cell, rowIndex, nextValue));
19652
19769
  }
@@ -20067,7 +20184,7 @@ const RENDERERS$1 = {
20067
20184
  cell: Cell$5
20068
20185
  };
20069
20186
  function useTable3(props, ref) {
20070
- const editing = useTableEditing(props.enableEditing, props.onEditingSave, props.onEditingChange, props.onEditingCreate, props.rowIdentityAccessor, props.validator);
20187
+ const editing = useTableEditing(props.enableEditing, props.onEditingSave, props.onEditingChange, props.onEditingCreate, props.onEditingDiscard, props.rowIdentityAccessor, props.validator);
20071
20188
  const creationEnabled = editing.isEnabled && !!props.onEditingCreate;
20072
20189
  // this gives me the performance heeby jeebies, but can't think of a better way to internalise the state
20073
20190
  const data = React__default.useMemo(() => {
@@ -20164,20 +20281,22 @@ function Alert$1(props) {
20164
20281
  // table.getColumn(columName) throw error in strict dev mode. Related thread: https://github.com/TanStack/table/discussions/5505
20165
20282
  table.getAllColumns().find(x => x.id === String(tableMeta.rowIdentityAccessor)) : undefined;
20166
20283
  pendingChangesWithErrors.forEach((pendingChangeWithError, index) => {
20284
+ var _row;
20167
20285
  // if appropriate, concatenate the item with the text "and"
20168
20286
  if (pendingChangesWithErrors.length > 1 && index === pendingChangesWithErrors.length - 1) {
20169
20287
  // Add space before and after `messageAnd` text
20170
20288
  links.push(` ${validationTexts.alert.messageAnd} `);
20171
20289
  }
20172
- const rowIndex = table.getRowModel().rows.findIndex(row => row.id === pendingChangeWithError.rowId);
20290
+ // note: if this row click functionality is removed, indexes can be removed from useEditingState
20173
20291
  const handleClick = () => {
20174
20292
  // if row is visible
20175
- if (rowIndex > -1) {
20176
- scrollToRow(rowIndex);
20293
+ if (pendingChangeWithError.index > -1) {
20294
+ scrollToRow(pendingChangeWithError.index);
20295
+ tableMeta.rowActive.setRowActiveIndex(pendingChangeWithError.index);
20177
20296
  }
20178
20297
  // if row is filtered out
20179
20298
  else {
20180
- setShowFilterResetDialog(pendingChangeWithError.rowId);
20299
+ setShowFilterResetDialog(pendingChangeWithError.index);
20181
20300
  }
20182
20301
  };
20183
20302
  let tooltip;
@@ -20189,7 +20308,12 @@ function Alert$1(props) {
20189
20308
  const columnName = (_table$getAllColumns$ = table.getAllColumns().find(column => column.id === firstCellErrorColumnId)) === null || _table$getAllColumns$ === void 0 ? void 0 : (_table$getAllColumns$2 = _table$getAllColumns$.columnDef.meta) === null || _table$getAllColumns$2 === void 0 ? void 0 : _table$getAllColumns$2.header;
20190
20309
  tooltip = `${columnName}: ${pendingChangeWithError.errors.cells[firstCellErrorColumnId]}`;
20191
20310
  }
20192
- const row = table.getRow(pendingChangeWithError.rowId).original;
20311
+ let row;
20312
+ try {
20313
+ row = table.getRow(pendingChangeWithError.rowId).original;
20314
+ } catch {
20315
+ // because of server loading, some rows may not be accessible
20316
+ }
20193
20317
  links.push(/*#__PURE__*/React__default.createElement(Tooltip, {
20194
20318
  key: pendingChangeWithError.rowId,
20195
20319
  title: tooltip
@@ -20197,7 +20321,7 @@ function Alert$1(props) {
20197
20321
  className: "text-blue",
20198
20322
  onClick: handleClick,
20199
20323
  role: "button"
20200
- }, rowIdentityColumn ? row[rowIdentityColumn.id] : rowIndex + 1)));
20324
+ }, rowIdentityColumn ? (_row = row) === null || _row === void 0 ? void 0 : _row[rowIdentityColumn.id] : pendingChangeWithError.index + 1)));
20201
20325
  // if appropriate, concatenate the item with the text ","
20202
20326
  if (pendingChangesWithErrors.length > 2 && index < pendingChangesWithErrors.length - 2) {
20203
20327
  links.push(', ');
@@ -20218,9 +20342,8 @@ function Alert$1(props) {
20218
20342
  table.resetGlobalFilter();
20219
20343
  table.resetColumnFilters();
20220
20344
  requestAnimationFrame(() => {
20221
- const rowIndex = table.getRowModel().rows.findIndex(row => row.id === showFilterResetDialog);
20222
- if (rowIndex > -1) {
20223
- scrollToRow(rowIndex);
20345
+ if (showFilterResetDialog && showFilterResetDialog > -1) {
20346
+ scrollToRow(showFilterResetDialog);
20224
20347
  }
20225
20348
  setShowFilterResetDialog(false);
20226
20349
  });
@@ -20301,7 +20424,9 @@ function CreateNewRow(props) {
20301
20424
  if (isDisabled) {
20302
20425
  return Promise.resolve();
20303
20426
  }
20304
- return Promise.resolve(tableMeta.editing.createRow(table, scrollToIndex)).then(function () {});
20427
+ return Promise.resolve(tableMeta.editing.createRow(table, scrollToIndex)).then(function () {
20428
+ table.resetRowSelection();
20429
+ });
20305
20430
  } catch (e) {
20306
20431
  return Promise.reject(e);
20307
20432
  }
@@ -20320,7 +20445,7 @@ function CreateNewRow(props) {
20320
20445
  keys: shortcut
20321
20446
  });
20322
20447
  }
20323
- const className = cn('group/row border-grey-300 !sticky z-[21]', {
20448
+ const className = cn('group/row border-grey-300 !sticky z-[21] print:hidden', {
20324
20449
  'bottom-10': tableMeta.footer.isEnabled,
20325
20450
  'bottom-0': !tableMeta.footer.isEnabled,
20326
20451
  'border-b': !isScrolled
@@ -20410,7 +20535,7 @@ function TemporaryRow(props) {
20410
20535
  }
20411
20536
  }
20412
20537
  };
20413
- const className = cn('group/row border-grey-300 !sticky z-[22]', {
20538
+ const className = cn('group/row border-grey-300 !sticky z-[22] print:hidden', {
20414
20539
  'bottom-[calc(5rem_+_2px)] data-[row-editing-move]:bottom-[calc(5rem_+_2px)]': tableMeta.footer.isEnabled,
20415
20540
  'bottom-[calc(2.5rem_+_2px)] data-[row-editing-move]:bottom-[calc(2.5rem_+_2px)]': !tableMeta.footer.isEnabled,
20416
20541
  'border-t-2 shadow-[0px_-5px_20px_0px_rgba(0,0,0,0.1)] [&>td]:!border-b-0': isScrolled
@@ -20427,7 +20552,8 @@ function TemporaryRow(props) {
20427
20552
  onKeyDown: handleKeyDown,
20428
20553
  onKeyDownCapture: handleKeyDownCapture,
20429
20554
  hideInternalColumns: true,
20430
- hideRowActions: !tableMeta.editing.isEditing
20555
+ hideRowActions: !tableMeta.editing.isEditing,
20556
+ skipPageLoading: true
20431
20557
  }))));
20432
20558
  }
20433
20559
 
@@ -22216,6 +22342,222 @@ Navigation2.Link = Link$3;
22216
22342
  Navigation2.Section = Section;
22217
22343
  Navigation2.Content = Content$a;
22218
22344
 
22345
+ const DATASET_SIZE_MULTIPLIER = 15;
22346
+ function useTableDataLoader2(fetchPage, fetchAll, options = {
22347
+ pageSize: DEFAULT_PAGE_SIZE
22348
+ }) {
22349
+ const loadPage = function (pageIndex, sorting, filters, hiddenColumns, search, reset = false) {
22350
+ try {
22351
+ // if a request is already pending for this page (and it's not a reset), skip it
22352
+ if (_pendingPageRequests.current[pageIndex] && !reset) {
22353
+ return Promise.resolve();
22354
+ }
22355
+ const hasChangedData = JSON.stringify(sorting) !== JSON.stringify(_lastUsedSorting.current) || JSON.stringify(filters) !== JSON.stringify(_lastUsedFilters.current) || search !== _lastUsedSearch.current;
22356
+ // if the page is already loaded and has actual rows, abort
22357
+ if (data.cache[pageIndex] && data.cache[pageIndex][0] && !hasChangedData && !reset) {
22358
+ return Promise.resolve();
22359
+ }
22360
+ // create an id to track the update
22361
+ const requestId = uuid.v4();
22362
+ // set the page as loading, so that subsequent requests don't retrigger it
22363
+ _pendingPageRequests.current[pageIndex] = true;
22364
+ const _temp2 = _catch(function () {
22365
+ _lastRequestId.current = requestId;
22366
+ return Promise.resolve(fetchPage(pageIndex, pageSize, sorting, filters, hiddenColumns, search)).then(function (response) {
22367
+ length.current = response.length;
22368
+ // update state, here we do some "magic" to support "load in place"
22369
+ setData(currentData => {
22370
+ // if this request wasn't the last one, just return the current state to prevent weird updates
22371
+ if (_lastRequestId.current !== requestId) {
22372
+ return currentData;
22373
+ }
22374
+ const direction = getDirection(pageIndex, currentData.pages);
22375
+ const nextPages = getPages(pageIndex, currentData.lastFetchedPage, reset ? [] : currentData.pages, direction);
22376
+ // set values so we can track if they changed between loads
22377
+ _lastUsedSorting.current = sorting;
22378
+ _lastUsedFilters.current = filters;
22379
+ _lastUsedSearch.current = search;
22380
+ _lastUsedHiddenColumns.current = hiddenColumns;
22381
+ // cache data as an object to prevent any duplicates for pages
22382
+ let nextCache;
22383
+ if (reset || hasChangedData || !direction) {
22384
+ nextCache = nextPages.reduce((acc, p) => ({
22385
+ ...acc,
22386
+ [p]: Array(pageSize).fill(undefined)
22387
+ }), {});
22388
+ } else {
22389
+ nextCache = {
22390
+ ...currentData.cache
22391
+ };
22392
+ }
22393
+ nextCache[pageIndex] = response.data;
22394
+ // cleanup "unloaded" pages
22395
+ if (direction === 'forward' && currentData.rows.length >= DATASET_SIZE) {
22396
+ delete nextCache[currentData.pages[0]];
22397
+ } else if (direction === 'backward' && currentData.rows.length >= DATASET_SIZE) {
22398
+ delete nextCache[currentData.pages[currentData.pages.length - 1]];
22399
+ }
22400
+ // remap rows from the cached data - do it here and not in render to save some performance
22401
+ const rows = Object.values(nextCache).reduce((acc, p) => acc.concat(p), []);
22402
+ return {
22403
+ cache: nextCache,
22404
+ pages: nextPages,
22405
+ rows: rows,
22406
+ lastFetchedPage: pageIndex
22407
+ };
22408
+ });
22409
+ // reset pending requests
22410
+ delete _pendingPageRequests.current[pageIndex];
22411
+ });
22412
+ }, function () {});
22413
+ return Promise.resolve(_temp2 && _temp2.then ? _temp2.then(function () {}) : void 0);
22414
+ } catch (e) {
22415
+ return Promise.reject(e);
22416
+ }
22417
+ };
22418
+ const {
22419
+ pageSize
22420
+ } = options;
22421
+ const DATASET_SIZE = DATASET_SIZE_MULTIPLIER * pageSize;
22422
+ // track the data length, we don't know it until the first request
22423
+ const length = React__default.useRef(0);
22424
+ // data will be filled after the first request
22425
+ const [data, setData] = React__default.useState({
22426
+ rows: [],
22427
+ pages: [],
22428
+ cache: {},
22429
+ lastFetchedPage: undefined
22430
+ });
22431
+ // track which pages have been loaded to dedupe requests
22432
+ const _pendingPageRequests = React__default.useRef({});
22433
+ // it's possible to spam updates, e.g. sort, so we don't set state if the last request wasn't the current oen
22434
+ const _lastRequestId = React__default.useRef();
22435
+ // store last used properties
22436
+ const _lastUsedSorting = React__default.useRef([]);
22437
+ const _lastUsedFilters = React__default.useRef([]);
22438
+ const _lastUsedSearch = React__default.useRef();
22439
+ const _lastUsedHiddenColumns = React__default.useRef([]);
22440
+ const loadAll = function (sorting, filters, hiddenColumns, search) {
22441
+ try {
22442
+ // set values so we can track if they changed between loads
22443
+ _lastUsedSorting.current = sorting;
22444
+ _lastUsedFilters.current = filters;
22445
+ _lastUsedSearch.current = search;
22446
+ _lastUsedHiddenColumns.current = hiddenColumns;
22447
+ const _temp = _finallyRethrows(function () {
22448
+ return _catch(function () {
22449
+ return Promise.resolve(fetchAll(sorting, filters, hiddenColumns, search)).then(function (response) {
22450
+ length.current = response.length;
22451
+ const pages = [];
22452
+ const cache = {};
22453
+ Array.from(Array(response.length / pageSize).keys()).forEach(index => {
22454
+ pages.push(index);
22455
+ const startIndex = index * pageSize;
22456
+ cache[index] = response.data.slice(startIndex, startIndex + pageSize);
22457
+ });
22458
+ setData({
22459
+ cache,
22460
+ pages,
22461
+ rows: response.data,
22462
+ lastFetchedPage: undefined
22463
+ });
22464
+ });
22465
+ }, function () {});
22466
+ }, function (_wasThrown, _result) {
22467
+ // reset pending requests
22468
+ _pendingPageRequests.current = {};
22469
+ if (_wasThrown) throw _result;
22470
+ return _result;
22471
+ });
22472
+ return Promise.resolve(_temp && _temp.then ? _temp.then(function () {}) : void 0);
22473
+ } catch (e) {
22474
+ return Promise.reject(e);
22475
+ }
22476
+ };
22477
+ const invalidate = function () {
22478
+ try {
22479
+ // reset stuff
22480
+ _pendingPageRequests.current = {};
22481
+ // load the current page again
22482
+ return loadPage(getCurrentPage(data.pages), _lastUsedSorting.current, _lastUsedFilters.current, _lastUsedHiddenColumns.current, _lastUsedSearch.current, true);
22483
+ } catch (e) {
22484
+ return Promise.reject(e);
22485
+ }
22486
+ };
22487
+ const handleSort = function (sorting) {
22488
+ try {
22489
+ // reset before loading the current page
22490
+ _pendingPageRequests.current = {};
22491
+ return loadPage(getCurrentPage(data.pages), sorting, _lastUsedFilters.current, _lastUsedHiddenColumns.current, _lastUsedSearch.current, true);
22492
+ } catch (e) {
22493
+ return Promise.reject(e);
22494
+ }
22495
+ };
22496
+ const handleFilter = function (filters, hiddenColumns) {
22497
+ try {
22498
+ // reset before loading the current page
22499
+ _pendingPageRequests.current = {};
22500
+ return loadPage(0, _lastUsedSorting.current, filters, hiddenColumns, _lastUsedSearch.current, true);
22501
+ } catch (e) {
22502
+ return Promise.reject(e);
22503
+ }
22504
+ };
22505
+ const handleSearch = function (search, hiddenColumns) {
22506
+ try {
22507
+ // reset before loading the current page
22508
+ _pendingPageRequests.current = {};
22509
+ return loadPage(0, _lastUsedSorting.current, _lastUsedFilters.current, hiddenColumns, search, true);
22510
+ } catch (e) {
22511
+ return Promise.reject(e);
22512
+ }
22513
+ };
22514
+ return [{
22515
+ data: data.rows,
22516
+ pages: data.pages,
22517
+ length: length.current,
22518
+ loadAll,
22519
+ loadPage,
22520
+ onChangeFilter: handleFilter,
22521
+ onChangeSearch: handleSearch,
22522
+ onChangeSort: handleSort,
22523
+ pageSize,
22524
+ _experimentalDataLoader2: true
22525
+ }, invalidate];
22526
+ }
22527
+ function getCurrentPage(currentPages) {
22528
+ if (currentPages.length <= 2) {
22529
+ return currentPages[0];
22530
+ }
22531
+ // for even page lengths we can't know which is the current visible page - it could even be both
22532
+ // so we load one of them and rely on the "load next/previous page" functionality in row
22533
+ const middle = Math.floor(currentPages.length / 2);
22534
+ return currentPages[middle];
22535
+ }
22536
+ function getDirection(pageIndex, currentPages) {
22537
+ if (currentPages.length) {
22538
+ if (pageIndex === currentPages[currentPages.length - 1] + 1) {
22539
+ return 'forward';
22540
+ } else if (pageIndex === currentPages[0] - 1 || currentPages.length === 2 && currentPages[0] !== 0 && pageIndex === currentPages[0]) {
22541
+ return 'backward';
22542
+ }
22543
+ }
22544
+ return undefined;
22545
+ }
22546
+ function getPages(pageIndex, lastUsedPageIndex, currentPages, direction) {
22547
+ if (currentPages.length && (pageIndex === lastUsedPageIndex || currentPages.includes(pageIndex))) {
22548
+ return currentPages;
22549
+ }
22550
+ if (direction === 'forward') {
22551
+ const nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(1) : currentPages;
22552
+ return nextPages.concat(pageIndex);
22553
+ }
22554
+ if (direction === 'backward') {
22555
+ const nextPages = currentPages.length === DATASET_SIZE_MULTIPLIER ? currentPages.slice(0, -1) : currentPages;
22556
+ return [pageIndex].concat(nextPages);
22557
+ }
22558
+ return [pageIndex];
22559
+ }
22560
+
22219
22561
  const useBoundaryOverflowDetection = (ref, dependencies = []) => {
22220
22562
  const [boundaryIndex, setBoundaryIndex] = React__default.useState();
22221
22563
  const dimensions = useBoundingClientRectListener(ref, dependencies);
@@ -22355,6 +22697,7 @@ exports.useOnClickOutside = useOnClickOutside;
22355
22697
  exports.usePagination = usePagination;
22356
22698
  exports.useRadioGroup = useRadioGroup;
22357
22699
  exports.useTableDataLoader = useTableDataLoader;
22700
+ exports.useTableDataLoader2 = useTableDataLoader2;
22358
22701
  exports.useTableRowCreation = useTableRowCreation;
22359
22702
  exports.useToast = useToast;
22360
22703
  //# sourceMappingURL=taco.cjs.development.js.map