-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathGridColumnMenuPinningItem.tsx
103 lines (93 loc) · 3.35 KB
/
GridColumnMenuPinningItem.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import * as React from 'react';
import { useTheme } from '@mui/material/styles';
import PropTypes from 'prop-types';
import MenuItem from '@mui/material/MenuItem';
import ListItemIcon from '@mui/material/ListItemIcon';
import ListItemText from '@mui/material/ListItemText';
import { GridColumnMenuItemProps } from '@mui/x-data-grid';
import { GridPinnedPosition } from '../hooks/features/columnPinning';
import { useGridApiContext } from '../hooks/utils/useGridApiContext';
import { useGridRootProps } from '../hooks/utils/useGridRootProps';
function GridColumnMenuPinningItem(props: GridColumnMenuItemProps) {
const { colDef, onClick } = props;
const apiRef = useGridApiContext();
const rootProps = useGridRootProps();
const theme = useTheme();
const pinColumn = React.useCallback(
(side: GridPinnedPosition) => (event: React.MouseEvent<HTMLElement>) => {
apiRef.current.pinColumn(colDef.field, side);
onClick(event);
},
[apiRef, colDef.field, onClick],
);
const unpinColumn = (event: React.MouseEvent<HTMLElement>) => {
apiRef.current.unpinColumn(colDef.field);
onClick(event);
};
const pinToLeftMenuItem = (
<MenuItem onClick={pinColumn(GridPinnedPosition.left)}>
<ListItemIcon>
<rootProps.slots.columnMenuPinLeftIcon fontSize="small" />
</ListItemIcon>
<ListItemText>{apiRef.current.getLocaleText('pinToLeft')}</ListItemText>
</MenuItem>
);
const pinToRightMenuItem = (
<MenuItem onClick={pinColumn(GridPinnedPosition.right)}>
<ListItemIcon>
<rootProps.slots.columnMenuPinRightIcon fontSize="small" />
</ListItemIcon>
<ListItemText>{apiRef.current.getLocaleText('pinToRight')}</ListItemText>
</MenuItem>
);
if (!colDef) {
return null;
}
const side = apiRef.current.isColumnPinned(colDef.field);
if (side) {
const otherSide =
side === GridPinnedPosition.right ? GridPinnedPosition.left : GridPinnedPosition.right;
const label = otherSide === GridPinnedPosition.right ? 'pinToRight' : 'pinToLeft';
const Icon =
side === GridPinnedPosition.right
? rootProps.slots.columnMenuPinLeftIcon
: rootProps.slots.columnMenuPinRightIcon;
return (
<React.Fragment>
<MenuItem onClick={pinColumn(otherSide)}>
<ListItemIcon>
<Icon fontSize="small" />
</ListItemIcon>
<ListItemText>{apiRef.current.getLocaleText(label)}</ListItemText>
</MenuItem>
<MenuItem onClick={unpinColumn}>
<ListItemIcon />
<ListItemText>{apiRef.current.getLocaleText('unpin')}</ListItemText>
</MenuItem>
</React.Fragment>
);
}
if (theme.direction === 'rtl') {
return (
<React.Fragment>
{pinToRightMenuItem}
{pinToLeftMenuItem}
</React.Fragment>
);
}
return (
<React.Fragment>
{pinToLeftMenuItem}
{pinToRightMenuItem}
</React.Fragment>
);
}
GridColumnMenuPinningItem.propTypes = {
// ----------------------------- Warning --------------------------------
// | These PropTypes are generated from the TypeScript type definitions |
// | To update them edit the TypeScript types and run "yarn proptypes" |
// ----------------------------------------------------------------------
colDef: PropTypes.object.isRequired,
onClick: PropTypes.func.isRequired,
} as any;
export { GridColumnMenuPinningItem };