diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx index f7fa71391ae..c4f2a848029 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx @@ -50,7 +50,16 @@ ColorPickerStories.add('Series color picker', () => { color={selectedColor} onChange={color => updateSelectedColor(color)} > -
Open color picker
+ {({ ref, showColorPicker, hideColorPicker }) => ( +
+ Open color picker +
+ )} ); }} diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx index 4602da9afc3..4a46458a115 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx @@ -1,4 +1,5 @@ import React, { Component, createRef } from 'react'; +import { omit } from 'lodash'; import { PopperController } from '../Tooltip/PopperController'; import { Popper } from '../Tooltip/Popper'; import { ColorPickerPopover, ColorPickerProps, ColorPickerChangeHandler } from './ColorPickerPopover'; @@ -8,13 +9,19 @@ import { SeriesColorPickerPopover } from './SeriesColorPickerPopover'; import { withTheme } from '../../themes/ThemeContext'; import { ColorPickerTrigger } from './ColorPickerTrigger'; +type ColorPickerTriggerRenderer = (props: { + ref: React.RefObject; + showColorPicker: () => void; + hideColorPicker: () => void; +}) => React.ReactNode; + export const colorPickerFactory = ( popover: React.ComponentType, displayName = 'ColorPicker' ) => { - return class ColorPicker extends Component { + return class ColorPicker extends Component { static displayName = displayName; - pickerTriggerRef = createRef(); + pickerTriggerRef = createRef(); onColorChange = (color: string) => { const { onColorChange, onChange } = this.props; @@ -24,11 +31,11 @@ export const colorPickerFactory = ( }; render() { + const { theme, children } = this.props; const popoverElement = React.createElement(popover, { - ...this.props, + ...omit(this.props, 'children'), onChange: this.onColorChange, }); - const { theme, children } = this.props; return ( @@ -46,10 +53,10 @@ export const colorPickerFactory = ( )} {children ? ( - React.cloneElement(children as JSX.Element, { + (children as ColorPickerTriggerRenderer)({ ref: this.pickerTriggerRef, - onClick: showPopper, - onMouseLeave: hidePopper, + showColorPicker: showPopper, + hideColorPicker: hidePopper, }) ) : ( extends ColorPickerProps, PopperContentProps { customPickers?: T; } diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPickerTrigger.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPickerTrigger.tsx index 6d4775d1739..0445fd465e3 100644 --- a/packages/grafana-ui/src/components/ColorPicker/ColorPickerTrigger.tsx +++ b/packages/grafana-ui/src/components/ColorPicker/ColorPickerTrigger.tsx @@ -1,4 +1,4 @@ -import React, { forwardRef, Ref } from 'react'; +import React, { forwardRef } from 'react'; interface ColorPickerTriggerProps { onClick: () => void; @@ -8,7 +8,7 @@ interface ColorPickerTriggerProps { export const ColorPickerTrigger = forwardRef(function ColorPickerTrigger( props: ColorPickerTriggerProps, - ref: Ref + ref: React.Ref ) { return (
- - - + {({ ref, showColorPicker, hideColorPicker }) => ( + + + + )} ); }