UNPKG

@mui/x-data-grid

Version:

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

181 lines 7.92 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import * as React from 'react'; import { styled } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import clsx from 'clsx'; import { Virtualization } from '@mui/x-virtualizer'; import { gridHasBottomFillerSelector, gridHasScrollXSelector, gridHasScrollYSelector } from "../../hooks/features/dimensions/gridDimensionsSelectors.mjs"; import { gridRowTreeSelector } from "../../hooks/features/rows/index.mjs"; import { GridScrollArea } from "../GridScrollArea.mjs"; import { useGridRootProps } from "../../hooks/utils/useGridRootProps.mjs"; import { useGridPrivateApiContext } from "../../hooks/utils/useGridPrivateApiContext.mjs"; import { useGridSelector } from "../../hooks/utils/useGridSelector.mjs"; import { getDataGridUtilityClass, gridClasses } from "../../constants/gridClasses.mjs"; import { useGridOverlays } from "../../hooks/features/overlays/useGridOverlays.mjs"; import { GridHeaders } from "../GridHeaders.mjs"; import { GridMainContainer as Container } from "./GridMainContainer.mjs"; import { GridTopContainer as TopContainer } from "./GridTopContainer.mjs"; import { GridVirtualScrollerContent as Content } from "./GridVirtualScrollerContent.mjs"; import { GridVirtualScrollerFiller as SpaceFiller } from "./GridVirtualScrollerFiller.mjs"; import { GridVirtualScrollerRenderZone as RenderZone } from "./GridVirtualScrollerRenderZone.mjs"; import { GridVirtualScrollbar as Scrollbar, ScrollbarCorner } from "./GridVirtualScrollbar.mjs"; import { GridScrollShadows as ScrollShadows } from "../GridScrollShadows.mjs"; import { GridOverlayWrapper } from "../base/GridOverlays.mjs"; import { useGridVirtualizer } from "../../hooks/core/useGridVirtualizer.mjs"; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; const useUtilityClasses = ownerState => { const { classes, hasScrollX, hasPinnedRight, loadingOverlayVariant, overlayType } = ownerState; const hideContent = loadingOverlayVariant === 'skeleton' || overlayType === 'noColumnsOverlay'; const slots = { root: ['main', hasPinnedRight && 'main--hasPinnedRight', hideContent && 'main--hiddenContent'], scroller: ['virtualScroller', hasScrollX && 'virtualScroller--hasScrollX'] }; return composeClasses(slots, getDataGridUtilityClass, classes); }; const Scroller = styled('div', { name: 'MuiDataGrid', slot: 'VirtualScroller', overridesResolver: (props, styles) => { const { ownerState } = props; return [styles.virtualScroller, ownerState.hasScrollX && styles['virtualScroller--hasScrollX']]; } })({ position: 'relative', height: '100%', flexGrow: 1, overflow: 'scroll', display: 'flex', flexDirection: 'column', scrollbarWidth: 'none' /* Firefox */, '&::-webkit-scrollbar': { display: 'none' /* Safari and Chrome */ }, '@media print': { overflow: 'hidden' }, // See https://github.com/mui/mui-x/issues/10547 zIndex: 0 }); const Viewport = styled('div', { slot: 'internal', shouldForwardProp: undefined })({ display: 'contents', [`.${gridClasses['virtualizer--layoutControlled']} &`]: { display: 'inline-block', position: 'sticky', top: 0, left: 0, overflow: 'hidden', scrollbarWidth: 'none' /* Firefox */, '&::-webkit-scrollbar': { display: 'none' /* Safari and Chrome */ } } }); const hasPinnedRightSelector = apiRef => apiRef.current.state.dimensions.rightPinnedWidth > 0; function GridVirtualScroller(props) { const apiRef = useGridPrivateApiContext(); const rootProps = useGridRootProps(); const hasScrollY = useGridSelector(apiRef, gridHasScrollYSelector); const hasScrollX = useGridSelector(apiRef, gridHasScrollXSelector); const hasPinnedRight = useGridSelector(apiRef, hasPinnedRightSelector); const hasBottomFiller = useGridSelector(apiRef, gridHasBottomFillerSelector); const { overlayType, loadingOverlayVariant } = useGridOverlays(apiRef, rootProps); const Overlay = rootProps.slots?.[overlayType]; const ownerState = { classes: rootProps.classes, hasScrollX, hasPinnedRight, overlayType, loadingOverlayVariant }; const classes = useUtilityClasses(ownerState); const virtualizer = useGridVirtualizer(); const layoutMode = virtualizer.store.use(Virtualization.selectors.layoutMode); const hasContentFiller = layoutMode === 'uncontrolled' && loadingOverlayVariant !== 'skeleton'; const { getContainerProps, getScrollerProps, getScrollerContentProps, getViewportProps, getContentProps, getPositionerProps, getScrollbarVerticalProps, getScrollbarHorizontalProps, getRows, getScrollAreaProps, getContainerVerticalProps } = virtualizer.api.getters; const rows = getRows(undefined, gridRowTreeSelector(apiRef)); const containerVerticalProps = getContainerVerticalProps(); return /*#__PURE__*/_jsxs(Container, _extends({ className: clsx(classes.root, layoutMode === 'controlled' && gridClasses['virtualizer--layoutControlled']) }, getContainerProps(), { ownerState: ownerState, children: [/*#__PURE__*/_jsx(GridScrollArea, _extends({ scrollDirection: "left" }, getScrollAreaProps())), /*#__PURE__*/_jsx(GridScrollArea, _extends({ scrollDirection: "right" }, getScrollAreaProps())), /*#__PURE__*/_jsx(GridScrollArea, _extends({ scrollDirection: "up" }, getScrollAreaProps())), /*#__PURE__*/_jsx(GridScrollArea, _extends({ scrollDirection: "down" }, getScrollAreaProps())), /*#__PURE__*/_jsx(Scroller, _extends({ className: classes.scroller }, getScrollerProps(), { ownerState: ownerState, children: /*#__PURE__*/_jsx(Content, _extends({}, getScrollerContentProps(), { children: /*#__PURE__*/_jsxs(Viewport, _extends({}, getViewportProps(), { children: [/*#__PURE__*/_jsxs(TopContainer, _extends({}, containerVerticalProps, { children: [!rootProps.listView && /*#__PURE__*/_jsx(GridHeaders, {}), /*#__PURE__*/_jsx(rootProps.slots.pinnedRows, { position: "top" })] })), overlayType && /*#__PURE__*/_jsx(GridOverlayWrapper, { overlayType: overlayType, loadingOverlayVariant: loadingOverlayVariant, children: /*#__PURE__*/_jsx(Overlay, _extends({}, rootProps.slotProps?.[overlayType])) }), /*#__PURE__*/_jsxs(RenderZone, _extends({ role: "rowgroup" }, getPositionerProps(), { children: [rows, /*#__PURE__*/_jsx(rootProps.slots.detailPanels, {})] })), hasContentFiller && /*#__PURE__*/_jsx("div", _extends({ className: gridClasses.contentFiller }, getContentProps())), hasBottomFiller && /*#__PURE__*/_jsx(SpaceFiller, { rowsLength: rows.length }), /*#__PURE__*/_jsx(rootProps.slots.bottomContainer, _extends({}, containerVerticalProps, { children: /*#__PURE__*/_jsx(rootProps.slots.pinnedRows, { position: "bottom" }) }))] })) })) })), hasScrollX && /*#__PURE__*/_jsxs(React.Fragment, { children: [rootProps.pinnedColumnsSectionSeparator?.endsWith('shadow') && /*#__PURE__*/_jsx(ScrollShadows, { position: "horizontal" }), /*#__PURE__*/_jsx(Scrollbar, _extends({ position: "horizontal" }, getScrollbarHorizontalProps()))] }), hasScrollY && /*#__PURE__*/_jsxs(React.Fragment, { children: [rootProps.pinnedRowsSectionSeparator?.endsWith('shadow') && /*#__PURE__*/_jsx(ScrollShadows, { position: "vertical" }), /*#__PURE__*/_jsx(Scrollbar, _extends({ position: "vertical" }, getScrollbarVerticalProps()))] }), hasScrollX && hasScrollY && /*#__PURE__*/_jsx(ScrollbarCorner, { "aria-hidden": "true" }), props.children] })); } export { GridVirtualScroller };