diff options
author | JoramWilander <jwawilander@gmail.com> | 2016-02-25 12:32:46 -0500 |
---|---|---|
committer | JoramWilander <jwawilander@gmail.com> | 2016-03-01 10:46:30 -0500 |
commit | 8239c68cf323e4bb20007d2b456336becead273d (patch) | |
tree | 3422ed0946afafa47d6649e09f6f09ee71692363 /web/react/components/analytics/line_chart.jsx | |
parent | 8aa4e28932ec43090ca6b481929fafbe0119a660 (diff) | |
download | chat-8239c68cf323e4bb20007d2b456336becead273d.tar.gz chat-8239c68cf323e4bb20007d2b456336becead273d.tar.bz2 chat-8239c68cf323e4bb20007d2b456336becead273d.zip |
Refactor and modularize analytics on the client
Diffstat (limited to 'web/react/components/analytics/line_chart.jsx')
-rw-r--r-- | web/react/components/analytics/line_chart.jsx | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/web/react/components/analytics/line_chart.jsx b/web/react/components/analytics/line_chart.jsx new file mode 100644 index 000000000..d1bb6b9cb --- /dev/null +++ b/web/react/components/analytics/line_chart.jsx @@ -0,0 +1,90 @@ +// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import {FormattedMessage} from 'mm-intl'; + +export default class LineChart extends React.Component { + constructor(props) { + super(props); + + this.initChart = this.initChart.bind(this); + this.chart = null; + } + + componentDidMount() { + this.initChart(); + } + + componentDidUpdate() { + if (this.chart) { + this.chart.destroy(); + } + this.initChart(); + } + + componentWillUnmount() { + if (this.chart) { + this.chart.destroy(); + } + } + + initChart() { + if (!this.refs.canvas) { + return; + } + var el = ReactDOM.findDOMNode(this.refs.canvas); + var ctx = el.getContext('2d'); + this.chart = new Chart(ctx).Line(this.props.data, this.props.options || {}); //eslint-disable-line new-cap + } + + render() { + let content; + if (this.props.data == null) { + content = ( + <FormattedMessage + id='analytics.chart.loading' + defaultMessage='Loading...' + /> + ); + } else if (this.props.data.labels.length === 0) { + content = ( + <h5> + <FormattedMessage + id='analytics.chart.meaningful' + defaultMessage='Not enough data for a meaningful representation.' + /> + </h5> + ); + } else { + content = ( + <canvas + ref='canvas' + width={this.props.width} + height={this.props.height} + /> + ); + } + + return ( + <div className='col-sm-12'> + <div className='total-count by-day'> + <div className='title'> + {this.props.title} + </div> + <div className='content'> + {content} + </div> + </div> + </div> + ); + } +} + +LineChart.propTypes = { + title: React.PropTypes.node.isRequired, + width: React.PropTypes.string.isRequired, + height: React.PropTypes.string.isRequired, + data: React.PropTypes.object, + options: React.PropTypes.object +}; + |