1. Change DataGrid to Select One
– Change DataGrid
– Check box is hidden
– Selection count is hidden
– Change multiple row selection to single row selection
2. node modules
@mui/x-data-grid@5.17.3
3. Reference
https://mui.com/material-ui/react-table/#data-table
4. Contents
(1) Not use
(2) Create selectionObj
(3) Force out of focus
(4) Component
(5) Usage
5. Not use
– useSate
– checkboxSelection
– disableSelectionOnClick={true}
6. Create selectionObj
– LendingToday.tsx
const CreatetSelectionObj = () => new selectionObj_class() ; function selectionObj_class() { this.selectionModel = null; this.setSelectionModel = (model) => this.selectionModel = model; this.getSelectionModel = () => this.selectionModel; return this; }
7. Force out of focus
const fieldsName = columns.map((row) => (row.field)) const cellClickHandler = (e) => { setSelectionModel(e.row) let columnNumber = fieldsName.indexOf(e.field) + 1; setTimeout(function (id, columnNumber) { let css = `.MuiDataGrid-row:nth-child(${id}) > .MuiDataGrid-cell:nth-child(${columnNumber}) > .MuiDataGrid-cellContent` let element = document.querySelector(css); element.parentNode.blur(); }.bind(null, e.row.id, columnNumber), 1); }
8. Component
– LendingTable.tsx
– hideFooterSelectedRowCount
import { DataGrid, GridColDef } from '@mui/x-data-grid'; export default function LendingTable(props) { const PAGE_SIZE = 5; const setSelectionModel = props.selectionObj.setSelectionModel; const getSelectionModel = props.selectionObj.getSelectionModel; const fieldsName = columns.map((row, index) => (row.field)) const cellClickHandler = (e) => { setSelectionModel(e.row) let columnNumber = fieldsName.indexOf(e.field) + 1; setTimeout(function (id, columnNumber) { let css = `.MuiDataGrid-row:nth-child(${id}) > .MuiDataGrid-cell:nth-child(${columnNumber}) > .MuiDataGrid-cellContent` let element = document.querySelector(css); element.parentNode.blur(); }.bind(null, e.row.id, columnNumber), 1); } if (props.rows.length == 0) { return; } <div style={{ height: 400 , width: '100%' }} > <DataGrid rows={props.rows} columns={props.columns} pageSize={PAGE_SIZE} rowsPerPageOptions={[PAGE_SIZE]} density= "compact" onCellClick={(event) => cellClickHandler(event)} hideFooterSelectedRowCount />
9. Usage
– LendingToday.tsx
import { GridColDef } from '@mui/x-data-grid'; import LendingTable from './LendingTable'; const CreatetSelectionObj = () => new selectionObj_class() ; function selectionObj_class() { this.selectionModel = null; this.setSelectionModel = (model) => this.selectionModel = model; this.getSelectionModel = () => this.selectionModel; return this; } export default function LendingToday(props) { const selectionObj = CreateSelectionObj() const S_WIDTH = 90; const B_WIDTH = 160; const D_WIDTH = 110; const columns: GridColDef[] = [ { field: 'id', headerName: 'Bike No', width: S_WIDTH }, { field: 'name', headerName: 'Borrower Name', width: B_WIDTH }, { field: 'status', headerName: 'Status', description: 'This column has a value getter and is not sortable.', sortable: false, width: S_WIDTH, align: 'center', valueGetter: (params: GridValueGetterParams) => `${params.row.returnTime? 'Returned' : (params.row.lendingTime? 'On lend': '')}`, }, { field: 'lendingDate', headerName: 'lending Date', width: D_WIDTH }, { field: 'lendingTime', headerName: 'lending Time', width: D_WIDTH }, { field: 'returnDate', headerName: 'Return Date', width: D_WIDTH }, { field: 'returnTime', headerName: 'Return Time', width: D_WIDTH }, ]; return ( <> <LendingTable rows={props.rows} selectionObj={selectionObj} columns={columns} /> </> ) }