diff --git a/src/components/fields/ColorPicker.js b/src/components/fields/ColorPicker.js index a1a883588..f14303b83 100644 --- a/src/components/fields/ColorPicker.js +++ b/src/components/fields/ColorPicker.js @@ -4,8 +4,34 @@ import PropTypes from 'prop-types'; import React, {Component} from 'react'; import {connectToContainer} from 'lib'; -class UnconnectedColorPicker extends Component { +export class UnconnectedColorPicker extends Component { + constructor(props, context) { + super(props, context); + this.state = { + empty: !this.props.fullValue && this.props.handleEmpty, + }; + } + render() { + if (this.state.empty) { + return ( + + + This color is computed from other parts of the figure but you can{' '} + { + this.setState({empty: false}); + this.props.updatePlot(this.props.defaultColor); + }} + > + override it + + . + + + ); + } + return ( 1 && + props.fullValue && props.fullValue.every(v => v[1] === props.fullValue[0][1]) ? 'single' : 'multiple', @@ -41,7 +42,11 @@ class UnconnectedMultiColorPicker extends Component { } setColor(color) { - this.props.updatePlot(color); + if (this.props.setColor) { + this.props.setColor(color); + } else { + this.props.updatePlot(color); + } } setColors(colorscale, colorscaleType) { @@ -88,11 +93,7 @@ class UnconnectedMultiColorPicker extends Component { {selectedConstantColorOption === 'single' ? singleMessage : multiMessage} {selectedConstantColorOption === 'single' ? ( - + ) : ( + ); } } diff --git a/src/components/fields/VisibilitySelect.js b/src/components/fields/VisibilitySelect.js index 12513928a..bcf159ea8 100644 --- a/src/components/fields/VisibilitySelect.js +++ b/src/components/fields/VisibilitySelect.js @@ -6,7 +6,7 @@ import Field from './Field'; import Radio from './Radio'; import Dropdown from './Dropdown'; -class UnconnectedVisibilitySelect extends Component { +export class UnconnectedVisibilitySelect extends Component { constructor(props, context) { super(props, context); diff --git a/src/components/fields/derived.js b/src/components/fields/derived.js index 9424f8ed3..d331c4bef 100644 --- a/src/components/fields/derived.js +++ b/src/components/fields/derived.js @@ -5,6 +5,8 @@ import {UnconnectedNumeric} from './Numeric'; import {UnconnectedAxisRangeValue} from './AxisRangeValue'; import {UnconnectedRadio} from './Radio'; import Info from './Info'; +import {UnconnectedColorPicker} from './ColorPicker'; +import {UnconnectedVisibilitySelect} from './VisibilitySelect'; import {connectToContainer, getAllAxes, getAxisTitle, axisIdToAxisName} from 'lib'; export const AxisAnchorDropdown = connectToContainer(UnconnectedDropdown, { @@ -638,7 +640,7 @@ export const HoveronDropdown = connectToContainer(UnconnectedDropdown, { }, }); -export const HovermodeDropdown = connectToContainer(UnconnectedDropdown, { +export const HovermodeDropdown = connectToContainer(UnconnectedVisibilitySelect, { modifyPlotProps: (props, context, plotProps) => { const {localize: _} = context; @@ -652,5 +654,14 @@ export const HovermodeDropdown = connectToContainer(UnconnectedDropdown, { ] : [{label: _('Closest'), value: 'closest'}, {label: _('Disable'), value: false}]; plotProps.clearable = false; + plotProps.dropdown = true; + plotProps.showOn = ['closest', 'x', 'y']; + }, +}); + +export const HoverColor = connectToContainer(UnconnectedColorPicker, { + modifyPlotProps: (props, context, plotProps) => { + plotProps.isVisible = Boolean(context.fullLayout.hovermode); + return plotProps; }, }); diff --git a/src/default_panels/StyleLayoutPanel.js b/src/default_panels/StyleLayoutPanel.js index 15500d65d..b68cfd49d 100644 --- a/src/default_panels/StyleLayoutPanel.js +++ b/src/default_panels/StyleLayoutPanel.js @@ -13,6 +13,7 @@ import { VisibilitySelect, HovermodeDropdown, } from '../components'; +import {HoverColor} from '../components/fields/derived'; const StyleLayoutPanel = (props, {localize: _}) => ( @@ -61,32 +62,57 @@ const StyleLayoutPanel = (props, {localize: _}) => ( - - - - + + + + + + + + + + + + + + );