materialuiupgraded
Version:
Material-UI's workspace package
335 lines (319 loc) • 10.7 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import FormControl from '@material-ui/core/FormControl';
import FormLabel from '@material-ui/core/FormLabel';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import RadioGroup from '@material-ui/core/RadioGroup';
import Radio from '@material-ui/core/Radio';
import MarkdownElement from '@material-ui/docs/MarkdownElement';
import Grid from '@material-ui/core/Grid';
import green from '@material-ui/core/colors/green';
import Typography from '@material-ui/core/Typography';
import Button from '@material-ui/core/Button';
import Popover from '@material-ui/core/Popover';
import Input from '@material-ui/core/Input';
import InputLabel from '@material-ui/core/InputLabel';
const styles = theme => ({
buttonWrapper: {
position: 'relative',
marginBottom: theme.spacing.unit * 4,
},
anchor: {
backgroundColor: green[500],
width: 10,
height: 10,
borderRadius: '50%',
position: 'absolute',
},
radioAnchor: {
color: green[600],
'&$checked': {
color: green[500],
},
},
checked: {},
typography: {
margin: theme.spacing.unit * 2,
},
});
const inlineStyles = {
anchorVertical: {
top: {
top: -5,
},
center: {
top: 'calc(50% - 5px)',
},
bottom: {
bottom: -5,
},
},
anchorHorizontal: {
left: {
left: -5,
},
center: {
left: 'calc(50% - 5px)',
},
right: {
right: -5,
},
},
};
class AnchorPlayground extends React.Component {
state = {
open: false,
anchorOriginVertical: 'top',
anchorOriginHorizontal: 'left',
transformOriginVertical: 'top',
transformOriginHorizontal: 'left',
positionTop: 200, // Just so the popover can be spotted more easily
positionLeft: 400, // Same as above
anchorReference: 'anchorEl',
};
handleChange = key => (event, value) => {
this.setState({
[key]: value,
});
};
handleNumberInputChange = key => event => {
this.setState({
[key]: parseInt(event.target.value, 10),
});
};
handleClickButton = () => {
this.setState({
open: true,
});
};
handleClose = () => {
this.setState({
open: false,
});
};
render() {
const { classes } = this.props;
const {
open,
anchorOriginVertical,
anchorOriginHorizontal,
transformOriginVertical,
transformOriginHorizontal,
positionTop,
positionLeft,
anchorReference,
} = this.state;
let mode = '';
if (anchorReference === 'anchorPosition') {
mode = `
anchorReference="${anchorReference}"
anchorPosition={{ top: ${positionTop}, left: ${positionLeft} }}`;
}
const code = `
\`\`\`jsx
<Popover ${mode}
anchorOrigin={{
vertical: '${anchorOriginVertical}',
horizontal: '${anchorOriginHorizontal}',
}}
transformOrigin={{
vertical: '${transformOriginVertical}',
horizontal: '${transformOriginHorizontal}',
}}
>
The content of the Popover.
</Popover>
\`\`\`
`;
const radioAnchorClasses = { root: classes.radioAnchor, checked: classes.checked };
return (
<div>
<Grid container justify="center" spacing={0}>
<Grid item className={classes.buttonWrapper}>
<Button
buttonRef={node => {
this.anchorEl = node;
}}
variant="contained"
onClick={this.handleClickButton}
>
Open Popover
</Button>
{anchorReference === 'anchorEl' && (
<div
className={classes.anchor}
style={{
...inlineStyles.anchorVertical[anchorOriginVertical],
...inlineStyles.anchorHorizontal[anchorOriginHorizontal],
}}
/>
)}
</Grid>
</Grid>
<Popover
open={open}
anchorEl={this.anchorEl}
anchorReference={anchorReference}
anchorPosition={{ top: positionTop, left: positionLeft }}
onClose={this.handleClose}
anchorOrigin={{
vertical: anchorOriginVertical,
horizontal: anchorOriginHorizontal,
}}
transformOrigin={{
vertical: transformOriginVertical,
horizontal: transformOriginHorizontal,
}}
>
<Typography className={classes.typography}>The content of the Popover.</Typography>
</Popover>
<Grid container spacing={16}>
<Grid item xs={12} sm={6}>
<FormControl component="fieldset">
<FormLabel component="legend">anchorReference</FormLabel>
<RadioGroup
row
aria-label="anchorReference"
name="anchorReference"
value={anchorReference}
onChange={this.handleChange('anchorReference')}
>
<FormControlLabel value="anchorEl" control={<Radio />} label="anchorEl" />
<FormControlLabel
value="anchorPosition"
control={<Radio />}
label="anchorPosition"
/>
</RadioGroup>
</FormControl>
</Grid>
<Grid item xs={12} sm={6}>
<FormControl className={classes.formControl}>
<InputLabel htmlFor="position-top">anchorPosition.top</InputLabel>
<Input
id="position-top"
type="number"
value={positionTop}
onChange={this.handleNumberInputChange('positionTop')}
/>
</FormControl>
<FormControl className={classes.formControl}>
<InputLabel htmlFor="position-left">anchorPosition.left</InputLabel>
<Input
id="position-left"
type="number"
value={positionLeft}
onChange={this.handleNumberInputChange('positionLeft')}
/>
</FormControl>
</Grid>
<Grid item xs={12} sm={6}>
<FormControl component="fieldset">
<FormLabel component="legend">anchorOrigin.vertical</FormLabel>
<RadioGroup
aria-label="anchorOriginVertical"
name="anchorOriginVertical"
value={anchorOriginVertical}
onChange={this.handleChange('anchorOriginVertical')}
>
<FormControlLabel
value="top"
control={<Radio classes={radioAnchorClasses} />}
label="Top"
/>
<FormControlLabel
value="center"
control={<Radio classes={radioAnchorClasses} />}
label="Center"
/>
<FormControlLabel
value="bottom"
control={<Radio classes={radioAnchorClasses} />}
label="Bottom"
/>
</RadioGroup>
</FormControl>
</Grid>
<Grid item xs={12} sm={6}>
<FormControl component="fieldset">
<FormLabel component="legend">transformOrigin.vertical</FormLabel>
<RadioGroup
aria-label="transformOriginVertical"
name="transformOriginVertical"
value={transformOriginVertical}
onChange={this.handleChange('transformOriginVertical')}
>
<FormControlLabel value="top" control={<Radio color="primary" />} label="Top" />
<FormControlLabel
value="center"
control={<Radio color="primary" />}
label="Center"
/>
<FormControlLabel
value="bottom"
control={<Radio color="primary" />}
label="Bottom"
/>
</RadioGroup>
</FormControl>
</Grid>
<Grid item xs={12} sm={6}>
<FormControl component="fieldset">
<FormLabel component="legend">anchorOrigin.horizontal</FormLabel>
<RadioGroup
row
aria-label="anchorOriginHorizontal"
name="anchorOriginHorizontal"
value={anchorOriginHorizontal}
onChange={this.handleChange('anchorOriginHorizontal')}
>
<FormControlLabel
value="left"
control={<Radio classes={radioAnchorClasses} />}
label="Left"
/>
<FormControlLabel
value="center"
control={<Radio classes={radioAnchorClasses} />}
label="Center"
/>
<FormControlLabel
value="right"
control={<Radio classes={radioAnchorClasses} />}
label="Right"
/>
</RadioGroup>
</FormControl>
</Grid>
<Grid item xs={12} sm={6}>
<FormControl component="fieldset">
<FormLabel component="legend">transformOrigin.horizontal</FormLabel>
<RadioGroup
row
aria-label="transformOriginHorizontal"
name="transformOriginHorizontal"
value={transformOriginHorizontal}
onChange={this.handleChange('transformOriginHorizontal')}
>
<FormControlLabel value="left" control={<Radio color="primary" />} label="Left" />
<FormControlLabel
value="center"
control={<Radio color="primary" />}
label="Center"
/>
<FormControlLabel value="right" control={<Radio color="primary" />} label="Right" />
</RadioGroup>
</FormControl>
</Grid>
</Grid>
<MarkdownElement text={code} />
</div>
);
}
}
AnchorPlayground.propTypes = {
classes: PropTypes.object.isRequired,
};
export default withStyles(styles)(AnchorPlayground);