UNPKG

material-react-table

Version:

A fully featured Material UI V6 implementation of TanStack React Table V8, written from the ground up in TypeScript.

271 lines (260 loc) 7.39 kB
import { useId, useMemo } from 'react'; import { getCoreRowModel, getExpandedRowModel, getFacetedMinMaxValues, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getGroupedRowModel, getPaginationRowModel, getSortedRowModel, } from '@tanstack/react-table'; import { useTheme } from '@mui/material/styles'; import { MRT_AggregationFns } from '../fns/aggregationFns'; import { MRT_FilterFns } from '../fns/filterFns'; import { MRT_SortingFns } from '../fns/sortingFns'; import { MRT_Default_Icons } from '../icons'; import { MRT_Localization_EN } from '../locales/en'; import { type MRT_DefinedTableOptions, type MRT_RowData, type MRT_TableOptions, } from '../types'; import { getMRTTheme } from '../utils/style.utils'; export const MRT_DefaultColumn = { filterVariant: 'text', maxSize: 1000, minSize: 40, size: 180, } as const; export const MRT_DefaultDisplayColumn = { columnDefType: 'display', enableClickToCopy: false, enableColumnActions: false, enableColumnDragging: false, enableColumnFilter: false, enableColumnOrdering: false, enableEditing: false, enableGlobalFilter: false, enableGrouping: false, enableHiding: false, enableResizing: false, enableSorting: false, } as const; export const useMRT_TableOptions: <TData extends MRT_RowData>( tableOptions: MRT_TableOptions<TData>, ) => MRT_DefinedTableOptions<TData> = <TData extends MRT_RowData>({ aggregationFns, autoResetExpanded = false, columnFilterDisplayMode = 'subheader', columnResizeDirection, columnResizeMode = 'onChange', createDisplayMode = 'modal', defaultColumn, defaultDisplayColumn, editDisplayMode = 'modal', enableBatchRowSelection = true, enableBottomToolbar = true, enableColumnActions = true, enableColumnFilters = true, enableColumnOrdering = false, enableColumnPinning = false, enableColumnResizing = false, enableColumnVirtualization, enableDensityToggle = true, enableExpandAll = true, enableExpanding, enableFacetedValues = false, enableFilterMatchHighlighting = true, enableFilters = true, enableFullScreenToggle = true, enableGlobalFilter = true, enableGlobalFilterRankedResults = true, enableGrouping = false, enableHiding = true, enableKeyboardShortcuts = true, enableMultiRowSelection = true, enableMultiSort = true, enablePagination = true, enableRowPinning = false, enableRowSelection = false, enableRowVirtualization, enableSelectAll = true, enableSorting = true, enableStickyHeader = false, enableTableFooter = true, enableTableHead = true, enableToolbarInternalActions = true, enableTopToolbar = true, filterFns, icons, id = useId(), layoutMode, localization, manualFiltering, manualGrouping, manualPagination, manualSorting, mrtTheme, paginationDisplayMode = 'default', positionActionsColumn = 'first', positionCreatingRow = 'top', positionExpandColumn = 'first', positionGlobalFilter = 'right', positionPagination = 'bottom', positionToolbarAlertBanner = 'top', positionToolbarDropZone = 'top', rowNumberDisplayMode = 'static', rowPinningDisplayMode = 'sticky', selectAllMode = 'page', sortingFns, ...rest }: MRT_TableOptions<TData>) => { const theme = useTheme(); icons = useMemo(() => ({ ...MRT_Default_Icons, ...icons }), [icons]); localization = useMemo( () => ({ ...MRT_Localization_EN, ...localization, }), [localization], ); mrtTheme = useMemo(() => getMRTTheme(mrtTheme, theme), [mrtTheme, theme]); aggregationFns = useMemo( () => ({ ...MRT_AggregationFns, ...aggregationFns }), [], ); filterFns = useMemo(() => ({ ...MRT_FilterFns, ...filterFns }), []); sortingFns = useMemo(() => ({ ...MRT_SortingFns, ...sortingFns }), []); defaultColumn = useMemo( () => ({ ...MRT_DefaultColumn, ...defaultColumn }), [defaultColumn], ); defaultDisplayColumn = useMemo( () => ({ ...MRT_DefaultDisplayColumn, ...defaultDisplayColumn, }), [defaultDisplayColumn], ); //cannot be changed after initialization [enableColumnVirtualization, enableRowVirtualization] = useMemo( () => [enableColumnVirtualization, enableRowVirtualization], [], ); if (!columnResizeDirection) { columnResizeDirection = theme.direction || 'ltr'; } layoutMode = layoutMode || (enableColumnResizing ? 'grid-no-grow' : 'semantic'); if ( layoutMode === 'semantic' && (enableRowVirtualization || enableColumnVirtualization) ) { layoutMode = 'grid'; } if (enableRowVirtualization) { enableStickyHeader = true; } if (enablePagination === false && manualPagination === undefined) { manualPagination = true; } if (!rest.data?.length) { manualFiltering = true; manualGrouping = true; manualPagination = true; manualSorting = true; } return { aggregationFns, autoResetExpanded, columnFilterDisplayMode, columnResizeDirection, columnResizeMode, createDisplayMode, defaultColumn, defaultDisplayColumn, editDisplayMode, enableBatchRowSelection, enableBottomToolbar, enableColumnActions, enableColumnFilters, enableColumnOrdering, enableColumnPinning, enableColumnResizing, enableColumnVirtualization, enableDensityToggle, enableExpandAll, enableExpanding, enableFacetedValues, enableFilterMatchHighlighting, enableFilters, enableFullScreenToggle, enableGlobalFilter, enableGlobalFilterRankedResults, enableGrouping, enableHiding, enableKeyboardShortcuts, enableMultiRowSelection, enableMultiSort, enablePagination, enableRowPinning, enableRowSelection, enableRowVirtualization, enableSelectAll, enableSorting, enableStickyHeader, enableTableFooter, enableTableHead, enableToolbarInternalActions, enableTopToolbar, filterFns, getCoreRowModel: getCoreRowModel(), getExpandedRowModel: enableExpanding || enableGrouping ? getExpandedRowModel() : undefined, getFacetedMinMaxValues: enableFacetedValues ? getFacetedMinMaxValues() : undefined, getFacetedRowModel: enableFacetedValues ? getFacetedRowModel() : undefined, getFacetedUniqueValues: enableFacetedValues ? getFacetedUniqueValues() : undefined, getFilteredRowModel: (enableColumnFilters || enableGlobalFilter || enableFilters) && !manualFiltering ? getFilteredRowModel() : undefined, getGroupedRowModel: enableGrouping && !manualGrouping ? getGroupedRowModel() : undefined, getPaginationRowModel: enablePagination && !manualPagination ? getPaginationRowModel() : undefined, getSortedRowModel: enableSorting && !manualSorting ? getSortedRowModel() : undefined, getSubRows: (row) => row?.subRows, icons, id, layoutMode, localization, manualFiltering, manualGrouping, manualPagination, manualSorting, mrtTheme, paginationDisplayMode, positionActionsColumn, positionCreatingRow, positionExpandColumn, positionGlobalFilter, positionPagination, positionToolbarAlertBanner, positionToolbarDropZone, rowNumberDisplayMode, rowPinningDisplayMode, selectAllMode, sortingFns, ...rest, } as MRT_DefinedTableOptions<TData>; };