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

[Button] Add loading prop #44637

Merged
merged 27 commits into from
Jan 13, 2025
Merged

Conversation

siriwatknp
Copy link
Member

@siriwatknp siriwatknp commented Dec 3, 2024

Preview: https://deploy-preview-44637--material-ui.netlify.app/material-ui/react-button/#loading-2

Closes #42684
Closes #31235

Context

This PR build on top of the reverted #42987 by making the default value of loading to be null to fix the problem with Google Translation Crash without introducing overhead of the loading wrapper to the existing projects.

When the prop is boolean, a span is always present as a wrapper regardless of the loading state:

<button>
  <span style={{ display: 'contents' }}></span> // still present even though loading is false
  text
</button>

The reasons to go with this approach instead of wrapping children with a span are:

  • No breaking change
  • No overhead for existing projects
  • Small overhead when loading because the loading wrapper is not build with styled.

Note

When this PR is merged, the next release should be v6.4.0


@siriwatknp siriwatknp added new feature New feature or request component: button This is the name of the generic UI component, not the React module! labels Dec 3, 2024
@siriwatknp
Copy link
Member Author

siriwatknp commented Dec 3, 2024

@oliviertassinari Based on your comment, are you okay with the new prop? Please see this comment instead. I will update this PR if you are okay with @mnajdova suggestion.

@mui-bot
Copy link

mui-bot commented Dec 3, 2024

Netlify deploy preview

IconButton: parsed: +4.55% , gzip: +3.60%
Alert: parsed: +4.02% , gzip: +3.10%
Autocomplete: parsed: +2.45% , gzip: +1.86%
@material-ui/core: parsed: +0.64% , gzip: +0.45%
LoadingButton: parsed: -0.78% 😍, gzip: -0.15% 😍

Bundle size report

Details of bundle changes (Toolpad)
Details of bundle changes

Generated by 🚫 dangerJS against 15192ab

@mnajdova
Copy link
Member

mnajdova commented Dec 3, 2024

This PR build on top of the reverted #42987 by adding a new prop enableLoadingWrapper to specifically fix the problem with Google Translation Crash.

Wouldn't it be better to automatically add the span if the loading prop has a boolean value (true/false), and don't add it if it has a nullish value. We can explain in the demos the usage.

@siriwatknp
Copy link
Member Author

This PR build on top of the reverted #42987 by adding a new prop enableLoadingWrapper to specifically fix the problem with Google Translation Crash.

Wouldn't it be better to automatically add the span if the loading prop has a boolean value (true/false), and don't add it if it has a nullish value. We can explain in the demos the usage.

That's a nice suggestion. If I understand correctly, there is no need for the new prop, right. The default value of loading is null which will not render the extra span by default. When loading={boolean}, the span is always there.

@mnajdova
Copy link
Member

mnajdova commented Dec 5, 2024

That's a nice suggestion. If I understand correctly, there is no need for the new prop, right. The default value of loading is null which will not render the extra span by default. When loading={boolean}, the span is always there.

Yes, the downside is that a component cannot alternative between supporting loading or not (at least in terms of working with Google translate). I think that's nice compromise.

@DiegoAndai
Copy link
Member

The default value of loading is null which will not render the extra span by default. When loading={boolean}, the span is always there.

I like this approach 👍🏼 let's add a short explanation in the docs as well.

@siriwatknp siriwatknp requested a review from mnajdova December 6, 2024 03:22
@siriwatknp
Copy link
Member Author

@mnajdova @DiegoAndai Ready for review.

@ZeeshanTamboli
Copy link
Member

@siriwatknp I’ve linked two issues in the description that should be closed when this PR merges, the same as in #44637.

{...other}
classes={classes}
>
{startIcon}
{enableLoadingWrapper ? (
// use plain HTML span to minimize the runtime overhead
<span className={classes.loadingWrapper} style={{ display: 'contents' }}>
Copy link
Member Author

Choose a reason for hiding this comment

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

Done

Copy link
Member

@DiegoAndai DiegoAndai left a comment

Choose a reason for hiding this comment

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

Hey Jun! Thanks for pickling this one back up again.

I think the loadingPosition needs some work, see these examples: https://codesandbox.io/p/sandbox/44637-feedback-1-wtf45k

Screenshot 2024-12-09 at 17 04 09

In these examples users would expect the loading indicator to position itself correctly.

packages/mui-material/src/Button/Button.js Show resolved Hide resolved
packages/mui-material/src/Button/buttonClasses.ts Outdated Show resolved Hide resolved
@siriwatknp
Copy link
Member Author

think the loadingPosition needs some work, see these examples: https://codesandbox.io/p/sandbox/44637-feedback-1-wtf45k

The root cause is that there is no icon to provide the space for the loading. I fixed this by render a loadingIconPlaceholder slot when there is no icon on that position.

image

packages/mui-material/src/Button/buttonClasses.ts Outdated Show resolved Hide resolved
{...other}
classes={classes}
>
{startIcon}
{enableLoadingWrapper ? (
// use plain HTML span to minimize the runtime overhead
<span className={classes.loadingWrapper} style={{ display: 'contents' }}>
Copy link
Member

Choose a reason for hiding this comment

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

Should we move style={{ display: 'contents' }} as well?

packages/mui-material/src/Button/Button.js Outdated Show resolved Hide resolved
packages/mui-material/src/Button/Button.js Show resolved Hide resolved
@mui mui deleted a comment from mnajdova Dec 16, 2024
@siriwatknp
Copy link
Member Author

Should we move style={{ display: 'contents' }} as well?

@DiegoAndai If you meant to move it to be styled components, I added a comment above it to keep that element as plain HTML for least overhead. Its purpose is to prevent google translate error, not for customization because it has display: contents.

@DiegoAndai
Copy link
Member

@siriwatknp The last thing from my side is this comment which hasn't been fixed yet: #44637 (comment)

@siriwatknp siriwatknp force-pushed the feat/button-loading3 branch from d3d0926 to 0e87a59 Compare January 3, 2025 02:22
@siriwatknp
Copy link
Member Author

@siriwatknp The last thing from my side is this comment which hasn't been fixed yet: #44637 (comment)

I misunderstood your point but it's fixed now.

Copy link
Member

@ZeeshanTamboli ZeeshanTamboli left a comment

Choose a reason for hiding this comment

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

Just these two things. Rest looks good.

docs/data/material/components/buttons/buttons.md Outdated Show resolved Hide resolved
siriwatknp and others added 2 commits January 9, 2025 17:53
Co-authored-by: Zeeshan Tamboli <[email protected]>
Co-authored-by: Diego Andai <[email protected]>
Signed-off-by: Siriwat K <[email protected]>
@DiegoAndai
Copy link
Member

This looks good to me from the technical perspective 👍🏼

I would like for @aarongarciah to approve this from the product perspective. If he does, then we're ready to merge.

I'll be OOO until Wednesday. If Aaron approves from the product perspective, don't wait for me, you can just merge.

Copy link
Member

@aarongarciah aarongarciah left a comment

Choose a reason for hiding this comment

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

Nice work! Left some small comments on the docs

docs/data/material/components/buttons/buttons.md Outdated Show resolved Hide resolved
docs/data/material/components/buttons/buttons.md Outdated Show resolved Hide resolved
docs/data/material/components/buttons/buttons.md Outdated Show resolved Hide resolved
@siriwatknp siriwatknp merged commit a76cf2e into mui:master Jan 13, 2025
22 checks passed
johnnyomair added a commit to vivid-planet/comet that referenced this pull request Jan 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component: button 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.

[material-ui][Button] Button doesn't have the loading props [LoadingButton] Displaying incorrect warning
6 participants