Skip to content

Commit

Permalink
[DataGrid] Data provider create and update fixes (#3621)
Browse files Browse the repository at this point in the history
  • Loading branch information
Janpot authored Jun 3, 2024
1 parent 5eead6f commit 3f48aa7
Showing 1 changed file with 35 additions and 30 deletions.
65 changes: 35 additions & 30 deletions packages/toolpad-core/src/DataGrid/DataGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
GridPaginationModel,
gridClasses,
GridRowIdGetter,
GridApi,
} from '@mui/x-data-grid';
import PropTypes from 'prop-types';
import * as React from 'react';
Expand Down Expand Up @@ -231,7 +232,7 @@ interface GridState {
}

type GridAction =
| { kind: 'START_ROW_EDIT'; rowId: GridRowId }
| { kind: 'START_ROW_EDIT'; rowId: GridRowId; fieldToFocus: string | undefined }
| { kind: 'CANCEL_ROW_EDIT' }
| { kind: 'START_ROW_UPDATE' }
| { kind: 'END_ROW_UPDATE' };
Expand All @@ -248,6 +249,7 @@ function gridEditingReducer(state: GridState, action: GridAction): GridState {
rowModesModel: {
[action.rowId]: {
mode: GridRowModes.Edit,
fieldToFocus: action.fieldToFocus,
},
},
};
Expand Down Expand Up @@ -325,6 +327,7 @@ export function getColumnsFromDataProviderFields<R extends Datum>(
}

function updateColumnsWithDataProviderEditing<R extends Datum>(
apiRef: React.MutableRefObject<GridApi>,
dataProvider: ResolvedDataProvider<R>,
baseColumns: readonly GridColDef<R>[],
state: GridState,
Expand Down Expand Up @@ -363,7 +366,7 @@ function updateColumnsWithDataProviderEditing<R extends Datum>(
const rowId = params.row[idField] as GridRowId;

const isEditing = state.editedRowId !== null || state.isProcessingRowUpdate;
const isEditedRow = rowId === state.editedRowId;
const isEditedRow = isDraftRow(params.row) || rowId === state.editedRowId;

if (isEditedRow) {
actions.push(
Expand Down Expand Up @@ -395,7 +398,11 @@ function updateColumnsWithDataProviderEditing<R extends Datum>(
label="Edit"
disabled={isEditing}
onClick={() => {
dispatch({ kind: 'START_ROW_EDIT', rowId });
dispatch({
kind: 'START_ROW_EDIT',
rowId,
fieldToFocus: getEditedRowFieldToFocus(apiRef, idField),
});
}}
/>,
);
Expand Down Expand Up @@ -436,23 +443,6 @@ function ToolbarGridToolbar() {
);
}

function usePatchedRowModesModel(rowModesModel: GridRowModesModel): GridRowModesModel {
const prevRowModesModel = React.useRef(rowModesModel);
React.useEffect(() => {
prevRowModesModel.current = rowModesModel;
}, [rowModesModel]);

return React.useMemo(() => {
if (rowModesModel === prevRowModesModel.current) {
return rowModesModel;
}
const base = Object.fromEntries(
Object.keys(prevRowModesModel.current).map((rowId) => [rowId, { mode: GridRowModes.View }]),
);
return { ...base, ...rowModesModel };
}, [rowModesModel]);
}

function diffRows<R extends Record<PropertyKey, unknown>>(original: R, changed: R): Partial<R> {
const keys = new Set([...Object.keys(original), ...Object.keys(changed)]);
const diff: Partial<R> = {};
Expand All @@ -474,6 +464,14 @@ function diffRows<R extends Record<PropertyKey, unknown>>(original: R, changed:
return diff;
}

function getEditedRowFieldToFocus(
apiRef: React.MutableRefObject<GridApi>,
idField: ValidId,
): string | undefined {
const firstNonIdColumn = apiRef.current.getVisibleColumns().find((col) => col.field !== idField);
return firstNonIdColumn?.field;
}

/**
*
* Demos:
Expand Down Expand Up @@ -526,8 +524,12 @@ const DataGrid = React.forwardRef(function DataGrid<R extends Datum>(
});

const handleCreateRowRequest = React.useCallback(() => {
dispatchEditingAction({ kind: 'START_ROW_EDIT', rowId: DRAFT_ROW_ID });
}, []);
dispatchEditingAction({
kind: 'START_ROW_EDIT',
rowId: DRAFT_ROW_ID,
fieldToFocus: getEditedRowFieldToFocus(apiRef, idField),
});
}, [apiRef, idField]);

const useGetManyParams = React.useMemo<GetManyParams<R>>(
() => ({
Expand Down Expand Up @@ -662,17 +664,19 @@ const DataGrid = React.forwardRef(function DataGrid<R extends Datum>(
[getRowIdProp, idField],
);

// Remove when https://github.com/mui/mui-x/issues/11423 is fixed
const rowModesModelPatched = usePatchedRowModesModel(editingState.rowModesModel ?? {});

const handleRowEditStart = React.useCallback<GridEventListener<'rowEditStart'>>(
(params) => {
const rowId = params.row[idField] as GridRowId;
if (params.reason === 'cellDoubleClick') {
dispatchEditingAction({ kind: 'START_ROW_EDIT', rowId });
const canEdit = !!dataProvider?.updateOne;
if (params.reason === 'cellDoubleClick' && canEdit) {
dispatchEditingAction({
kind: 'START_ROW_EDIT',
rowId,
fieldToFocus: getEditedRowFieldToFocus(apiRef, idField),
});
}
},
[idField],
[apiRef, dataProvider?.updateOne, idField],
);

// Calculate separately to avoid re-calculating columns on every render
Expand Down Expand Up @@ -702,14 +706,15 @@ const DataGrid = React.forwardRef(function DataGrid<R extends Datum>(
);

gridColumns = updateColumnsWithDataProviderEditing(
apiRef,
dataProvider,
gridColumns,
editingState,
dispatchEditingAction,
);

return gridColumns;
}, [columnsProp, dataProvider, editingState, inferredFields]);
}, [apiRef, columnsProp, dataProvider, editingState, inferredFields]);

const isSsr = useSsr();

Expand Down Expand Up @@ -743,7 +748,7 @@ const DataGrid = React.forwardRef(function DataGrid<R extends Datum>(
loading={loading}
processRowUpdate={processRowUpdate}
slots={slots}
rowModesModel={rowModesModelPatched}
rowModesModel={editingState.rowModesModel}
onRowEditStart={handleRowEditStart}
getRowId={getRowId}
{...(restProps.paginationMode === 'server'
Expand Down

0 comments on commit 3f48aa7

Please sign in to comment.