diff --git a/public/app/features/plugins/built_in_plugins.ts b/public/app/features/plugins/built_in_plugins.ts index b9779190a8b..a0cedb3ebfd 100644 --- a/public/app/features/plugins/built_in_plugins.ts +++ b/public/app/features/plugins/built_in_plugins.ts @@ -24,6 +24,7 @@ import * as heatmapPanel from 'app/plugins/panel/heatmap/module'; import * as tablePanel from 'app/plugins/panel/table/module'; import * as singlestatPanel from 'app/plugins/panel/singlestat/module'; import * as gettingStartedPanel from 'app/plugins/panel/gettingstarted/module'; +import * as gaugePanel from 'app/plugins/panel/gauge/module'; const builtInPlugins = { 'app/plugins/datasource/graphite/module': graphitePlugin, @@ -52,6 +53,7 @@ const builtInPlugins = { 'app/plugins/panel/table/module': tablePanel, 'app/plugins/panel/singlestat/module': singlestatPanel, 'app/plugins/panel/gettingstarted/module': gettingStartedPanel, + 'app/plugins/panel/gauge/module': gaugePanel, }; export default builtInPlugins; diff --git a/public/app/plugins/panel/gauge/module.tsx b/public/app/plugins/panel/gauge/module.tsx new file mode 100644 index 00000000000..526e7cca87a --- /dev/null +++ b/public/app/plugins/panel/gauge/module.tsx @@ -0,0 +1,23 @@ +import React, { PureComponent } from 'react'; +import { NullValueMode, PanelProps } from '../../../types'; +import { Gauge } from '../../../viz/Gauge'; +import { getTimeSeriesVMs } from '../../../viz/state/timeSeries'; + +export interface Options {} + +interface Props extends PanelProps {} + +export class GaugePanel extends PureComponent { + render() { + const { timeSeries } = this.props; + + const vmSeries = getTimeSeriesVMs({ + timeSeries: timeSeries, + nullValueMode: NullValueMode.Ignore, + }); + + return ; + } +} + +export { GaugePanel as PanelComponent }; diff --git a/public/app/plugins/panel/gauge/plugin.json b/public/app/plugins/panel/gauge/plugin.json new file mode 100644 index 00000000000..1fff76fdd3b --- /dev/null +++ b/public/app/plugins/panel/gauge/plugin.json @@ -0,0 +1,18 @@ +{ + "type": "panel", + "name": "Gauge", + "id": "gauge", + + "state": "alpha", + + "info": { + "author": { + "name": "Grafana Project", + "url": "https://grafana.com" + }, + "logos": { + + } + } +} + diff --git a/public/app/viz/Gauge.tsx b/public/app/viz/Gauge.tsx new file mode 100644 index 00000000000..f3f0c79d9a7 --- /dev/null +++ b/public/app/viz/Gauge.tsx @@ -0,0 +1,99 @@ +import React, { PureComponent } from 'react'; +import $ from 'jquery'; +import { TimeSeriesVMs } from 'app/types'; +import config from '../core/config'; + +interface Props { + timeSeries: TimeSeriesVMs; + minValue: number; + maxValue: number; + showThresholdMarkers?: boolean; + thresholds?: number[]; + showThresholdLables?: boolean; +} + +export class Gauge extends PureComponent { + element: any; + + static defaultProps = { + minValue: 0, + maxValue: 100, + showThresholdMarkers: true, + showThresholdLables: false, + thresholds: [], + }; + + componentDidMount() { + this.draw(); + } + + componentDidUpdate(prevProps: Props) { + if (prevProps.timeSeries !== this.props.timeSeries) { + this.draw(); + } + } + + draw() { + const { maxValue, minValue, showThresholdLables, showThresholdMarkers, timeSeries, thresholds } = this.props; + + console.log(timeSeries); + const backgroundColor = config.bootData.user.lightTheme ? 'rgb(230,230,230)' : 'rgb(38,38,38)'; + const fontColor = config.bootData.user.lightTheme ? 'rgb(38,38,38)' : 'rgb(230,230,230)'; + + const options = { + series: { + gauges: { + gauge: { + min: minValue, + max: maxValue, + background: { color: backgroundColor }, + border: { color: null }, + shadow: { show: false }, + width: '100%', + }, + frame: { show: false }, + label: { show: false }, + layout: { margin: 0, thresholdWidth: 0 }, + cell: { border: { width: 0 } }, + threshold: { + values: thresholds, + label: { + show: showThresholdLables, + margin: 2, + font: { size: 14 }, + }, + show: showThresholdMarkers, + width: 1, + }, + value: { + color: fontColor, + formatter: () => { + return Math.round(timeSeries[0].stats.avg); + }, + font: { + size: 78, + family: '"Helvetica Neue", Helvetica, Arial, sans-serif', + }, + }, + show: true, + }, + }, + }; + + try { + $.plot(this.element, timeSeries, options); + } catch (err) { + console.log('Gauge rendering error', err, options, timeSeries); + } + } + + getValueText() {} + + render() { + return ( +
+
(this.element = e)} /> +
+ ); + } +} diff --git a/public/app/viz/GaugeOptions.tsx b/public/app/viz/GaugeOptions.tsx new file mode 100644 index 00000000000..031855e1c78 --- /dev/null +++ b/public/app/viz/GaugeOptions.tsx @@ -0,0 +1,16 @@ +import React, { PureComponent } from 'react'; +import { PanelOptionsProps } from '../types'; + +interface Props {} + +export class GaugeOptions extends PureComponent> { + render() { + return ( +
+
+
Draw Modes
+
+
+ ); + } +}