import React, { Dispatch, MutableRefObject, ReactNode, SetStateAction, useMemo, } from 'react'; import type { AlertProps } from '@mui/material/Alert'; import type { ButtonProps } from '@mui/material/Button'; import type { CheckboxProps } from '@mui/material/Checkbox'; import type { ChipProps } from '@mui/material/Chip'; import type { IconButtonProps } from '@mui/material/IconButton'; import type { LinearProgressProps } from '@mui/material/LinearProgress'; import type { PaperProps } from '@mui/material/Paper'; import type { RadioProps } from '@mui/material/Radio'; import type { SkeletonProps } from '@mui/material/Skeleton'; import type { TableProps } from '@mui/material/Table'; import type { TableBodyProps } from '@mui/material/TableBody'; import type { TableCellProps } from '@mui/material/TableCell'; import type { TableContainerProps } from '@mui/material/TableContainer'; import type { TableFooterProps } from '@mui/material/TableFooter'; import type { TableHeadProps } from '@mui/material/TableHead'; import type { TablePaginationProps } from '@mui/material/TablePagination'; import type { TableRowProps } from '@mui/material/TableRow'; import type { TextFieldProps } from '@mui/material/TextField'; import type { ToolbarProps } from '@mui/material/Toolbar'; import type { AggregationFn, Cell, Column, ColumnDef, ColumnFiltersState, ColumnOrderState, ColumnPinningState, ColumnSizingInfoState, ColumnSizingState, DeepKeys, ExpandedState, FilterFn, GroupingState, Header, HeaderGroup, OnChangeFn, PaginationState, Row, RowSelectionState, SortingFn, SortingState, Table, TableOptions, TableState, Updater, VisibilityState, } from '@tanstack/react-table'; import type { VirtualizerOptions, Virtualizer, VirtualItem, } from '@tanstack/react-virtual'; import { MRT_AggregationFns } from './aggregationFns'; import { MRT_DefaultColumn, MRT_DefaultDisplayColumn } from './column.utils'; import { MRT_FilterFns } from './filterFns'; import { MRT_Default_Icons, MRT_Icons } from './icons'; import { MRT_SortingFns } from './sortingFns'; import { MRT_TableRoot } from './table/MRT_TableRoot'; import { MRT_Localization_EN } from './_locales/en'; export { MRT_AggregationFns, MRT_FilterFns, MRT_SortingFns }; /** * Most of this file is just TypeScript types */ type Prettify = { [K in keyof T]: T[K] } & {}; type LiteralUnion = T | (U & Record); export type MRT_DensityState = 'comfortable' | 'compact' | 'spacious'; export type { ColumnFiltersState as MRT_ColumnFiltersState, ColumnOrderState as MRT_ColumnOrderState, ColumnPinningState as MRT_ColumnPinningState, ColumnSizingInfoState as MRT_ColumnSizingInfoState, ColumnSizingState as MRT_ColumnSizingState, ExpandedState as MRT_ExpandedState, GroupingState as MRT_GroupingState, PaginationState as MRT_PaginationState, RowSelectionState as MRT_RowSelectionState, SortingState as MRT_SortingState, Updater as MRT_Updater, VirtualItem as MRT_VirtualItem, Virtualizer as MRT_Virtualizer, VirtualizerOptions as MRT_VirtualizerOptions, VisibilityState as MRT_VisibilityState, }; export interface MRT_Localization { actions: string; and: string; cancel: string; changeFilterMode: string; changeSearchMode: string; clearFilter: string; clearSearch: string; clearSort: string; clickToCopy: string; collapse: string; collapseAll: string; columnActions: string; copiedToClipboard: string; dropToGroupBy: string; edit: string; expand: string; expandAll: string; filterArrIncludes: string; filterArrIncludesAll: string; filterArrIncludesSome: string; filterBetween: string; filterBetweenInclusive: string; filterByColumn: string; filterContains: string; filterEmpty: string; filterEndsWith: string; filterEquals: string; filterEqualsString: string; filterFuzzy: string; filterGreaterThan: string; filterGreaterThanOrEqualTo: string; filterInNumberRange: string; filterIncludesString: string; filterIncludesStringSensitive: string; filterLessThan: string; filterLessThanOrEqualTo: string; filterMode: string; filterNotEmpty: string; filterNotEquals: string; filterStartsWith: string; filterWeakEquals: string; filteringByColumn: string; goToFirstPage: string; goToLastPage: string; goToNextPage: string; goToPreviousPage: string; grab: string; groupByColumn: string; groupedBy: string; hideAll: string; hideColumn: string; max: string; min: string; move: string; noRecordsToDisplay: string; noResultsFound: string; of: string; or: string; pinToLeft: string; pinToRight: string; resetColumnSize: string; resetOrder: string; rowActions: string; rowNumber: string; rowNumbers: string; rowsPerPage: string; save: string; search: string; select: string; selectedCountOfRowCountRowsSelected: string; showAll: string; showAllColumns: string; showHideColumns: string; showHideFilters: string; showHideSearch: string; sortByColumnAsc: string; sortByColumnDesc: string; sortedByColumnAsc: string; sortedByColumnDesc: string; thenBy: string; toggleDensity: string; toggleFullScreen: string; toggleSelectAll: string; toggleSelectRow: string; toggleVisibility: string; ungroupByColumn: string; unpin: string; unpinAll: string; unsorted: string; } export interface MRT_RowModel = {}> { flatRows: MRT_Row[]; rows: MRT_Row[]; rowsById: { [key: string]: MRT_Row }; } export type MRT_TableInstance = {}> = Prettify< Omit< Table, | 'getAllColumns' | 'getAllFlatColumns' | 'getAllLeafColumns' | 'getCenterLeafColumns' | 'getColumn' | 'getExpandedRowModel' | 'getFlatHeaders' | 'getLeftLeafColumns' | 'getPaginationRowModel' | 'getPreFilteredRowModel' | 'getPrePaginationRowModel' | 'getRightLeafColumns' | 'getRowModel' | 'getSelectedRowModel' | 'getState' | 'options' > & { getAllColumns: () => MRT_Column[]; getAllFlatColumns: () => MRT_Column[]; getAllLeafColumns: () => MRT_Column[]; getCenterLeafColumns: () => MRT_Column[]; getColumn: (columnId: string) => MRT_Column; getExpandedRowModel: () => MRT_RowModel; getFlatHeaders: () => MRT_Header[]; getLeftLeafColumns: () => MRT_Column[]; getPaginationRowModel: () => MRT_RowModel; getPreFilteredRowModel: () => MRT_RowModel; getPrePaginationRowModel: () => MRT_RowModel; getRightLeafColumns: () => MRT_Column[]; getRowModel: () => MRT_RowModel; getSelectedRowModel: () => MRT_RowModel; getState: () => MRT_TableState; options: MaterialReactTableProps & { icons: MRT_Icons; localization: MRT_Localization; }; refs: { bottomToolbarRef: MutableRefObject; editInputRefs: MutableRefObject>; filterInputRefs: MutableRefObject>; searchInputRef: MutableRefObject; tableContainerRef: MutableRefObject; tableHeadCellRefs: MutableRefObject< Record >; tablePaperRef: MutableRefObject; topToolbarRef: MutableRefObject; }; setColumnFilterFns: Dispatch< SetStateAction<{ [key: string]: MRT_FilterOption }> >; setDensity: Dispatch>; setDraggingColumn: Dispatch | null>>; setDraggingRow: Dispatch | null>>; setEditingCell: Dispatch | null>>; setEditingRow: Dispatch | null>>; setGlobalFilterFn: Dispatch>; setHoveredColumn: Dispatch< SetStateAction | { id: string } | null> >; setHoveredRow: Dispatch< SetStateAction | { id: string } | null> >; setIsFullScreen: Dispatch>; setShowAlertBanner: Dispatch>; setShowFilters: Dispatch>; setShowGlobalFilter: Dispatch>; setShowToolbarDropZone: Dispatch>; } >; export type MRT_TableState = {}> = Prettify< TableState & { columnFilterFns: Record; density: MRT_DensityState; draggingColumn: MRT_Column | null; draggingRow: MRT_Row | null; editingCell: MRT_Cell | null; editingRow: MRT_Row | null; globalFilterFn: MRT_FilterOption; hoveredColumn: MRT_Column | { id: string } | null; hoveredRow: MRT_Row | { id: string } | null; isFullScreen: boolean; isLoading: boolean; showAlertBanner: boolean; showColumnFilters: boolean; showGlobalFilter: boolean; hideSelectBanner: boolean; showProgressBars: boolean; showSkeletons: boolean; showToolbarDropZone: boolean; } >; interface editSelectOptions { text: string; value: number | string; label?: string; sub_label?: string; sub_label_variant?: string; } export type MRT_ColumnDef = {}> = // Prettify< Omit< ColumnDef, | 'accessorKey' | 'aggregatedCell' | 'aggregationFn' | 'cell' | 'columns' | 'filterFn' | 'footer' | 'header' | 'id' | 'sortingFn' > & { AggregatedCell?: (props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; Cell?: (props: { cell: MRT_Cell; renderedCellValue: number | string | ReactNode; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; Edit?: (props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; Filter?: (props: { column: MRT_Column; header: MRT_Header; rangeFilterIndex?: number; table: MRT_TableInstance; }) => ReactNode; Footer?: | ReactNode | ((props: { column: MRT_Column; footer: MRT_Header; table: MRT_TableInstance; }) => ReactNode); GroupedCell?: (props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; Header?: | ReactNode | ((props: { column: MRT_Column; header: MRT_Header; table: MRT_TableInstance; }) => ReactNode); PlaceholderCell?: (props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; /** * Either an `accessorKey` or a combination of an `accessorFn` and `id` are required for a data column definition. * Specify a function here to point to the correct property in the data object. * * @example accessorFn: (row) => row.username */ accessorFn?: (originalRow: TData) => any; accessorObjectFn?: (originalRow: TData) => any; /** * Either an `accessorKey` or a combination of an `accessorFn` and `id` are required for a data column definition. * Specify which key in the row this column should use to access the correct data. * Also supports Deep Key Dot Notation. * * @example accessorKey: 'username' //simple * @example accessorKey: 'name.firstName' //deep key dot notation */ accessorKey?: DeepKeys; aggregationFn?: MRT_AggregationFn | Array>; /** * Specify what type of column this is. Either `data`, `display`, or `group`. Defaults to `data`. * Leave this blank if you are just creating a normal data column. * * @default 'data' * * @example columnDefType: 'display' */ columnDefType?: 'data' | 'display' | 'group'; columnFilterModeOptions?: Array< LiteralUnion > | null; columns?: MRT_ColumnDef[]; editSelectOptions?: (string | editSelectOptions)[]; editSelectOptionsFn?: (originalRow: TData) => any[]; editVariant?: 'text' | 'select' | 'tag' | 'currency' | 'percent'; enableClickToCopy?: boolean; enableColumnActions?: boolean; enableColumnDragging?: boolean; enableColumnFilterModes?: boolean; enableColumnOrdering?: boolean; enableEditing?: boolean | ((row: MRT_Row) => boolean); enableFilterMatchHighlighting?: boolean; filterFn?: MRT_FilterFn; filterSelectOptions?: (string | { text: string; value: any })[]; filterVariant?: 'text' | 'select' | 'multi-select' | 'range' | 'checkbox'; /** * footer must be a string. If you want custom JSX to render the footer, you can also specify a `Footer` option. (Capital F) */ footer?: string; /** * header must be a string. If you want custom JSX to render the header, you can also specify a `Header` option. (Capital H) */ header: string; /** * Either an `accessorKey` or a combination of an `accessorFn` and `id` are required for a data column definition. * * If you have also specified an `accessorFn`, MRT still needs to have a valid `id` to be able to identify the column uniquely. * * `id` defaults to the `accessorKey` or `header` if not specified. * * @default gets set to the same value as `accessorKey` by default */ id?: LiteralUnion; muiTableBodyCellCopyButtonProps?: | ButtonProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ButtonProps); getSaving?: (originalRow: TData) => boolean | undefined; getEndAdornment?: (originalRow: TData) => ReactNode; getError?: (originalRow: TData) => | { type: 'error' | 'warning'; content: string; } | undefined; muiTableBodyCellEditTextFieldProps?: | TextFieldProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => TextFieldProps); muiTableBodyCellProps?: | TableCellProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => TableCellProps); muiTableFooterCellProps?: | TableCellProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => TableCellProps); muiTableHeadCellColumnActionsButtonProps?: | IconButtonProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => IconButtonProps); muiTableHeadCellDragHandleProps?: | IconButtonProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => IconButtonProps); muiTableHeadCellFilterCheckboxProps?: | CheckboxProps | ((props: { column: MRT_Column; table: MRT_TableInstance; }) => CheckboxProps); muiTableHeadCellFilterTextFieldProps?: | TextFieldProps | ((props: { table: MRT_TableInstance; column: MRT_Column; rangeFilterIndex?: number; }) => TextFieldProps); muiTableHeadCellProps?: | TableCellProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => TableCellProps); renderColumnActionsMenuItems?: (props: { closeMenu: () => void; column: MRT_Column; table: MRT_TableInstance; }) => ReactNode[]; renderColumnFilterModeMenuItems?: (props: { column: MRT_Column; internalFilterOptions: MRT_InternalFilterOption[]; onSelectFilterMode: (filterMode: MRT_FilterOption) => void; table: MRT_TableInstance; }) => ReactNode[]; sortingFn?: MRT_SortingFn; }; // > export type MRT_DefinedColumnDef = {}> = // Prettify< Omit, 'id' | 'defaultDisplayColumn'> & { defaultDisplayColumn: Partial>; id: string; _filterFn: MRT_FilterOption; }; // > export type MRT_Column = {}> = // Prettify< Omit< Column, 'header' | 'footer' | 'columns' | 'columnDef' | 'filterFn' > & { columnDef: MRT_DefinedColumnDef; columns?: MRT_Column[]; filterFn?: MRT_FilterFn; footer: string; header: string; }; // >; export type MRT_Header = {}> = Prettify< Omit, 'column'> & { column: MRT_Column; } >; export type MRT_HeaderGroup = {}> = Prettify< Omit, 'headers'> & { headers: MRT_Header[]; } >; export type MRT_Row = {}> = Prettify< Omit< Row, 'getVisibleCells' | 'getAllCells' | 'subRows' | '_valuesCache' > & { getAllCells: () => MRT_Cell[]; getVisibleCells: () => MRT_Cell[]; subRows?: MRT_Row[]; _valuesCache: Record>, any>; } >; export type MRT_Cell = {}> = Prettify< Omit, 'column' | 'row'> & { column: MRT_Column; row: MRT_Row; } >; export type MRT_AggregationOption = string & keyof typeof MRT_AggregationFns; export type MRT_AggregationFn = {}> = | AggregationFn | MRT_AggregationOption; export type MRT_SortingOption = LiteralUnion< string & keyof typeof MRT_SortingFns >; export type MRT_SortingFn = {}> = | SortingFn | MRT_SortingOption; export type MRT_FilterOption = LiteralUnion< string & keyof typeof MRT_FilterFns >; export type MRT_FilterFn = {}> = | FilterFn | MRT_FilterOption; export type MRT_InternalFilterOption = { option: string; symbol: string; label: string; divider: boolean; }; export type MRT_DisplayColumnIds = | 'mrt-row-actions' | 'mrt-row-drag' | 'mrt-row-expand' | 'mrt-row-numbers' | 'mrt-row-select'; export type MRT_CreateTableFeature< TData extends Record = {}, TFeature = any, > = (table: MRT_TableInstance) => TFeature; /** * `columns` and `data` props are the only required props, but there are over 170 other optional props. * * See more info on creating columns and data on the official docs site: * @link https://www.material-react-table.com/docs/getting-started/usage * * See the full props list on the official docs site: * @link https://www.material-react-table.com/docs/api/props */ export type MaterialReactTableProps = {}> = Prettify< Omit< Partial>, | 'columns' | 'data' | 'defaultColumn' | 'enableRowSelection' | 'expandRowsFn' | 'getRowId' | 'globalFilterFn' | 'initialState' | 'onStateChange' | 'state' > & { columnFilterModeOptions?: Array< LiteralUnion > | null; /** * The columns to display in the table. `accessorKey`s or `accessorFn`s must match keys in the `data` prop. * * See more info on creating columns on the official docs site: * @link https://www.material-react-table.com/docs/guides/data-columns * @link https://www.material-react-table.com/docs/guides/display-columns * * See all Columns Options on the official docs site: * @link https://www.material-react-table.com/docs/api/column-options */ columns: MRT_ColumnDef[]; /** * Pass your data as an array of objects. Objects can theoretically be any shape, but it's best to keep them consistent. * * See the usage guide for more info on creating columns and data: * @link https://www.material-react-table.com/docs/getting-started/usage */ data: TData[]; /** * Instead of specifying a bunch of the same options for each column, you can just change an option in the `defaultColumn` prop to change a default option for all columns. */ defaultColumn?: Partial>; /** * Change the default options for display columns. */ defaultDisplayColumn?: Partial>; displayColumnDefOptions?: Partial<{ [key in MRT_DisplayColumnIds]: Partial; }>; noRecordsToDisplay?: React.ReactNode; editingMode?: 'table' | 'modal' | 'row' | 'cell'; enableBottomToolbar?: boolean; enableClickToCopy?: boolean; enableColumnActions?: boolean; enableColumnDragging?: boolean; enableColumnFilterModes?: boolean; enableColumnOrdering?: boolean; enableColumnVirtualization?: boolean; enableDensityToggle?: boolean; enableEditing?: boolean | ((row: MRT_Row) => boolean); enableExpandAll?: boolean; enableFilterMatchHighlighting?: boolean; enableFullScreenToggle?: boolean; enableGlobalFilterModes?: boolean; enableGlobalFilterRankedResults?: boolean; enablePagination?: boolean; enableRowActions?: boolean; enableRowDragging?: boolean; enableRowNumbers?: boolean; enableRowOrdering?: boolean; enableRowSelection?: boolean | ((row: MRT_Row) => boolean); enableRowVirtualization?: boolean; enableSelectAll?: boolean; enableStickyFooter?: boolean; enableStickyHeader?: boolean; enableTableFooter?: boolean; enableTableHead?: boolean; enableToolbarInternalActions?: boolean; enableTopToolbar?: boolean; expandRowsFn?: (dataRow: TData) => TData[]; getRowId?: ( originalRow: TData, index: number, parentRow: MRT_Row, ) => string; globalFilterFn?: MRT_FilterOption; globalFilterModeOptions?: MRT_FilterOption[] | null; icons?: Partial; initialState?: Partial>; /** * Changes which kind of CSS layout is used to render the table. `semantic` uses default semantic HTML elements, while `grid` adds CSS grid and flexbox styles */ layoutMode?: 'semantic' | 'grid'; /** * Pass in either a locale imported from `material-react-table/locales/*` or a custom locale object. * * See the localization (i18n) guide for more info: * @link https://www.material-react-table.com/docs/guides/localization */ localization?: Partial; /** * Memoize cells, rows, or the entire table body to potentially improve render performance. * * @warning This will break some dynamic rendering features. See the memoization guide for more info: * @link https://www.material-react-table.com/docs/guides/memoize-components */ memoMode?: 'cells' | 'rows' | 'table-body'; muiBottomToolbarProps?: | ToolbarProps | ((props: { table: MRT_TableInstance }) => ToolbarProps); muiExpandAllButtonProps?: | IconButtonProps | ((props: { table: MRT_TableInstance }) => IconButtonProps); muiExpandButtonProps?: | IconButtonProps | ((props: { table: MRT_TableInstance; row: MRT_Row; }) => IconButtonProps); muiLinearProgressProps?: | LinearProgressProps | ((props: { isTopToolbar: boolean; table: MRT_TableInstance; }) => LinearProgressProps); muiSearchTextFieldProps?: | TextFieldProps | ((props: { table: MRT_TableInstance }) => TextFieldProps); muiSelectAllCheckboxProps?: | CheckboxProps | ((props: { table: MRT_TableInstance }) => CheckboxProps); muiSelectCheckboxProps?: | (CheckboxProps | RadioProps) | ((props: { table: MRT_TableInstance; row: MRT_Row; }) => CheckboxProps | RadioProps); muiTableBodyCellCopyButtonProps?: | ButtonProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => ButtonProps); muiTableBodyCellEditTextFieldProps?: | TextFieldProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => TextFieldProps); muiTableBodyCellProps?: | TableCellProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => TableCellProps); muiTableBodyCellSkeletonProps?: | SkeletonProps | ((props: { cell: MRT_Cell; column: MRT_Column; row: MRT_Row; table: MRT_TableInstance; }) => SkeletonProps); muiTableBodyProps?: | TableBodyProps | ((props: { table: MRT_TableInstance }) => TableBodyProps); muiTableBodyRowDragHandleProps?: | IconButtonProps | ((props: { table: MRT_TableInstance; row: MRT_Row; }) => IconButtonProps); muiTableBodyRowProps?: | TableRowProps | ((props: { isDetailPanel?: boolean; row: MRT_Row; table: MRT_TableInstance; }) => TableRowProps); muiTableContainerProps?: | TableContainerProps | ((props: { table: MRT_TableInstance }) => TableContainerProps); muiTableDetailPanelProps?: | TableCellProps | ((props: { table: MRT_TableInstance; row: MRT_Row; }) => TableCellProps); muiTableFooterCellProps?: | TableCellProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => TableCellProps); muiTableFooterProps?: | TableFooterProps | ((props: { table: MRT_TableInstance }) => TableFooterProps); muiTableFooterRowProps?: | TableRowProps | ((props: { table: MRT_TableInstance; footerGroup: MRT_HeaderGroup; }) => TableRowProps); muiTableHeadCellColumnActionsButtonProps?: | IconButtonProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => IconButtonProps); muiTableHeadCellDragHandleProps?: | IconButtonProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => IconButtonProps); muiTableHeadCellFilterCheckboxProps?: | CheckboxProps | ((props: { column: MRT_Column; table: MRT_TableInstance; }) => CheckboxProps); muiTableHeadCellFilterTextFieldProps?: | TextFieldProps | ((props: { table: MRT_TableInstance; column: MRT_Column; rangeFilterIndex?: number; }) => TextFieldProps); muiTableHeadCellProps?: | TableCellProps | ((props: { table: MRT_TableInstance; column: MRT_Column; }) => TableCellProps); muiTableHeadProps?: | TableHeadProps | ((props: { table: MRT_TableInstance }) => TableHeadProps); muiTableHeadRowProps?: | TableRowProps | ((props: { table: MRT_TableInstance; headerGroup: MRT_HeaderGroup; }) => TableRowProps); muiTablePaginationProps?: | Partial> | ((props: { table: MRT_TableInstance; }) => Partial>); muiTablePaperProps?: | PaperProps | ((props: { table: MRT_TableInstance }) => PaperProps); muiTableProps?: | TableProps | ((props: { table: MRT_TableInstance }) => TableProps); muiToolbarAlertBannerChipProps?: | ChipProps | ((props: { table: MRT_TableInstance }) => ChipProps); muiToolbarAlertBannerProps?: | AlertProps | ((props: { table: MRT_TableInstance }) => AlertProps); muiTopToolbarProps?: | ToolbarProps | ((props: { table: MRT_TableInstance }) => ToolbarProps); onDensityChange?: OnChangeFn; onDraggingColumnChange?: OnChangeFn | null>; onDraggingRowChange?: OnChangeFn | null>; onEditingCellChange?: OnChangeFn | null>; onEditingRowCancel?: (props: { row: MRT_Row; table: MRT_TableInstance; }) => void; onEditingRowSave?: (props: { exitEditingMode: () => void; row: MRT_Row; table: MRT_TableInstance; values: Record>, any>; }) => Promise | void; onEditingRowChange?: OnChangeFn | null>; onColumnFilterFnsChange?: OnChangeFn<{ [key: string]: MRT_FilterOption }>; onGlobalFilterFnChange?: OnChangeFn; onHoveredColumnChange?: OnChangeFn | null>; onHoveredRowChange?: OnChangeFn | null>; onIsFullScreenChange?: OnChangeFn; onShowAlertBannerChange?: OnChangeFn; onShowFiltersChange?: OnChangeFn; onShowGlobalFilterChange?: OnChangeFn; onShowToolbarDropZoneChange?: OnChangeFn; positionActionsColumn?: 'first' | 'last'; positionExpandColumn?: 'first' | 'last'; positionGlobalFilter?: 'left' | 'right' | 'none'; positionPagination?: 'bottom' | 'top' | 'both' | 'none'; positionToolbarAlertBanner?: 'bottom' | 'top' | 'none'; positionToolbarDropZone?: 'bottom' | 'top' | 'none' | 'both'; renderBottomToolbar?: | ReactNode | ((props: { table: MRT_TableInstance }) => ReactNode); renderBottomToolbarCustomActions?: (props: { table: MRT_TableInstance; }) => ReactNode; renderColumnActionsMenuItems?: (props: { column: MRT_Column; closeMenu: () => void; table: MRT_TableInstance; }) => ReactNode[]; renderColumnFilterModeMenuItems?: (props: { column: MRT_Column; internalFilterOptions: MRT_InternalFilterOption[]; onSelectFilterMode: (filterMode: MRT_FilterOption) => void; table: MRT_TableInstance; }) => ReactNode[]; renderDetailPanel?: (props: { row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; renderGlobalFilterModeMenuItems?: (props: { internalFilterOptions: MRT_InternalFilterOption[]; onSelectFilterMode: (filterMode: MRT_FilterOption) => void; table: MRT_TableInstance; }) => ReactNode[]; renderRowActionMenuItems?: (props: { closeMenu: () => void; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode[]; renderRowActions?: (props: { cell: MRT_Cell; row: MRT_Row; table: MRT_TableInstance; }) => ReactNode; renderToolbarInternalActions?: (props: { table: MRT_TableInstance; }) => ReactNode; renderTopToolbar?: | ReactNode | ((props: { table: MRT_TableInstance }) => ReactNode); renderTopToolbarCustomActions?: (props: { table: MRT_TableInstance; }) => ReactNode; rowCount?: number; rowNumberMode?: 'original' | 'static'; selectAllMode?: 'all' | 'page'; /** * Manage state externally any way you want, then pass it back into MRT. */ state?: Partial>; /** * Sequence of features important any dependent feature must be defined first */ tableFeatures?: Array>; /** * Get access to the table instance via a ref to read state or call built-in methods */ tableInstanceRef?: MutableRefObject | null>; /** * @deprecated Use `rowVirtualizerInstanceRef` instead */ virtualizerInstanceRef?: any; /** * @deprecated Use `rowVirtualizerProps` instead */ virtualizerProps?: any; } > & { columnVirtualizerInstanceRef?: MutableRefObject | null>; columnVirtualizerProps?: | Partial> | ((props: { table: MRT_TableInstance; }) => Partial< VirtualizerOptions >); rowVirtualizerInstanceRef?: MutableRefObject | null>; rowVirtualizerProps?: | Partial> | ((props: { table: MRT_TableInstance; }) => Partial>); }; const MaterialReactTable = = {}>({ aggregationFns, autoResetExpanded = false, columnResizeMode = 'onChange', defaultColumn, defaultDisplayColumn, noRecordsToDisplay, editingMode = 'modal', enableBottomToolbar = true, enableColumnActions = true, enableColumnFilters = true, enableColumnOrdering = false, enableColumnResizing = false, enableDensityToggle = true, enableExpandAll = true, enableFilterMatchHighlighting = true, enableFilters = true, enableFullScreenToggle = true, enableGlobalFilter = true, enableGlobalFilterRankedResults = true, enableGrouping = false, enableHiding = true, enableMultiRowSelection = true, enableMultiSort = true, enablePagination = true, enablePinning = false, enableRowSelection = false, enableSelectAll = true, enableSorting = true, enableStickyHeader = false, enableTableFooter = true, enableTableHead = true, enableToolbarInternalActions = true, enableTopToolbar = true, filterFns, icons, layoutMode = 'semantic', localization, manualFiltering, manualGrouping, manualPagination, manualSorting, positionActionsColumn = 'first', positionExpandColumn = 'first', positionGlobalFilter = 'right', positionPagination = 'bottom', positionToolbarAlertBanner = 'top', positionToolbarDropZone = 'top', rowNumberMode = 'original', selectAllMode = 'page', sortingFns, ...rest }: MaterialReactTableProps) => { const _icons = useMemo(() => ({ ...MRT_Default_Icons, ...icons }), [icons]); const _localization = useMemo( () => ({ ...MRT_Localization_EN, ...localization, }), [localization], ); const _aggregationFns = useMemo( () => ({ ...MRT_AggregationFns, ...aggregationFns }), [], ); const _filterFns = useMemo(() => ({ ...MRT_FilterFns, ...filterFns }), []); const _sortingFns = useMemo(() => ({ ...MRT_SortingFns, ...sortingFns }), []); const _defaultColumn = useMemo( () => ({ ...MRT_DefaultColumn, ...defaultColumn }), [defaultColumn], ); const _defaultDisplayColumn = useMemo( () => ({ ...MRT_DefaultDisplayColumn, ...defaultDisplayColumn, }), [defaultDisplayColumn], ); if (rest.enableRowVirtualization || rest.enableColumnVirtualization) { layoutMode = 'grid'; } if (rest.enableRowVirtualization) { enableStickyHeader = true; } if (enablePagination === false && manualPagination === undefined) { manualPagination = true; } if (!rest.data?.length) { manualFiltering = true; manualGrouping = true; manualPagination = true; manualSorting = true; } return ( ); }; export default MaterialReactTable;