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 }) => (
+
+
+
+ )}
);
}