]> source.dussan.org Git - sonarqube.git/commitdiff
improve rendering of bar chart
authorStas Vilchik <vilchiks@gmail.com>
Fri, 5 Feb 2016 14:34:51 +0000 (15:34 +0100)
committerStas Vilchik <vilchiks@gmail.com>
Fri, 5 Feb 2016 14:34:51 +0000 (15:34 +0100)
server/sonar-web/src/main/js/apps/account/components/IssueWidgets.js
server/sonar-web/src/main/js/apps/overview/components/complexity-distribution.js
server/sonar-web/src/main/js/components/charts/bar-chart.js
server/sonar-web/tests/components/charts/bar-chart-test.js

index 8679486d1d615b250beac0295e886ca6a3a4636a..cc828b572ce60bf5c150e0588f38b6ef601de2e8 100644 (file)
@@ -136,7 +136,7 @@ export default class IssueWidgets extends Component {
               xTicks={xTicks}
               xValues={xValues}
               barsWidth={20}
-              padding={[25, 0, 25, 0]}
+              padding={[25, 10, 25, 10]}
               height={80}
               onBarClick={this.handleByDateClick.bind(this)}/>
         </section>
index 56781f4770f2de6c90ee7dff32404753939d6b27..daa9b8141bdf1f83cd4f8220ea5a2664104a9d39 100644 (file)
@@ -54,8 +54,8 @@ export const ComplexityDistribution = React.createClass({
                      xTicks={xTicks}
                      xValues={xValues}
                      height={HEIGHT}
-                     barsWidth={10}
-                     padding={[25, 0, 25, 0]}/>;
+                     barsWidth={20}
+                     padding={[25, 10, 25, 10]}/>;
   },
 
   render () {
index c73405d370bd8f9f392e3a2b22371f85421e9662..a2345491bc09a6cc0dc54df17d5c347c2b9240ac 100644 (file)
@@ -30,7 +30,7 @@ export const BarChart = React.createClass({
     xValues: React.PropTypes.arrayOf(React.PropTypes.any),
     height: React.PropTypes.number,
     padding: React.PropTypes.arrayOf(React.PropTypes.number),
-    barsWidth: React.PropTypes.number,
+    barsWidth: React.PropTypes.number.isRequired,
     onBarClick: React.PropTypes.func
   },
 
@@ -40,8 +40,7 @@ export const BarChart = React.createClass({
     return {
       xTicks: [],
       xValues: [],
-      padding: [10, 10, 10, 10],
-      barsWidth: 40
+      padding: [10, 10, 10, 10]
     };
   },
 
@@ -59,7 +58,7 @@ export const BarChart = React.createClass({
     }
     let ticks = this.props.xTicks.map((tick, index) => {
       let point = this.props.data[index];
-      let x = Math.round(xScale(point.x) + xScale.rangeBand() / 2 + this.props.barsWidth / 2);
+      let x = Math.round(xScale(point.x) + xScale.rangeBand() / 2);
       let y = yScale.range()[0];
       let d = this.props.data[index];
       let tooltipAtts = {};
@@ -85,7 +84,7 @@ export const BarChart = React.createClass({
     }
     let ticks = this.props.xValues.map((value, index) => {
       let point = this.props.data[index];
-      let x = Math.round(xScale(point.x) + xScale.rangeBand() / 2 + this.props.barsWidth / 2);
+      let x = Math.round(xScale(point.x) + xScale.rangeBand() / 2);
       let y = yScale(point.y);
       let d = this.props.data[index];
       let tooltipAtts = {};
@@ -107,7 +106,7 @@ export const BarChart = React.createClass({
 
   renderBars (xScale, yScale) {
     let bars = this.props.data.map((d, index) => {
-      let x = Math.round(xScale(d.x) + xScale.rangeBand() / 2);
+      let x = Math.round(xScale(d.x));
       let maxY = yScale.range()[0];
       let y = Math.round(yScale(d.y)) - /* minimum bar height */ 1;
       let height = maxY - y;
@@ -137,10 +136,13 @@ export const BarChart = React.createClass({
     let availableWidth = this.state.width - this.props.padding[1] - this.props.padding[3];
     let availableHeight = this.state.height - this.props.padding[0] - this.props.padding[2];
 
+    const innerPadding = (availableWidth - this.props.barsWidth * this.props.data.length) / (this.props.data.length - 1);
+    const relativeInnerPadding = innerPadding / (innerPadding + this.props.barsWidth);
+
     let maxY = d3.max(this.props.data, d => d.y);
     let xScale = d3.scale.ordinal()
                    .domain(this.props.data.map(d => d.x))
-                   .rangeRoundBands([0, availableWidth]);
+                   .rangeBands([0, availableWidth], relativeInnerPadding, 0);
     let yScale = d3.scale.linear()
                    .domain([0, maxY])
                    .range([availableHeight, 0]);
index 894d02a483e92601b0033904e538e9e7bbb03dee..e56497e4891daf24500af4e6190ee91fa7a9ceb9 100644 (file)
@@ -13,7 +13,7 @@ describe('Bar Chart', function () {
       { x: 2, y: 30 },
       { x: 3, y: 20 }
     ];
-    let chart = TestUtils.renderIntoDocument(<BarChart data={data} width={100} height={100}/>);
+    let chart = TestUtils.renderIntoDocument(<BarChart data={data} width={100} height={100} barsWidth={20}/>);
     expect(TestUtils.scryRenderedDOMComponentsWithClass(chart, 'bar-chart-bar')).to.have.length(3);
   });
 
@@ -24,7 +24,7 @@ describe('Bar Chart', function () {
       { x: 3, y: 20 }
     ];
     const ticks = ['A', 'B', 'C'];
-    let chart = TestUtils.renderIntoDocument(<BarChart data={data} xTicks={ticks} width={100} height={100}/>);
+    let chart = TestUtils.renderIntoDocument(<BarChart data={data} xTicks={ticks} width={100} height={100} barsWidth={20}/>);
     expect(TestUtils.scryRenderedDOMComponentsWithClass(chart, 'bar-chart-tick')).to.have.length(3);
   });
 
@@ -35,7 +35,7 @@ describe('Bar Chart', function () {
       { x: 3, y: 20 }
     ];
     const values = ['A', 'B', 'C'];
-    let chart = TestUtils.renderIntoDocument(<BarChart data={data} xValues={values} width={100} height={100}/>);
+    let chart = TestUtils.renderIntoDocument(<BarChart data={data} xValues={values} width={100} height={100} barsWidth={20}/>);
     expect(TestUtils.scryRenderedDOMComponentsWithClass(chart, 'bar-chart-tick')).to.have.length(3);
   });
 
@@ -48,7 +48,7 @@ describe('Bar Chart', function () {
     const ticks = ['A', 'B', 'C'];
     const values = ['A', 'B', 'C'];
     let chart = TestUtils.renderIntoDocument(
-        <BarChart data={data} xTicks={ticks} xValues={values} width={100} height={100}/>);
+        <BarChart data={data} xTicks={ticks} xValues={values} width={100} height={100} barsWidth={20}/>);
     expect(TestUtils.scryRenderedDOMComponentsWithClass(chart, 'bar-chart-bar')).to.have.length(3);
     expect(TestUtils.scryRenderedDOMComponentsWithClass(chart, 'bar-chart-tick')).to.have.length(6);
   });