UNPKG

@mui/x-data-grid-pro

Version:

The Pro plan edition of the MUI X Data Grid components.

146 lines 6.97 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; const _excluded = ["getColumnsToRender", "getPinnedCellOffset", "renderContext", "leftRenderContext", "rightRenderContext", "pinnedColumns", "visibleColumns", "columnPositions"]; import * as React from 'react'; import { gridFocusColumnHeaderFilterSelector, useGridSelector, gridFilterModelSelector, gridTabIndexColumnHeaderFilterSelector, getDataGridUtilityClass } from '@mui/x-data-grid'; import { gridColumnsTotalWidthSelector, gridHasFillerSelector, gridHeaderFilterHeightSelector, gridVerticalScrollbarWidthSelector, useGridColumnHeaders as useGridColumnHeadersCommunity, useGridPrivateApiContext, getGridFilter, GridColumnHeaderRow, shouldCellShowLeftBorder, shouldCellShowRightBorder, PinnedColumnPosition } from '@mui/x-data-grid/internals'; import composeClasses from '@mui/utils/composeClasses'; import { useGridRootProps } from "../../utils/useGridRootProps.js"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; const useUtilityClasses = ownerState => { const { classes } = ownerState; return React.useMemo(() => { const slots = { headerFilterRow: ['headerFilterRow'] }; return composeClasses(slots, getDataGridUtilityClass, classes); }, [classes]); }; export const useGridColumnHeadersPro = props => { const apiRef = useGridPrivateApiContext(); const { headerGroupingMaxDepth, hasOtherElementInTabSequence } = props; const columnHeaderFilterTabIndexState = useGridSelector(apiRef, gridTabIndexColumnHeaderFilterSelector); const _useGridColumnHeaders = useGridColumnHeadersCommunity(_extends({}, props, { hasOtherElementInTabSequence: hasOtherElementInTabSequence || columnHeaderFilterTabIndexState !== null })), { getColumnsToRender, getPinnedCellOffset, renderContext, leftRenderContext, rightRenderContext, pinnedColumns, visibleColumns, columnPositions } = _useGridColumnHeaders, otherProps = _objectWithoutPropertiesLoose(_useGridColumnHeaders, _excluded); const headerFiltersRef = React.useRef(null); apiRef.current.register('private', { headerFiltersElementRef: headerFiltersRef }); const headerFilterMenuRef = React.useRef(null); const rootProps = useGridRootProps(); const classes = useUtilityClasses(rootProps); const disableHeaderFiltering = !rootProps.headerFilters; const filterModel = useGridSelector(apiRef, gridFilterModelSelector); const columnsTotalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector); const gridHasFiller = useGridSelector(apiRef, gridHasFillerSelector); const headerFilterHeight = useGridSelector(apiRef, gridHeaderFilterHeightSelector); const scrollbarWidth = useGridSelector(apiRef, gridVerticalScrollbarWidthSelector); const columnHeaderFilterFocus = useGridSelector(apiRef, gridFocusColumnHeaderFilterSelector); const filterItemsCache = React.useRef(Object.create(null)).current; const getFilterItem = React.useCallback(colDef => { const filterModelItem = filterModel?.items.find(it => it.field === colDef.field && it.operator !== 'isAnyOf'); if (filterModelItem != null) { // there's a valid `filterModelItem` for this column return filterModelItem; } const defaultCachedItem = filterItemsCache[colDef.field]; if (defaultCachedItem != null) { // there's a cached `defaultItem` for this column return defaultCachedItem; } // there's no cached `defaultItem` for this column, let's generate one and cache it const defaultItem = getGridFilter(colDef); filterItemsCache[colDef.field] = defaultItem; return defaultItem; }, // eslint-disable-next-line react-hooks/exhaustive-deps [filterModel]); const getColumnFilters = params => { const { renderedColumns, firstColumnToRender } = getColumnsToRender(params); const filters = []; for (let i = 0; i < renderedColumns.length; i += 1) { const colDef = renderedColumns[i]; const columnIndex = firstColumnToRender + i; const hasFocus = columnHeaderFilterFocus?.field === colDef.field; const isFirstColumn = columnIndex === 0; const tabIndexField = columnHeaderFilterTabIndexState?.field; const tabIndex = tabIndexField === colDef.field || isFirstColumn && !props.hasOtherElementInTabSequence ? 0 : -1; const headerClassName = typeof colDef.headerClassName === 'function' ? colDef.headerClassName({ field: colDef.field, colDef }) : colDef.headerClassName; const item = getFilterItem(colDef); const pinnedPosition = params?.position; const pinnedOffset = getPinnedCellOffset(pinnedPosition, colDef.computedWidth, columnIndex, columnPositions, columnsTotalWidth, scrollbarWidth); const indexInSection = i; const sectionLength = renderedColumns.length; const showLeftBorder = shouldCellShowLeftBorder(pinnedPosition, indexInSection); const showRightBorder = shouldCellShowRightBorder(pinnedPosition, indexInSection, sectionLength, rootProps.showColumnVerticalBorder, gridHasFiller); filters.push(/*#__PURE__*/_jsx(rootProps.slots.headerFilterCell, _extends({ colIndex: columnIndex, height: headerFilterHeight, width: colDef.computedWidth, colDef: colDef, hasFocus: hasFocus, tabIndex: tabIndex, headerFilterMenuRef: headerFilterMenuRef, headerClassName: headerClassName, "data-field": colDef.field, item: item, pinnedPosition: pinnedPosition, pinnedOffset: pinnedOffset, showLeftBorder: showLeftBorder, showRightBorder: showRightBorder }, rootProps.slotProps?.headerFilterCell), `${colDef.field}-filter`)); } return otherProps.getFillers(params, filters, 0, true); }; const getColumnFiltersRow = () => { if (disableHeaderFiltering) { return null; } return /*#__PURE__*/_jsxs(GridColumnHeaderRow, { ref: headerFiltersRef, className: classes.headerFilterRow, role: "row", "aria-rowindex": headerGroupingMaxDepth + 2, ownerState: rootProps, children: [leftRenderContext && getColumnFilters({ position: PinnedColumnPosition.LEFT, renderContext: leftRenderContext, maxLastColumn: leftRenderContext.lastColumnIndex }), getColumnFilters({ renderContext, maxLastColumn: visibleColumns.length - pinnedColumns.right.length }), rightRenderContext && getColumnFilters({ position: PinnedColumnPosition.RIGHT, renderContext: rightRenderContext, maxLastColumn: rightRenderContext.lastColumnIndex })] }); }; if (process.env.NODE_ENV !== "production") getColumnFiltersRow.displayName = "getColumnFiltersRow"; return _extends({}, otherProps, { getColumnFiltersRow }); };