@tanstack/table-core 8.0.0-alpha.22 → 8.0.0-alpha.23

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 (48) hide show
  1. package/build/cjs/aggregationTypes.js +21 -19
  2. package/build/cjs/aggregationTypes.js.map +1 -1
  3. package/build/cjs/core.js +8 -8
  4. package/build/cjs/core.js.map +1 -1
  5. package/build/cjs/features/Expanding.js +1 -8
  6. package/build/cjs/features/Expanding.js.map +1 -1
  7. package/build/cjs/features/Filters.js +1 -1
  8. package/build/cjs/features/Filters.js.map +1 -1
  9. package/build/cjs/features/Grouping.js.map +1 -1
  10. package/build/cjs/features/RowSelection.js +3 -3
  11. package/build/cjs/features/RowSelection.js.map +1 -1
  12. package/build/cjs/utils/columnFilterRowsFn.js +20 -78
  13. package/build/cjs/utils/columnFilterRowsFn.js.map +1 -1
  14. package/build/cjs/utils/filterRowsUtils.js +100 -0
  15. package/build/cjs/utils/filterRowsUtils.js.map +1 -0
  16. package/build/cjs/utils/globalFilterRowsFn.js +10 -62
  17. package/build/cjs/utils/globalFilterRowsFn.js.map +1 -1
  18. package/build/cjs/utils/groupRowsFn.js +15 -15
  19. package/build/cjs/utils/groupRowsFn.js.map +1 -1
  20. package/build/cjs/utils/sortRowsFn.js +1 -1
  21. package/build/cjs/utils/sortRowsFn.js.map +1 -1
  22. package/build/esm/index.js +156 -192
  23. package/build/esm/index.js.map +1 -1
  24. package/build/stats-html.html +1 -1
  25. package/build/stats-react.json +301 -268
  26. package/build/types/aggregationTypes.d.ts +9 -9
  27. package/build/types/core.d.ts +1 -1
  28. package/build/types/features/Filters.d.ts +1 -1
  29. package/build/types/features/Grouping.d.ts +1 -1
  30. package/build/types/utils/filterRowsUtils.d.ts +3 -0
  31. package/build/types/utils/sortRowsQuicksortFn.d.ts +11 -0
  32. package/build/umd/index.development.js +156 -192
  33. package/build/umd/index.development.js.map +1 -1
  34. package/build/umd/index.production.js +1 -1
  35. package/build/umd/index.production.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/aggregationTypes.ts +23 -19
  38. package/src/core.tsx +3 -5
  39. package/src/features/Expanding.ts +2 -10
  40. package/src/features/Filters.ts +2 -2
  41. package/src/features/Grouping.ts +2 -2
  42. package/src/features/RowSelection.ts +1 -3
  43. package/src/utils/columnFilterRowsFn.ts +12 -73
  44. package/src/utils/filterRowsUtils.ts +107 -0
  45. package/src/utils/globalFilterRowsFn.ts +10 -66
  46. package/src/utils/groupRowsFn.ts +14 -16
  47. package/src/utils/sortRowsFn.ts +6 -8
  48. package/src/utils/sortRowsQuicksortFn.ts +174 -0
@@ -10,13 +10,13 @@ export declare const aggregationTypes: {
10
10
  count: typeof count;
11
11
  };
12
12
  export declare type BuiltInAggregationType = keyof typeof aggregationTypes;
13
- declare function sum(_leafValues: unknown[], childValues: unknown[]): number;
14
- declare function min(_leafValues: unknown[], childValues: unknown[]): number | undefined;
15
- declare function max(_leafValues: unknown[], childValues: unknown[]): number | undefined;
16
- declare function extent(_leafValues: unknown[], childValues: unknown[]): (number | undefined)[];
17
- declare function mean(leafValues: unknown[]): number | undefined;
18
- declare function median(values: unknown[]): number | undefined;
19
- declare function unique<T>(values: T[]): T[];
20
- declare function uniqueCount(values: unknown[]): number;
21
- declare function count(values: unknown[]): number;
13
+ declare function sum(_getLeafValues: () => unknown[], getChildValues: () => unknown[]): number;
14
+ declare function min(_getLeafValues: () => unknown[], getChildValues: () => unknown[]): number | undefined;
15
+ declare function max(_getLeafValues: () => unknown[], getChildValues: () => unknown[]): number | undefined;
16
+ declare function extent(_getLeafValues: () => unknown[], getChildValues: () => unknown[]): (number | undefined)[];
17
+ declare function mean(getLeafValues: () => unknown[]): number | undefined;
18
+ declare function median(getLeafValues: () => unknown[]): number | undefined;
19
+ declare function unique<T>(getLeafValues: () => T[]): T[];
20
+ declare function uniqueCount(getLeafValues: () => unknown[]): number;
21
+ declare function count(getLeafValues: () => unknown[]): number;
22
22
  export {};
@@ -58,8 +58,8 @@ export declare type CoreRow<TGenerics extends PartialGenerics> = {
58
58
  original?: TGenerics['Row'];
59
59
  depth: number;
60
60
  values: RowValues;
61
- leafRows: Row<TGenerics>[];
62
61
  subRows: Row<TGenerics>[];
62
+ getLeafRows: () => Row<TGenerics>[];
63
63
  getRowProps: PropGetter<RowProps>;
64
64
  originalSubRows?: TGenerics['Row'][];
65
65
  getAllCells: () => Cell<TGenerics>[];
@@ -44,7 +44,7 @@ export declare type FiltersColumn<TGenerics extends PartialGenerics> = {
44
44
  getPreFilteredMinMaxValues: () => [any, any];
45
45
  };
46
46
  export declare type FiltersOptions<TGenerics extends PartialGenerics> = {
47
- filterFromChildrenUp?: boolean;
47
+ filterFromLeafRows?: boolean;
48
48
  filterTypes?: TGenerics['FilterFns'];
49
49
  enableFilters?: boolean;
50
50
  onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>;
@@ -3,7 +3,7 @@ import { BuiltInAggregationType } from '../aggregationTypes';
3
3
  import { Cell, Column, Getter, OnChangeFn, PropGetterValue, TableInstance, Row, Updater, PartialGenerics, Renderable, UseRenderer } from '../types';
4
4
  import { Overwrite } from '../utils';
5
5
  export declare type GroupingState = string[];
6
- export declare type AggregationFn<TGenerics extends PartialGenerics> = (leafValues: TGenerics['Row'][], childValues: TGenerics['Row'][]) => any;
6
+ export declare type AggregationFn<TGenerics extends PartialGenerics> = (getLeafValues: () => TGenerics['Row'][], getChildValues: () => TGenerics['Row'][]) => any;
7
7
  export declare type CustomAggregationTypes<TGenerics extends PartialGenerics> = Record<string, AggregationFn<TGenerics>>;
8
8
  export declare type AggregationType<TGenerics extends PartialGenerics> = 'auto' | BuiltInAggregationType | keyof TGenerics['AggregationFns'] | AggregationFn<TGenerics>;
9
9
  export declare type GroupingTableState = {
@@ -0,0 +1,3 @@
1
+ import { AnyGenerics, Row, RowModel, TableInstance } from '../types';
2
+ export declare function filterRowModelFromLeafs<TGenerics extends AnyGenerics>(rowsToFilter: Row<TGenerics>[], filterRows: (rowsToFilter: Row<TGenerics>[], depth: number) => Row<TGenerics>[], instance: TableInstance<TGenerics>): RowModel<TGenerics>;
3
+ export declare function filterRowModelFromRoot<TGenerics extends AnyGenerics>(rowsToFilter: Row<TGenerics>[], filterRows: (rowsToFilter: Row<TGenerics>[], depth: number) => Row<TGenerics>[], instance: TableInstance<TGenerics>): RowModel<TGenerics>;
@@ -0,0 +1,11 @@
1
+ import { TableInstance, Row, RowModel, AnyGenerics } from '../types';
2
+ export declare function sortRowsFn<TGenerics extends AnyGenerics>(instance: TableInstance<TGenerics>, rowModel: RowModel<TGenerics>): RowModel<TGenerics>;
3
+ declare type Sorter<TGenerics extends AnyGenerics> = {
4
+ id: string;
5
+ compare: (a: Row<TGenerics>, b: Row<TGenerics>) => number;
6
+ desc?: boolean;
7
+ sortUndefined?: false | -1 | 1;
8
+ invertSorting?: boolean;
9
+ };
10
+ export declare function quicksort<TGenerics extends AnyGenerics>(rows: Row<TGenerics>[], sorters: Sorter<TGenerics>[]): Row<TGenerics>[];
11
+ export {};
@@ -388,18 +388,18 @@
388
388
  count: count
389
389
  };
390
390
 
391
- function sum(_leafValues, childValues) {
391
+ function sum(_getLeafValues, getChildValues) {
392
392
  // It's faster to just add the aggregations together instead of
393
393
  // process leaf nodes individually
394
- return childValues.reduce(function (sum, next) {
394
+ return getChildValues().reduce(function (sum, next) {
395
395
  return sum + (typeof next === 'number' ? next : 0);
396
396
  }, 0);
397
397
  }
398
398
 
399
- function min(_leafValues, childValues) {
399
+ function min(_getLeafValues, getChildValues) {
400
400
  var min;
401
401
 
402
- for (var _iterator = _createForOfIteratorHelperLoose(childValues), _step; !(_step = _iterator()).done;) {
402
+ for (var _iterator = _createForOfIteratorHelperLoose(getChildValues()), _step; !(_step = _iterator()).done;) {
403
403
  var value = _step.value;
404
404
 
405
405
  if (value != null && (min > value || min === undefined && value >= value)) {
@@ -410,10 +410,10 @@
410
410
  return min;
411
411
  }
412
412
 
413
- function max(_leafValues, childValues) {
413
+ function max(_getLeafValues, getChildValues) {
414
414
  var max;
415
415
 
416
- for (var _iterator2 = _createForOfIteratorHelperLoose(childValues), _step2; !(_step2 = _iterator2()).done;) {
416
+ for (var _iterator2 = _createForOfIteratorHelperLoose(getChildValues()), _step2; !(_step2 = _iterator2()).done;) {
417
417
  var value = _step2.value;
418
418
 
419
419
  if (value != null && (max < value || max === undefined && value >= value)) {
@@ -424,11 +424,11 @@
424
424
  return max;
425
425
  }
426
426
 
427
- function extent(_leafValues, childValues) {
427
+ function extent(_getLeafValues, getChildValues) {
428
428
  var min;
429
429
  var max;
430
430
 
431
- for (var _iterator3 = _createForOfIteratorHelperLoose(childValues), _step3; !(_step3 = _iterator3()).done;) {
431
+ for (var _iterator3 = _createForOfIteratorHelperLoose(getChildValues()), _step3; !(_step3 = _iterator3()).done;) {
432
432
  var value = _step3.value;
433
433
 
434
434
  if (value != null) {
@@ -444,11 +444,11 @@
444
444
  return [min, max];
445
445
  }
446
446
 
447
- function mean(leafValues) {
447
+ function mean(getLeafValues) {
448
448
  var count = 0;
449
449
  var sum = 0;
450
450
 
451
- for (var _iterator4 = _createForOfIteratorHelperLoose(leafValues), _step4; !(_step4 = _iterator4()).done;) {
451
+ for (var _iterator4 = _createForOfIteratorHelperLoose(getLeafValues()), _step4; !(_step4 = _iterator4()).done;) {
452
452
  var value = _step4.value;
453
453
 
454
454
  if (value != null && (value = +value) >= value) {
@@ -460,14 +460,16 @@
460
460
  return;
461
461
  }
462
462
 
463
- function median(values) {
464
- if (!values.length) {
463
+ function median(getLeafValues) {
464
+ var leafValues = getLeafValues();
465
+
466
+ if (!leafValues.length) {
465
467
  return;
466
468
  }
467
469
 
468
470
  var min = 0;
469
471
  var max = 0;
470
- values.forEach(function (value) {
472
+ leafValues.forEach(function (value) {
471
473
  if (typeof value === 'number') {
472
474
  min = Math.min(min, value);
473
475
  max = Math.max(max, value);
@@ -476,16 +478,16 @@
476
478
  return (min + max) / 2;
477
479
  }
478
480
 
479
- function unique(values) {
480
- return Array.from(new Set(values).values());
481
+ function unique(getLeafValues) {
482
+ return Array.from(new Set(getLeafValues()).values());
481
483
  }
482
484
 
483
- function uniqueCount(values) {
484
- return new Set(values).size;
485
+ function uniqueCount(getLeafValues) {
486
+ return new Set(getLeafValues()).size;
485
487
  }
486
488
 
487
- function count(values) {
488
- return values.length;
489
+ function count(getLeafValues) {
490
+ return getLeafValues().length;
489
491
  }
490
492
 
491
493
  //
@@ -1989,7 +1991,7 @@
1989
1991
  onColumnFiltersChange: makeStateUpdater('columnFilters', instance),
1990
1992
  onGlobalFilterChange: makeStateUpdater('globalFilter', instance),
1991
1993
  autoResetColumnFilters: true,
1992
- filterFromChildrenUp: true,
1994
+ filterFromLeafRows: true,
1993
1995
  autoResetGlobalFilter: true,
1994
1996
  globalFilterType: 'auto',
1995
1997
  getColumnCanGlobalFilterFn: function getColumnCanGlobalFilterFn(column) {
@@ -2976,14 +2978,7 @@
2976
2978
  return row.subRows && !!row.subRows.length;
2977
2979
  },
2978
2980
  getToggleExpandedProps: function getToggleExpandedProps(userProps) {
2979
- var initialProps = {
2980
- title: 'Toggle Row Expanded',
2981
- onClick: function onClick(e) {
2982
- e.stopPropagation();
2983
- instance.toggleRowExpanded(row.id);
2984
- }
2985
- };
2986
- return propGetter(initialProps, userProps);
2981
+ return instance.getToggleExpandedProps(row.id, userProps);
2987
2982
  }
2988
2983
  };
2989
2984
  }
@@ -3210,10 +3205,10 @@
3210
3205
  },
3211
3206
  toggleAllRowsSelected: function toggleAllRowsSelected(value) {
3212
3207
  instance.setRowSelection(function (old) {
3213
- value = typeof value !== 'undefined' ? value : !instance.getIsAllRowsSelected(); // Only remove/add the rows that are visible on the screen
3214
- // Leave all the other rows that are selected alone.
3208
+ value = typeof value !== 'undefined' ? value : !instance.getIsAllRowsSelected();
3209
+
3210
+ var rowSelection = _extends({}, old);
3215
3211
 
3216
- var rowSelection = Object.assign({}, old);
3217
3212
  var preGroupedFlatRows = instance.getPreGroupedRowModel().flatRows; // We don't use `mutateRowIsSelected` here for performance reasons.
3218
3213
  // All of the rows are flat already, so it wouldn't be worth it
3219
3214
 
@@ -3955,7 +3950,11 @@
3955
3950
  depth: depth,
3956
3951
  values: values,
3957
3952
  subRows: [],
3958
- leafRows: [],
3953
+ getLeafRows: function getLeafRows() {
3954
+ return flattenBy(row.subRows, function (d) {
3955
+ return d.subRows;
3956
+ });
3957
+ },
3959
3958
  getRowProps: function getRowProps(userProps) {
3960
3959
  return instance.getRowProps(row.id, userProps);
3961
3960
  },
@@ -4049,13 +4048,9 @@
4049
4048
 
4050
4049
  for (var _i = 0; _i < row.originalSubRows.length; _i++) {
4051
4050
  accessRow(row.originalSubRows[_i], _i, depth + 1, subRows, row);
4052
- } // Keep the new subRows array on the row
4053
-
4051
+ }
4054
4052
 
4055
4053
  row.subRows = subRows;
4056
- row.leafRows = flattenBy(subRows, function (d) {
4057
- return d.leafRows;
4058
- });
4059
4054
  }
4060
4055
  }
4061
4056
  };
@@ -4077,9 +4072,9 @@
4077
4072
  return (_instance$options$deb10 = instance.options.debugAll) != null ? _instance$options$deb10 : instance.options.debugTable;
4078
4073
  },
4079
4074
  onChange: function onChange() {
4080
- instance._notifyRowSelectionReset();
4081
-
4082
4075
  instance._notifyFiltersReset();
4076
+
4077
+ instance._notifyRowSelectionReset();
4083
4078
  }
4084
4079
  }),
4085
4080
  // The final calls start at the bottom of the model,
@@ -4241,126 +4236,147 @@
4241
4236
  };
4242
4237
  }
4243
4238
 
4244
- function columnFilterRowsFn(instance, rowModel) {
4245
- var columnFilters = instance.getState().columnFilters;
4239
+ function filterRowModelFromLeafs(rowsToFilter, filterRows, instance) {
4246
4240
  var newFilteredFlatRows = [];
4247
4241
  var newFilteredRowsById = {};
4248
- var filterFromChildrenUp = instance.options.filterFromChildrenUp;
4249
4242
 
4250
- var filterRows = function filterRows(rowsToFilter, depth) {
4251
- columnFilters.forEach(function (_ref) {
4252
- var columnId = _ref.id,
4253
- filterValue = _ref.value;
4254
- // Find the columnFilters column
4255
- var column = instance.getColumn(columnId);
4243
+ var recurseFilterRows = function recurseFilterRows(rowsToFilter, depth) {
4244
+ if (depth === void 0) {
4245
+ depth = 0;
4246
+ }
4256
4247
 
4257
- if (!column) {
4258
- {
4259
- console.warn("Table: Could not find a column with id: " + columnId);
4260
- }
4248
+ rowsToFilter = rowsToFilter.slice(); // Filter from children up first
4261
4249
 
4262
- throw new Error();
4263
- }
4250
+ for (var i = 0; i < rowsToFilter.length; i++) {
4251
+ var _row$subRows;
4264
4252
 
4265
- if (depth === 0) {
4266
- var preFilteredRows = [].concat(rowsToFilter);
4253
+ var row = rowsToFilter[i];
4267
4254
 
4268
- column.getPreFilteredRows = function () {
4269
- return preFilteredRows;
4270
- };
4255
+ if (!((_row$subRows = row.subRows) != null && _row$subRows.length)) {
4256
+ continue;
4271
4257
  }
4272
4258
 
4273
- var filterFn = instance.getColumnFilterFn(column.id);
4274
-
4275
- if (!filterFn) {
4276
- {
4277
- console.warn("Could not find a valid 'column.filterType' for column with the ID: " + column.id + ".");
4278
- }
4259
+ rowsToFilter[i] = instance.createRow(row.id, row.original, row.index, row.depth, row.values);
4260
+ rowsToFilter[i].subRows = recurseFilterRows(row.subRows, depth + 1);
4279
4261
 
4280
- return;
4281
- } // Pass the rows, id, filterValue and column to the filterFn
4282
- // to get the filtered rows back
4262
+ if (!rowsToFilter[i].subRows.length) {
4263
+ rowsToFilter.splice(i, 1);
4264
+ i--;
4265
+ }
4266
+ }
4283
4267
 
4268
+ rowsToFilter = filterRows(rowsToFilter, depth); // Apply the filter to any subRows
4284
4269
 
4285
- rowsToFilter = filterFn(rowsToFilter, [columnId], filterValue);
4270
+ rowsToFilter.forEach(function (row) {
4271
+ newFilteredFlatRows.push(row);
4272
+ newFilteredRowsById[row.id] = row;
4286
4273
  });
4287
4274
  return rowsToFilter;
4288
4275
  };
4289
4276
 
4290
- if (filterFromChildrenUp) {
4291
- var _recurseFilterRows = function _recurseFilterRows(rowsToFilter, depth) {
4292
- if (depth === void 0) {
4293
- depth = 0;
4294
- }
4295
-
4296
- // Filter from children up
4297
- rowsToFilter = rowsToFilter.filter(function (row) {
4298
- var _row$subRows;
4299
-
4300
- if (!((_row$subRows = row.subRows) != null && _row$subRows.length)) {
4301
- return true;
4302
- }
4303
-
4304
- row.subRows = _recurseFilterRows(row.subRows, depth + 1);
4305
- return row.subRows.length;
4306
- });
4307
- rowsToFilter = filterRows(rowsToFilter, depth); // Apply the filter to any subRows
4308
-
4309
- rowsToFilter.forEach(function (row) {
4310
- newFilteredFlatRows.push(row);
4311
- newFilteredRowsById[row.id] = row;
4312
- });
4313
- return rowsToFilter;
4314
- };
4315
-
4316
- return {
4317
- rows: _recurseFilterRows(rowModel.rows),
4318
- flatRows: newFilteredFlatRows,
4319
- rowsById: newFilteredRowsById
4320
- };
4321
- } // Filters top level and nested rows
4322
-
4277
+ return {
4278
+ rows: recurseFilterRows(rowsToFilter),
4279
+ flatRows: newFilteredFlatRows,
4280
+ rowsById: newFilteredRowsById
4281
+ };
4282
+ }
4283
+ function filterRowModelFromRoot(rowsToFilter, filterRows, instance) {
4284
+ var newFilteredFlatRows = [];
4285
+ var newFilteredRowsById = {}; // Filters top level and nested rows
4323
4286
 
4324
4287
  var recurseFilterRows = function recurseFilterRows(rowsToFilter, depth) {
4325
4288
  if (depth === void 0) {
4326
4289
  depth = 0;
4327
4290
  }
4328
4291
 
4329
- // Filter from parents downward
4292
+ // Filter from parents downward first
4330
4293
  rowsToFilter = filterRows(rowsToFilter, depth); // Apply the filter to any subRows
4331
- // We technically could do this recursively in the above loop,
4332
- // but that would severely hinder the API for the user, since they
4333
- // would be required to do that recursion in some scenarios
4334
4294
 
4335
- rowsToFilter.forEach(function (row) {
4295
+ for (var i = 0; i < rowsToFilter.length; i++) {
4296
+ var _row$subRows2;
4297
+
4298
+ var row = rowsToFilter[i];
4336
4299
  newFilteredFlatRows.push(row);
4337
4300
  newFilteredRowsById[row.id] = row;
4338
4301
 
4339
- if (!filterFromChildrenUp) {
4340
- var _row$subRows2;
4302
+ if (!((_row$subRows2 = row.subRows) != null && _row$subRows2.length)) {
4303
+ rowsToFilter.splice(i, 1);
4304
+ i--;
4305
+ continue;
4306
+ }
4341
4307
 
4342
- if (!((_row$subRows2 = row.subRows) != null && _row$subRows2.length)) {
4343
- return;
4344
- }
4308
+ rowsToFilter[i] = instance.createRow(row.id, row.original, row.index, row.depth, row.values);
4309
+ rowsToFilter[i].subRows = recurseFilterRows(row.subRows, depth + 1);
4310
+ }
4345
4311
 
4346
- row.subRows = recurseFilterRows(row.subRows, depth + 1);
4347
- }
4348
- });
4349
4312
  return rowsToFilter;
4350
4313
  };
4351
4314
 
4352
4315
  return {
4353
- rows: recurseFilterRows(rowModel.rows),
4316
+ rows: recurseFilterRows(rowsToFilter),
4354
4317
  flatRows: newFilteredFlatRows,
4355
4318
  rowsById: newFilteredRowsById
4356
4319
  };
4357
4320
  }
4358
4321
 
4322
+ function columnFilterRowsFn(instance, rowModel) {
4323
+ var columnFilters = instance.getState().columnFilters;
4324
+ var filterFromLeafRows = instance.options.filterFromLeafRows;
4325
+
4326
+ var filterRows = function filterRows(rowsToFilter, depth) {
4327
+ for (var i = 0; i < columnFilters.length; i++) {
4328
+ var _columnFilters$i = columnFilters[i],
4329
+ columnId = _columnFilters$i.id,
4330
+ filterValue = _columnFilters$i.value; // Find the columnFilters column
4331
+
4332
+ var column = instance.getColumn(columnId);
4333
+
4334
+ if (!column) {
4335
+ {
4336
+ console.warn("Table: Could not find a column with id: " + columnId);
4337
+ }
4338
+
4339
+ throw new Error();
4340
+ }
4341
+
4342
+ if (depth === 0) {
4343
+ (function () {
4344
+ var preFilteredRows = [].concat(rowsToFilter);
4345
+
4346
+ column.getPreFilteredRows = function () {
4347
+ return preFilteredRows;
4348
+ };
4349
+ })();
4350
+ }
4351
+
4352
+ var filterFn = instance.getColumnFilterFn(column.id);
4353
+
4354
+ if (!filterFn) {
4355
+ {
4356
+ console.warn("Could not find a valid 'column.filterType' for column with the ID: " + column.id + ".");
4357
+ }
4358
+
4359
+ continue;
4360
+ } // Pass the rows, id, filterValue and column to the filterFn
4361
+ // to get the filtered rows back
4362
+
4363
+
4364
+ rowsToFilter = filterFn(rowsToFilter, [columnId], filterValue);
4365
+ }
4366
+
4367
+ return rowsToFilter;
4368
+ };
4369
+
4370
+ if (filterFromLeafRows) {
4371
+ return filterRowModelFromLeafs(rowModel.rows, filterRows, instance);
4372
+ }
4373
+
4374
+ return filterRowModelFromRoot(rowModel.rows, filterRows, instance);
4375
+ }
4376
+
4359
4377
  function globalFilterRowsFn(instance, rowModel) {
4360
4378
  var globalFilter = instance.getState().globalFilter;
4361
- var newFilteredFlatRows = [];
4362
- var newFilteredRowsById = {};
4363
- var filterFromChildrenUp = instance.options.filterFromChildrenUp;
4379
+ var filterFromLeafRows = instance.options.filterFromLeafRows;
4364
4380
  var filterFn = instance.getGlobalFilterFn();
4365
4381
 
4366
4382
  if (!filterFn) {
@@ -4378,67 +4394,15 @@
4378
4394
  return d.id;
4379
4395
  });
4380
4396
 
4381
- if (filterFromChildrenUp) {
4382
- var _recurseFilterRows = function _recurseFilterRows(rowsToFilter, depth) {
4383
-
4384
- // Filter from children up
4385
- rowsToFilter = rowsToFilter.filter(function (row) {
4386
- var _row$subRows;
4387
-
4388
- if (!((_row$subRows = row.subRows) != null && _row$subRows.length)) {
4389
- return true;
4390
- }
4391
-
4392
- row.subRows = _recurseFilterRows(row.subRows);
4393
- return row.subRows.length;
4394
- });
4395
- rowsToFilter = filterFn(rowsToFilter, filterableColumnIds, globalFilter); // Apply the filter to any subRows
4396
-
4397
- rowsToFilter.forEach(function (row) {
4398
- newFilteredFlatRows.push(row);
4399
- newFilteredRowsById[row.id] = row;
4400
- });
4401
- return rowsToFilter;
4402
- };
4403
-
4404
- return {
4405
- rows: _recurseFilterRows(rowModel.rows),
4406
- flatRows: newFilteredFlatRows,
4407
- rowsById: newFilteredRowsById
4408
- };
4409
- } // Filters top level and nested rows
4410
-
4411
-
4412
- var recurseFilterRows = function recurseFilterRows(rowsToFilter, depth) {
4413
-
4414
- // Filter from parents downward
4415
- rowsToFilter = filterFn(rowsToFilter, filterableColumnIds, globalFilter); // Apply the filter to any subRows
4416
- // We technically could do this recursively in the above loop,
4417
- // but that would severely hinder the API for the user, since they
4418
- // would be required to do that recursion in some scenarios
4419
-
4420
- rowsToFilter.forEach(function (row) {
4421
- newFilteredFlatRows.push(row);
4422
- newFilteredRowsById[row.id] = row;
4423
-
4424
- if (!filterFromChildrenUp) {
4425
- var _row$subRows2;
4426
-
4427
- if (!((_row$subRows2 = row.subRows) != null && _row$subRows2.length)) {
4428
- return;
4429
- }
4430
-
4431
- row.subRows = recurseFilterRows(row.subRows);
4432
- }
4433
- });
4434
- return rowsToFilter;
4397
+ var filterRows = function filterRows(rows) {
4398
+ return filterFn(rows, filterableColumnIds, globalFilter);
4435
4399
  };
4436
4400
 
4437
- return {
4438
- rows: recurseFilterRows(rowModel.rows),
4439
- flatRows: newFilteredFlatRows,
4440
- rowsById: newFilteredRowsById
4441
- };
4401
+ if (filterFromLeafRows) {
4402
+ filterRowModelFromLeafs(rowModel.rows, filterRows, instance);
4403
+ }
4404
+
4405
+ return filterRowModelFromRoot(rowModel.rows, filterRows, instance);
4442
4406
  }
4443
4407
 
4444
4408
  function sortRowsFn(instance, rowModel) {
@@ -4477,7 +4441,7 @@
4477
4441
  var bUndefined = typeof bValue === 'undefined';
4478
4442
 
4479
4443
  if (aUndefined || bUndefined) {
4480
- return aUndefined && bUndefined ? 0 : aUndefined ? 1 : -1;
4444
+ return aUndefined && bUndefined ? 0 : aUndefined ? columnInfo.sortUndefined : -columnInfo.sortUndefined;
4481
4445
  }
4482
4446
  } // This function should always return in ascending order
4483
4447
 
@@ -4540,21 +4504,21 @@
4540
4504
  var aggregateFn = instance.getColumnAggregationFn(column.id);
4541
4505
 
4542
4506
  if (aggregateFn) {
4543
- // Get the columnValues to aggregate
4544
- var groupedValues = groupedRows.map(function (row) {
4545
- return row.values[column.id];
4546
- }); // Get the columnValues to aggregate
4547
-
4548
- var leafValues = leafRows.map(function (row) {
4549
- var columnValue = row.values[column.id];
4507
+ values[column.id] = aggregateFn(function () {
4508
+ return leafRows.map(function (row) {
4509
+ var columnValue = row.values[column.id];
4550
4510
 
4551
- if (!depth && column.aggregateValue) {
4552
- columnValue = column.aggregateValue(columnValue);
4553
- }
4511
+ if (!depth && column.aggregateValue) {
4512
+ columnValue = column.aggregateValue(columnValue);
4513
+ }
4554
4514
 
4555
- return columnValue;
4515
+ return columnValue;
4516
+ });
4517
+ }, function () {
4518
+ return groupedRows.map(function (row) {
4519
+ return row.values[column.id];
4520
+ });
4556
4521
  });
4557
- values[column.id] = aggregateFn(leafValues, groupedValues);
4558
4522
  } else if (column.aggregationType) {
4559
4523
  console.info({
4560
4524
  column: column
@@ -4597,7 +4561,7 @@
4597
4561
  var subRows = groupUpRecursively(groupedRows, depth + 1, id); // Flatten the leaf rows of the rows in this group
4598
4562
 
4599
4563
  var leafRows = depth ? flattenBy(groupedRows, function (row) {
4600
- return row.leafRows;
4564
+ return row.subRows;
4601
4565
  }) : groupedRows;
4602
4566
  var values = aggregateRowsToValues(leafRows, groupedRows, depth);
4603
4567
  var row = instance.createRow(id, undefined, index, depth, values);