-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
[fields] Enable the new field DOM structure by default #14651
[fields] Enable the new field DOM structure by default #14651
Conversation
Deploy preview: https://deploy-preview-14651--material-ui-x.netlify.app/ Updated pages: |
bce7e95
to
931a1a1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we already want to remove the "v6" x "v7" terminology for good ?
It happens on:
-
DateField/tests/editing.DateField.test
- onChangeV7 (multiple declarations)
- onChangeV6 (multiple declarations)
-
TimeField/tests/editing.TimeField.test.tsx
- onChangeV7 (multiple declarations)
- onChangeV6 (multiple declarations)
Although I think it can make sense, I also see it as questionable since adding new suffixes could make it more verbose and hardly to read, plus we are already used to the v6 x v7 nomenclature. I wouldn't mind leaving the renaming for v9 once we remove the non-accessible-v6 input |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 👏
Nice to see so many removed lines, specially in our tests ! 🎉
I'm leaving the approve, I believe the v7xv6 nomenclature doesn't block this PR 🙂
Thanks for the deep dive on the v6/v7 nomenclature.
I would differenciate public usage of the nomenclature and internal one. All the rest is purely internal, I can rename it for consistency, but as you said everything will go away in v9 so it may not be worth the effort. |
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
## New DOM structure for the field | ||
|
||
Before version `v8.x`, the fields' DOM structure consisted of an `<input />`, which held the whole value for the component, | ||
but unfortunately presents a few limitations in terms of accessibility when managing multiple section values. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Raised #15596 😉
By the way, it's possible to inspect native inputs:
Yes, thank you for bringing this up. 👍
It's always nice to have a reference to check how others are doing similar things. 👌
Closes #14477
If possible, this PR should be merged as soon as the
next
branch is prepared so that I can open the PR to #14796 which also impacts most of the interfaces in the package.Work
enableAccessibleFieldDOMStructure
when the prop is not provided and render the right text fieldTEnableAccessibleFieldDOMStructure
generic in every component and interface using itenableAccessibleFieldDOMStructure={true}
in doc and testsChangelog
Pickers
The default DOM structure of the field has changed.
Before version
v8.x
, the fields' DOM structure consisted of an<input />
, which held the whole value for the component, but unfortunately presents a few limitations in terms of accessibility when managing multiple section values.Starting with version
v8.x
, all the field and picker components come with a new DOM structure that allows the field component to set aria attributes on individual sections, providing a far better experience with screen readers.Fallback to the non-accessible DOM structure:
Migrate
slotProps.field
:When using
slotProps.field
to pass props to your field component,the field consumes some props (e.g:
shouldRespectLeadingZeros
) and forwards the rest to theTextField
.For the props consumed by the field, the behavior should remain exactly the same with both DOM structures.
Both components below will respect the leading zeroes on digit sections:
For the props forwarded to the
TextField
,you can have a look at the next section to see how the migration impact them.
Both components below will render a small size UI:
Migrate
slotProps.textField
:If you are passing props to
slotProps.textField
,these props will now be received by
PickersTextField
and should keep working the same way as before.Both components below will render a small size UI:
Side note: If you are passing
inputProps
toslotProps.textField
, these props will now be passed to the hidden<input />
element.Migrate
slots.field
:If you are passing a custom field component to your pickers, you need to create a new one that is using the accessible DOM structure.
This new component will need to use the
PickersSectionList
component instead of an<input />
HTML element.You can have a look at the Using a custom input to have a concrete example.
Migrate
slots.textField
:If you are passing a custom
TextField
component to your fields and pickers,you need to create a new one that is using the accessible DOM structure.
You can have a look at the Wrapping PickersTextField section to have a concrete example.
Side note: If your custom
TextField
was used to apply a totally different input that did not use@mui/material/TextField
,please consider having a look at the Using a custom input section which uses
slots.field
.This approach can be more appropriate for deeper changes.
Migrate the theme:
If you are using the theme to customize
MuiTextField
,you need to pass the same config to
MuiPickersTextField
:If you are using the theme to customize
MuiInput
,MuiOutlinedInput
orMuiFilledInput
,you need to pass the same config to
MuiPickersInput
,MuiPickersOutlinedInput
orMuiPickersFilledInput
:If you are using the theme to customize
MuiInputBase
,you need to pass the same config to
MuiPickersInputBase
: