WIP Add gauge controls in display options
parent
57891556e3
commit
ede2c2a7d0
|
@ -1,6 +1,7 @@
|
||||||
import React, {Component, PropTypes} from 'react'
|
import React, {Component, PropTypes} from 'react'
|
||||||
|
|
||||||
import GraphTypeSelector from 'src/dashboards/components/GraphTypeSelector'
|
import GraphTypeSelector from 'src/dashboards/components/GraphTypeSelector'
|
||||||
|
import GaugeOptions from 'src/dashboards/components/GaugeOptions'
|
||||||
import AxesOptions from 'src/dashboards/components/AxesOptions'
|
import AxesOptions from 'src/dashboards/components/AxesOptions'
|
||||||
|
|
||||||
import {buildDefaultYLabel} from 'shared/presenters'
|
import {buildDefaultYLabel} from 'shared/presenters'
|
||||||
|
@ -44,22 +45,26 @@ class DisplayOptions extends Component {
|
||||||
} = this.props
|
} = this.props
|
||||||
const {axes} = this.state
|
const {axes} = this.state
|
||||||
|
|
||||||
|
const isGauge = selectedGraphType === 'gauge'
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="display-options">
|
<div className="display-options">
|
||||||
<GraphTypeSelector
|
<GraphTypeSelector
|
||||||
selectedGraphType={selectedGraphType}
|
selectedGraphType={selectedGraphType}
|
||||||
onSelectGraphType={onSelectGraphType}
|
onSelectGraphType={onSelectGraphType}
|
||||||
/>
|
/>
|
||||||
<AxesOptions
|
{isGauge
|
||||||
selectedGraphType={selectedGraphType}
|
? <GaugeOptions />
|
||||||
axes={axes}
|
: <AxesOptions
|
||||||
onSetBase={onSetBase}
|
selectedGraphType={selectedGraphType}
|
||||||
onSetLabel={onSetLabel}
|
axes={axes}
|
||||||
onSetScale={onSetScale}
|
onSetBase={onSetBase}
|
||||||
onSetPrefixSuffix={onSetPrefixSuffix}
|
onSetLabel={onSetLabel}
|
||||||
onSetYAxisBoundMin={onSetYAxisBoundMin}
|
onSetScale={onSetScale}
|
||||||
onSetYAxisBoundMax={onSetYAxisBoundMax}
|
onSetPrefixSuffix={onSetPrefixSuffix}
|
||||||
/>
|
onSetYAxisBoundMin={onSetYAxisBoundMin}
|
||||||
|
onSetYAxisBoundMax={onSetYAxisBoundMax}
|
||||||
|
/>}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
import React, {Component, PropTypes} from 'react'
|
||||||
|
|
||||||
|
import FancyScrollbar from 'shared/components/FancyScrollbar'
|
||||||
|
import ColorDropdown from 'shared/components/ColorDropdown'
|
||||||
|
import uuid from 'node-uuid'
|
||||||
|
|
||||||
|
import {
|
||||||
|
MAX_THRESHOLDS,
|
||||||
|
GAUGE_COLORS,
|
||||||
|
} from 'src/dashboards/constants/gaugeColors'
|
||||||
|
|
||||||
|
class GaugeOptions extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
minValue: this.props.config.minValue,
|
||||||
|
minColor: this.props.config.minColor,
|
||||||
|
maxValue: this.props.config.maxValue,
|
||||||
|
maxColor: this.props.config.maxColor,
|
||||||
|
thresholds: this.props.config.thresholds,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChooseMinColor = color => {
|
||||||
|
this.setState({minColor: color})
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChooseMaxColor = color => {
|
||||||
|
this.setState({maxColor: color})
|
||||||
|
}
|
||||||
|
|
||||||
|
handleAddThreshold = () => {
|
||||||
|
const {minValue, thresholds} = this.state
|
||||||
|
const randomColor = Math.floor(Math.random() * GAUGE_COLORS.length)
|
||||||
|
|
||||||
|
const newThreshold = {
|
||||||
|
id: uuid.v4(),
|
||||||
|
value: minValue + 1,
|
||||||
|
hex: GAUGE_COLORS[randomColor].hex,
|
||||||
|
text: GAUGE_COLORS[randomColor].text,
|
||||||
|
}
|
||||||
|
thresholds.push(newThreshold)
|
||||||
|
|
||||||
|
this.setState([thresholds])
|
||||||
|
}
|
||||||
|
|
||||||
|
handleDeleteThreshold = threshold => () => {
|
||||||
|
const {thresholds} = this.state
|
||||||
|
|
||||||
|
const filteredThresholds = thresholds.filter(t => {
|
||||||
|
return t.id !== threshold.id
|
||||||
|
})
|
||||||
|
|
||||||
|
this.setState({thresholds: filteredThresholds})
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChooseColor = threshold => newColor => {
|
||||||
|
threshold.hex = newColor.hex
|
||||||
|
threshold.text = newColor.text
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChangeValue = threshold => e => {
|
||||||
|
threshold.value = Number(e.target.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {minValue, minColor, maxValue, maxColor, thresholds} = this.state
|
||||||
|
|
||||||
|
const disableMaxColor = thresholds.length > 0
|
||||||
|
|
||||||
|
const disableAddThreshold = thresholds.length > MAX_THRESHOLDS
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FancyScrollbar
|
||||||
|
className="display-options--cell y-axis-controls"
|
||||||
|
autoHide={false}
|
||||||
|
>
|
||||||
|
<div className="display-options--cell-wrapper">
|
||||||
|
<h5 className="display-options--header">Gauge Controls</h5>
|
||||||
|
<div className="gauge-controls">
|
||||||
|
<div className="gauge-controls--section">
|
||||||
|
<div className="gauge-controls--label">Minimum</div>
|
||||||
|
<input
|
||||||
|
defaultValue={minValue}
|
||||||
|
className="form-control input-sm gauge-controls--input"
|
||||||
|
type="number"
|
||||||
|
placeholder=">= 0"
|
||||||
|
min={0}
|
||||||
|
/>
|
||||||
|
<ColorDropdown
|
||||||
|
colors={GAUGE_COLORS}
|
||||||
|
selected={minColor}
|
||||||
|
onChoose={this.handleChooseMinColor}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{thresholds.length > 0 &&
|
||||||
|
thresholds.map(threshold =>
|
||||||
|
<div className="gauge-controls--section" key={threshold.id}>
|
||||||
|
<div className="gauge-controls--label-editable">
|
||||||
|
Threshold
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
className="btn btn-default btn-sm btn-square gauge-controls--delete"
|
||||||
|
onClick={this.handleDeleteThreshold(threshold)}
|
||||||
|
>
|
||||||
|
<span className="icon remove" />
|
||||||
|
</button>
|
||||||
|
<input
|
||||||
|
defaultValue={threshold.value}
|
||||||
|
className="form-control input-sm gauge-controls--input"
|
||||||
|
type="number"
|
||||||
|
onChange={this.handleChangeValue(threshold)}
|
||||||
|
min={minValue + 1}
|
||||||
|
max={maxValue - 1}
|
||||||
|
/>
|
||||||
|
<ColorDropdown
|
||||||
|
colors={GAUGE_COLORS}
|
||||||
|
selected={threshold}
|
||||||
|
onChoose={this.handleChooseColor(threshold)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<div className="gauge-controls--section">
|
||||||
|
<div className="gauge-controls--label">Maximum</div>
|
||||||
|
<input
|
||||||
|
defaultValue={maxValue}
|
||||||
|
className="form-control input-sm gauge-controls--input"
|
||||||
|
type="number"
|
||||||
|
/>
|
||||||
|
<ColorDropdown
|
||||||
|
colors={GAUGE_COLORS}
|
||||||
|
selected={maxColor}
|
||||||
|
onChoose={this.handleChooseMaxColor}
|
||||||
|
disabled={disableMaxColor}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
className="btn btn-sm btn-primary gauge-controls--add-threshold"
|
||||||
|
onClick={this.handleAddThreshold}
|
||||||
|
disabled={disableAddThreshold}
|
||||||
|
>
|
||||||
|
<span className="icon plus" /> Add Threshold
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</FancyScrollbar>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const {arrayOf, func, number, shape, string} = PropTypes
|
||||||
|
|
||||||
|
GaugeOptions.defaultProps = {
|
||||||
|
config: {
|
||||||
|
minValue: 0,
|
||||||
|
minColor: GAUGE_COLORS[2],
|
||||||
|
maxValue: 100,
|
||||||
|
maxColor: GAUGE_COLORS[13],
|
||||||
|
thresholds: [],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
GaugeOptions.propTypes = {
|
||||||
|
config: shape({
|
||||||
|
minValue: number.isRequired,
|
||||||
|
minColor: shape({hex: string.isRequired, text: string.isRequired})
|
||||||
|
.isRequired,
|
||||||
|
maxValue: number.isRequired,
|
||||||
|
maxColor: shape({hex: string.isRequired, text: string.isRequired})
|
||||||
|
.isRequired,
|
||||||
|
thresholds: arrayOf(
|
||||||
|
shape({
|
||||||
|
value: number.isRequired,
|
||||||
|
hex: string.isRequired,
|
||||||
|
text: string.isRequired,
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
onUpdateOptions: func,
|
||||||
|
}
|
||||||
|
|
||||||
|
export default GaugeOptions
|
|
@ -1,3 +1,4 @@
|
||||||
|
export const MAX_THRESHOLDS = 3
|
||||||
export const GAUGE_COLORS = [
|
export const GAUGE_COLORS = [
|
||||||
{
|
{
|
||||||
hex: '#BF3D5E',
|
hex: '#BF3D5E',
|
||||||
|
|
|
@ -195,3 +195,52 @@ $graph-type--gutter: 4px;
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
@include no-user-select();
|
@include no-user-select();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Cell Editor Overlay - Gauge Controls
|
||||||
|
------------------------------------------------------
|
||||||
|
*/
|
||||||
|
.gauge-controls {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gauge-controls--section {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
align-items: center;
|
||||||
|
height: 30px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
button.btn.btn-primary.btn-sm.gauge-controls--add-threshold {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gauge-controls--label {
|
||||||
|
height: 30px;
|
||||||
|
background-color: $g4-onyx;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $g11-sidewalk;
|
||||||
|
padding: 0 11px;
|
||||||
|
border-radius: 4px;
|
||||||
|
line-height: 30px;
|
||||||
|
@include no-user-select();
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
.gauge-controls--label-editable {
|
||||||
|
height: 30px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: $g16-pearl;
|
||||||
|
padding: 0 11px;
|
||||||
|
border-radius: 4px;
|
||||||
|
line-height: 30px;
|
||||||
|
@include no-user-select();
|
||||||
|
width: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gauge-controls--input {
|
||||||
|
flex: 1 0 0;
|
||||||
|
margin: 0 4px;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue