UNPKG

@mui/x-data-grid

Version:

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

93 lines (92 loc) 3.91 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import * as React from 'react'; import { gridRowTreeSelector, gridRowNodeSelector } from "./gridRowsSelector.js"; import { gridExpandedSortedRowIndexLookupSelector } from "../filter/gridFilterSelector.js"; import { GRID_ROOT_GROUP_ID } from "./gridRowsUtils.js"; export const useGridRowsOverridableMethods = apiRef => { const setRowPosition = React.useCallback((sourceRowId, targetRowId, position) => { 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 !== 'leaf') { throw new Error(`MUI X: The row reordering does not support reordering of footer or grouping rows.`); } if (position === 'inside') { throw new Error(`MUI X: The 'inside' position is only supported for tree data. Use 'above' or 'below' for flat data.`); } // Get the target index from the targetRowId using the lookup selector const sortedFilteredRowIndexLookup = gridExpandedSortedRowIndexLookupSelector(apiRef); const targetRowIndexUnadjusted = sortedFilteredRowIndexLookup[targetRowId]; if (targetRowIndexUnadjusted === undefined) { throw new Error(`MUI X: Target row with id #${targetRowId} not found in current view.`); } const sourceRowIndex = sortedFilteredRowIndexLookup[sourceRowId]; if (sourceRowIndex === undefined) { throw new Error(`MUI X: Source row with id #${sourceRowId} not found in current view.`); } const dragDirection = targetRowIndexUnadjusted < sourceRowIndex ? 'up' : 'down'; let targetRowIndex; if (dragDirection === 'up') { targetRowIndex = position === 'above' ? targetRowIndexUnadjusted : targetRowIndexUnadjusted + 1; } else { targetRowIndex = position === 'above' ? targetRowIndexUnadjusted - 1 : targetRowIndexUnadjusted; } if (targetRowIndex === sourceRowIndex) { return; } apiRef.current.setState(state => { const group = gridRowTreeSelector(apiRef)[GRID_ROOT_GROUP_ID]; const allRows = group.children; const updatedRows = [...allRows]; updatedRows.splice(targetRowIndex, 0, updatedRows.splice(sourceRowIndex, 1)[0]); return _extends({}, state, { rows: _extends({}, state.rows, { tree: _extends({}, state.rows.tree, { [GRID_ROOT_GROUP_ID]: _extends({}, group, { children: updatedRows }) }) }) }); }); apiRef.current.publishEvent('rowsSet'); }, [apiRef]); const setRowIndex = React.useCallback((rowId, targetIndex) => { const node = gridRowNodeSelector(apiRef, rowId); if (!node) { throw new Error(`MUI X: No row with id #${rowId} found.`); } if (node.type !== 'leaf') { throw new Error(`MUI X: The row reordering does not support reordering of footer or grouping rows.`); } apiRef.current.setState(state => { const group = gridRowTreeSelector(apiRef)[GRID_ROOT_GROUP_ID]; const allRows = group.children; const oldIndex = allRows.findIndex(row => row === rowId); if (oldIndex === -1 || oldIndex === targetIndex) { return state; } const updatedRows = [...allRows]; updatedRows.splice(targetIndex, 0, updatedRows.splice(oldIndex, 1)[0]); return _extends({}, state, { rows: _extends({}, state.rows, { tree: _extends({}, state.rows.tree, { [GRID_ROOT_GROUP_ID]: _extends({}, group, { children: updatedRows }) }) }) }); }); apiRef.current.publishEvent('rowsSet'); }, [apiRef]); return { setRowIndex, setRowPosition }; };