Skip to content
Merged
Show file tree
Hide file tree
Changes from 61 commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
7816345
[data grid] Update vertical position to cover pinned rows
KenanYusuf Feb 5, 2025
0737cae
fix build
KenanYusuf Feb 5, 2025
80ae0f9
fix
KenanYusuf Feb 6, 2025
673393e
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Feb 6, 2025
672d1f9
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Feb 17, 2025
5a87515
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Apr 15, 2025
432e5c8
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf May 21, 2025
b610de5
fix vertical scrollbar
KenanYusuf May 22, 2025
82ae8d6
add aria-hidden to presentational scrollbar
KenanYusuf May 22, 2025
57a2d0b
fix scrollbar filler for pinned right columns
KenanYusuf May 22, 2025
9707912
fix skeleton loader styles
KenanYusuf May 22, 2025
4eec5f3
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf May 22, 2025
4b6fda9
revert changes
KenanYusuf May 22, 2025
de7bfb5
fix scrollbarInnerHeight
KenanYusuf May 23, 2025
e89a6a9
fix scrolling vertically when there is horizontal scroll
KenanYusuf May 27, 2025
888f749
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf May 27, 2025
5d87e4a
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf May 27, 2025
04b6311
add scroll shadows
KenanYusuf May 28, 2025
d1dba84
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf May 28, 2025
83f916c
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 2, 2025
62603e3
remove border from filler cells
KenanYusuf Jun 2, 2025
8a42578
round scroll values
KenanYusuf Jun 2, 2025
2b7881e
improve shadow styles
KenanYusuf Jun 2, 2025
35fafe2
improve var naming
KenanYusuf Jun 2, 2025
a9a2668
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 2, 2025
beeb89b
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 23, 2025
1642174
add null check
KenanYusuf Jun 24, 2025
bf0fc47
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 24, 2025
f44d1b3
fix vertical scrollbar size and position
KenanYusuf Jun 24, 2025
0ec921a
alternate approach to hiding vertical scrollbar on overlays
KenanYusuf Jun 25, 2025
6dd3eed
export type
KenanYusuf Jun 25, 2025
fbc9c83
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 25, 2025
aeb9ff4
adjust shadow
KenanYusuf Jun 25, 2025
872530a
fix space for horizontal scrollbar in list view
KenanYusuf Jun 25, 2025
fe55f40
add missing dependency
KenanYusuf Jun 25, 2025
2386c9c
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 25, 2025
67c3a42
update background color in dark mode
KenanYusuf Jun 26, 2025
825be6d
update light mode background color
KenanYusuf Jun 26, 2025
bedd100
refine shadows
KenanYusuf Jun 26, 2025
24ea113
add border to scrollbar filler on header filter rows
KenanYusuf Jun 26, 2025
684f386
adjust shadows _again_
KenanYusuf Jun 26, 2025
81b3a90
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jun 26, 2025
392d9a0
fix scroll shadows in RTL
KenanYusuf Jun 26, 2025
7d5734e
lint
KenanYusuf Jun 27, 2025
4d40332
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
KenanYusuf Jul 3, 2025
3c42491
remove styles
KenanYusuf Jul 3, 2025
f6a0ce3
memoize style
KenanYusuf Jul 7, 2025
526072a
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
cherniavskii Sep 15, 2025
6648147
apply dimension changes to the virtualizer
cherniavskii Sep 15, 2025
144a32e
fix ts error
cherniavskii Sep 15, 2025
e906325
add pinnedColumnsSectionSeparator prop
cherniavskii Sep 15, 2025
eecf0e5
do not hide horizontal scroll for loading overlay
cherniavskii Sep 16, 2025
0e0a327
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
cherniavskii Sep 16, 2025
1047df5
evaluate scroll shadow visibility in effect
cherniavskii Sep 16, 2025
c4d411a
fix error where horizontal scroll was disable instead of vertical one
cherniavskii Sep 16, 2025
17b57f1
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
cherniavskii Sep 16, 2025
747f6c5
lint: extract type
cherniavskii Sep 16, 2025
26d7561
add pinnedRowsSectionSeparator prop
cherniavskii Sep 16, 2025
afd3eff
update demo
cherniavskii Sep 16, 2025
092ad68
reduce the diff
cherniavskii Sep 16, 2025
367db03
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
cherniavskii Sep 26, 2025
7cb61c9
Merge branch 'master' into vertical-scrollbar-include-pinned-rows
cherniavskii Sep 29, 2025
612f420
border+shadow => border-and-shadow
cherniavskii Sep 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 167 additions & 0 deletions docs/data/data-grid/column-pinning/ColumnPinningSectionSeparator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import * as React from 'react';
import DeleteIcon from '@mui/icons-material/Delete';
import EditIcon from '@mui/icons-material/Edit';
import FormControl from '@mui/material/FormControl';
import RadioGroup from '@mui/material/RadioGroup';
import FormControlLabel from '@mui/material/FormControlLabel';
import Radio from '@mui/material/Radio';
import { DataGridPro, GridActionsCellItem } from '@mui/x-data-grid-pro';
import {
randomCreatedDate,
randomTraderName,
randomEmail,
randomUpdatedDate,
} from '@mui/x-data-grid-generator';

export default function ColumnPinningSectionSeparator() {
const [separator, setSeparator] = React.useState('border+shadow');

return (
<div style={{ width: '100%' }}>
<FormControl component="fieldset">
<RadioGroup
row
value={separator}
onChange={(event) => setSeparator(event.target.value)}
name="pinned-columns-section-separator"
>
<FormControlLabel
value="border+shadow"
control={<Radio />}
label={<code>&quot;border+shadow&quot;</code>}
/>
<FormControlLabel
value="border"
control={<Radio />}
label={<code>&quot;border&quot;</code>}
/>
<FormControlLabel
value="shadow"
control={<Radio />}
label={<code>&quot;shadow&quot;</code>}
/>
</RadioGroup>
</FormControl>
<div style={{ height: 400 }}>
<DataGridPro
rows={rows}
columns={columns}
initialState={{ pinnedColumns: { left: ['name'], right: ['actions'] } }}
pinnedColumnsSectionSeparator={separator}
/>
</div>
</div>
);
}

const columns = [
{ field: 'name', headerName: 'Name', width: 160, editable: true },
{ field: 'email', headerName: 'Email', width: 200, editable: true },
{ field: 'age', headerName: 'Age', type: 'number', editable: true },
{
field: 'dateCreated',
headerName: 'Date Created',
type: 'date',
width: 180,
editable: true,
},
{
field: 'lastLogin',
headerName: 'Last Login',
type: 'dateTime',
width: 220,
editable: true,
},
{
field: 'actions',
type: 'actions',
width: 100,
getActions: () => [
<GridActionsCellItem icon={<EditIcon />} label="Edit" />,
<GridActionsCellItem icon={<DeleteIcon />} label="Delete" />,
],
},
];

const rows = [
{
id: 1,
name: randomTraderName(),
email: randomEmail(),
age: 25,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 2,
name: randomTraderName(),
email: randomEmail(),
age: 36,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 3,
name: randomTraderName(),
email: randomEmail(),
age: 19,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 4,
name: randomTraderName(),
email: randomEmail(),
age: 28,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 5,
name: randomTraderName(),
email: randomEmail(),
age: 23,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 6,
name: randomTraderName(),
email: randomEmail(),
age: 27,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 7,
name: randomTraderName(),
email: randomEmail(),
age: 18,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 8,
name: randomTraderName(),
email: randomEmail(),
age: 31,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 9,
name: randomTraderName(),
email: randomEmail(),
age: 24,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 10,
name: randomTraderName(),
email: randomEmail(),
age: 35,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
];
178 changes: 178 additions & 0 deletions docs/data/data-grid/column-pinning/ColumnPinningSectionSeparator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
import * as React from 'react';
import DeleteIcon from '@mui/icons-material/Delete';
import EditIcon from '@mui/icons-material/Edit';
import FormControl from '@mui/material/FormControl';
import RadioGroup from '@mui/material/RadioGroup';
import FormControlLabel from '@mui/material/FormControlLabel';
import Radio from '@mui/material/Radio';
import {
DataGridPro,
GridActionsCellItem,
type GridColDef,
type GridRowsProp,
type DataGridProProps,
} from '@mui/x-data-grid-pro';
import {
randomCreatedDate,
randomTraderName,
randomEmail,
randomUpdatedDate,
} from '@mui/x-data-grid-generator';

type SectionSeparator = NonNullable<
DataGridProProps['pinnedColumnsSectionSeparator']
>;

export default function ColumnPinningSectionSeparator() {
const [separator, setSeparator] =
React.useState<SectionSeparator>('border+shadow');

return (
<div style={{ width: '100%' }}>
<FormControl component="fieldset">
<RadioGroup
row
value={separator}
onChange={(event) => setSeparator(event.target.value as SectionSeparator)}
name="pinned-columns-section-separator"
>
<FormControlLabel
value="border+shadow"
control={<Radio />}
label={<code>&quot;border+shadow&quot;</code>}
/>
<FormControlLabel
value="border"
control={<Radio />}
label={<code>&quot;border&quot;</code>}
/>
<FormControlLabel
value="shadow"
control={<Radio />}
label={<code>&quot;shadow&quot;</code>}
/>
</RadioGroup>
</FormControl>
<div style={{ height: 400 }}>
<DataGridPro
rows={rows}
columns={columns}
initialState={{ pinnedColumns: { left: ['name'], right: ['actions'] } }}
pinnedColumnsSectionSeparator={separator}
/>
</div>
</div>
);
}

const columns: GridColDef[] = [
{ field: 'name', headerName: 'Name', width: 160, editable: true },
{ field: 'email', headerName: 'Email', width: 200, editable: true },
{ field: 'age', headerName: 'Age', type: 'number', editable: true },
{
field: 'dateCreated',
headerName: 'Date Created',
type: 'date',
width: 180,
editable: true,
},
{
field: 'lastLogin',
headerName: 'Last Login',
type: 'dateTime',
width: 220,
editable: true,
},
{
field: 'actions',
type: 'actions',
width: 100,
getActions: () => [
<GridActionsCellItem icon={<EditIcon />} label="Edit" />,
<GridActionsCellItem icon={<DeleteIcon />} label="Delete" />,
],
},
];

const rows: GridRowsProp = [
{
id: 1,
name: randomTraderName(),
email: randomEmail(),
age: 25,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 2,
name: randomTraderName(),
email: randomEmail(),
age: 36,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 3,
name: randomTraderName(),
email: randomEmail(),
age: 19,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 4,
name: randomTraderName(),
email: randomEmail(),
age: 28,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 5,
name: randomTraderName(),
email: randomEmail(),
age: 23,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 6,
name: randomTraderName(),
email: randomEmail(),
age: 27,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 7,
name: randomTraderName(),
email: randomEmail(),
age: 18,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 8,
name: randomTraderName(),
email: randomEmail(),
age: 31,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 9,
name: randomTraderName(),
email: randomEmail(),
age: 24,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
{
id: 10,
name: randomTraderName(),
email: randomEmail(),
age: 35,
dateCreated: randomCreatedDate(),
lastLogin: randomUpdatedDate(),
},
];
8 changes: 8 additions & 0 deletions docs/data/data-grid/column-pinning/column-pinning.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ Use it together with `onPinnedColumnsChange` to track when columns are pinned an

{{"demo": "ControlPinnedColumns.js", "bg": "inline"}}

## Pinned columns appearance

By default, the pinned columns sections are separated from non-pinned columns with a border and a shadow that appears when there is scroll.

You can change the appearance by setting the [`pinnedColumnsSectionSeparator`](/x/api/data-grid/data-grid-pro/#data-grid-pro-prop-pinnedColumnsSectionSeparator) prop to `'border'`, `'shadow'`, or `'border+shadow'`.

{{"demo": "ColumnPinningSectionSeparator.js", "bg": "inline"}}

## Disabling column pinning

Column pinning is enabled by default on the Data Grid Pro, but you can disable it for some or all columns.
Expand Down
Loading
Loading