import { cx } from '@emotion/css'; import { forwardRef, FormEvent } from 'react'; import { t } from '@grafana/i18n'; import { Checkbox, Icon, Tooltip, useStyles2, useTheme2 } from '@grafana/ui'; import { getSelectStyles } from '@grafana/ui/internal'; import { Role } from 'app/types'; import { getStyles } from './styles'; interface RoleMenuOptionProps { data: Role; onChange: (value: Role) => void; useFilteredDisplayName?: boolean; isSelected?: boolean; isFocused?: boolean; disabled?: boolean; mapped?: boolean; hideDescription?: boolean; } export const RoleMenuOption = forwardRef>( ({ data, isFocused, isSelected, useFilteredDisplayName, disabled, mapped, onChange, hideDescription }, ref) => { const theme = useTheme2(); const styles = getSelectStyles(theme); const customStyles = useStyles2(getStyles); disabled = disabled || mapped; let disabledMessage = ''; if (disabled) { disabledMessage = 'You do not have permissions to assign this role.'; if (mapped) { disabledMessage = 'Role assignment cannot be removed because the role is mapped through group sync.'; } } const wrapperClassName = cx( styles.option, isFocused && styles.optionFocused, disabled && customStyles.menuOptionDisabled ); const onChangeInternal = (event: FormEvent) => { if (disabled) { return; } event.preventDefault(); event.stopPropagation(); onChange(data); }; return ( // TODO: fix keyboard a11y // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
{(useFilteredDisplayName && data.filteredDisplayName) || data.displayName || data.name} {!hideDescription && data.description &&
{data.description}
}
{disabledMessage && ( )} {data.description && ( )}
); } ); RoleMenuOption.displayName = 'RoleMenuOption';