mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
RolePicker: UI improvements (#49397)
* RolePicker: Adjust input and display widths * RolePicker: Use forwardRef * RolePicker: Apply input styles to roles display
This commit is contained in:
parent
cbf71fbd7f
commit
8fecf25d54
@ -58,7 +58,7 @@ export const RolePicker = ({
|
|||||||
} else {
|
} else {
|
||||||
setOffset(-offset);
|
setOffset(-offset);
|
||||||
}
|
}
|
||||||
}, [isOpen]);
|
}, [isOpen, selectedRoles]);
|
||||||
|
|
||||||
const onOpen = useCallback(
|
const onOpen = useCallback(
|
||||||
(event: FormEvent<HTMLElement>) => {
|
(event: FormEvent<HTMLElement>) => {
|
||||||
|
@ -7,6 +7,7 @@ import { useStyles2, getInputStyles, sharedInputStyle, styleMixins, Tooltip, Ico
|
|||||||
import { Role } from '../../../types';
|
import { Role } from '../../../types';
|
||||||
|
|
||||||
import { ValueContainer } from './ValueContainer';
|
import { ValueContainer } from './ValueContainer';
|
||||||
|
import { ROLE_PICKER_WIDTH } from './constants';
|
||||||
|
|
||||||
const stopPropagation = (event: React.MouseEvent<HTMLDivElement>) => event.stopPropagation();
|
const stopPropagation = (event: React.MouseEvent<HTMLDivElement>) => event.stopPropagation();
|
||||||
|
|
||||||
@ -51,7 +52,7 @@ export const RolePickerInput = ({
|
|||||||
const numberOfRoles = appliedRoles.length;
|
const numberOfRoles = appliedRoles.length;
|
||||||
|
|
||||||
return !isFocused ? (
|
return !isFocused ? (
|
||||||
<div className={styles.selectedRoles} onMouseDown={onOpen}>
|
<div className={cx(styles.wrapper, styles.selectedRoles)} onMouseDown={onOpen}>
|
||||||
{showBuiltInRole && <ValueContainer>{builtInRole}</ValueContainer>}
|
{showBuiltInRole && <ValueContainer>{builtInRole}</ValueContainer>}
|
||||||
<RolesLabel appliedRoles={appliedRoles} numberOfRoles={numberOfRoles} showBuiltInRole={showBuiltInRole} />
|
<RolesLabel appliedRoles={appliedRoles} numberOfRoles={numberOfRoles} showBuiltInRole={showBuiltInRole} />
|
||||||
</div>
|
</div>
|
||||||
@ -104,18 +105,12 @@ export const RolesLabel = ({ showBuiltInRole, numberOfRoles, appliedRoles }: Rol
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<div>
|
<ValueContainer>{`${showBuiltInRole ? '+' : ''}${numberOfRoles} role${
|
||||||
<ValueContainer>{`${showBuiltInRole ? '+' : ''}${numberOfRoles} role${
|
numberOfRoles > 1 ? 's' : ''
|
||||||
numberOfRoles > 1 ? 's' : ''
|
}`}</ValueContainer>
|
||||||
}`}</ValueContainer>
|
|
||||||
</div>
|
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
) : (
|
) : (
|
||||||
!showBuiltInRole && (
|
!showBuiltInRole && <ValueContainer>No roles assigned</ValueContainer>
|
||||||
<div>
|
|
||||||
<ValueContainer>No roles assigned</ValueContainer>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
@ -140,7 +135,7 @@ const getRolePickerInputStyles = (
|
|||||||
`,
|
`,
|
||||||
disabled && styles.inputDisabled,
|
disabled && styles.inputDisabled,
|
||||||
css`
|
css`
|
||||||
width: 520px;
|
width: ${ROLE_PICKER_WIDTH}px;
|
||||||
min-height: 32px;
|
min-height: 32px;
|
||||||
height: auto;
|
height: auto;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { css, cx } from '@emotion/css';
|
import { css, cx } from '@emotion/css';
|
||||||
import React, { ReactNode } from 'react';
|
import React, { forwardRef, ReactNode } from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { getInputStyles, Icon, IconName, useStyles2, getSelectStyles } from '@grafana/ui';
|
import { getInputStyles, Icon, IconName, useStyles2, getSelectStyles } from '@grafana/ui';
|
||||||
@ -8,15 +8,17 @@ export interface Props {
|
|||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
iconName?: IconName;
|
iconName?: IconName;
|
||||||
}
|
}
|
||||||
export const ValueContainer = ({ children, iconName }: Props) => {
|
export const ValueContainer = forwardRef<HTMLDivElement, Props>(({ children, iconName }, ref) => {
|
||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div className={styles.container} ref={ref}>
|
||||||
{iconName && <Icon name={iconName} size="xs" />}
|
{iconName && <Icon name={iconName} size="xs" />}
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
});
|
||||||
|
|
||||||
|
ValueContainer.displayName = 'ValueContainer';
|
||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => {
|
const getStyles = (theme: GrafanaTheme2) => {
|
||||||
const { prefix } = getInputStyles({ theme });
|
const { prefix } = getInputStyles({ theme });
|
||||||
|
@ -1 +1,2 @@
|
|||||||
export const MENU_MAX_HEIGHT = 300; // max height for the picker's dropdown menu
|
export const MENU_MAX_HEIGHT = 300; // max height for the picker's dropdown menu
|
||||||
|
export const ROLE_PICKER_WIDTH = 360;
|
||||||
|
Loading…
Reference in New Issue
Block a user