You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.8 KiB
162 lines
4.8 KiB
import { FieldNamePicker } from '../../grafana/MatchersUI/FieldNamePicker'; |
|
|
|
import { GrafanaTheme, StandardEditorProps } from '@grafana/data'; |
|
import { |
|
Button, |
|
ColorPicker, |
|
HorizontalGroup, |
|
IconButton, |
|
InlineField, |
|
InlineLabel, |
|
InlineSwitch, |
|
Input, |
|
stylesFactory, |
|
ThemeContext, |
|
} from '@grafana/ui'; |
|
|
|
import React from 'react'; |
|
|
|
import { css } from 'emotion'; |
|
import * as _ from 'lodash'; |
|
|
|
|
|
interface Props { |
|
defaultColor: string; |
|
arcBackground: string; |
|
thresholds: ThresholdConfig[]; |
|
} |
|
|
|
type ThresholdConfig = { |
|
color: string; |
|
useMetric: boolean; |
|
value?: number; |
|
metricName?: string; |
|
}; |
|
|
|
const DEFAULT_THRESHOLD: ThresholdConfig = { |
|
color: '#378372d', |
|
useMetric: false, |
|
value: 0, |
|
}; |
|
|
|
const fieldNamePickerSettings = { |
|
settings: { width: 24 }, |
|
} as any; |
|
|
|
export function ThresholdsEditor({ onChange, value, context }: StandardEditorProps<Props>) { |
|
const config = value; |
|
|
|
const addThreshold = () => { |
|
config.thresholds.push(_.cloneDeep(DEFAULT_THRESHOLD)); |
|
onChange(config); |
|
}; |
|
|
|
const removeThreshold = (idx: number) => { |
|
config.thresholds.splice(idx, 1); |
|
onChange(config); |
|
}; |
|
|
|
const onFieldChange = (field: keyof Props, value: any) => { |
|
config[field] = value; |
|
onChange(config); |
|
}; |
|
|
|
const onThresholdFieldChange = (thresholdIdx: number, field: keyof ThresholdConfig, value: any) => { |
|
// @ts-ignore |
|
config.thresholds[thresholdIdx][field] = value; |
|
onChange(config); |
|
}; |
|
|
|
return ( |
|
<ThemeContext.Consumer> |
|
{(theme) => { |
|
const styles = getStyles(theme.v1); |
|
return ( |
|
<div> |
|
<InlineField label="Default Gauge Color" labelWidth={20}> |
|
<InlineLabel> |
|
<ColorPicker |
|
color={config.defaultColor} |
|
onChange={(val) => onFieldChange('defaultColor', val)} |
|
enableNamedColors={false} |
|
/> |
|
</InlineLabel> |
|
</InlineField> |
|
|
|
<InlineField label="Arc Background" labelWidth={20}> |
|
<InlineLabel> |
|
<ColorPicker |
|
color={config.arcBackground} |
|
onChange={(val) => onFieldChange('arcBackground', val)} |
|
enableNamedColors={false} |
|
/> |
|
</InlineLabel> |
|
</InlineField> |
|
{config.thresholds.map((threshold, thresholdIdx) => { |
|
return ( |
|
<HorizontalGroup key={thresholdIdx}> |
|
<InlineField label="Use metric"> |
|
<InlineSwitch |
|
value={threshold.useMetric} |
|
onChange={(evt) => onThresholdFieldChange(thresholdIdx, 'useMetric', (evt.target as any).checked)} |
|
/> |
|
</InlineField> |
|
<InlineField> |
|
{threshold.useMetric ? ( |
|
<FieldNamePicker |
|
context={context} |
|
value={threshold.metricName as string} |
|
onChange={(newVal: any) => onThresholdFieldChange(thresholdIdx, 'metricName', newVal)} |
|
item={fieldNamePickerSettings} |
|
/> |
|
) : ( |
|
<Input |
|
placeholder="value" |
|
width={24} |
|
value={threshold.value} |
|
onChange={(evt) => onThresholdFieldChange(thresholdIdx, 'value', (evt.target as any).value)} |
|
/> |
|
)} |
|
</InlineField> |
|
<InlineField label="Color"> |
|
<InlineLabel> |
|
<ColorPicker |
|
color={threshold.color} |
|
onChange={(newVal) => onThresholdFieldChange(thresholdIdx, 'color', newVal)} |
|
enableNamedColors={false} |
|
/> |
|
</InlineLabel> |
|
</InlineField> |
|
<InlineField> |
|
<InlineLabel width={0} className={styles.deleteButton}> |
|
<IconButton |
|
name="trash-alt" |
|
onClick={() => removeThreshold(thresholdIdx)} |
|
tooltip="Delete Threshold" |
|
></IconButton> |
|
</InlineLabel> |
|
</InlineField> |
|
</HorizontalGroup> |
|
); |
|
})} |
|
<Button variant="secondary" onClick={addThreshold}> |
|
Add Threshold |
|
</Button> |
|
</div> |
|
); |
|
}} |
|
</ThemeContext.Consumer> |
|
); |
|
} |
|
|
|
interface ThresholdsEditorStyles { |
|
deleteButton: string; |
|
} |
|
|
|
const getStyles = stylesFactory((theme: GrafanaTheme): ThresholdsEditorStyles => { |
|
return { |
|
deleteButton: css` |
|
margin-right: 0px!important; |
|
`, |
|
}; |
|
});
|
|
|