Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Rating] Clear value if selected value is clicked #18999

Merged
merged 3 commits into from
Dec 30, 2019

Conversation

ivowork
Copy link
Contributor

@ivowork ivowork commented Dec 27, 2019

While using the Rating, I faced the challenge that it was not possible to clear the rating without adding a "clear" button. This PR sets the rating value to null if the current rating is clicked.
Recording #13

@mui-pr-bot
Copy link

mui-pr-bot commented Dec 27, 2019

Details of bundle changes.

Comparing: f3218f2...46ddeec

bundle Size Change Size Gzip Change Gzip
@material-ui/lab ▲ +247 B (+0.14% ) 177 kB ▲ +83 B (+0.16% ) 53.2 kB
Rating ▲ +247 B (+0.35% ) 70 kB ▲ +80 B (+0.36% ) 22.6 kB
docs.main ▲ +183 B (+0.03% ) 613 kB ▲ +18 B (+0.01% ) 196 kB
@material-ui/core -- 358 kB -- 97.7 kB
@material-ui/core[umd] -- 314 kB -- 90.6 kB
@material-ui/styles -- 50.8 kB -- 15.3 kB
@material-ui/system -- 14.5 kB -- 4.04 kB
AppBar -- 63.6 kB -- 20 kB
Autocomplete -- 129 kB -- 40.4 kB
Avatar -- 64.9 kB -- 20.5 kB
AvatarGroup -- 62 kB -- 19.5 kB
Backdrop -- 67.4 kB -- 20.9 kB
Badge -- 65 kB -- 20.3 kB
BottomNavigation -- 62.1 kB -- 19.5 kB
BottomNavigationAction -- 75.2 kB -- 23.8 kB
Box -- 70.4 kB -- 21.5 kB
Breadcrumbs -- 67.7 kB -- 21.3 kB
Button -- 79.4 kB -- 24.4 kB
ButtonBase -- 73.6 kB -- 23.2 kB
ButtonGroup -- 82.8 kB -- 25.5 kB
Card -- 62.5 kB -- 19.6 kB
CardActionArea -- 74.7 kB -- 23.6 kB
CardActions -- 61.7 kB -- 19.4 kB
CardContent -- 61.7 kB -- 19.4 kB
CardHeader -- 64.8 kB -- 20.4 kB
CardMedia -- 62 kB -- 19.6 kB
Checkbox -- 81.6 kB -- 25.9 kB
Chip -- 82.2 kB -- 25.2 kB
CircularProgress -- 63.8 kB -- 20.2 kB
ClickAwayListener -- 3.85 kB -- 1.55 kB
Collapse -- 67.6 kB -- 21 kB
colorManipulator -- 3.85 kB -- 1.52 kB
Container -- 62.9 kB -- 19.7 kB
CssBaseline -- 57.3 kB -- 18 kB
Dialog -- 82.4 kB -- 25.8 kB
DialogActions -- 61.8 kB -- 19.4 kB
DialogContent -- 61.9 kB -- 19.5 kB
DialogContentText -- 63.7 kB -- 20.1 kB
DialogTitle -- 64 kB -- 20.1 kB
Divider -- 62.3 kB -- 19.6 kB
docs.landing -- 50.7 kB -- 13.4 kB
Drawer -- 84.2 kB -- 25.7 kB
ExpansionPanel -- 71.1 kB -- 22.3 kB
ExpansionPanelActions -- 61.8 kB -- 19.4 kB
ExpansionPanelDetails -- 61.6 kB -- 19.4 kB
ExpansionPanelSummary -- 77.8 kB -- 24.6 kB
Fab -- 76.5 kB -- 23.9 kB
Fade -- 23.2 kB -- 7.98 kB
FilledInput -- 73.2 kB -- 22.8 kB
FormControl -- 64.1 kB -- 20 kB
FormControlLabel -- 65.2 kB -- 20.5 kB
FormGroup -- 61.7 kB -- 19.4 kB
FormHelperText -- 63 kB -- 19.8 kB
FormLabel -- 63.2 kB -- 19.6 kB
Grid -- 64.8 kB -- 20.4 kB
GridList -- 62.2 kB -- 19.6 kB
GridListTile -- 63.4 kB -- 19.9 kB
GridListTileBar -- 62.9 kB -- 19.8 kB
Grow -- 23.8 kB -- 8.19 kB
Hidden -- 65.6 kB -- 20.7 kB
Icon -- 62.5 kB -- 19.6 kB
IconButton -- 75.8 kB -- 23.7 kB
Input -- 72.2 kB -- 22.6 kB
InputAdornment -- 64.8 kB -- 20.4 kB
InputBase -- 70.3 kB -- 22.1 kB
InputLabel -- 65 kB -- 20.1 kB
LinearProgress -- 65 kB -- 20.4 kB
Link -- 66.3 kB -- 21 kB
List -- 62 kB -- 19.4 kB
ListItem -- 76.8 kB -- 24.1 kB
ListItemAvatar -- 61.8 kB -- 19.4 kB
ListItemIcon -- 61.9 kB -- 19.4 kB
ListItemSecondaryAction -- 61.7 kB -- 19.4 kB
ListItemText -- 64.6 kB -- 20.4 kB
ListSubheader -- 62.4 kB -- 19.7 kB
Menu -- 88.1 kB -- 27.2 kB
MenuItem -- 77.8 kB -- 24.4 kB
MenuList -- 65.7 kB -- 20.6 kB
MobileStepper -- 67.5 kB -- 21.2 kB
Modal -- 14.3 kB -- 5.01 kB
NativeSelect -- 76.5 kB -- 24.2 kB
NoSsr -- 2.19 kB -- 1.04 kB
OutlinedInput -- 73.7 kB -- 23 kB
Paper -- 62 kB -- 19.4 kB
Popover -- 82.5 kB -- 25.6 kB
Popper -- 28.7 kB -- 10.3 kB
Portal -- 2.9 kB -- 1.3 kB
Radio -- 82.7 kB -- 26.1 kB
RadioGroup -- 63.1 kB -- 19.8 kB
RootRef -- 4.21 kB -- 1.64 kB
Select -- 114 kB -- 34 kB
Skeleton -- 62.3 kB -- 19.7 kB
Slide -- 25.3 kB -- 8.71 kB
Slider -- 75.3 kB -- 23.9 kB
Snackbar -- 74.8 kB -- 23.4 kB
SnackbarContent -- 63.2 kB -- 20 kB
SpeedDial -- 85.7 kB -- 27.1 kB
SpeedDialAction -- 117 kB -- 37 kB
SpeedDialIcon -- 64.3 kB -- 20.2 kB
Step -- 62.3 kB -- 19.6 kB
StepButton -- 82 kB -- 26 kB
StepConnector -- 62.4 kB -- 19.7 kB
StepContent -- 68.7 kB -- 21.6 kB
StepIcon -- 64.3 kB -- 20.1 kB
StepLabel -- 68.3 kB -- 21.2 kB
Stepper -- 64.6 kB -- 20.4 kB
styles/createMuiTheme -- 16.4 kB -- 5.83 kB
SvgIcon -- 62.7 kB -- 19.6 kB
SwipeableDrawer -- 91.6 kB -- 28.7 kB
Switch -- 80.8 kB -- 25.5 kB
Tab -- 76 kB -- 24.1 kB
Table -- 62.2 kB -- 19.6 kB
TableBody -- 61.8 kB -- 19.4 kB
TableCell -- 63.7 kB -- 20.1 kB
TableContainer -- 61.7 kB -- 19.4 kB
TableFooter -- 61.8 kB -- 19.4 kB
TableHead -- 61.8 kB -- 19.4 kB
TablePagination -- 141 kB -- 41.3 kB
TableRow -- 62.2 kB -- 19.6 kB
TableSortLabel -- 77 kB -- 24.3 kB
Tabs -- 85.1 kB -- 27.1 kB
TextareaAutosize -- 5.09 kB -- 2.14 kB
TextField -- 123 kB -- 36.1 kB
ToggleButton -- 75.8 kB -- 24.1 kB
ToggleButtonGroup -- 62.9 kB -- 19.8 kB
Toolbar -- 62 kB -- 19.6 kB
Tooltip -- 101 kB -- 31.9 kB
TreeItem -- 73.4 kB -- 23.3 kB
TreeView -- 66.1 kB -- 20.8 kB
Typography -- 63.3 kB -- 19.9 kB
useAutocomplete -- 12.6 kB -- 4.7 kB
useMediaQuery -- 2.5 kB -- 1.06 kB
Zoom -- 23.3 kB -- 8.1 kB

Generated by 🚫 dangerJS against 46ddeec

@mbrookes mbrookes added the component: rating This is the name of the generic UI component, not the React module! label Dec 28, 2019
@oliviertassinari oliviertassinari changed the title [Rating] clear value if selected value is clicked [Rating] Clear value if selected value is clicked Dec 28, 2019
@oliviertassinari oliviertassinari added the new feature New feature or request label Dec 28, 2019
Copy link
Member

@oliviertassinari oliviertassinari left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sounds like a great idea. I have noticed that Amazon, Google Maps, Antd and Semantic-UI have similar behavior. I'm wondering if this requires a prop to opt-out. I guess we will see from the feedback we get.

@mbrookes
Copy link
Member

mbrookes commented Dec 28, 2019

@oliviertassinari While looking at the code to understand why the value is set to null, rather than zero to reset the rating (given that the defaultChecked input has a value of 0), I noticed that the zero input is never actually rendered.

This is because roundValueToPrecision() always returns a number:
https://github.com/mui-org/material-ui/blob/52e808369f2bde5b21ae30858d829e448b213314/packages/material-ui-lab/src/Rating/Rating.js#L24

https://github.com/mui-org/material-ui/blob/52e808369f2bde5b21ae30858d829e448b213314/packages/material-ui-lab/src/Rating/Rating.js#L162

but the (abstract) equality check is for null:

https://github.com/mui-org/material-ui/blob/52e808369f2bde5b21ae30858d829e448b213314/packages/material-ui-lab/src/Rating/Rating.js#L346

Tangentially related - if the hidden input represents no current rating, should the label say that, rather than "0 Stars"? (Zero stars sounds like the lowest rating, rather than no rating.)

Unrelated - should the disabled rating have a role and aria-label? (And what's the practical distinction between disabled and read-only for rating component?)

@oliviertassinari
Copy link
Member

@mbrookes Great catch! I have updated the pull request to reflect it.

Unrelated - should the disabled rating have a role and aria-label?

I don't know, I couldn't find any better resource for a11y than https://www.w3.org/WAI/tutorials/forms/custom-controls/.

(And what's the practical distinction between disabled and read-only for rating component?)

Read-only is for presentational rating, e.g. the ones you will see when looking at a review.
Disabled if for forms.

@@ -433,6 +456,10 @@ Rating.propTypes = {
* The icon to display when empty.
*/
emptyIcon: PropTypes.node,
/**
* The label read when the rating input is empty.
Copy link
Member

@mbrookes mbrookes Dec 28, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* The label read when the rating input is empty.
* The label read by a screen reader when the rating input is empty.

?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"You do not have permission to push to this repository."

@mbrookes
Copy link
Member

The update looks good.

Regarding the disabled state - at the moment in the docs example we have the legend "Disabled", then a set of presentational SVGs. There's nothing to indicate to a screen reader what it is that's disabled (hence the question about a label). We could make the legend more explicit "Disabled rating input", but I wonder instead if it should have actual disabled radio inputs? (Would that more accurately represent to a screen reader the current state of the component?)

@oliviertassinari
Copy link
Member

oliviertassinari commented Dec 28, 2019

but I wonder instead if it should have actual disabled radio inputs?

Agree, it sounds better. Probably something for a follow-up.

@oliviertassinari
Copy link
Member

@ivowork Thanks for the care on the component. It's a good step forward.

@CrocoDillon
Copy link

I'm sorry for bumping such an old PR but this seems like a good place to ask my question so people with the same question will find the answer.

How can you change the rating to zero?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component: rating This is the name of the generic UI component, not the React module! new feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants