@tanstack/table-core 8.0.0-alpha.55 → 8.0.0-alpha.59

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 (88) hide show
  1. package/build/cjs/core.js +18 -404
  2. package/build/cjs/core.js.map +1 -1
  3. package/build/cjs/createTable.js +3 -3
  4. package/build/cjs/createTable.js.map +1 -1
  5. package/build/cjs/features/Cells.js +107 -0
  6. package/build/cjs/features/Cells.js.map +1 -0
  7. package/build/cjs/features/ColumnSizing.js +96 -54
  8. package/build/cjs/features/ColumnSizing.js.map +1 -1
  9. package/build/cjs/features/Columns.js +216 -0
  10. package/build/cjs/features/Columns.js.map +1 -0
  11. package/build/cjs/features/Expanding.js +13 -21
  12. package/build/cjs/features/Expanding.js.map +1 -1
  13. package/build/cjs/features/Filters.js +3 -3
  14. package/build/cjs/features/Filters.js.map +1 -1
  15. package/build/cjs/features/Grouping.js +8 -11
  16. package/build/cjs/features/Grouping.js.map +1 -1
  17. package/build/cjs/features/Headers.js +79 -220
  18. package/build/cjs/features/Headers.js.map +1 -1
  19. package/build/cjs/features/Ordering.js +1 -1
  20. package/build/cjs/features/Ordering.js.map +1 -1
  21. package/build/cjs/features/Pagination.js +5 -5
  22. package/build/cjs/features/Pagination.js.map +1 -1
  23. package/build/cjs/features/Pinning.js +172 -2
  24. package/build/cjs/features/Pinning.js.map +1 -1
  25. package/build/cjs/features/RowSelection.js +16 -48
  26. package/build/cjs/features/RowSelection.js.map +1 -1
  27. package/build/cjs/features/Rows.js +84 -0
  28. package/build/cjs/features/Rows.js.map +1 -0
  29. package/build/cjs/features/Sorting.js +9 -12
  30. package/build/cjs/features/Sorting.js.map +1 -1
  31. package/build/cjs/features/Visibility.js +59 -38
  32. package/build/cjs/features/Visibility.js.map +1 -1
  33. package/build/cjs/filterFns.js +16 -0
  34. package/build/cjs/filterFns.js.map +1 -1
  35. package/build/cjs/index.js +0 -1
  36. package/build/cjs/index.js.map +1 -1
  37. package/build/cjs/utils.js +0 -16
  38. package/build/cjs/utils.js.map +1 -1
  39. package/build/esm/index.js +866 -856
  40. package/build/esm/index.js.map +1 -1
  41. package/build/stats-html.html +1 -1
  42. package/build/stats-react.json +424 -322
  43. package/build/types/core.d.ts +9 -88
  44. package/build/types/createTable.d.ts +10 -11
  45. package/build/types/features/Cells.d.ts +13 -0
  46. package/build/types/features/ColumnSizing.d.ts +24 -30
  47. package/build/types/features/Columns.d.ts +54 -0
  48. package/build/types/features/Expanding.d.ts +6 -9
  49. package/build/types/features/Filters.d.ts +3 -1
  50. package/build/types/features/Grouping.d.ts +6 -9
  51. package/build/types/features/Headers.d.ts +3 -15
  52. package/build/types/features/Ordering.d.ts +1 -1
  53. package/build/types/features/Pagination.d.ts +6 -6
  54. package/build/types/features/Pinning.d.ts +18 -4
  55. package/build/types/features/RowSelection.d.ts +6 -13
  56. package/build/types/features/Rows.d.ts +27 -0
  57. package/build/types/features/Sorting.d.ts +5 -8
  58. package/build/types/features/Visibility.d.ts +9 -7
  59. package/build/types/filterFns.d.ts +5 -0
  60. package/build/types/types.d.ts +27 -69
  61. package/build/types/utils.d.ts +1 -5
  62. package/build/umd/index.development.js +844 -835
  63. package/build/umd/index.development.js.map +1 -1
  64. package/build/umd/index.production.js +1 -1
  65. package/build/umd/index.production.js.map +1 -1
  66. package/package.json +1 -1
  67. package/src/core.ts +55 -601
  68. package/src/createTable.ts +13 -17
  69. package/src/features/Cells.ts +130 -0
  70. package/src/features/ColumnSizing.ts +111 -89
  71. package/src/features/Columns.ts +288 -0
  72. package/src/features/Expanding.ts +20 -42
  73. package/src/features/Filters.ts +11 -3
  74. package/src/features/Grouping.ts +13 -39
  75. package/src/features/Headers.ts +49 -233
  76. package/src/features/Ordering.ts +1 -1
  77. package/src/features/Pagination.ts +14 -4
  78. package/src/features/Pinning.ts +194 -3
  79. package/src/features/RowSelection.ts +26 -88
  80. package/src/features/Rows.ts +123 -0
  81. package/src/features/Sorting.ts +20 -43
  82. package/src/features/Visibility.ts +82 -63
  83. package/src/filterFns.ts +20 -0
  84. package/src/types.ts +59 -133
  85. package/src/utils/getColumnFilteredRowModelAsync.ts +1 -5
  86. package/src/utils/getGlobalFilteredRowModelAsync.ts +2 -6
  87. package/src/utils/getSortedRowModelAsync.ts +0 -1
  88. package/src/utils.ts +2 -31
@@ -1,14 +1,12 @@
1
1
  import {
2
- Getter,
3
2
  OnChangeFn,
4
3
  TableGenerics,
5
- PropGetterValue,
6
4
  TableInstance,
7
5
  Row,
8
6
  RowModel,
9
7
  Updater,
10
8
  } from '../types'
11
- import { functionalUpdate, makeStateUpdater, memo, propGetter } from '../utils'
9
+ import { makeStateUpdater, memo } from '../utils'
12
10
 
13
11
  export type RowSelectionState = Record<string, boolean>
14
12
 
@@ -41,40 +39,22 @@ export type RowSelectionOptions<TGenerics extends TableGenerics> = {
41
39
  // ) => RowModel<TGenerics>
42
40
  }
43
41
 
44
- type ToggleRowSelectedProps = {
45
- onChange?: (e: unknown) => void
46
- checked?: boolean
47
- title?: string
48
- indeterminate?: boolean
49
- }
50
-
51
42
  export type RowSelectionRow = {
52
43
  getIsSelected: () => boolean
53
44
  getIsSomeSelected: () => boolean
54
45
  getCanSelect: () => boolean
55
46
  getCanMultiSelect: () => boolean
56
47
  toggleSelected: (value?: boolean) => void
57
- getToggleSelectedProps: <TGetter extends Getter<ToggleRowSelectedProps>>(
58
- userProps?: TGetter
59
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
48
+ getToggleSelectedHandler: () => (event: unknown) => void
60
49
  }
61
50
 
62
51
  export type RowSelectionInstance<TGenerics extends TableGenerics> = {
63
52
  queueResetRowSelection: () => void
64
- getToggleRowSelectedProps: <TGetter extends Getter<ToggleRowSelectedProps>>(
65
- rowId: string,
66
- userProps?: TGetter
67
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
68
- getToggleAllRowsSelectedProps: <
69
- TGetter extends Getter<ToggleRowSelectedProps>
70
- >(
71
- userProps?: TGetter
72
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
73
- getToggleAllPageRowsSelectedProps: <
74
- TGetter extends Getter<ToggleRowSelectedProps>
75
- >(
76
- userProps?: TGetter
77
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
53
+ getToggleRowSelectedHandler: (
54
+ rowId: string
55
+ ) => undefined | ((e: unknown) => void)
56
+ getToggleAllRowsSelectedHandler: () => (event: unknown) => void
57
+ getToggleAllPageRowsSelectedHandler: () => (event: unknown) => void
78
58
  setRowSelection: (updater: Updater<RowSelectionState>) => void
79
59
  resetRowSelection: () => void
80
60
  toggleRowSelected: (rowId: string, value?: boolean) => void
@@ -120,7 +100,7 @@ export const RowSelection = {
120
100
  }
121
101
  },
122
102
 
123
- getInstance: <TGenerics extends TableGenerics>(
103
+ createInstance: <TGenerics extends TableGenerics>(
124
104
  instance: TableInstance<TGenerics>
125
105
  ): RowSelectionInstance<TGenerics> => {
126
106
  let registered = false
@@ -460,77 +440,35 @@ export const RowSelection = {
460
440
  : !!paginationFlatRows?.length
461
441
  },
462
442
 
463
- getToggleRowSelectedProps: (rowId, userProps) => {
443
+ getToggleRowSelectedHandler: rowId => {
464
444
  const row = instance.getRow(rowId)
465
445
 
466
446
  const isSelected = row.getIsSelected()
467
447
  const isSomeSelected = row.getIsSomeSelected()
468
448
  const canSelect = row.getCanSelect()
469
449
 
470
- const initialProps: ToggleRowSelectedProps = {
471
- onChange: canSelect
472
- ? (e: unknown) => {
473
- row.toggleSelected(
474
- ((e as MouseEvent).target as HTMLInputElement).checked
475
- )
476
- }
477
- : undefined,
478
- checked: isSelected,
479
- title: 'Toggle Row Selected',
480
- indeterminate: isSomeSelected,
481
- // onChange: forInput
482
- // ? (e: Event) => e.stopPropagation()
483
- // : (e: Event) => {
484
- // if (instance.options.isAdditiveSelectEvent(e)) {
485
- // row.toggleSelected()
486
- // } else if (instance.options.isInclusiveSelectEvent(e)) {
487
- // instance.addRowSelectionRange(row.id)
488
- // } else {
489
- // instance.setRowSelection({})
490
- // row.toggleSelected()
491
- // }
492
-
493
- // if (props.onClick) props.onClick(e)
494
- // },
450
+ return (e: unknown) => {
451
+ if (!canSelect) return
452
+ row.toggleSelected(
453
+ ((e as MouseEvent).target as HTMLInputElement)?.checked
454
+ )
495
455
  }
496
-
497
- return propGetter(initialProps, userProps)
498
456
  },
499
457
 
500
- getToggleAllRowsSelectedProps: userProps => {
501
- const isSomeRowsSelected = instance.getIsSomeRowsSelected()
502
- const isAllRowsSelected = instance.getIsAllRowsSelected()
503
-
504
- const initialProps: ToggleRowSelectedProps = {
505
- onChange: (e: unknown) => {
506
- instance.toggleAllRowsSelected(
507
- ((e as MouseEvent).target as HTMLInputElement).checked
508
- )
509
- },
510
- checked: isAllRowsSelected,
511
- title: 'Toggle All Rows Selected',
512
- indeterminate: isSomeRowsSelected,
458
+ getToggleAllRowsSelectedHandler: () => {
459
+ return (e: unknown) => {
460
+ instance.toggleAllRowsSelected(
461
+ ((e as MouseEvent).target as HTMLInputElement).checked
462
+ )
513
463
  }
514
-
515
- return propGetter(initialProps, userProps)
516
464
  },
517
465
 
518
- getToggleAllPageRowsSelectedProps: userProps => {
519
- const isSomePageRowsSelected = instance.getIsSomePageRowsSelected()
520
- const isAllPageRowsSelected = instance.getIsAllPageRowsSelected()
521
-
522
- const initialProps: ToggleRowSelectedProps = {
523
- onChange: (e: unknown) => {
524
- instance.toggleAllPageRowsSelected(
525
- ((e as MouseEvent).target as HTMLInputElement).checked
526
- )
527
- },
528
- checked: isAllPageRowsSelected,
529
- title: 'Toggle All Current Page Rows Selected',
530
- indeterminate: isSomePageRowsSelected,
466
+ getToggleAllPageRowsSelectedHandler: () => {
467
+ return (e: unknown) => {
468
+ instance.toggleAllPageRowsSelected(
469
+ ((e as MouseEvent).target as HTMLInputElement).checked
470
+ )
531
471
  }
532
-
533
- return propGetter(initialProps, userProps)
534
472
  },
535
473
  }
536
474
  },
@@ -543,8 +481,8 @@ export const RowSelection = {
543
481
  getIsSelected: () => instance.getRowIsSelected(row.id),
544
482
  getIsSomeSelected: () => instance.getRowIsSomeSelected(row.id),
545
483
  toggleSelected: value => instance.toggleRowSelected(row.id, value),
546
- getToggleSelectedProps: userProps =>
547
- instance.getToggleRowSelectedProps(row.id, userProps),
484
+ getToggleSelectedHandler: () =>
485
+ instance.getToggleRowSelectedHandler(row.id)!,
548
486
  getCanMultiSelect: () => instance.getRowCanMultiSelect(row.id),
549
487
  getCanSelect: () => instance.getRowCanSelect(row.id),
550
488
  }
@@ -0,0 +1,123 @@
1
+ import {
2
+ TableGenerics,
3
+ TableInstance,
4
+ Row,
5
+ RowModel,
6
+ RowValues,
7
+ } from '../types'
8
+ import { flattenBy } from '../utils'
9
+
10
+ export type CoreRow<TGenerics extends TableGenerics> = {
11
+ id: string
12
+ index: number
13
+ original?: TGenerics['Row']
14
+ depth: number
15
+ values: RowValues
16
+ subRows: Row<TGenerics>[]
17
+ getLeafRows: () => Row<TGenerics>[]
18
+ originalSubRows?: TGenerics['Row'][]
19
+ }
20
+
21
+ export type RowsOptions<TGenerics extends TableGenerics> = {
22
+ getCoreRowModel: (
23
+ instance: TableInstance<TGenerics>
24
+ ) => () => RowModel<TGenerics>
25
+ getSubRows?: (
26
+ originalRow: TGenerics['Row'],
27
+ index: number
28
+ ) => undefined | TGenerics['Row'][]
29
+ getRowId?: (
30
+ originalRow: TGenerics['Row'],
31
+ index: number,
32
+ parent?: Row<TGenerics>
33
+ ) => string
34
+ }
35
+
36
+ export type RowsInstance<TGenerics extends TableGenerics> = {
37
+ getRowId: (
38
+ _: TGenerics['Row'],
39
+ index: number,
40
+ parent?: Row<TGenerics>
41
+ ) => string
42
+ createRow: (
43
+ id: string,
44
+ original: TGenerics['Row'] | undefined,
45
+ rowIndex: number,
46
+ depth: number,
47
+ values: Record<string, any>
48
+ ) => Row<TGenerics>
49
+ getCoreRowModel: () => RowModel<TGenerics>
50
+ _getCoreRowModel?: () => RowModel<TGenerics>
51
+ getRowModel: () => RowModel<TGenerics>
52
+ getRow: (id: string) => Row<TGenerics>
53
+ }
54
+
55
+ //
56
+
57
+ export const Rows = {
58
+ // createRow: <TGenerics extends TableGenerics>(
59
+ // row: Row<TGenerics>,
60
+ // instance: TableInstance<TGenerics>
61
+ // ): CellsRow<TGenerics> => {
62
+ // return {}
63
+ // },
64
+
65
+ createInstance: <TGenerics extends TableGenerics>(
66
+ instance: TableInstance<TGenerics>
67
+ ): RowsInstance<TGenerics> => {
68
+ return {
69
+ getRowId: (
70
+ row: TGenerics['Row'],
71
+ index: number,
72
+ parent?: Row<TGenerics>
73
+ ) =>
74
+ instance.options.getRowId?.(row, index, parent) ??
75
+ `${parent ? [parent.id, index].join('.') : index}`,
76
+ createRow: (id, original, rowIndex, depth, values) => {
77
+ let row: CoreRow<TGenerics> = {
78
+ id,
79
+ index: rowIndex,
80
+ original,
81
+ depth,
82
+ values,
83
+ subRows: [],
84
+ getLeafRows: () => flattenBy(row.subRows, d => d.subRows),
85
+ }
86
+
87
+ for (let i = 0; i < instance._features.length; i++) {
88
+ const feature = instance._features[i]
89
+ Object.assign(row, feature.createRow?.(row, instance))
90
+ }
91
+
92
+ return row as Row<TGenerics>
93
+ },
94
+
95
+ getCoreRowModel: () => {
96
+ if (!instance._getCoreRowModel) {
97
+ instance._getCoreRowModel = instance.options.getCoreRowModel(instance)
98
+ }
99
+
100
+ return instance._getCoreRowModel()
101
+ },
102
+
103
+ // The final calls start at the bottom of the model,
104
+ // expanded rows, which then work their way up
105
+
106
+ getRowModel: () => {
107
+ return instance.getPaginationRowModel()
108
+ },
109
+ getRow: (id: string) => {
110
+ const row = instance.getRowModel().rowsById[id]
111
+
112
+ if (!row) {
113
+ if (process.env.NODE_ENV !== 'production') {
114
+ throw new Error(`getRow expected an ID, but got ${id}`)
115
+ }
116
+ throw new Error()
117
+ }
118
+
119
+ return row
120
+ },
121
+ }
122
+ },
123
+ }
@@ -7,24 +7,14 @@ import {
7
7
 
8
8
  import {
9
9
  Column,
10
- Getter,
11
- Header,
12
10
  OnChangeFn,
13
11
  TableGenerics,
14
- PropGetterValue,
15
12
  TableInstance,
16
13
  Row,
17
14
  Updater,
18
15
  } from '../types'
19
16
 
20
- import {
21
- functionalUpdate,
22
- isFunction,
23
- makeStateUpdater,
24
- memo,
25
- Overwrite,
26
- propGetter,
27
- } from '../utils'
17
+ import { isFunction, makeStateUpdater, Overwrite } from '../utils'
28
18
 
29
19
  export type SortDirection = 'asc' | 'desc'
30
20
 
@@ -72,12 +62,11 @@ export type SortingColumn<TGenerics extends TableGenerics> = {
72
62
  getIsSorted: () => false | SortDirection
73
63
  resetSorting: () => void
74
64
  toggleSorting: (desc?: boolean, isMulti?: boolean) => void
75
- getToggleSortingProps: <TGetter extends Getter<ToggleSortingProps>>(
76
- userProps?: TGetter
77
- ) => undefined | PropGetterValue<ToggleSortingProps, TGetter>
65
+ getToggleSortingHandler: () => undefined | ((event: unknown) => void)
78
66
  }
79
67
 
80
68
  export type SortingOptions<TGenerics extends TableGenerics> = {
69
+ manualSorting?: boolean
81
70
  sortingFns?: TGenerics['SortingFns']
82
71
  onSortingChange?: OnChangeFn<SortingState>
83
72
  autoResetSorting?: boolean
@@ -93,11 +82,6 @@ export type SortingOptions<TGenerics extends TableGenerics> = {
93
82
  isMultiSortEvent?: (e: unknown) => boolean
94
83
  }
95
84
 
96
- export type ToggleSortingProps = {
97
- title?: string
98
- onClick?: (event: unknown) => void
99
- }
100
-
101
85
  export type SortingInstance<TGenerics extends TableGenerics> = {
102
86
  queueResetSorting: () => void
103
87
  getColumnAutoSortingFn: (columnId: string) => SortingFn<TGenerics> | undefined
@@ -116,10 +100,9 @@ export type SortingInstance<TGenerics extends TableGenerics> = {
116
100
  getColumnCanMultiSort: (columnId: string) => boolean
117
101
  getColumnIsSorted: (columnId: string) => false | 'asc' | 'desc'
118
102
  getColumnSortIndex: (columnId: string) => number
119
- getToggleSortingProps: <TGetter extends Getter<ToggleSortingProps>>(
120
- columnId: string,
121
- userProps?: TGetter
122
- ) => undefined | PropGetterValue<ToggleSortingProps, TGetter>
103
+ getToggleSortingHandler: (
104
+ columnId: string
105
+ ) => undefined | ((event: unknown) => void)
123
106
  getPreSortedRowModel: () => RowModel<TGenerics>
124
107
  getSortedRowModel: () => RowModel<TGenerics>
125
108
  _getSortedRowModel?: () => RowModel<TGenerics>
@@ -167,12 +150,12 @@ export const Sorting = {
167
150
  resetSorting: () => instance.resetSorting(column.id),
168
151
  toggleSorting: (desc, isMulti) =>
169
152
  instance.toggleColumnSorting(column.id, desc, isMulti),
170
- getToggleSortingProps: userProps =>
171
- instance.getToggleSortingProps(column.id, userProps),
153
+ getToggleSortingHandler: () =>
154
+ instance.getToggleSortingHandler(column.id)!,
172
155
  }
173
156
  },
174
157
 
175
- getInstance: <TGenerics extends TableGenerics>(
158
+ createInstance: <TGenerics extends TableGenerics>(
176
159
  instance: TableInstance<TGenerics>
177
160
  ): SortingInstance<TGenerics> => {
178
161
  let registered = false
@@ -415,7 +398,7 @@ export const Sorting = {
415
398
  }
416
399
  },
417
400
 
418
- getToggleSortingProps: (columnId, userProps) => {
401
+ getToggleSortingHandler: columnId => {
419
402
  const column = instance.getColumn(columnId)
420
403
 
421
404
  if (!column) {
@@ -424,22 +407,16 @@ export const Sorting = {
424
407
 
425
408
  const canSort = column.getCanSort()
426
409
 
427
- const initialProps: ToggleSortingProps = {
428
- title: canSort ? 'Toggle Sorting' : undefined,
429
- onClick: canSort
430
- ? (e: unknown) => {
431
- ;(e as any).persist?.()
432
- column.toggleSorting?.(
433
- undefined,
434
- column.getCanMultiSort()
435
- ? instance.options.isMultiSortEvent?.(e)
436
- : false
437
- )
438
- }
439
- : undefined,
410
+ return (e: unknown) => {
411
+ if (!canSort) return
412
+ ;(e as any).persist?.()
413
+ column.toggleSorting?.(
414
+ undefined,
415
+ column.getCanMultiSort()
416
+ ? instance.options.isMultiSortEvent?.(e)
417
+ : false
418
+ )
440
419
  }
441
-
442
- return propGetter(initialProps, userProps)
443
420
  },
444
421
 
445
422
  getPreSortedRowModel: () => instance.getGlobalFilteredRowModel(),
@@ -452,7 +429,7 @@ export const Sorting = {
452
429
  instance.options.getSortedRowModel(instance)
453
430
  }
454
431
 
455
- if (!instance._getSortedRowModel) {
432
+ if (instance.options.manualSorting || !instance._getSortedRowModel) {
456
433
  return instance.getPreSortedRowModel()
457
434
  }
458
435
 
@@ -1,14 +1,13 @@
1
1
  import {
2
2
  Cell,
3
3
  Column,
4
- Getter,
5
4
  OnChangeFn,
6
5
  TableGenerics,
7
- PropGetterValue,
8
6
  TableInstance,
9
7
  Updater,
8
+ Row,
10
9
  } from '../types'
11
- import { makeStateUpdater, memo, propGetter } from '../utils'
10
+ import { makeStateUpdater, memo } from '../utils'
12
11
 
13
12
  export type VisibilityOptions = {
14
13
  onColumnVisibilityChange?: OnChangeFn<VisibilityState>
@@ -28,6 +27,9 @@ export type VisibilityTableState = {
28
27
  export type VisibilityInstance<TGenerics extends TableGenerics> = {
29
28
  getVisibleFlatColumns: () => Column<TGenerics>[]
30
29
  getVisibleLeafColumns: () => Column<TGenerics>[]
30
+ getLeftVisibleLeafColumns: () => Column<TGenerics>[]
31
+ getRightVisibleLeafColumns: () => Column<TGenerics>[]
32
+ getCenterVisibleLeafColumns: () => Column<TGenerics>[]
31
33
  setColumnVisibility: (updater: Updater<VisibilityState>) => void
32
34
  toggleColumnVisibility: (columnId: string, value?: boolean) => void
33
35
  toggleAllColumnsVisible: (value?: boolean) => void
@@ -35,16 +37,11 @@ export type VisibilityInstance<TGenerics extends TableGenerics> = {
35
37
  getColumnCanHide: (columnId: string) => boolean
36
38
  getIsAllColumnsVisible: () => boolean
37
39
  getIsSomeColumnsVisible: () => boolean
38
- getToggleAllColumnsVisibilityProps: <
39
- TGetter extends Getter<ToggleAllColumnsVisibilityProps>
40
- >(
41
- userProps?: TGetter
42
- ) => undefined | PropGetterValue<ToggleAllColumnsVisibilityProps, TGetter>
40
+ getToggleAllColumnsVisibilityHandler: () =>
41
+ | undefined
42
+ | ((event: unknown) => void)
43
43
  }
44
44
 
45
- type ToggleVisibilityProps = {}
46
- type ToggleAllColumnsVisibilityProps = {}
47
-
48
45
  export type VisibilityColumnDef = {
49
46
  enableHiding?: boolean
50
47
  defaultCanHide?: boolean
@@ -52,6 +49,7 @@ export type VisibilityColumnDef = {
52
49
  }
53
50
 
54
51
  export type VisibilityRow<TGenerics extends TableGenerics> = {
52
+ _getAllVisibleCells: () => Cell<TGenerics>[]
55
53
  getVisibleCells: () => Cell<TGenerics>[]
56
54
  }
57
55
 
@@ -59,9 +57,7 @@ export type VisibilityColumn = {
59
57
  getCanHide: () => boolean
60
58
  getIsVisible: () => boolean
61
59
  toggleVisibility: (value?: boolean) => void
62
- getToggleVisibilityProps: <TGetter extends Getter<ToggleVisibilityProps>>(
63
- userProps?: TGetter
64
- ) => PropGetterValue<ToggleVisibilityProps, TGetter>
60
+ getToggleVisibilityHandler: () => (event: unknown) => void
65
61
  }
66
62
 
67
63
  //
@@ -96,63 +92,98 @@ export const Visibility = {
96
92
  getIsVisible: () => instance.getColumnIsVisible(column.id),
97
93
  toggleVisibility: value =>
98
94
  instance.toggleColumnVisibility(column.id, value),
99
- getToggleVisibilityProps: userProps => {
100
- const props: ToggleVisibilityProps = {
101
- type: 'checkbox',
102
- checked: column.getIsVisible?.(),
103
- title: 'Toggle Column Visibility',
104
- onChange: (e: unknown) => {
105
- column.toggleVisibility?.(
106
- ((e as MouseEvent).target as HTMLInputElement).checked
107
- )
108
- },
95
+ getToggleVisibilityHandler: () => {
96
+ return (e: unknown) => {
97
+ column.toggleVisibility?.(
98
+ ((e as MouseEvent).target as HTMLInputElement).checked
99
+ )
109
100
  }
110
-
111
- return propGetter(props, userProps)
112
101
  },
113
102
  }
114
103
  },
115
104
 
116
- getInstance: <TGenerics extends TableGenerics>(
105
+ createRow: <TGenerics extends TableGenerics>(
106
+ row: Row<TGenerics>,
117
107
  instance: TableInstance<TGenerics>
118
- ): VisibilityInstance<TGenerics> => {
108
+ ): VisibilityRow<TGenerics> => {
119
109
  return {
120
- getVisibleFlatColumns: memo(
110
+ _getAllVisibleCells: memo(
121
111
  () => [
122
- instance.getAllFlatColumns(),
123
- instance
124
- .getAllFlatColumns()
125
- .filter(d => d.getIsVisible?.())
112
+ row
113
+ .getAllCells()
114
+ .filter(cell => cell.column.getIsVisible())
126
115
  .map(d => d.id)
127
116
  .join('_'),
128
117
  ],
129
- allFlatColumns => {
130
- return allFlatColumns.filter(d => d.getIsVisible?.())
118
+ _ => {
119
+ return row.getAllCells().filter(cell => cell.column.getIsVisible())
131
120
  },
132
121
  {
133
- key: 'getVisibleFlatColumns',
134
- debug: () =>
135
- instance.options.debugAll ?? instance.options.debugColumns,
122
+ key: 'row._getAllVisibleCells',
123
+ debug: () => instance.options.debugAll ?? instance.options.debugRows,
136
124
  }
137
125
  ),
126
+ getVisibleCells: memo(
127
+ () => [
128
+ row.getLeftVisibleCells(),
129
+ row.getCenterVisibleCells(),
130
+ row.getRightVisibleCells(),
131
+ ],
132
+ (left, center, right) => [...left, ...center, ...right],
133
+ {
134
+ key: 'row.getVisibleCells',
135
+ debug: () => instance.options.debugAll ?? instance.options.debugRows,
136
+ }
137
+ ),
138
+ }
139
+ },
138
140
 
139
- getVisibleLeafColumns: memo(
141
+ createInstance: <TGenerics extends TableGenerics>(
142
+ instance: TableInstance<TGenerics>
143
+ ): VisibilityInstance<TGenerics> => {
144
+ const makeVisibleColumnsMethod = (
145
+ key: string,
146
+ getColumns: () => Column<TGenerics>[]
147
+ ): (() => Column<TGenerics>[]) => {
148
+ return memo(
140
149
  () => [
141
- instance.getAllLeafColumns(),
142
- instance
143
- .getAllLeafColumns()
144
- .filter(d => d.getIsVisible?.())
150
+ getColumns(),
151
+ getColumns()
152
+ .filter(d => d.getIsVisible())
145
153
  .map(d => d.id)
146
154
  .join('_'),
147
155
  ],
148
- allFlatColumns => {
149
- return allFlatColumns.filter(d => d.getIsVisible?.())
156
+ columns => {
157
+ return columns.filter(d => d.getIsVisible?.())
150
158
  },
151
159
  {
152
- key: 'getVisibleLeafColumns',
160
+ key,
153
161
  debug: () =>
154
162
  instance.options.debugAll ?? instance.options.debugColumns,
155
163
  }
164
+ )
165
+ }
166
+
167
+ return {
168
+ getVisibleFlatColumns: makeVisibleColumnsMethod(
169
+ 'getVisibleFlatColumns',
170
+ () => instance.getAllFlatColumns()
171
+ ),
172
+ getVisibleLeafColumns: makeVisibleColumnsMethod(
173
+ 'getVisibleLeafColumns',
174
+ () => instance.getAllLeafColumns()
175
+ ),
176
+ getLeftVisibleLeafColumns: makeVisibleColumnsMethod(
177
+ 'getLeftVisibleLeafColumns',
178
+ () => instance.getLeftLeafColumns()
179
+ ),
180
+ getRightVisibleLeafColumns: makeVisibleColumnsMethod(
181
+ 'getRightVisibleLeafColumns',
182
+ () => instance.getRightLeafColumns()
183
+ ),
184
+ getCenterVisibleLeafColumns: makeVisibleColumnsMethod(
185
+ 'getCenterVisibleLeafColumns',
186
+ () => instance.getCenterLeafColumns()
156
187
  ),
157
188
 
158
189
  setColumnVisibility: updater =>
@@ -218,24 +249,12 @@ export const Visibility = {
218
249
  getIsSomeColumnsVisible: () =>
219
250
  instance.getAllLeafColumns().some(column => column.getIsVisible?.()),
220
251
 
221
- getToggleAllColumnsVisibilityProps: userProps => {
222
- const props: ToggleAllColumnsVisibilityProps = {
223
- onChange: (e: MouseEvent) => {
224
- instance.toggleAllColumnsVisible(
225
- (e.target as HTMLInputElement)?.checked
226
- )
227
- },
228
- type: 'checkbox',
229
- title: 'Toggle visibility for all columns',
230
- checked: instance.getIsAllColumnsVisible(),
231
- indeterminate:
232
- !instance.getIsAllColumnsVisible() &&
233
- instance.getIsSomeColumnsVisible()
234
- ? 'indeterminate'
235
- : undefined,
252
+ getToggleAllColumnsVisibilityHandler: () => {
253
+ return (e: unknown) => {
254
+ instance.toggleAllColumnsVisible(
255
+ ((e as MouseEvent).target as HTMLInputElement)?.checked
256
+ )
236
257
  }
237
-
238
- return propGetter(props, userProps)
239
258
  },
240
259
  }
241
260
  },
package/src/filterFns.ts CHANGED
@@ -7,6 +7,7 @@ export const filterFns = {
7
7
  equalsStringSensitive,
8
8
  arrIncludes,
9
9
  arrIncludesAll,
10
+ arrIncludesSome,
10
11
  equals,
11
12
  weakEquals,
12
13
  betweenNumberRange,
@@ -117,6 +118,25 @@ function arrIncludesAll<TGenerics extends TableGenerics>(
117
118
 
118
119
  arrIncludesAll.autoRemove = (val: any) => testFalsey(val) || !val?.length
119
120
 
121
+ function arrIncludesSome<TGenerics extends TableGenerics>(
122
+ rows: Row<TGenerics>[],
123
+ columnIds: string[],
124
+ filterValue: unknown[]
125
+ ) {
126
+ return rows.filter(row => {
127
+ return columnIds.some(id => {
128
+ const rowValue = row.values[id]
129
+ return (
130
+ rowValue &&
131
+ rowValue.length &&
132
+ filterValue.some(val => rowValue.includes(val))
133
+ )
134
+ })
135
+ })
136
+ }
137
+
138
+ arrIncludesSome.autoRemove = (val: any) => testFalsey(val) || !val?.length
139
+
120
140
  function equals<TGenerics extends TableGenerics>(
121
141
  rows: Row<TGenerics>[],
122
142
  columnIds: string[],