UNPKG

@mui/x-data-grid

Version:

The community edition of the data grid component (MUI X).

151 lines (134 loc) 5.77 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import * as React from 'react'; import { useGridLogger, useGridSelector, useGridApiMethod, useGridApiEventHandler } from '../../utils'; import { gridVisibleTopLevelRowCountSelector } from '../filter'; import { gridPageSelector, gridPageSizeSelector } from './gridPaginationSelector'; import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing'; import { buildWarning } from '../../../utils/warning'; export var getPageCount = function getPageCount(rowCount, pageSize) { if (pageSize > 0 && rowCount > 0) { return Math.ceil(rowCount / pageSize); } return 0; }; var applyValidPage = function applyValidPage(paginationState) { if (!paginationState.pageCount) { return paginationState; } return _extends({}, paginationState, { page: Math.max(Math.min(paginationState.page, paginationState.pageCount - 1), 0) }); }; var mergeStateWithPage = function mergeStateWithPage(page) { return function (state) { return _extends({}, state, { pagination: applyValidPage(_extends({}, state.pagination, { page: page })) }); }; }; var noRowCountInServerMode = buildWarning(["MUI: the 'rowCount' prop is undefined while using paginationMode='server'", 'For more detail, see http://mui.com/components/data-grid/pagination/#basic-implementation'], 'error'); /** * @requires useGridPageSize (event) */ export var useGridPage = function useGridPage(apiRef, props) { var _props$initialState2, _props$initialState2$; var logger = useGridLogger(apiRef, 'useGridPage'); var visibleTopLevelRowCount = useGridSelector(apiRef, gridVisibleTopLevelRowCountSelector); apiRef.current.unstable_registerControlState({ stateId: 'page', propModel: props.page, propOnChange: props.onPageChange, stateSelector: gridPageSelector, changeEvent: 'pageChange' }); /** * API METHODS */ var setPage = React.useCallback(function (page) { logger.debug("Setting page to ".concat(page)); apiRef.current.setState(mergeStateWithPage(page)); apiRef.current.forceUpdate(); }, [apiRef, logger]); var pageApi = { setPage: setPage }; useGridApiMethod(apiRef, pageApi, 'GridPageApi'); /** * PRE-PROCESSING */ var stateExportPreProcessing = React.useCallback(function (prevState, context) { var _props$initialState, _props$initialState$p; var pageToExport = gridPageSelector(apiRef); var shouldExportPage = // Always export if the `exportOnlyDirtyModels` property is activated !context.exportOnlyDirtyModels || // Always export if the page is controlled props.page != null || // Always export if the page has been initialized ((_props$initialState = props.initialState) == null ? void 0 : (_props$initialState$p = _props$initialState.pagination) == null ? void 0 : _props$initialState$p.page) != null || // Export if the page is not equal to the default value pageToExport !== 0; if (!shouldExportPage) { return prevState; } return _extends({}, prevState, { pagination: _extends({}, prevState.pagination, { page: pageToExport }) }); }, [apiRef, props.page, (_props$initialState2 = props.initialState) == null ? void 0 : (_props$initialState2$ = _props$initialState2.pagination) == null ? void 0 : _props$initialState2$.page]); var stateRestorePreProcessing = React.useCallback(function (params, context) { var _context$stateToResto, _context$stateToResto2; // We apply the constraint even if the page did not change in case the pageSize changed. var page = (_context$stateToResto = (_context$stateToResto2 = context.stateToRestore.pagination) == null ? void 0 : _context$stateToResto2.page) != null ? _context$stateToResto : gridPageSelector(apiRef); apiRef.current.setState(mergeStateWithPage(page)); return params; }, [apiRef]); useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing); useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing); /** * EVENTS */ var handlePageSizeChange = function handlePageSizeChange(pageSize) { apiRef.current.setState(function (state) { var pageCount = getPageCount(state.pagination.rowCount, pageSize); return _extends({}, state, { pagination: applyValidPage(_extends({}, state.pagination, { pageCount: pageCount, page: state.pagination.page })) }); }); apiRef.current.forceUpdate(); }; var handlePageChange = function handlePageChange() { return apiRef.current.scrollToIndexes({ rowIndex: gridPageSelector(apiRef) * gridPageSizeSelector(apiRef) }); }; useGridApiEventHandler(apiRef, 'pageSizeChange', handlePageSizeChange); useGridApiEventHandler(apiRef, 'pageChange', handlePageChange); /** * EFFECTS */ React.useEffect(function () { if (process.env.NODE_ENV !== 'production') { if (props.paginationMode === 'server' && props.rowCount == null) { noRowCountInServerMode(); } } }, [props.rowCount, props.paginationMode]); React.useEffect(function () { apiRef.current.setState(function (state) { var rowCount = props.rowCount !== undefined ? props.rowCount : visibleTopLevelRowCount; var pageCount = getPageCount(rowCount, state.pagination.pageSize); var page = props.page == null ? state.pagination.page : props.page; return _extends({}, state, { pagination: applyValidPage(_extends({}, state.pagination, { page: page, rowCount: rowCount, pageCount: pageCount })) }); }); apiRef.current.forceUpdate(); }, [visibleTopLevelRowCount, props.rowCount, props.page, props.paginationMode, apiRef]); };