Skip to content

Commit

Permalink
Init
Browse files Browse the repository at this point in the history
  • Loading branch information
m4theushw committed Nov 2, 2022
1 parent b43bbc7 commit 6561c62
Show file tree
Hide file tree
Showing 48 changed files with 1,647 additions and 152 deletions.
21 changes: 21 additions & 0 deletions docs/data/data-grid/events/events.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@
"event": "MuiEvent<React.KeyboardEvent<HTMLElement>>",
"componentProp": "onCellKeyDown"
},
{
"projects": ["x-data-grid", "x-data-grid-pro", "x-data-grid-premium"],
"name": "cellKeyUp",
"description": "Fired when a <code>keyup</code> event happens in a cell.",
"params": "GridCellParams",
"event": "MuiEvent<React.KeyboardEvent<HTMLElement>>"
},
{
"projects": ["x-data-grid", "x-data-grid-pro", "x-data-grid-premium"],
"name": "cellModesModelChange",
Expand All @@ -75,13 +82,27 @@
"params": "GridCellParams",
"event": "MuiEvent<React.MouseEvent<HTMLElement>>"
},
{
"projects": ["x-data-grid", "x-data-grid-pro", "x-data-grid-premium"],
"name": "cellMouseOver",
"description": "Fired when a <code>mouseover</code> event happens in a cell.",
"params": "GridCellParams",
"event": "MuiEvent<React.MouseEvent<HTMLElement>>"
},
{
"projects": ["x-data-grid", "x-data-grid-pro", "x-data-grid-premium"],
"name": "cellMouseUp",
"description": "Fired when a <code>mouseup</code> event happens in a cell.",
"params": "GridCellParams",
"event": "MuiEvent<React.MouseEvent<HTMLElement>>"
},
{
"projects": ["x-data-grid-premium"],
"name": "cellSelectionChange",
"description": "Fired when the selection state of one or multiple cells change.",
"params": "GridCellSelectionModel",
"event": "MuiEvent<{}>"
},
{
"projects": ["x-data-grid", "x-data-grid-pro", "x-data-grid-premium"],
"name": "columnGroupHeaderKeyDown",
Expand Down
2 changes: 1 addition & 1 deletion docs/data/data-grid/getting-started/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ The enterprise components come in two plans: Pro and Premium.
| [Single row selection](/x/react-data-grid/selection/#single-row-selection) ||||
| [Checkbox selection](/x/react-data-grid/selection/#checkbox-selection) ||||
| [Multiple row selection](/x/react-data-grid/selection/#multiple-row-selection) ||||
| [Cell range selection](/x/react-data-grid/selection/#range-selection) ||| 🚧 |
| [Cell range selection](/x/react-data-grid/selection/#cell-selection) ||| |
| **Filtering** | | | |
| [Quick filter](/x/react-data-grid/filtering/#quick-filter) ||||
| [Column filters](/x/react-data-grid/filtering/#single-and-multi-filtering) ||||
Expand Down
1 change: 0 additions & 1 deletion docs/data/data-grid/overview/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,6 @@ Please see [the Licensing page](/x/introduction/licensing/) for details.
While development of the data grid component is moving fast, there are still many additional features that we plan to implement. Some of them:

- Headless (hooks only)
- [Range selection](/x/react-data-grid/selection/#range-selection) <span class="plan-premium"></span>
- [Pivoting](/x/react-data-grid/pivoting/) <span class="plan-premium"></span>

You can find more details on, the [feature comparison](/x/react-data-grid/getting-started/#feature-comparison), our living quarterly [roadmap](https://github.com/mui/mui-x/projects/1) as well as on the open [GitHub issues](https://github.com/mui/mui-x/issues?q=is%3Aopen+label%3A%22component%3A+DataGrid%22+label%3Aenhancement).
Expand Down
87 changes: 87 additions & 0 deletions docs/data/data-grid/selection/CellSelectionFormulaField.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import * as React from 'react';
import Button from '@mui/material/Button';
import TextField from '@mui/material/TextField';
import Stack from '@mui/material/Stack';
import { DataGridPremium, useGridApiRef } from '@mui/x-data-grid-premium';
import { useDemoData } from '@mui/x-data-grid-generator';

export default function CellSelectionFormulaField() {
const apiRef = useGridApiRef();
const [value, setValue] = React.useState('');
const [cellSelectionModel, setCellSelectionModel] = React.useState({});
const [numberOfSelectedCells, setNumberOfSelectedCells] = React.useState(0);

const { data } = useDemoData({
dataSet: 'Commodity',
rowLength: 10,
maxColumns: 6,
});

const handleCellSelectionModelChange = React.useCallback((newModel) => {
setCellSelectionModel(newModel);
}, []);

const handleValueChange = React.useCallback((event) => {
setValue(event.target.value);
}, []);

const updateSelectedCells = React.useCallback(() => {
const updates = [];

Object.entries(cellSelectionModel).forEach(([id, fields]) => {
const updatedRow = { ...apiRef.current.getRow(id) };

Object.entries(fields).forEach(([field, isSelected]) => {
if (isSelected) {
updatedRow[field] = value;
}
});

updates.push(updatedRow);
});

apiRef.current.updateRows(updates);
}, [apiRef, cellSelectionModel, value]);

React.useEffect(() => {
const selectedCells = apiRef.current.getSelectedCellsAsArray();
setNumberOfSelectedCells(selectedCells.length);

if (selectedCells.length > 1) {
setValue('(multiple values)');
} else if (selectedCells.length === 1) {
setValue(
apiRef.current.getCellValue(selectedCells[0].id, selectedCells[0].field),
);
} else {
setValue('');
}
}, [apiRef, cellSelectionModel]);

return (
<div style={{ width: '100%' }}>
<Stack sx={{ mb: 2 }} direction="row" spacing={2}>
<TextField
label="Selected cell value"
disabled={numberOfSelectedCells === 0}
value={value}
onChange={handleValueChange}
fullWidth
/>
<Button disabled={numberOfSelectedCells === 0} onClick={updateSelectedCells}>
Update selected cells
</Button>
</Stack>
<div style={{ height: 400 }}>
<DataGridPremium
apiRef={apiRef}
rowSelection={false}
cellSelectionModel={cellSelectionModel}
onCellSelectionModelChange={handleCellSelectionModelChange}
cellSelection
{...data}
/>
</div>
</div>
);
}
99 changes: 99 additions & 0 deletions docs/data/data-grid/selection/CellSelectionFormulaField.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import * as React from 'react';
import Button from '@mui/material/Button';
import TextField from '@mui/material/TextField';
import Stack from '@mui/material/Stack';
import {
DataGridPremium,
GridCellSelectionModel,
GridRowModelUpdate,
useGridApiRef,
} from '@mui/x-data-grid-premium';
import { useDemoData } from '@mui/x-data-grid-generator';

export default function CellSelectionFormulaField() {
const apiRef = useGridApiRef();
const [value, setValue] = React.useState('');
const [cellSelectionModel, setCellSelectionModel] =
React.useState<GridCellSelectionModel>({});
const [numberOfSelectedCells, setNumberOfSelectedCells] = React.useState(0);

const { data } = useDemoData({
dataSet: 'Commodity',
rowLength: 10,
maxColumns: 6,
});

const handleCellSelectionModelChange = React.useCallback(
(newModel: GridCellSelectionModel) => {
setCellSelectionModel(newModel);
},
[],
);

const handleValueChange = React.useCallback(
(event: React.ChangeEvent<HTMLInputElement>) => {
setValue(event.target.value);
},
[],
);

const updateSelectedCells = React.useCallback(() => {
const updates: GridRowModelUpdate[] = [];

Object.entries(cellSelectionModel).forEach(([id, fields]) => {
const updatedRow = { ...apiRef.current.getRow(id) };

Object.entries(fields).forEach(([field, isSelected]) => {
if (isSelected) {
updatedRow[field] = value;
}
});

updates.push(updatedRow);
});

apiRef.current.updateRows(updates);
}, [apiRef, cellSelectionModel, value]);

React.useEffect(() => {
const selectedCells = apiRef.current.getSelectedCellsAsArray();
setNumberOfSelectedCells(selectedCells.length);

if (selectedCells.length > 1) {
setValue('(multiple values)');
} else if (selectedCells.length === 1) {
setValue(
apiRef.current.getCellValue(selectedCells[0].id, selectedCells[0].field),
);
} else {
setValue('');
}
}, [apiRef, cellSelectionModel]);

return (
<div style={{ width: '100%' }}>
<Stack sx={{ mb: 2 }} direction="row" spacing={2}>
<TextField
label="Selected cell value"
disabled={numberOfSelectedCells === 0}
value={value}
onChange={handleValueChange}
fullWidth
/>
<Button disabled={numberOfSelectedCells === 0} onClick={updateSelectedCells}>
Update selected cells
</Button>
</Stack>
<div style={{ height: 400 }}>
<DataGridPremium
apiRef={apiRef}
rowSelection={false}
cellSelectionModel={cellSelectionModel}
onCellSelectionModelChange={handleCellSelectionModelChange}
cellSelection
{...data}
/>
</div>
</div>
);
}
30 changes: 30 additions & 0 deletions docs/data/data-grid/selection/CellSelectionGrid.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import * as React from 'react';
import Button from '@mui/material/Button';
import { DataGridPremium } from '@mui/x-data-grid-premium';
import { useDemoData } from '@mui/x-data-grid-generator';

export default function CellSelectionGrid() {
const [rowSelection, setRowSelection] = React.useState(false);

const { data } = useDemoData({
dataSet: 'Commodity',
rowLength: 10,
maxColumns: 6,
});

return (
<div style={{ width: '100%' }}>
<Button sx={{ mb: 2 }} onClick={() => setRowSelection(!rowSelection)}>
Toggle row selection
</Button>
<div style={{ height: 400 }}>
<DataGridPremium
rowSelection={rowSelection}
checkboxSelection={rowSelection}
cellSelection
{...data}
/>
</div>
</div>
);
}
30 changes: 30 additions & 0 deletions docs/data/data-grid/selection/CellSelectionGrid.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import * as React from 'react';
import Button from '@mui/material/Button';
import { DataGridPremium } from '@mui/x-data-grid-premium';
import { useDemoData } from '@mui/x-data-grid-generator';

export default function CellSelectionGrid() {
const [rowSelection, setRowSelection] = React.useState(false);

const { data } = useDemoData({
dataSet: 'Commodity',
rowLength: 10,
maxColumns: 6,
});

return (
<div style={{ width: '100%' }}>
<Button sx={{ mb: 2 }} onClick={() => setRowSelection(!rowSelection)}>
Toggle row selection
</Button>
<div style={{ height: 400 }}>
<DataGridPremium
rowSelection={rowSelection}
checkboxSelection={rowSelection}
cellSelection
{...data}
/>
</div>
</div>
);
}
11 changes: 11 additions & 0 deletions docs/data/data-grid/selection/CellSelectionGrid.tsx.preview
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<Button sx={{ mb: 2 }} onClick={() => setRowSelection(!rowSelection)}>
Toggle row selection
</Button>
<div style={{ height: 400 }}>
<DataGridPremium
rowSelection={rowSelection}
checkboxSelection={rowSelection}
cellSelection
{...data}
/>
</div>
50 changes: 50 additions & 0 deletions docs/data/data-grid/selection/CellSelectionRangeStyling.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import * as React from 'react';
import { styled, lighten, darken, alpha } from '@mui/material/styles';
import { DataGridPremium, gridClasses } from '@mui/x-data-grid-premium';
import { useDemoData } from '@mui/x-data-grid-generator';

const StyledDataGridPremium = styled(DataGridPremium)(({ theme }) => {
const borderColor =
theme.palette.mode === 'light'
? lighten(alpha(theme.palette.divider, 1), 0.88)
: darken(alpha(theme.palette.divider, 1), 0.68);

const selectedCellBorder = alpha(theme.palette.primary.main, 0.5);

return {
[`& .${gridClasses.cell}`]: {
border: `1px solid transparent`,
borderRight: `1px solid ${borderColor}`,
borderBottom: `1px solid ${borderColor}`,
},
[`& .${gridClasses.cell}.Mui-selected`]: {
borderColor: alpha(theme.palette.primary.main, 0.1),
},
[`& .${gridClasses.cell}.Mui-selected.${gridClasses['cell--rangeTop']}`]: {
borderTopColor: selectedCellBorder,
},
[`& .${gridClasses.cell}.Mui-selected.${gridClasses['cell--rangeBottom']}`]: {
borderBottomColor: selectedCellBorder,
},
[`& .${gridClasses.cell}.Mui-selected.${gridClasses['cell--rangeLeft']}`]: {
borderLeftColor: selectedCellBorder,
},
[`& .${gridClasses.cell}.Mui-selected.${gridClasses['cell--rangeRight']}`]: {
borderRightColor: selectedCellBorder,
},
};
});

export default function CellSelectionRangeStyling() {
const { data } = useDemoData({
dataSet: 'Commodity',
rowLength: 10,
maxColumns: 6,
});

return (
<div style={{ height: 400, width: '100%' }}>
<StyledDataGridPremium rowSelection={false} cellSelection {...data} />
</div>
);
}
Loading

0 comments on commit 6561c62

Please sign in to comment.