diff options
author | Stas Vilchik <vilchiks@gmail.com> | 2016-05-13 16:24:17 +0200 |
---|---|---|
committer | Stas Vilchik <vilchiks@gmail.com> | 2016-05-13 16:24:17 +0200 |
commit | 3efea992de3a883b22321a42c0c639364b3fbf11 (patch) | |
tree | ef25eaa2aee7e0c7b76f2173ca75283c0a1af84c /server/sonar-web/src/main/js/components | |
parent | f77e302dde33cd34ade4311e36c03aa898c61669 (diff) | |
download | sonarqube-3efea992de3a883b22321a42c0c639364b3fbf11.tar.gz sonarqube-3efea992de3a883b22321a42c0c639364b3fbf11.zip |
refactor project overview page (#908)
Diffstat (limited to 'server/sonar-web/src/main/js/components')
-rw-r--r-- | server/sonar-web/src/main/js/components/charts/LanguageDistribution.js | 95 | ||||
-rw-r--r-- | server/sonar-web/src/main/js/components/shared/complexity-distribution.js | 69 |
2 files changed, 164 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/components/charts/LanguageDistribution.js b/server/sonar-web/src/main/js/components/charts/LanguageDistribution.js new file mode 100644 index 00000000000..5105fca04b8 --- /dev/null +++ b/server/sonar-web/src/main/js/components/charts/LanguageDistribution.js @@ -0,0 +1,95 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import find from 'lodash/find'; +import sortBy from 'lodash/sortBy'; +import React from 'react'; +import shallowCompare from 'react-addons-shallow-compare'; + +import { Histogram } from './histogram'; +import { formatMeasure } from '../../helpers/measures'; +import { getLanguages } from '../../api/languages'; +import { translate } from '../../helpers/l10n'; + +export default class LanguageDistribution extends React.Component { + static propTypes = { + distribution: React.PropTypes.string.isRequired + }; + + state = {}; + + componentDidMount () { + this.mounted = true; + this.requestLanguages(); + } + + shouldComponentUpdate (nextProps, nextState) { + return shallowCompare(this, nextProps, nextState); + } + + componentWillUnmount () { + this.mounted = false; + } + + requestLanguages () { + getLanguages().then(languages => { + if (this.mounted) { + this.setState({ languages }); + } + }); + } + + getLanguageName (langKey) { + if (this.state.languages) { + const lang = find(this.state.languages, { key: langKey }); + return lang ? lang.name : translate('unknown'); + } else { + return langKey; + } + } + + cutLanguageName (name) { + return name.length > 10 ? `${name.substr(0, 7)}...` : name; + } + + render () { + let data = this.props.distribution.split(';') + .map((point, index) => { + const tokens = point.split('='); + return { x: parseInt(tokens[1], 10), y: index, value: tokens[0] }; + }); + + data = sortBy(data, d => -d.x); + + const yTicks = data + .map(point => this.getLanguageName(point.value)) + .map(this.cutLanguageName); + const yValues = data.map(point => formatMeasure(point.x, 'SHORT_INT')); + + return ( + <Histogram + data={data} + yTicks={yTicks} + yValues={yValues} + barsWidth={10} + height={data.length * 25} + padding={[0, 60, 0, 80]}/> + ); + } +} diff --git a/server/sonar-web/src/main/js/components/shared/complexity-distribution.js b/server/sonar-web/src/main/js/components/shared/complexity-distribution.js new file mode 100644 index 00000000000..4771ae96489 --- /dev/null +++ b/server/sonar-web/src/main/js/components/shared/complexity-distribution.js @@ -0,0 +1,69 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import React from 'react'; + +import { BarChart } from '../charts/bar-chart'; +import { formatMeasure } from '../../helpers/measures'; +import { translateWithParameters } from '../../helpers/l10n'; + +const HEIGHT = 80; + +export const ComplexityDistribution = React.createClass({ + propTypes: { + distribution: React.PropTypes.string.isRequired, + of: React.PropTypes.string.isRequired + }, + + renderBarChart () { + const data = this.props.distribution.split(';').map((point, index) => { + const tokens = point.split('='); + const y = parseInt(tokens[1], 10); + const value = parseInt(tokens[0], 10); + return { + x: index, + y, + value, + tooltip: translateWithParameters(`overview.complexity_tooltip.${this.props.of}`, y, value) + }; + }); + + const xTicks = data.map(point => point.value); + + const xValues = data.map(point => formatMeasure(point.y, 'INT')); + + return <BarChart data={data} + xTicks={xTicks} + xValues={xValues} + height={HEIGHT} + barsWidth={20} + padding={[25, 10, 25, 10]}/>; + }, + + render () { + // TODO remove inline styling + return ( + <div + className="overview-bar-chart" + style={{ height: HEIGHT, paddingTop: 10, paddingBottom: 15 }}> + {this.renderBarChart()} + </div> + ); + } +}); |