@mui/x-data-grid
Version:
The Community plan edition of the MUI X Data Grid components.
117 lines (116 loc) • 4.33 kB
JavaScript
import * as React from 'react';
import { getGridCellElement, getGridColumnHeaderElement, getGridRowElement } from "../../../utils/domUtils.js";
import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
import { gridFocusCellSelector, gridTabIndexCellSelector } from "../focus/gridFocusStateSelector.js";
import { gridListColumnSelector } from "../listView/gridListViewSelectors.js";
import { gridRowNodeSelector } from "./gridRowsSelector.js";
export class MissingRowIdError extends Error {}
/**
* @requires useGridColumns (method)
* @requires useGridRows (method)
* @requires useGridFocus (state)
* @requires useGridEditing (method)
* TODO: Impossible priority - useGridEditing also needs to be after useGridParamsApi
* TODO: Impossible priority - useGridFocus also needs to be after useGridParamsApi
*/
export function useGridParamsApi(apiRef, props, configuration) {
const getColumnHeaderParams = React.useCallback(field => ({
field,
colDef: apiRef.current.getColumn(field)
}), [apiRef]);
const getRowParams = React.useCallback(id => {
const row = apiRef.current.getRow(id);
if (!row) {
throw new MissingRowIdError(`No row with id #${id} found`);
}
const params = {
id,
columns: apiRef.current.getAllColumns(),
row
};
return params;
}, [apiRef]);
const getCellParamsForRow = React.useCallback((id, field, row, {
cellMode,
colDef,
hasFocus,
rowNode,
tabIndex,
value: forcedValue,
formattedValue: forcedFormattedValue
}) => {
const value = forcedValue !== undefined ? forcedValue : apiRef.current.getRowValue(row, colDef);
const formattedValue = forcedFormattedValue !== undefined ? forcedFormattedValue : apiRef.current.getRowFormattedValue(row, colDef);
const params = {
id,
field,
row,
rowNode,
colDef,
cellMode,
hasFocus,
tabIndex,
value,
formattedValue,
isEditable: false,
api: apiRef.current
};
params.isEditable = colDef && apiRef.current.isCellEditable(params);
return params;
}, [apiRef]);
const getCellParams = React.useCallback((id, field) => {
const row = apiRef.current.getRow(id);
const rowNode = gridRowNodeSelector(apiRef, id);
if (!row || !rowNode) {
throw new MissingRowIdError(`No row with id #${id} found`);
}
const cellFocus = gridFocusCellSelector(apiRef);
const cellTabIndex = gridTabIndexCellSelector(apiRef);
const cellMode = apiRef.current.getCellMode(id, field);
return apiRef.current.getCellParamsForRow(id, field, row, {
colDef: props.listView && props.listViewColumn?.field === field ? gridListColumnSelector(apiRef) : apiRef.current.getColumn(field),
rowNode,
hasFocus: cellFocus !== null && cellFocus.field === field && cellFocus.id === id,
tabIndex: cellTabIndex && cellTabIndex.field === field && cellTabIndex.id === id ? 0 : -1,
cellMode
});
}, [apiRef, props.listView, props.listViewColumn?.field]);
const getColumnHeaderElement = React.useCallback(field => {
if (!apiRef.current.rootElementRef.current) {
return null;
}
return getGridColumnHeaderElement(apiRef.current.rootElementRef.current, field);
}, [apiRef]);
const getRowElement = React.useCallback(id => {
if (!apiRef.current.rootElementRef.current) {
return null;
}
return getGridRowElement(apiRef.current.rootElementRef.current, id);
}, [apiRef]);
const getCellElement = React.useCallback((id, field) => {
if (!apiRef.current.rootElementRef.current) {
return null;
}
return getGridCellElement(apiRef.current.rootElementRef.current, {
id,
field
});
}, [apiRef]);
const overridableParamsMethods = configuration.hooks.useGridParamsOverridableMethods(apiRef);
const paramsApi = {
getCellValue: overridableParamsMethods.getCellValue,
getCellParams,
getCellElement,
getRowValue: overridableParamsMethods.getRowValue,
getRowFormattedValue: overridableParamsMethods.getRowFormattedValue,
getRowParams,
getRowElement,
getColumnHeaderParams,
getColumnHeaderElement
};
const paramsPrivateApi = {
getCellParamsForRow
};
useGridApiMethod(apiRef, paramsApi, 'public');
useGridApiMethod(apiRef, paramsPrivateApi, 'private');
}