* PLT-2713 Added ability for admins to list users not in any team * Updated style of unit test * Split SearchableUserList to give better control over its properties * Added users without any teams to the user store * Added ManageUsers page * Renamed ManageUsers to SystemUsers * Added ability to search by user id in SystemUsers page * Added SystemUsersDropdown * Removed unnecessary injectIntl * Created TeamUtils * Reduced scope of system console heading CSS * Added team filter to TeamAnalytics page * Updated admin console sidebar * Removed unnecessary TODO * Removed unused reference to deleted modal * Fixed system console sidebar not scrolling on first load * Fixed TeamAnalytics page not rendering on first load * Fixed chart.js throwing an error when switching between teams * Changed TeamAnalytics header to show the team's display name * Fixed appearance of TeamAnalytics and SystemUsers on small screen widths * Fixed placement of 'No users found' message * Fixed teams not appearing in SystemUsers on first load * Updated user count text for SystemUsers * Changed search by id fallback to trigger less often * Fixed SystemUsers list items not updating when searching * Fixed localization strings for SystemUsers page
120 строки
3.3 KiB
JavaScript
120 строки
3.3 KiB
JavaScript
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import {FormattedMessage} from 'react-intl';
|
|
|
|
import * as Utils from 'utils/utils.jsx';
|
|
|
|
import React from 'react';
|
|
import ReactDOM from 'react-dom';
|
|
import Chart from 'chart.js';
|
|
|
|
export default class LineChart extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.initChart = this.initChart.bind(this);
|
|
this.chart = null;
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.initChart();
|
|
}
|
|
|
|
componentWillUpdate(nextProps) {
|
|
const willHaveData = nextProps.data && nextProps.data.labels.length > 0;
|
|
const hasChart = Boolean(this.chart);
|
|
|
|
if (!willHaveData && hasChart) {
|
|
// Clean up the rendered chart before we render and destroy its context
|
|
this.chart.destroy();
|
|
this.chart = null;
|
|
}
|
|
}
|
|
|
|
componentDidUpdate(prevProps) {
|
|
if (Utils.areObjectsEqual(prevProps.data, this.props.data) && Utils.areObjectsEqual(prevProps.options, this.props.options)) {
|
|
return;
|
|
}
|
|
|
|
const hasData = this.props.data && this.props.data.labels.length > 0;
|
|
const hasChart = Boolean(this.chart);
|
|
|
|
if (hasData) {
|
|
// Update the rendered chart or initialize it as necessary
|
|
this.initChart(hasChart);
|
|
}
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (this.chart) {
|
|
this.chart.destroy();
|
|
}
|
|
}
|
|
|
|
initChart(update) {
|
|
if (!this.refs.canvas) {
|
|
return;
|
|
}
|
|
|
|
var el = ReactDOM.findDOMNode(this.refs.canvas);
|
|
var ctx = el.getContext('2d');
|
|
this.chart = new Chart(ctx, {type: 'line', data: this.props.data, options: this.props.options || {}}); // eslint-disable-line new-cap
|
|
|
|
if (update) {
|
|
this.chart.update();
|
|
}
|
|
}
|
|
|
|
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
|
|
};
|
|
|