Chore: Use forwardRef in ButtonSelect (#22042)
* forwardRef to ButtonSelect * Remove innerRef prop * Use styleFactory
This commit is contained in:
@@ -4,9 +4,10 @@ import { Button, ButtonVariant, ButtonProps } from '../Button';
|
||||
import { ButtonSize } from '../../Button/types';
|
||||
import { SelectCommonProps, SelectBase, CustomControlProps } from './SelectBase';
|
||||
import { css } from 'emotion';
|
||||
import { useTheme } from '../../../themes';
|
||||
import { stylesFactory, useTheme } from '../../../themes';
|
||||
import { Icon } from '../../Icon/Icon';
|
||||
import { IconType } from '../../Icon/types';
|
||||
import { GrafanaTheme } from '@grafana/data';
|
||||
|
||||
interface ButtonSelectProps<T> extends Omit<SelectCommonProps<T>, 'renderControl' | 'size' | 'prefix'> {
|
||||
icon?: IconType;
|
||||
@@ -17,42 +18,43 @@ interface ButtonSelectProps<T> extends Omit<SelectCommonProps<T>, 'renderControl
|
||||
interface SelectButtonProps extends Omit<ButtonProps, 'icon'> {
|
||||
icon?: IconType;
|
||||
isOpen?: boolean;
|
||||
innerRef: any;
|
||||
}
|
||||
|
||||
const SelectButton: React.FC<SelectButtonProps> = ({ icon, children, isOpen, innerRef, ...buttonProps }) => {
|
||||
const theme = useTheme();
|
||||
const styles = {
|
||||
wrapper: css`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
max-width: 200px;
|
||||
text-overflow: ellipsis;
|
||||
`,
|
||||
iconWrap: css`
|
||||
padding: 0 15px 0 0;
|
||||
`,
|
||||
caretWrap: css`
|
||||
padding-left: ${theme.spacing.sm};
|
||||
margin-left: ${theme.spacing.sm};
|
||||
margin-right: -${theme.spacing.sm};
|
||||
height: 100%;
|
||||
`,
|
||||
};
|
||||
const buttonIcon = `fa fa-${icon}`;
|
||||
const caretIcon = isOpen ? 'caret-up' : 'caret-down';
|
||||
return (
|
||||
<Button {...buttonProps} ref={innerRef} icon={buttonIcon}>
|
||||
<span className={styles.wrapper}>
|
||||
<span>{children}</span>
|
||||
<span className={styles.caretWrap}>
|
||||
<Icon name={caretIcon} />
|
||||
const SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProps>(
|
||||
({ icon, children, isOpen, ...buttonProps }, ref) => {
|
||||
const getStyles = stylesFactory((theme: GrafanaTheme) => ({
|
||||
wrapper: css`
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
max-width: 200px;
|
||||
text-overflow: ellipsis;
|
||||
`,
|
||||
iconWrap: css`
|
||||
padding: 0 15px 0 0;
|
||||
`,
|
||||
caretWrap: css`
|
||||
padding-left: ${theme.spacing.sm};
|
||||
margin-left: ${theme.spacing.sm};
|
||||
margin-right: -${theme.spacing.sm};
|
||||
height: 100%;
|
||||
`,
|
||||
}));
|
||||
const styles = getStyles(useTheme());
|
||||
const buttonIcon = `fa fa-${icon}`;
|
||||
const caretIcon = isOpen ? 'caret-up' : 'caret-down';
|
||||
return (
|
||||
<Button {...buttonProps} ref={ref} icon={buttonIcon}>
|
||||
<span className={styles.wrapper}>
|
||||
<span>{children}</span>
|
||||
<span className={styles.caretWrap}>
|
||||
<Icon name={caretIcon} />
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
export function ButtonSelect<T>({
|
||||
placeholder,
|
||||
@@ -76,7 +78,7 @@ export function ButtonSelect<T>({
|
||||
{...selectProps}
|
||||
renderControl={React.forwardRef<any, CustomControlProps<T>>(({ onBlur, onClick, value, isOpen }, ref) => {
|
||||
return (
|
||||
<SelectButton {...buttonProps} innerRef={ref} onBlur={onBlur} onClick={onClick} isOpen={isOpen}>
|
||||
<SelectButton {...buttonProps} ref={ref} onBlur={onBlur} onClick={onClick} isOpen={isOpen}>
|
||||
{value ? value.label : placeholder}
|
||||
</SelectButton>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user