@mui/x-data-grid
Version:
The community edition of the data grid component (MUI X).
191 lines (160 loc) • 8.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.editingStateInitializer = void 0;
exports.useGridEditing = useGridEditing;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var React = _interopRequireWildcard(require("react"));
var _gridEditRowModel = require("../../../models/gridEditRowModel");
var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
var _useGridApiMethod = require("../../utils/useGridApiMethod");
var _useGridLogger = require("../../utils/useGridLogger");
var _gridEditRowsSelector = require("./gridEditRowsSelector");
var _useGridCellEditing = require("./useGridCellEditing.old");
var _useGridRowEditing = require("./useGridRowEditing.old");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
const editingStateInitializer = state => (0, _extends2.default)({}, state, {
editRows: {}
});
/**
* @requires useGridFocus - can be after, async only
* @requires useGridParamsApi (method)
* @requires useGridColumns (state)
*/
exports.editingStateInitializer = editingStateInitializer;
function useGridEditing(apiRef, props) {
var _props$experimentalFe2;
const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridEditRows');
(0, _useGridCellEditing.useCellEditing)(apiRef, props);
(0, _useGridRowEditing.useGridRowEditing)(apiRef, props);
const debounceMap = React.useRef({});
apiRef.current.unstable_registerControlState({
stateId: 'editRows',
propModel: props.editRowsModel,
propOnChange: props.onEditRowsModelChange,
stateSelector: _gridEditRowsSelector.gridEditRowsStateSelector,
changeEvent: 'editRowsModelChange'
});
const isCellEditable = React.useCallback(params => !params.rowNode.isAutoGenerated && !params.rowNode.isPinned && !!params.colDef.editable && !!params.colDef.renderEditCell && (!props.isCellEditable || props.isCellEditable(params)), // eslint-disable-next-line react-hooks/exhaustive-deps
[props.isCellEditable]);
const maybeDebounce = (id, field, debounceMs, callback) => {
if (!debounceMs) {
callback();
return;
}
if (!debounceMap.current[id]) {
debounceMap.current[id] = {};
}
if (debounceMap.current[id][field]) {
const [timeout] = debounceMap.current[id][field];
clearTimeout(timeout);
}
const callbackToRunImmediately = () => {
callback();
const [timeout] = debounceMap.current[id][field];
clearTimeout(timeout);
delete debounceMap.current[id][field];
};
const timeout = setTimeout(() => {
callback();
delete debounceMap.current[id][field];
}, debounceMs);
debounceMap.current[id][field] = [timeout, callbackToRunImmediately];
};
const runPendingEditCellValueMutation = React.useCallback((id, field) => {
if (!debounceMap.current[id]) {
return;
}
if (!field) {
Object.keys(debounceMap.current[id]).forEach(debouncedField => {
const [, callback] = debounceMap.current[id][debouncedField];
callback();
});
} else if (debounceMap.current[id][field]) {
const [, callback] = debounceMap.current[id][field];
callback();
}
}, []);
const setEditCellValue = React.useCallback((params, event = {}) => {
maybeDebounce(params.id, params.field, params.debounceMs, () => {
var _props$experimentalFe;
if ((_props$experimentalFe = props.experimentalFeatures) != null && _props$experimentalFe.preventCommitWhileValidating) {
if (props.editMode === 'row') {
return apiRef.current.unstable_setRowEditingEditCellValue(params);
}
return apiRef.current.unstable_setCellEditingEditCellValue(params);
}
const newParams = {
id: params.id,
field: params.field,
props: {
value: params.value
}
};
return apiRef.current.publishEvent('editCellPropsChange', newParams, event);
});
}, [apiRef, props.editMode, (_props$experimentalFe2 = props.experimentalFeatures) == null ? void 0 : _props$experimentalFe2.preventCommitWhileValidating]);
const parseValue = React.useCallback((id, field, value) => {
const column = apiRef.current.getColumn(field);
return column.valueParser ? column.valueParser(value, apiRef.current.getCellParams(id, field)) : value;
}, [apiRef]);
const setEditCellProps = React.useCallback(params => {
const {
id,
field,
props: editProps
} = params;
logger.debug(`Setting cell props on id: ${id} field: ${field}`);
apiRef.current.setState(state => {
const editRowsModel = (0, _extends2.default)({}, state.editRows);
editRowsModel[id] = (0, _extends2.default)({}, state.editRows[id]);
editRowsModel[id][field] = (0, _extends2.default)({}, editProps, {
value: parseValue(id, field, editProps.value)
});
return (0, _extends2.default)({}, state, {
editRows: editRowsModel
});
});
apiRef.current.forceUpdate();
const editRowsState = (0, _gridEditRowsSelector.gridEditRowsStateSelector)(apiRef.current.state);
return editRowsState[id][field];
}, [apiRef, logger, parseValue]);
const setEditRowsModel = React.useCallback(model => {
const currentModel = (0, _gridEditRowsSelector.gridEditRowsStateSelector)(apiRef.current.state);
if (currentModel !== model) {
logger.debug(`Setting editRows model`);
apiRef.current.setState(state => (0, _extends2.default)({}, state, {
editRows: model
}));
apiRef.current.forceUpdate();
}
}, [apiRef, logger]);
const getEditRowsModel = React.useCallback(() => (0, _gridEditRowsSelector.gridEditRowsStateSelector)(apiRef.current.state), [apiRef]);
const preventTextSelection = React.useCallback((params, event) => {
const isMoreThanOneClick = event.detail > 1;
if (params.isEditable && params.cellMode === _gridEditRowModel.GridCellModes.View && isMoreThanOneClick) {
// If we click more than one time, then we prevent the default behavior of selecting the text cell.
event.preventDefault();
}
}, []);
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'cellMouseDown', preventTextSelection);
(0, _useGridApiEventHandler.useGridApiOptionHandler)(apiRef, 'editCellPropsChange', props.onEditCellPropsChange); // TODO v6: remove, use `preProcessEditCellProps` instead
const editingSharedApi = {
isCellEditable,
setEditRowsModel,
getEditRowsModel,
setEditCellValue,
unstable_setEditCellProps: setEditCellProps,
unstable_parseValue: parseValue,
unstable_runPendingEditCellValueMutation: runPendingEditCellValueMutation
};
(0, _useGridApiMethod.useGridApiMethod)(apiRef, editingSharedApi, 'EditRowApi');
React.useEffect(() => {
if (props.editRowsModel !== undefined) {
apiRef.current.setEditRowsModel(props.editRowsModel);
}
}, [apiRef, props.editRowsModel]);
}