aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/components
diff options
context:
space:
mode:
authorStas Vilchik <vilchiks@gmail.com>2016-05-13 16:24:17 +0200
committerStas Vilchik <vilchiks@gmail.com>2016-05-13 16:24:17 +0200
commit3efea992de3a883b22321a42c0c639364b3fbf11 (patch)
treeef25eaa2aee7e0c7b76f2173ca75283c0a1af84c /server/sonar-web/src/main/js/components
parentf77e302dde33cd34ade4311e36c03aa898c61669 (diff)
downloadsonarqube-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.js95
-rw-r--r--server/sonar-web/src/main/js/components/shared/complexity-distribution.js69
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>
+ );
+ }
+});