@mui/x-data-grid-pro
Version:
The Pro plan edition of the MUI X Data Grid components.
59 lines (58 loc) • 2.71 kB
JavaScript
import * as React from 'react';
import { gridRowTreeSelector, gridExpandedSortedRowIdsSelector, gridRowNodeSelector, useGridSelector, gridRowMaximumTreeDepthSelector, gridExpandedSortedRowIndexLookupSelector } from '@mui/x-data-grid';
import { useGridRowsOverridableMethodsCommunity } from '@mui/x-data-grid/internals';
import { treeDataReorderExecutor } from "../treeData/treeDataReorderExecutor.js";
export const useGridRowsOverridableMethods = (apiRef, props) => {
const {
processRowUpdate,
onProcessRowUpdateError,
setTreeDataPath
} = props;
const {
setRowIndex: setRowIndexFlat,
setRowPosition: setRowPositionFlat
} = useGridRowsOverridableMethodsCommunity(apiRef);
const flatTree = useGridSelector(apiRef, gridRowMaximumTreeDepthSelector) === 1;
const setRowPosition = React.useCallback(async (sourceRowId, targetRowId, position) => {
const sortedFilteredRowIds = gridExpandedSortedRowIdsSelector(apiRef);
const sortedFilteredRowIndexLookup = gridExpandedSortedRowIndexLookupSelector(apiRef);
const rowTree = gridRowTreeSelector(apiRef);
const sourceNode = gridRowNodeSelector(apiRef, sourceRowId);
const targetNode = gridRowNodeSelector(apiRef, targetRowId);
if (!sourceNode) {
throw new Error(`MUI X: No row with id #${sourceRowId} found.`);
}
if (!targetNode) {
throw new Error(`MUI X: No row with id #${targetRowId} found.`);
}
if (sourceNode.type === 'footer') {
throw new Error(`MUI X: The row reordering do not support reordering of footer rows.`);
}
// Get the target index from the targetRowId using the lookup selector
const targetIndexUnadjusted = sortedFilteredRowIndexLookup[targetRowId];
if (targetIndexUnadjusted === undefined) {
throw new Error(`MUI X: Target row with id #${targetRowId} not found in current view.`);
}
const targetIndex = position === 'below' ? targetIndexUnadjusted + 1 : targetIndexUnadjusted;
const executionContext = {
sourceRowId,
dropPosition: position,
placeholderIndex: targetIndex,
sortedFilteredRowIds,
sortedFilteredRowIndexLookup,
rowTree,
apiRef,
processRowUpdate,
onProcessRowUpdateError,
setTreeDataPath
};
return treeDataReorderExecutor.execute(executionContext);
}, [apiRef, processRowUpdate, onProcessRowUpdateError, setTreeDataPath]);
const setRowIndex = React.useCallback(async () => {
throw new Error(`MUI X: \`setRowIndex()\` is not supported for tree data. Use \`setRowPosition()\` instead.`);
}, []);
return {
setRowIndex: flatTree ? setRowIndexFlat : setRowIndex,
setRowPosition: flatTree ? setRowPositionFlat : setRowPosition
};
};