From 8fecf25d54d5e4b9f5999b4cbd59cf95eda37670 Mon Sep 17 00:00:00 2001 From: Alex Khomenko Date: Tue, 24 May 2022 10:21:31 +0300 Subject: [PATCH] RolePicker: UI improvements (#49397) * RolePicker: Adjust input and display widths * RolePicker: Use forwardRef * RolePicker: Apply input styles to roles display --- .../core/components/RolePicker/RolePicker.tsx | 2 +- .../components/RolePicker/RolePickerInput.tsx | 19 +++++++------------ .../components/RolePicker/ValueContainer.tsx | 10 ++++++---- .../core/components/RolePicker/constants.ts | 1 + 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/public/app/core/components/RolePicker/RolePicker.tsx b/public/app/core/components/RolePicker/RolePicker.tsx index 9fed8ad8b43..d2fdba81cfc 100644 --- a/public/app/core/components/RolePicker/RolePicker.tsx +++ b/public/app/core/components/RolePicker/RolePicker.tsx @@ -58,7 +58,7 @@ export const RolePicker = ({ } else { setOffset(-offset); } - }, [isOpen]); + }, [isOpen, selectedRoles]); const onOpen = useCallback( (event: FormEvent) => { diff --git a/public/app/core/components/RolePicker/RolePickerInput.tsx b/public/app/core/components/RolePicker/RolePickerInput.tsx index b650439532d..70e8f9b2ff8 100644 --- a/public/app/core/components/RolePicker/RolePickerInput.tsx +++ b/public/app/core/components/RolePicker/RolePickerInput.tsx @@ -7,6 +7,7 @@ import { useStyles2, getInputStyles, sharedInputStyle, styleMixins, Tooltip, Ico import { Role } from '../../../types'; import { ValueContainer } from './ValueContainer'; +import { ROLE_PICKER_WIDTH } from './constants'; const stopPropagation = (event: React.MouseEvent) => event.stopPropagation(); @@ -51,7 +52,7 @@ export const RolePickerInput = ({ const numberOfRoles = appliedRoles.length; return !isFocused ? ( -
+
{showBuiltInRole && {builtInRole}}
@@ -104,18 +105,12 @@ export const RolesLabel = ({ showBuiltInRole, numberOfRoles, appliedRoles }: Rol
} > -
- {`${showBuiltInRole ? '+' : ''}${numberOfRoles} role${ - numberOfRoles > 1 ? 's' : '' - }`} -
+ {`${showBuiltInRole ? '+' : ''}${numberOfRoles} role${ + numberOfRoles > 1 ? 's' : '' + }`} ) : ( - !showBuiltInRole && ( -
- No roles assigned -
- ) + !showBuiltInRole && No roles assigned )} ); @@ -140,7 +135,7 @@ const getRolePickerInputStyles = ( `, disabled && styles.inputDisabled, css` - width: 520px; + width: ${ROLE_PICKER_WIDTH}px; min-height: 32px; height: auto; flex-direction: row; diff --git a/public/app/core/components/RolePicker/ValueContainer.tsx b/public/app/core/components/RolePicker/ValueContainer.tsx index 32c409892ac..f1a7d3848f4 100644 --- a/public/app/core/components/RolePicker/ValueContainer.tsx +++ b/public/app/core/components/RolePicker/ValueContainer.tsx @@ -1,5 +1,5 @@ import { css, cx } from '@emotion/css'; -import React, { ReactNode } from 'react'; +import React, { forwardRef, ReactNode } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { getInputStyles, Icon, IconName, useStyles2, getSelectStyles } from '@grafana/ui'; @@ -8,15 +8,17 @@ export interface Props { children: ReactNode; iconName?: IconName; } -export const ValueContainer = ({ children, iconName }: Props) => { +export const ValueContainer = forwardRef(({ children, iconName }, ref) => { const styles = useStyles2(getStyles); return ( -
+
{iconName && } {children}
); -}; +}); + +ValueContainer.displayName = 'ValueContainer'; const getStyles = (theme: GrafanaTheme2) => { const { prefix } = getInputStyles({ theme }); diff --git a/public/app/core/components/RolePicker/constants.ts b/public/app/core/components/RolePicker/constants.ts index 1fdd623ad74..80beb4e0d43 100644 --- a/public/app/core/components/RolePicker/constants.ts +++ b/public/app/core/components/RolePicker/constants.ts @@ -1 +1,2 @@ export const MENU_MAX_HEIGHT = 300; // max height for the picker's dropdown menu +export const ROLE_PICKER_WIDTH = 360;