From 18ba2cdcb11dd4491c73ce5e7b6ac05ec4bfef52 Mon Sep 17 00:00:00 2001
From: Gregory Eremin
Date: Sat, 14 Mar 2015 15:53:53 +0700
Subject: [PATCH] Refactor bar labels a bit
---
app/scripts/src/charts/animation.jsx | 2 +-
app/scripts/src/charts/bar_chart.jsx | 62 +++++++++++++++++++---------
app/scripts/src/charts/charts.jsx | 5 +++
3 files changed, 49 insertions(+), 20 deletions(-)
diff --git a/app/scripts/src/charts/animation.jsx b/app/scripts/src/charts/animation.jsx
index e3329fb..25a62e4 100644
--- a/app/scripts/src/charts/animation.jsx
+++ b/app/scripts/src/charts/animation.jsx
@@ -26,7 +26,7 @@ var ChartAnimationMixin = {
clearAnimations: function(ref) {
var node = ref.getDOMNode();
- while (node.firstChild) {
+ while (node.firstChild && node.firstChild.nodeName === 'animate') {
node.removeChild(node.firstChild);
}
}
diff --git a/app/scripts/src/charts/bar_chart.jsx b/app/scripts/src/charts/bar_chart.jsx
index d207ade..0d57828 100644
--- a/app/scripts/src/charts/bar_chart.jsx
+++ b/app/scripts/src/charts/bar_chart.jsx
@@ -181,7 +181,7 @@ var Bar = React.createClass({
calculateLabelPosition: function() {
var val = this.props.value,
offset = this.props.offset,
- label = this.props.item + ': ' + val,
+ label = this.props.item + ': ' + numberFormat(val),
labelWidth = textWidth(label),
labelOuterWidth = labelWidth + 2*this.labelPaddingH,
labelOffsetWidth = labelOuterWidth + 2*this.labelPaddingH,
@@ -211,17 +211,22 @@ var Bar = React.createClass({
},
animateAll: function() {
- this.clearAnimations(this.refs.bar);
- this.clearAnimations(this.refs.underlay);
- this.animate(this.refs.bar, 'width', this.state.lastBarWidth, this.props.width);
- this.animate(this.refs.bar, 'x', this.state.lastBarX, this.props.x);
- var ph = this.labelPaddingH;
- this.animate(this.refs.underlay, 'x', this.state.lastLabelX - ph, this.state.labelX - ph);
- this.animate(this.refs.label, 'x', this.state.lastLabelX, this.state.labelX);
+ var bar = this.refs.bar,
+ underlay = this.refs.label.refs.underlay,
+ text = this.refs.label.refs.text,
+ padH = this.labelPaddingH;
+
+ this.clearAnimations(bar);
+ this.clearAnimations(underlay);
+ this.clearAnimations(text);
+ this.animate(bar, 'width', this.state.lastBarWidth, this.props.width);
+ this.animate(bar, 'x', this.state.lastBarX, this.props.x);
+ this.animate(underlay, 'x', this.state.lastLabelX - padH, this.state.labelX - padH);
+ this.animate(text, 'x', this.state.lastLabelX, this.state.labelX);
},
render: function() {
- var label = this.props.item ? (this.props.item + ': ' + this.props.value) : '',
+ var label = this.props.item ? (this.props.item + ': ' + numberFormat(this.props.value)) : '',
labelWidth = textWidth(label),
labelOuterWidth = (labelWidth == 0 ? 0 : labelWidth + 2*this.labelPaddingH),
barX = (this.state.lastBarX && this.state.lastBarX !== this.props.x
@@ -242,20 +247,39 @@ var Bar = React.createClass({
y={this.props.y}
rx="2"
ry="2" />
-
-
- {label}
+ y={this.props.y + this.labelMarginV} />
);
}
});
+
+var BarLabel = React.createClass({
+ render: function() {
+ var text = (this.props.item ? this.props.item +': '+ numberFormat(this.props.value) : '');
+ return (
+
+
+
+ {text}
+
+
+ );
+ }
+})
diff --git a/app/scripts/src/charts/charts.jsx b/app/scripts/src/charts/charts.jsx
index 2837823..2097170 100644
--- a/app/scripts/src/charts/charts.jsx
+++ b/app/scripts/src/charts/charts.jsx
@@ -9,6 +9,11 @@ var SVGChartMixin = {
var fontFamily = 'Helvetica Neue, Helvetica, sans-serif',
fontSize = 16;
+function numberFormat(num) {
+ // FIXME: Not supported in IE10- and Safari
+ return Intl.NumberFormat().format(num);
+}
+
function textWidth(str) {
var svg = document.createElementNS('http://www.w3.org/2000/svg', "svg");
text = document.createElementNS('http://www.w3.org/2000/svg', "text");