material-react-table 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/useMRT.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import React, { PropsWithChildren, Dispatch, SetStateAction } from 'react';
2
2
  import type { MRT_FilterType, MRT_Row, MRT_TableInstance } from '.';
3
+ import { MRT_FILTER_TYPE } from './enums';
3
4
  import { MRT_Icons } from './icons';
4
5
  import { MRT_Localization } from './localization';
5
6
  import { MaterialReactTableProps } from './MaterialReactTable';
@@ -8,6 +9,9 @@ export declare type UseMRT<D extends {} = {}> = MaterialReactTableProps<D> & {
8
9
  anyRowsExpanded: boolean;
9
10
  icons: MRT_Icons;
10
11
  idPrefix: string;
12
+ filterTypes: {
13
+ [key in MRT_FILTER_TYPE]: any;
14
+ };
11
15
  localization: MRT_Localization;
12
16
  setCurrentEditingRow: Dispatch<SetStateAction<MRT_Row<D> | null>>;
13
17
  setCurrentFilterTypes: Dispatch<SetStateAction<{
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.6.1",
2
+ "version": "0.6.2",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
5
  "description": "A fully featured Material-UI implementation of react-table, inspired by material-table and the mui DataGrid, written from the ground up in TypeScript.",
@@ -20,7 +20,7 @@ import {
20
20
  Column,
21
21
  ColumnInstance,
22
22
  FilterType,
23
- // ColumnInterface,
23
+ ColumnInterface,
24
24
  HeaderGroup,
25
25
  Row,
26
26
  TableInstance,
@@ -78,6 +78,7 @@ import { MRT_TableContainer } from './table/MRT_TableContainer';
78
78
  import { MRT_Localization, MRT_DefaultLocalization_EN } from './localization';
79
79
  import { MRT_Default_Icons, MRT_Icons } from './icons';
80
80
  import { MRT_FILTER_TYPE } from './enums';
81
+ import { defaultFilterFNs } from './filtersFNs';
81
82
 
82
83
  export type MRT_TableOptions<D extends {} = {}> = TableOptions<D> &
83
84
  UseExpandedOptions<D> &
@@ -115,57 +116,60 @@ export type MRT_TableInstance<D extends {} = {}> = TableInstance<D> &
115
116
  getToggleAllRowsExpandedProps: () => void;
116
117
  };
117
118
 
118
- export type MRT_ColumnInterface<D extends {} = {}> =
119
- // ColumnInterface<D> &
119
+ export type MRT_ColumnInterface<D extends {} = {}> = ColumnInterface<D> &
120
120
  UseFiltersColumnOptions<D> &
121
- UseGlobalFiltersColumnOptions<D> &
122
- UseGroupByColumnOptions<D> &
123
- UseResizeColumnsColumnOptions<D> &
124
- UseSortByColumnOptions<D> & {
125
- Edit?: ({
126
- cell,
127
- onChange,
128
- }: {
129
- cell: MRT_Cell<D>;
130
- onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
131
- }) => ReactNode;
132
- Filter?: ({ column }: { column: MRT_HeaderGroup<D> }) => ReactNode;
133
- Footer?: string;
134
- Header?: string;
135
- disableFilters?: boolean;
136
- editable?: boolean;
137
- filter?: MRT_FilterType | string | FilterType<D>;
138
- filterSelectOptions?: (string | { text: string; value: string })[];
139
- muiTableBodyCellEditTextFieldProps?:
140
- | TextFieldProps
141
- | ((cell: MRT_Cell<D>) => TextFieldProps);
142
- muiTableBodyCellProps?:
143
- | TableCellProps
144
- | ((cell: MRT_Cell<D>) => TableCellProps);
145
- muiTableFooterCellProps?:
146
- | TableCellProps
147
- | ((column: Column<D>) => TableCellProps);
148
- muiTableHeadCellFilterTextFieldProps?:
149
- | TextFieldProps
150
- | ((column: Column<D>) => TextFieldProps);
151
- muiTableHeadCellProps?:
152
- | TableCellProps
153
- | ((column: Column<D>) => TableCellProps);
154
- onCellEditChange?: (
155
- event: ChangeEvent<HTMLInputElement>,
156
- cell: MRT_Cell<D>,
157
- ) => void;
158
- onFilterChange?: (
159
- event: ChangeEvent<HTMLInputElement>,
160
- filterValue: any,
161
- ) => void;
162
- };
121
+ UseGlobalFiltersColumnOptions<D> &
122
+ UseGroupByColumnOptions<D> &
123
+ UseResizeColumnsColumnOptions<D> &
124
+ UseSortByColumnOptions<D> & {
125
+ Edit?: ({
126
+ cell,
127
+ onChange,
128
+ }: {
129
+ cell: MRT_Cell<D>;
130
+ onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
131
+ }) => ReactNode;
132
+ Filter?: ({ column }: { column: MRT_HeaderGroup<D> }) => ReactNode;
133
+ Footer?: string;
134
+ Header?: string;
135
+ accessor: string;
136
+ columns?: (Column<D> & MRT_ColumnInterface<D>)[];
137
+ disableFilters?: boolean;
138
+ editable?: boolean;
139
+ filter?: MRT_FilterType | string | FilterType<D>;
140
+ filterSelectOptions?: (string | { text: string; value: string })[];
141
+ filterTypes: MRT_FILTER_TYPE[];
142
+ muiTableBodyCellEditTextFieldProps?:
143
+ | TextFieldProps
144
+ | ((cell: MRT_Cell<D>) => TextFieldProps);
145
+ muiTableBodyCellProps?:
146
+ | TableCellProps
147
+ | ((cell: MRT_Cell<D>) => TableCellProps);
148
+ muiTableFooterCellProps?:
149
+ | TableCellProps
150
+ | ((column: Column<D>) => TableCellProps);
151
+ muiTableHeadCellFilterTextFieldProps?:
152
+ | TextFieldProps
153
+ | ((column: Column<D>) => TextFieldProps);
154
+ muiTableHeadCellProps?:
155
+ | TableCellProps
156
+ | ((column: Column<D>) => TableCellProps);
157
+ onCellEditChange?: (
158
+ event: ChangeEvent<HTMLInputElement>,
159
+ cell: MRT_Cell<D>,
160
+ ) => void;
161
+ onFilterChange?: (
162
+ event: ChangeEvent<HTMLInputElement>,
163
+ filterValue: any,
164
+ ) => void;
165
+ };
163
166
 
164
167
  export type MRT_ColumnInstance<D extends {} = {}> = ColumnInstance<D> &
165
168
  UseFiltersColumnProps<D> &
166
169
  UseGroupByColumnProps<D> &
167
170
  UseResizeColumnsColumnProps<D> &
168
- UseSortByColumnProps<D> & {
171
+ UseSortByColumnProps<D> &
172
+ MRT_ColumnInterface<D> & {
169
173
  columns?: MRT_ColumnInstance<D>[];
170
174
  };
171
175
 
@@ -185,7 +189,9 @@ export type MRT_Row<D extends {} = {}> = Row<D> &
185
189
 
186
190
  export type MRT_Cell<D extends {} = {}, _V = any> = Cell<D> &
187
191
  UseGroupByCellProps<D> &
188
- UseRowStateCellProps<D> & {};
192
+ UseRowStateCellProps<D> & {
193
+ column: MRT_ColumnInstance<D>;
194
+ };
189
195
 
190
196
  export type MRT_FilterType = MRT_FILTER_TYPE | Function;
191
197
 
@@ -232,6 +238,7 @@ export type MaterialReactTableProps<D extends {} = {}> = UseTableOptions<D> &
232
238
  enableRowEditing?: boolean;
233
239
  enableRowNumbers?: boolean;
234
240
  enableSelection?: boolean;
241
+ filterTypes?: { [key in MRT_FILTER_TYPE]: any };
235
242
  hideTableFooter?: boolean;
236
243
  hideTableHead?: boolean;
237
244
  hideToolbarBottom?: boolean;
@@ -362,6 +369,8 @@ export type MaterialReactTableProps<D extends {} = {}> = UseTableOptions<D> &
362
369
 
363
370
  export default <D extends {}>({
364
371
  defaultColumn = { minWidth: 50, maxWidth: 1000 },
372
+ filterTypes,
373
+ globalFilter = 'fuzzy',
365
374
  icons,
366
375
  localization,
367
376
  positionActionsColumn = 'first',
@@ -372,6 +381,9 @@ export default <D extends {}>({
372
381
  }: MaterialReactTableProps<D>) => (
373
382
  <MaterialReactTableProvider
374
383
  defaultColumn={defaultColumn}
384
+ // @ts-ignore
385
+ filterTypes={{ ...defaultFilterFNs, ...filterTypes }}
386
+ globalFilter={globalFilter}
375
387
  icons={{ ...MRT_Default_Icons, ...icons }}
376
388
  localization={{ ...MRT_DefaultLocalization_EN, ...localization }}
377
389
  positionActionsColumn={positionActionsColumn}
package/src/filtersFNs.ts CHANGED
@@ -1,25 +1,15 @@
1
1
  import { matchSorter } from 'match-sorter';
2
2
  import { MRT_Row } from '.';
3
3
 
4
- export const fuzzySearchFN = (
5
- rows: MRT_Row[],
6
- columnIds: string[],
7
- filterValue: string | number,
8
- ) =>
9
- matchSorter(rows, filterValue.toString().trim(), {
10
- keys: columnIds.map((c) => `values.${c}`),
11
- sorter: (rankedItems) => rankedItems,
12
- });
13
-
14
- fuzzySearchFN.autoRemove = (val: any) => !val;
15
-
16
4
  export const fuzzyFilterFN = (
17
5
  rows: MRT_Row[],
18
- id: string,
6
+ columnIds: string[] | string,
19
7
  filterValue: string | number,
20
8
  ) =>
21
9
  matchSorter(rows, filterValue.toString().trim(), {
22
- keys: [`values.${id}`],
10
+ keys: Array.isArray(columnIds)
11
+ ? columnIds.map((c) => `values.${c}`)
12
+ : [`values.${columnIds}`],
23
13
  sorter: (rankedItems) => rankedItems,
24
14
  });
25
15
 
@@ -146,7 +136,6 @@ export const defaultFilterFNs = {
146
136
  endsWith: endsWithFilterFN,
147
137
  equals: equalsFilterFN,
148
138
  fuzzy: fuzzyFilterFN,
149
- globalFuzzy: fuzzySearchFN,
150
139
  greaterThan: greaterThanFilterFN,
151
140
  lessThan: lessThanFilterFN,
152
141
  notEmpty: notEmptyFilterFN,
@@ -149,6 +149,7 @@ export const MRT_FilterTextField: FC<Props> = ({ column }) => {
149
149
  <Tooltip arrow title={localization.changeFilterMode}>
150
150
  <span>
151
151
  <IconButton
152
+ aria-label={localization.changeFilterMode}
152
153
  onClick={handleFilterMenuOpen}
153
154
  size="small"
154
155
  sx={{ height: '1.75rem', width: '1.75rem' }}
package/src/useMRT.tsx CHANGED
@@ -22,9 +22,13 @@ import {
22
22
  useSortBy,
23
23
  useTable,
24
24
  } from 'react-table';
25
- import type { MRT_FilterType, MRT_Row, MRT_TableInstance } from '.';
25
+ import type {
26
+ MRT_ColumnInterface,
27
+ MRT_FilterType,
28
+ MRT_Row,
29
+ MRT_TableInstance,
30
+ } from '.';
26
31
  import { MRT_FILTER_TYPE } from './enums';
27
- import { defaultFilterFNs } from './filtersFNs';
28
32
  import { MRT_Icons } from './icons';
29
33
  import { MRT_Localization } from './localization';
30
34
  import { MaterialReactTableProps } from './MaterialReactTable';
@@ -34,6 +38,7 @@ export type UseMRT<D extends {} = {}> = MaterialReactTableProps<D> & {
34
38
  anyRowsExpanded: boolean;
35
39
  icons: MRT_Icons;
36
40
  idPrefix: string;
41
+ filterTypes: { [key in MRT_FILTER_TYPE]: any };
37
42
  localization: MRT_Localization;
38
43
  setCurrentEditingRow: Dispatch<SetStateAction<MRT_Row<D> | null>>;
39
44
  setCurrentFilterTypes: Dispatch<
@@ -83,16 +88,6 @@ export const MaterialReactTableProvider = <D extends {} = {}>(
83
88
  props.initialState?.showSearch ?? false,
84
89
  );
85
90
 
86
- const filterTypes = useMemo<{
87
- [key in MRT_FILTER_TYPE]: any;
88
- }>(
89
- () => ({
90
- ...defaultFilterFNs,
91
- ...props.filterTypes,
92
- }),
93
- [props.filterTypes],
94
- );
95
-
96
91
  const findLowestLevelCols = useCallback(() => {
97
92
  let lowestLevelColumns: any[] = props.columns;
98
93
  let currentCols: any[] = props.columns;
@@ -123,25 +118,33 @@ export const MaterialReactTableProvider = <D extends {} = {}>(
123
118
  ),
124
119
  );
125
120
 
126
- const columns = useMemo(
127
- () =>
128
- findLowestLevelCols().map((column) => {
129
- column.filter =
130
- filterTypes[
131
- currentFilterTypes[column.accessor as string] as MRT_FILTER_TYPE
132
- ];
121
+ const applyFiltersToColumns = useCallback(
122
+ (cols: MRT_ColumnInterface[]) =>
123
+ cols.map((column) => {
124
+ if (column.columns) {
125
+ applyFiltersToColumns(column.columns);
126
+ } else {
127
+ column.filter =
128
+ props?.filterTypes?.[
129
+ currentFilterTypes[column.accessor as string] as MRT_FILTER_TYPE
130
+ ];
131
+ }
133
132
  return column;
134
133
  }),
135
- [props.columns, filterTypes, currentFilterTypes],
134
+ [currentFilterTypes, props.filterTypes],
135
+ );
136
+
137
+ const columns = useMemo(
138
+ () => applyFiltersToColumns(props.columns),
139
+ [props.columns, applyFiltersToColumns],
136
140
  );
137
141
 
138
142
  const tableInstance = useTable(
143
+ // @ts-ignore
139
144
  {
140
145
  ...props,
141
- columns,
142
146
  // @ts-ignore
143
- filterTypes,
144
- globalFilter: props.globalFilter ?? 'globalFuzzy',
147
+ columns,
145
148
  useControlledState: (state) =>
146
149
  useMemo(
147
150
  () => ({
@@ -167,7 +170,7 @@ export const MaterialReactTableProvider = <D extends {} = {}>(
167
170
  ),
168
171
  },
169
172
  ...hooks,
170
- ) as MRT_TableInstance<D>;
173
+ ) as unknown as MRT_TableInstance<D>;
171
174
 
172
175
  const idPrefix = useMemo(
173
176
  () => props.idPrefix ?? Math.random().toString(36).substring(2, 9),