Skip to content

Commit dc08701

Browse files
NeiruBugzworkshur
andauthored
improvement/config-save-spinner add spinner for submit button (#3551)
* improvement/config-save-spinner add spinner for submit button * improvement/config-save-spinner add Spinner component to common, update spinner usage * improvement/config-save-spinner remove unused props for spinner component * improvement/config-save-spinner add defaultProps, refactor props definition * improvement/config-save-spinner disable button on inProgress prop --------- Co-authored-by: Oleg Shur <[email protected]>
1 parent 58102fa commit dc08701

File tree

8 files changed

+76
-23
lines changed

8 files changed

+76
-23
lines changed

kafka-ui-react-app/src/components/common/Button/Button.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import StyledButton, {
33
} from 'components/common/Button/Button.styled';
44
import React from 'react';
55
import { Link } from 'react-router-dom';
6+
import Spinner from 'components/common/Spinner/Spinner';
67

78
export interface Props
89
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
910
ButtonProps {
1011
to?: string | object;
12+
inProgress?: boolean;
1113
}
1214

1315
export const Button: React.FC<Props> = ({ to, ...props }) => {
@@ -20,5 +22,16 @@ export const Button: React.FC<Props> = ({ to, ...props }) => {
2022
</Link>
2123
);
2224
}
23-
return <StyledButton type="button" {...props} />;
25+
return (
26+
<StyledButton
27+
type="button"
28+
disabled={props.disabled || props.inProgress}
29+
{...props}
30+
>
31+
{props.children}{' '}
32+
{props.inProgress ? (
33+
<Spinner size={16} borderWidth={2} marginLeft={2} emptyBorderColor />
34+
) : null}
35+
</StyledButton>
36+
);
2437
};

kafka-ui-react-app/src/components/common/Button/__tests__/Button.spec.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,10 @@ describe('Button', () => {
5858
theme.button.primary.invertedColors.normal
5959
);
6060
});
61+
it('renders disabled button and spinner when inProgress truthy', () => {
62+
render(<Button buttonType="primary" buttonSize="M" inProgress />);
63+
expect(screen.getByRole('button')).toBeInTheDocument();
64+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
65+
expect(screen.getByRole('button')).toBeDisabled();
66+
});
6167
});
Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import styled, { css } from 'styled-components';
1+
import styled from 'styled-components';
22

33
export const Wrapper = styled.div`
44
display: flex;
@@ -8,23 +8,3 @@ export const Wrapper = styled.div`
88
height: 100%;
99
width: 100%;
1010
`;
11-
12-
export const Spinner = styled.div(
13-
({ theme }) => css`
14-
border: 10px solid ${theme.pageLoader.borderColor};
15-
border-bottom: 10px solid ${theme.pageLoader.borderBottomColor};
16-
border-radius: 50%;
17-
width: 80px;
18-
height: 80px;
19-
animation: spin 1.3s linear infinite;
20-
21-
@keyframes spin {
22-
0% {
23-
transform: rotate(0deg);
24-
}
25-
100% {
26-
transform: rotate(360deg);
27-
}
28-
}
29-
`
30-
);

kafka-ui-react-app/src/components/common/PageLoader/PageLoader.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import React from 'react';
2+
import Spinner from 'components/common/Spinner/Spinner';
23

34
import * as S from './PageLoader.styled';
45

56
const PageLoader: React.FC = () => (
67
<S.Wrapper>
7-
<S.Spinner role="progressbar" />
8+
<Spinner />
89
</S.Wrapper>
910
);
1011

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import styled from 'styled-components';
2+
import { SpinnerProps } from 'components/common/Spinner/types';
3+
4+
export const Spinner = styled.div<SpinnerProps>`
5+
border-width: ${(props) => props.borderWidth}px;
6+
border-style: solid;
7+
border-color: ${({ theme }) => theme.pageLoader.borderColor};
8+
border-bottom-color: ${(props) =>
9+
props.emptyBorderColor
10+
? 'transparent'
11+
: props.theme.pageLoader.borderBottomColor};
12+
border-radius: 50%;
13+
width: ${(props) => props.size}px;
14+
height: ${(props) => props.size}px;
15+
margin-left: ${(props) => props.marginLeft}px;
16+
animation: spin 1.3s linear infinite;
17+
18+
@keyframes spin {
19+
0% {
20+
transform: rotate(0deg);
21+
}
22+
100% {
23+
transform: rotate(360deg);
24+
}
25+
}
26+
`;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* eslint-disable react/default-props-match-prop-types */
2+
import React from 'react';
3+
import { SpinnerProps } from 'components/common/Spinner/types';
4+
5+
import * as S from './Spinner.styled';
6+
7+
const defaultProps: SpinnerProps = {
8+
size: 80,
9+
borderWidth: 10,
10+
emptyBorderColor: false,
11+
marginLeft: 0,
12+
};
13+
14+
const Spinner: React.FC<SpinnerProps> = (props) => (
15+
<S.Spinner role="progressbar" {...props} />
16+
);
17+
18+
Spinner.defaultProps = defaultProps;
19+
20+
export default Spinner;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface SpinnerProps {
2+
size?: number;
3+
borderWidth?: number;
4+
emptyBorderColor?: boolean;
5+
marginLeft?: number;
6+
}

kafka-ui-react-app/src/widgets/ClusterConfigForm/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ const ClusterConfigForm: React.FC<ClusterConfigFormProps> = ({
142142
buttonSize="L"
143143
buttonType="primary"
144144
disabled={isSubmitDisabled}
145+
inProgress={isSubmitting}
145146
>
146147
Submit
147148
</Button>

0 commit comments

Comments
 (0)