React, Material-UI - onClick() get always last item as argument - reactjs

I hit a wall.
Problem is that handleDeleteItem() always receives last item._id instead of given.
On the other hand goToEdit() is working properly. So far I have tried placing key property in different components, deleting node_modules and rebuilding app.
I have no idea what causes this situation.
I have component like this:
export class List extends Component {
render() {
const {
classes,
items,
anchorEl,
handleDeleteItem,
openItemMenu,
closeItemMenu,
goToEdit,
} = this.props;
return (
<main className={classes.content}>
<div className={classes.toolbar} />
<Typography
variant="h3"
color="textSecondary"
gutterBottom
align="center"
>
Items
</Typography>
<Grid container spacing={3}>
<Grid item xs={12} align="right">
<Button
variant="outlined"
color="primary"
startIcon={<AddIcon />}
onClick={(e) => goToEdit(e, 0)}
>
Add new
</Button>
</Grid>
{!items.length && (
<Grid item xs={12} align="center">
<Typography variant="overline">
List empty!
</Typography>
</Grid>
)}
{items.map((item) => (
<Grid item key={item._id} xs={12}>
<Paper
elevation={3}
style={{
borderLeft: `5px solid ${item.color}`,
}}
onClick={(e) => goToEdit(e, item._id)}
className={classes.paper}
>
<Grid container>
<Grid item xs={11}>
<Typography variant="subtitle1" color="textSecondary">
{item.name}
</Typography>
</Grid>
<Grid item xs={1} align="right">
<IconButton
className={classes.showOnHover}
size="small"
edge="end"
aria-label="delete"
onClick={(e) => openItemMenu(e)}
>
<MoreVertIcon />
</IconButton>
<Menu
id="item-menu"
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={(e) => closeItemMenu(e)}
TransitionComponent={Fade}
>
<MenuItem
onClick={(e) => handleDeleteItem(e, item._id)}
>
Usuń bajkę
</MenuItem>
</Menu>
</Grid>
<Grid item xs={12}>
<Box
component="div"
my={2}
textOverflow="ellipsis"
overflow="hidden"
>
<Typography noWrap variant="body2">
{item.description}
</Typography>
</Box>
</Grid>
</Grid>
</Paper>
</Grid>
))}
</Grid>
</main>
);
}
}

Related

Add padding between buttons

I'm interested how I can add space between these buttons:
<Box pb={2}>
<Grid
container
direction="row"
justifyContent="space-between"
alignItems="baseline"
>
<Grid item>
<Typography variant="h4">
Tickets
</Typography>
</Grid>
<Grid item>
<Box component="span">
<Button sx={{ p: 2 }}
variant="contained"
color="primary"
size="small"
startIcon={<SaveIcon />}
>
Open Ticket
</Button>
<Button sx={{ p: 2 }}
variant="contained"
color="primary"
size="small"
startIcon={<SaveIcon />}
>
Export
</Button>
</Box>
</Grid>
</Grid>
</Box>
I tried to add:
<Box bgcolor="red" display="inline-block">
<Button sx={{ m: 2 }} variant="contained">
margin
</Button>
</Box>
But looks like I need to add some configuration to main container between space is not applied. Do you know what is the proper way to add space between buttons?
you can use spacing.the space between the type item component. It can only be used on a type container component. (Grid API)
if you want to use material-ui Grid props you should put each button in separated Grid item.
its looks like this:
<Box pb={2}>
<Grid
container
spacing={2}
direction="row"
justifyContent="space-between"
alignItems="baseline"
>
<Grid item>
<Typography variant="h4">
Tickets
</Typography>
</Grid>
<Grid item>
<Box component="span">
<Button sx={{ p: 2 }}
variant="contained"
color="primary"
size="small"
startIcon={<SaveIcon />}
>
Open Ticket
</Button>
</Box>
</Grid>
<Grid item>
<Box component="span">
<Button sx={{ p: 2 }}
variant="contained"
color="primary"
size="small"
startIcon={<SaveIcon />}
>
Export
</Button>
</Box>
</Grid>
</Grid>
</Box>

Failed prop type: The prop justify of Grid must be used on container

I got the error while using Material-UI in react
<Grid container justify="center">
<Box className={classes.box}>
<Grid item className={classes.item1}>
<Typography variant="h5" className={classes.loginTitle}>
Login
</Typography>
<Typography variant="body1" className={classes.subTitle}>
to continue to Program
</Typography>
</Grid>
{renderForm(window.location.pathname)}
<Grid
item
className={classes.component}
alignItems="center"
justify="space-between"
>
<Typography
variant="body2"
color="primary"
className={classes.createAccountLink}
>
<Link
style={{ cursor: "pointer" }}
onClick={(e) => e.preventDefault()}
>
Create account
</Link>
</Typography>
<Button
variant="contained"
color="primary"
disableElevation
className={classes.btn}
>
Login
</Button>
</Grid>
Grid uses CSS flexbox for layout. You cannot set alignItems in a Grid item, it must be placed in a Grid container. See this interactive example to know how to use alignItems in
Grid.
// invalid
<Grid container>
<Grid item alignItems="center">
</Grid>
</Grid>
// valid
<Grid container alignItems="center">
<Grid item>
</Grid>
</Grid>

Material UI stepper does not animate

I have a vertical stepper I'm using in Material UI to render a pricing calculator. The animation is no longer working. Previously, the stepper would animate a collapse effect when the steps changed.
I suspect it may be due to the nesting of multiple transitions, but I'm not entirely sure.
Relevant render method for the calculator is below. Thanks!
return (
<Grid container>
<Grid item xs={12} sm={12} md={8} className="nocPricingCalculatorContainer">
<Collapse in={activeStep < 2}>
<Stepper elevation={0} activeStep={activeStep} className="nocPricingCalculatorStepper" connector={<StepConnector classes={{ line: classes.stepConnector }} />} orientation="vertical">
{steps.map((stepObj, index) => {
return (
<Step key={uuidv4()}>
<StepLabel classes={{ label: classes.stepLabel }} StepIconProps={{
classes: { text: classes.stepLabelText }
}}>{stepObj.label}</StepLabel>
<StepContent className={classes.stepContentBorder}>
<div className={classes.actionsContainer}>
<Grid container item xs={12}>
{getStepContent(index)}
</Grid>
<div>
{
(activeStep !== 0) ?
<Button
className="nocButtonClear"
onClick={handleBack}>
Back
</Button> :
<div></div>
}
<Button
variant="contained"
onClick={handleNext}
className="nocButtonYellow"
disableRipple
>
{activeStep === steps.length - 1 ? 'Finish' : 'Next'}
</Button>
</div>
</div>
</StepContent>
</Step>
)
})}
</Stepper>
</Collapse>
<Collapse in={activeStep >= 2}>
{activeStep === steps.length && (
<Grid item container className="nocPricingCalculatorFinalStep" alignItems="center" justify="center">
<Grid item container xs={12} justify="center" className="nocPricingCalculatorResetArea">
<Grid item>
<Button className="nocButtonClear nocPricingCalculatorResetButton" disableRipple onClick={handleReset}>
<RefreshIcon className="nocResetIcon" />Reset calculator
</Button>
</Grid>
</Grid>
<Grid item container xs={12} justify="center" className="nocPricingCalculatorPriceArea">
<Grid item container alignItems="center" justify="center" xs={12} className="nocPriceColumnLabel">
<CheckCircle className="nocPriceAreaCheckIcon" />
<Typography className="nocPricingCalculatorPricingHeader">
{pricingSectionTitle}
</Typography>
</Grid>
<Grid item container className="nocPricingCalculatorPriceColumn left" alignItems="center" justify="center" xs={12} sm={12} md={6}>
<Grid item xs={12}>
<Typography className="nocPricingCalculatorPricingRepairType">
{pricingColumnLeft.title}
</Typography>
<Typography className="nocPricingCalculatorPricingPrice">
{pricingColumnLeft.price}
</Typography>
</Grid>
<Grid item>
<List dense={true}>
{generateRenderableList(pricingColumnLeft.details)}
</List>
</Grid>
</Grid>
<Grid item container className="nocPricingCalculatorPriceColumn right" alignItems="center" justify="center" xs={12} sm={12} md={6}>
<Grid item xs={12}>
<Typography className="nocPricingCalculatorPricingRepairType">
{pricingColumnRight.title}
</Typography>
<Typography className="nocPricingCalculatorPricingPrice">
{pricingColumnRight.price}
</Typography>
</Grid>
<Grid item>
<List dense={true}>
{generateRenderableList(pricingColumnRight.details)}
</List>
</Grid>
</Grid>
</Grid>
</Grid>
)}
</Collapse>
</Grid>
</Grid>
);
}
Never mind. I accidentally put a random UUID key on the Step and that caused the stepper to jump to the next step without animating.
#reactprobs

Centered icon and text (React Material-UI)

I am interested in best way to present a React Material-UI with icon and text, so it is all vertically aligned. Right now it does not work as expected, especially with conditional rendering.
<Typography gutterBottom variant="subtitle2" component="h2" align="center">
<Grid container direction="row" alignItems="center" wrap="nowrap">
{p.numRooms > 0 && (
<Grid item xs={2} alignItems="center">
<HotelRoundedIcon color="secondary" />
{p.numRooms}
</Grid>
)}
{p.area > 0 && (
<Grid item xs={2}>
<AspectRatioRounded color="secondary" />
{p.area}
</Grid>
)}
</Grid>
</Typography>
You can add container in your secondary Grids to make icons and text vertically aligned.
<Typography gutterBottom variant="subtitle2" component="h2" align="center">
<Grid container direction="row" alignItems="center" wrap="nowrap">
{p.numRooms > 0 && (
<Grid item xs={2} container >
<HotelRoundedIcon color="secondary" />
{p.numRooms}
</Grid>
)}
{p.area > 0 && (
<Grid item xs={2} container>
<AspectRatioRounded color="secondary" />
{p.area}
</Grid>
)}
</Grid>
</Typography>

What's the right way to float right or left using the material-ui appbar with material-ui-next?

I can't figure out if I'm using the right approach to get the login/logout buttons to float right in while using material-ui-next ("material-ui": "^1.0.0-beta.22",)
It seems they removed iconElementRight= from the api. Do we have to use the <Grid> now in the appbar? It feels kinds of cludgy. What's the right way to float buttons (e.g. login) in the appbar?
<AppBar position="static">
<Toolbar>
<Grid container spacing={24}>
<Grid item xs={11}>
<Typography type="title" color="inherit">
Title
</Typography>
</Grid>
<Grid item xs={1}>
<div>
<HeartIcon />
<Button raised color="accent">
Login
</Button>
</div>
</Grid>
</Grid>
</Toolbar>
</AppBar>
#Kyle You had it right :)
just add to the grid container:
justify="space-between"
With your example:
<AppBar position="static">
<Toolbar>
<Grid
justify="space-between" // Add it here :)
container
spacing={24}
>
<Grid item>
<Typography type="title" color="inherit">
Title
</Typography>
</Grid>
<Grid item>
<div>
<HeartIcon />
<Button raised color="accent">
Login
</Button>
</div>
</Grid>
</Grid>
</Toolbar>
</AppBar>
You need to add flex: 1 to your <Typography /> component so it pushes the <div /> to the rightmost part of the AppBar:
<AppBar position="static">
<Toolbar>
<Typography type="title" color="inherit" style={{ flex: 1 }}>
Title
</Typography>
<div>
<HeartIcon />
<Button raised color="accent">
Login
</Button>
</div>
</Toolbar>
</AppBar>
<Toolbar>
<Box sx={{ flexGrow: 1 }}>
<Button variant='text' color='inherit'>Button1</Button>
<Button variant='text' color='inherit'>Button2</Button>
<Button variant='text' color='inherit'>Button3</Button>
</Box>
<Button variant='text' color='inherit'>Button4</Button>
</Toolbar>
Now Button4 will be positioned in the far right!
Just use the property align="right"
as shown here https://mui.com/api/typography/
Fresh variant:
<Grid
container
direction="row"
justifyContent="space-between"
alignItems="center"
>
<Grid item>Back</Grid>
<Grid item>Next</Grid>
</Grid>

Resources