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
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
52f690e
Revert "[material-ui][Button] Revert Button loading (#44478)"
siriwatknp Dec 3, 2024
f317e69
add enableLoadingWrapper
siriwatknp Dec 3, 2024
ecdab2b
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Dec 6, 2024
baf6709
Revert "add enableLoadingWrapper"
siriwatknp Dec 6, 2024
ce1206a
set loading default to null
siriwatknp Dec 6, 2024
92a33b5
add warning
siriwatknp Dec 6, 2024
33543e7
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Dec 11, 2024
6d404da
remove combined classes
siriwatknp Dec 11, 2024
92d392e
remove loading from badge demo
siriwatknp Dec 11, 2024
5ce445f
fix loading position without icon
siriwatknp Dec 11, 2024
978a40e
run docs:api
siriwatknp Dec 11, 2024
82f9be8
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Dec 17, 2024
65cfdbe
remove `order`
siriwatknp Dec 17, 2024
c9911ff
fix button loading position class
siriwatknp Dec 17, 2024
d3cf66a
run docs:api
siriwatknp Dec 17, 2024
d50b95f
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Dec 23, 2024
32d7170
simplify loading styles
siriwatknp Jan 2, 2025
d7b36ed
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Jan 2, 2025
602691d
update docs
siriwatknp Jan 2, 2025
02abe9d
update available version
siriwatknp Jan 2, 2025
0e87a59
add loadingPosition* classes to button
siriwatknp Jan 3, 2025
5d4986e
Apply suggestions from code review
siriwatknp Jan 9, 2025
38d6c8f
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Jan 9, 2025
222af9f
apply suggestion
siriwatknp Jan 10, 2025
8bbabb7
run docs:api
siriwatknp Jan 10, 2025
4b60f03
Merge branch 'master' of https://github.com/mui/material-ui into feat…
siriwatknp Jan 10, 2025
15192ab
update doc
siriwatknp Jan 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import * as React from 'react';
import ButtonGroup from '@mui/material/ButtonGroup';
import Button from '@mui/material/Button';
import LoadingButton from '@mui/lab/LoadingButton';
import SaveIcon from '@mui/icons-material/Save';

export default function LoadingButtonGroup() {
return (
<ButtonGroup variant="outlined" aria-label="Loading button group">
<Button>Submit</Button>
<LoadingButton>Fetch data</LoadingButton>
<LoadingButton loading loadingPosition="start" startIcon={<SaveIcon />}>
<Button>Fetch data</Button>
<Button loading loadingPosition="start" startIcon={<SaveIcon />}>
Save
</LoadingButton>
</Button>
</ButtonGroup>
);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import * as React from 'react';
import ButtonGroup from '@mui/material/ButtonGroup';
import Button from '@mui/material/Button';
import LoadingButton from '@mui/lab/LoadingButton';
import SaveIcon from '@mui/icons-material/Save';

export default function LoadingButtonGroup() {
return (
<ButtonGroup variant="outlined" aria-label="Loading button group">
<Button>Submit</Button>
<LoadingButton>Fetch data</LoadingButton>
<LoadingButton loading loadingPosition="start" startIcon={<SaveIcon />}>
<Button>Fetch data</Button>
<Button loading loadingPosition="start" startIcon={<SaveIcon />}>
Save
</LoadingButton>
</Button>
</ButtonGroup>
);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<ButtonGroup variant="outlined" aria-label="Loading button group">
<Button>Submit</Button>
<LoadingButton>Fetch data</LoadingButton>
<LoadingButton loading loadingPosition="start" startIcon={<SaveIcon />}>
<Button>Fetch data</Button>
<Button loading loadingPosition="start" startIcon={<SaveIcon />}>
Save
</LoadingButton>
</Button>
</ButtonGroup>
8 changes: 3 additions & 5 deletions docs/data/material/components/button-group/button-group.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
productId: material-ui
title: React Button Group component
components: Button, ButtonGroup, LoadingButton
components: Button, ButtonGroup
githubLabel: 'component: ButtonGroup'
githubSource: packages/mui-material/src/ButtonGroup
---
Expand Down Expand Up @@ -49,10 +49,8 @@ You can remove the elevation with the `disableElevation` prop.

{{"demo": "DisableElevation.js"}}

## Experimental APIs
## Loading

### Loading button

You can use the [`<LoadingButton />`](/material-ui/react-button/#loading-button) from [`@mui/lab`](/material-ui/about-the-lab/) in the button group.
Use the `loading` prop from `Button` to set buttons in a loading state and disable interactions.

{{"demo": "LoadingButtonGroup.js"}}
37 changes: 37 additions & 0 deletions docs/data/material/components/buttons/IconButtonWithBadge.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import * as React from 'react';
import { styled } from '@mui/material/styles';
import IconButton from '@mui/material/IconButton';
import Badge, { badgeClasses } from '@mui/material/Badge';
import Stack from '@mui/material/Stack';
import SaveIcon from '@mui/icons-material/Save';
import ShoppingCartIcon from '@mui/icons-material/ShoppingCartOutlined';

const CartBadge = styled(Badge)`
.${badgeClasses.badge} {
top: -12px;
right: -6px;
}
`;

export default function IconButtonWithBadge() {
const [loading, setLoading] = React.useState(false);
React.useEffect(() => {
const timeout = setTimeout(() => {
setLoading(false);
}, 2000);
return () => clearTimeout(timeout);
});
return (
<Stack spacing={2} direction="row" sx={{ alignItems: 'center' }}>
<IconButton loading>
<Badge badgeContent={4} color="primary">
<SaveIcon />
</Badge>
</IconButton>
<IconButton loading={loading} onClick={() => setLoading(true)}>
<ShoppingCartIcon fontSize="small" />
<CartBadge badgeContent={2} color="primary" overlap="circular" />
</IconButton>
</Stack>
);
}
37 changes: 37 additions & 0 deletions docs/data/material/components/buttons/IconButtonWithBadge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import * as React from 'react';
import { styled } from '@mui/material/styles';
import IconButton from '@mui/material/IconButton';
import Badge, { badgeClasses } from '@mui/material/Badge';
import Stack from '@mui/material/Stack';
import SaveIcon from '@mui/icons-material/Save';
import ShoppingCartIcon from '@mui/icons-material/ShoppingCartOutlined';

const CartBadge = styled(Badge)`
.${badgeClasses.badge} {
siriwatknp marked this conversation as resolved.
Show resolved Hide resolved
top: -12px;
right: -6px;
}
`;

export default function IconButtonWithBadge() {
const [loading, setLoading] = React.useState(false);
React.useEffect(() => {
const timeout = setTimeout(() => {
setLoading(false);
}, 2000);
return () => clearTimeout(timeout);
});
return (
<Stack spacing={2} direction="row" sx={{ alignItems: 'center' }}>
<IconButton loading>
<Badge badgeContent={4} color="primary">
<SaveIcon />
</Badge>
</IconButton>
<IconButton loading={loading} onClick={() => setLoading(true)}>
<ShoppingCartIcon fontSize="small" />
<CartBadge badgeContent={2} color="primary" overlap="circular" />
</IconButton>
</Stack>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<IconButton loading>
<Badge badgeContent={4} color="primary">
<SaveIcon />
</Badge>
</IconButton>
<IconButton loading={loading} onClick={() => setLoading(true)}>
<ShoppingCartIcon fontSize="small" />
<CartBadge badgeContent={2} color="primary" overlap="circular" />
</IconButton>
42 changes: 31 additions & 11 deletions docs/data/material/components/buttons/LoadingButtons.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,45 @@
import * as React from 'react';
import LoadingButton from '@mui/lab/LoadingButton';
import Button from '@mui/material/Button';
import SaveIcon from '@mui/icons-material/Save';
import Stack from '@mui/material/Stack';

export default function LoadingButtons() {
return (
<Stack direction="row" spacing={2}>
<LoadingButton loading variant="outlined">
Submit
</LoadingButton>
<LoadingButton loading loadingIndicator="Loading…" variant="outlined">
Fetch data
</LoadingButton>
<LoadingButton
<Stack spacing={2}>
<Stack direction="row" spacing={2}>
<Button loading variant="outlined">
Submit
</Button>
<Button loading loadingIndicator="Loading…" variant="outlined">
Fetch data
</Button>
<Button
loading
loadingPosition="start"
startIcon={<SaveIcon />}
variant="outlined"
>
Save
</Button>
</Stack>
<Button
fullWidth
loading
loadingPosition="start"
startIcon={<SaveIcon />}
variant="outlined"
>
Save
</LoadingButton>
Full width
</Button>
<Button
fullWidth
loading
loadingPosition="end"
endIcon={<SaveIcon />}
variant="outlined"
>
Full width
</Button>
</Stack>
);
}
42 changes: 31 additions & 11 deletions docs/data/material/components/buttons/LoadingButtons.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,45 @@
import * as React from 'react';
import LoadingButton from '@mui/lab/LoadingButton';
import Button from '@mui/material/Button';
import SaveIcon from '@mui/icons-material/Save';
import Stack from '@mui/material/Stack';

export default function LoadingButtons() {
return (
<Stack direction="row" spacing={2}>
<LoadingButton loading variant="outlined">
Submit
</LoadingButton>
<LoadingButton loading loadingIndicator="Loading…" variant="outlined">
Fetch data
</LoadingButton>
<LoadingButton
<Stack spacing={2}>
<Stack direction="row" spacing={2}>
<Button loading variant="outlined">
Submit
</Button>
<Button loading loadingIndicator="Loading…" variant="outlined">
Fetch data
</Button>
<Button
loading
loadingPosition="start"
startIcon={<SaveIcon />}
variant="outlined"
>
Save
</Button>
</Stack>
<Button
fullWidth
loading
loadingPosition="start"
startIcon={<SaveIcon />}
variant="outlined"
>
Save
</LoadingButton>
Full width
</Button>
<Button
fullWidth
loading
loadingPosition="end"
endIcon={<SaveIcon />}
variant="outlined"
>
Full width
</Button>
</Stack>
);
}
14 changes: 0 additions & 14 deletions docs/data/material/components/buttons/LoadingButtons.tsx.preview

This file was deleted.

Loading
Loading