diff --git a/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx b/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx index 0a407bc0ff4..96e8809a6eb 100644 --- a/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx +++ b/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx @@ -1,4 +1,4 @@ -import React, { Component, RefObject } from 'react'; +import React, { Component } from 'react'; import isNil from 'lodash/isNil'; import classNames from 'classnames'; import Scrollbars from 'react-custom-scrollbars'; @@ -17,7 +17,6 @@ interface Props { setScrollTop: (event: any) => void; autoHeightMin?: number | string; updateAfterMountMs?: number; - scrollRef?: RefObject; } /** @@ -38,7 +37,7 @@ export class CustomScrollbar extends Component { constructor(props: Props) { super(props); - this.ref = props.scrollRef || React.createRef(); + this.ref = React.createRef(); } updateScroll() { @@ -52,6 +51,7 @@ export class CustomScrollbar extends Component { componentDidMount() { this.updateScroll(); + // this logic is to make scrollbar visible when content is added body after mount if (this.props.updateAfterMountMs) { setTimeout(() => this.updateAfterMount(), this.props.updateAfterMountMs); diff --git a/packages/grafana-ui/src/components/Forms/Select/SelectBase.tsx b/packages/grafana-ui/src/components/Forms/Select/SelectBase.tsx index 0af6db41447..2b0f55f5f16 100644 --- a/packages/grafana-ui/src/components/Forms/Select/SelectBase.tsx +++ b/packages/grafana-ui/src/components/Forms/Select/SelectBase.tsx @@ -24,7 +24,6 @@ import { SingleValue } from './SingleValue'; import { MultiValueContainer, MultiValueRemove } from './MultiValue'; import { useTheme } from '../../../themes'; import { getSelectStyles } from './getSelectStyles'; -import { withSelectArrowNavigation } from '../../Select/withSelectArrowNavigation'; type SelectValue = T | SelectableValue | T[] | Array>; @@ -272,10 +271,10 @@ export function SelectBase({ defaultOptions, }; } - const NavigatableSelect = withSelectArrowNavigation(ReactSelectComponent); + return ( <> - ; innerProps: {}; - scrollRef: RefObject; } -export const SelectMenu = forwardRef>( - (props, ref = props.innerRef) => { - const theme = useTheme(); - const styles = getSelectStyles(theme); - const { children, maxHeight, innerProps, scrollRef } = props; +export const SelectMenu = React.forwardRef>((props, ref) => { + const theme = useTheme(); + const styles = getSelectStyles(theme); + const { children, maxHeight, innerRef, innerProps } = props; - return ( -
- - {children} - -
- ); - } -); + return ( +
+ + {children} + +
+ ); +}); SelectMenu.displayName = 'SelectMenu'; diff --git a/packages/grafana-ui/src/components/Select/Select.tsx b/packages/grafana-ui/src/components/Select/Select.tsx index cfffa665e7d..e59032b6d1d 100644 --- a/packages/grafana-ui/src/components/Select/Select.tsx +++ b/packages/grafana-ui/src/components/Select/Select.tsx @@ -27,8 +27,6 @@ import { PopoverContent } from '../Tooltip/Tooltip'; import { Tooltip } from '../Tooltip/Tooltip'; import { SelectableValue } from '@grafana/data'; -import { withSelectArrowNavigation } from './withSelectArrowNavigation'; - /** * Changes in new selects: * - noOptionsMessage & loadingMessage is of string type @@ -44,7 +42,7 @@ interface AsyncProps extends LegacyCommonProps, Omit, value?: SelectableValue; } -export interface LegacySelectProps extends LegacyCommonProps { +interface LegacySelectProps extends LegacyCommonProps { tooltipContent?: PopoverContent; noOptionsMessage?: () => string; isDisabled?: boolean; @@ -54,7 +52,7 @@ export interface LegacySelectProps extends LegacyCommonProps { export const MenuList = (props: any) => { return ( - + {props.children} @@ -127,7 +125,6 @@ export class Select extends PureComponent> { SelectComponent = Creatable; creatableOptions.formatCreateLabel = formatCreateLabel ?? ((input: string) => input); } - const NavigatableSelect = withSelectArrowNavigation(SelectComponent); const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className); const selectComponents = { ...Select.defaultProps.components, ...components }; @@ -135,7 +132,7 @@ export class Select extends PureComponent> { {(onOpenMenuInternal, onCloseMenuInternal) => { return ( - extends PureComponent> { } } -const NavigatableAsyncSelect = withSelectArrowNavigation(ReactAsyncSelect); - export class AsyncSelect extends PureComponent> { static defaultProps: Partial> = { className: '', @@ -231,7 +226,7 @@ export class AsyncSelect extends PureComponent> { {(onOpenMenuInternal, onCloseMenuInternal) => { return ( - { }; } -export const SelectOption = forwardRef((props: ExtendedOptionProps, ref) => { +export const SelectOption = (props: ExtendedOptionProps) => { const { children, isSelected, data } = props; + return ( - +
{data.imgUrl && }
@@ -27,6 +28,6 @@ export const SelectOption = forwardRef((props: ExtendedOptionProps, ref) => {
); -}); +}; export default SelectOption; diff --git a/packages/grafana-ui/src/components/Select/withSelectArrowNavigation.tsx b/packages/grafana-ui/src/components/Select/withSelectArrowNavigation.tsx deleted file mode 100644 index 710d191e484..00000000000 --- a/packages/grafana-ui/src/components/Select/withSelectArrowNavigation.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useRef, Component, createRef, RefObject, ComponentType, KeyboardEvent } from 'react'; -import { ExtendedOptionProps } from './SelectOption'; - -const scrollIntoView = (optionRef: RefObject | null, scrollRef: RefObject) => { - if (!optionRef || !optionRef.current || !scrollRef || !scrollRef.current || !scrollRef.current.container) { - return; - } - - const { container, scrollTop } = scrollRef.current; - const option = optionRef.current; - const containerRect = container.getBoundingClientRect(); - const optionRect = option.getBoundingClientRect(); - - if (optionRect.bottom > containerRect.bottom) { - scrollTop(option.offsetTop + option.clientHeight - container.offsetHeight); - } else if (optionRect.top < containerRect.top) { - scrollTop(option.offsetTop); - } -}; - -export const withSelectArrowNavigation =

(WrappedComponent: ComponentType

) => { - return class Select extends Component

{ - focusedOptionRef: RefObject | null = null; - scrollRef = createRef(); - render() { - const { components } = this.props; - return ( - { - return ; - }, - Option: (props: ExtendedOptionProps) => { - const innerRef = useRef(null); - if (props.isFocused) { - this.focusedOptionRef = innerRef; - } - return ; - }, - }} - onKeyDown={(e: KeyboardEvent) => { - const { onKeyDown } = this.props; - onKeyDown && onKeyDown(e); - if (e.keyCode === 38 || e.keyCode === 40) { - setTimeout(() => { - scrollIntoView(this.focusedOptionRef, this.scrollRef); - }); - } - }} - /> - ); - } - }; -}; diff --git a/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap b/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap index 6e7db70f6ee..1c70ef18bf4 100644 --- a/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap +++ b/public/app/features/teams/__snapshots__/TeamMemberRow.test.tsx.snap @@ -97,10 +97,7 @@ exports[`Render when feature toggle editorsCanAdmin is turned off should not ren "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -190,10 +187,7 @@ exports[`Render when feature toggle editorsCanAdmin is turned on should render p "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } diff --git a/public/app/plugins/datasource/cloudwatch/components/__snapshots__/ConfigEditor.test.tsx.snap b/public/app/plugins/datasource/cloudwatch/components/__snapshots__/ConfigEditor.test.tsx.snap index 1330a9aa86c..6f27bc6bd76 100644 --- a/public/app/plugins/datasource/cloudwatch/components/__snapshots__/ConfigEditor.test.tsx.snap +++ b/public/app/plugins/datasource/cloudwatch/components/__snapshots__/ConfigEditor.test.tsx.snap @@ -31,10 +31,7 @@ exports[`Render should disable access key id field 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -141,10 +138,7 @@ exports[`Render should disable access key id field 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -217,10 +211,7 @@ exports[`Render should render component 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -327,10 +318,7 @@ exports[`Render should render component 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -403,10 +391,7 @@ exports[`Render should should show access key and secret access key fields 1`] = "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -513,10 +498,7 @@ exports[`Render should should show access key and secret access key fields 1`] = "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -589,10 +571,7 @@ exports[`Render should should show arn role field 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -699,10 +678,7 @@ exports[`Render should should show arn role field 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -775,10 +751,7 @@ exports[`Render should should show credentials profile name field 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -885,10 +858,7 @@ exports[`Render should should show credentials profile name field 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AnalyticsConfig.test.tsx.snap b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AnalyticsConfig.test.tsx.snap index 126998be172..1766d027d2e 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AnalyticsConfig.test.tsx.snap +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AnalyticsConfig.test.tsx.snap @@ -52,10 +52,7 @@ exports[`Render should disable log analytics credentials form 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -151,10 +148,7 @@ exports[`Render should enable azure log analytics load workspaces button 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -250,10 +244,7 @@ exports[`Render should render component 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AzureCredentialsForm.test.tsx.snap b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AzureCredentialsForm.test.tsx.snap index 0653a34b3af..caf4a184fea 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AzureCredentialsForm.test.tsx.snap +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/AzureCredentialsForm.test.tsx.snap @@ -27,10 +27,7 @@ exports[`Render should disable azure monitor secret input 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -176,10 +173,7 @@ exports[`Render should disable azure monitor secret input 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -250,10 +244,7 @@ exports[`Render should enable azure monitor load subscriptions button 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -389,10 +380,7 @@ exports[`Render should enable azure monitor load subscriptions button 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -463,10 +451,7 @@ exports[`Render should render component 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -602,10 +587,7 @@ exports[`Render should render component 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } diff --git a/public/app/plugins/datasource/influxdb/components/__snapshots__/ConfigEditor.test.tsx.snap b/public/app/plugins/datasource/influxdb/components/__snapshots__/ConfigEditor.test.tsx.snap index 824cb2fa535..bedce4b6188 100644 --- a/public/app/plugins/datasource/influxdb/components/__snapshots__/ConfigEditor.test.tsx.snap +++ b/public/app/plugins/datasource/influxdb/components/__snapshots__/ConfigEditor.test.tsx.snap @@ -125,10 +125,7 @@ exports[`Render should disable basic auth password input 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -345,10 +342,7 @@ exports[`Render should hide basic auth fields when switch off 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -565,10 +559,7 @@ exports[`Render should hide white listed cookies input when browser access chose "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -785,10 +776,7 @@ exports[`Render should render component 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } diff --git a/public/app/plugins/datasource/prometheus/components/__snapshots__/PromQueryEditor.test.tsx.snap b/public/app/plugins/datasource/prometheus/components/__snapshots__/PromQueryEditor.test.tsx.snap index 5d82ac46737..1f9d676b29c 100644 --- a/public/app/plugins/datasource/prometheus/components/__snapshots__/PromQueryEditor.test.tsx.snap +++ b/public/app/plugins/datasource/prometheus/components/__snapshots__/PromQueryEditor.test.tsx.snap @@ -86,10 +86,7 @@ exports[`Render PromQueryEditor with basic options should render 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } } @@ -156,10 +153,7 @@ exports[`Render PromQueryEditor with basic options should render 1`] = ` "Group": [Function], "IndicatorsContainer": [Function], "MenuList": [Function], - "Option": Object { - "$$typeof": Symbol(react.forward_ref), - "render": [Function], - }, + "Option": [Function], "SingleValue": [Function], } }